diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f29dbfcb..21cf982d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Install python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - @@ -56,7 +56,7 @@ jobs: - name: Set up Python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} cache: "pipenv" @@ -87,7 +87,7 @@ jobs: pipenv --python ${{ steps.setup-python.outputs.python-version }} run mkdocs gh-deploy --force --no-history - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: documentation path: site/ @@ -114,7 +114,7 @@ jobs: - name: Set up Python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "${{ matrix.python-version }}" cache: "pipenv" @@ -155,7 +155,7 @@ jobs: - name: Upload coverage if: ${{ matrix.python-version == env.DEFAULT_PYTHON_VERSION }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: backend-coverage-report path: src/coverage.xml @@ -238,7 +238,7 @@ jobs: - name: Upload Jest coverage if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: jest-coverage-report-${{ matrix.shard-index }} path: | @@ -253,9 +253,9 @@ jobs: - name: Upload Playwright test results if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: playwright-report + name: playwright-report-${{ matrix.shard-index }} path: src-ui/playwright-report retention-days: 7 @@ -269,10 +269,18 @@ jobs: - uses: actions/checkout@v4 - - name: Download frontend coverage - uses: actions/download-artifact@v3 + name: Download frontend jest coverage + uses: actions/download-artifact@v4 with: path: src-ui/coverage/ + pattern: jest-coverage-report-* + - + name: Download frontend playwright coverage + uses: actions/download-artifact@v4 + with: + path: src-ui/coverage/ + pattern: playwright-report-* + merge-multiple: true - name: Upload frontend coverage to Codecov uses: codecov/codecov-action@v3 @@ -285,7 +293,7 @@ jobs: files: '!coverage.xml' - name: Download backend coverage - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: backend-coverage-report path: src/ @@ -416,7 +424,7 @@ jobs: docker cp frontend-extract:/usr/src/paperless/src/documents/static/frontend src/documents/static/frontend/ - name: Upload frontend artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: frontend-compiled path: src/documents/static/frontend/ @@ -435,7 +443,7 @@ jobs: - name: Set up Python id: setup-python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} cache: "pipenv" @@ -461,13 +469,13 @@ jobs: sudo apt-get install -qq --no-install-recommends gettext liblept5 - name: Download frontend artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: frontend-compiled path: src/documents/static/frontend/ - name: Download documentation artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: documentation path: docs/_build/html/ @@ -533,7 +541,7 @@ jobs: tar -cJf paperless-ngx.tar.xz paperless-ngx/ - name: Upload release artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: release path: dist/paperless-ngx.tar.xz @@ -552,7 +560,7 @@ jobs: steps: - name: Download release artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: release path: ./ @@ -603,7 +611,7 @@ jobs: ref: main - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} cache: "pipenv" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index bd3943144..fc521843f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -42,7 +42,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -51,4 +51,4 @@ jobs: # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml index c732d0342..ec0153726 100644 --- a/.github/workflows/repo-maintenance.yml +++ b/.github/workflows/repo-maintenance.yml @@ -18,7 +18,7 @@ jobs: name: 'Stale' runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: days-before-stale: 7 days-before-close: 14 diff --git a/src-ui/package-lock.json b/src-ui/package-lock.json index 030902b88..6a8a18a12 100644 --- a/src-ui/package-lock.json +++ b/src-ui/package-lock.json @@ -10,14 +10,14 @@ "hasInstallScript": true, "dependencies": { "@angular/cdk": "^17.0.4", - "@angular/common": "~17.0.7", - "@angular/compiler": "~17.0.7", - "@angular/core": "~17.0.7", - "@angular/forms": "~17.0.7", - "@angular/localize": "~17.0.7", - "@angular/platform-browser": "~17.0.7", - "@angular/platform-browser-dynamic": "~17.0.7", - "@angular/router": "~17.0.7", + "@angular/common": "~17.0.8", + "@angular/compiler": "~17.0.8", + "@angular/core": "~17.0.8", + "@angular/forms": "~17.0.8", + "@angular/localize": "~17.0.8", + "@angular/platform-browser": "~17.0.8", + "@angular/platform-browser-dynamic": "~17.0.8", + "@angular/router": "~17.0.8", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-select/ng-select": "^12.0.4", "@ngneat/dirty-check-forms": "^3.0.3", @@ -37,21 +37,21 @@ }, "devDependencies": { "@angular-builders/jest": "17.0.0", - "@angular-devkit/build-angular": "~17.0.7", + "@angular-devkit/build-angular": "~17.0.8", "@angular-eslint/builder": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/schematics": "17.1.1", "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "~17.0.7", + "@angular/cli": "~17.0.8", "@angular/compiler-cli": "~17.0.7", "@playwright/test": "^1.40.1", "@types/jest": "^29.5.10", - "@types/node": "^20.10.2", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/node": "^20.10.6", + "@typescript-eslint/eslint-plugin": "^6.17.0", + "@typescript-eslint/parser": "^6.17.0", "concurrently": "^8.2.2", - "eslint": "^8.53.0", + "eslint": "^8.56.0", "jest": "29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-preset-angular": "^13.1.4", @@ -107,12 +107,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1700.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.7.tgz", - "integrity": "sha512-32uitQKsYLGXAKoXBsmOnPsTt9pS+b9cnFI9ZvBFVhJ31I2EOM7vGcMFalhTxdB/DkVHk4TyO78efV0V26DwCA==", + "version": "0.1700.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.8.tgz", + "integrity": "sha512-SWVr3CvwO6T0yW2ytszCwBT1g92vyFkwbVUxqE93urYnoD8PvP+81GH5YwVjHQTgvhP4eXQMGZ9hpHx57VOrWQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", + "@angular-devkit/core": "17.0.8", "rxjs": "7.8.1" }, "engines": { @@ -122,15 +122,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.7.tgz", - "integrity": "sha512-AtEzLk6n6BXqQzk0Bsupe6GV0IgUe7RbpBfqROi+NZqMA7OUAHCX3xA6M68Qu+5KxBtW7T5lHeZZ7iP/y39wtQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.8.tgz", + "integrity": "sha512-u7R5yX92ZxOL/LfxiKGGqlBo86100sJ5Rabavn8DeGtYP8N0qgwCcNwlW2zaMoUlkw2geMnxcxIX5VJI4iFPUA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.7", - "@angular-devkit/build-webpack": "0.1700.7", - "@angular-devkit/core": "17.0.7", + "@angular-devkit/architect": "0.1700.8", + "@angular-devkit/build-webpack": "0.1700.8", + "@angular-devkit/core": "17.0.8", "@babel/core": "7.23.2", "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", @@ -141,7 +141,7 @@ "@babel/preset-env": "7.23.2", "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.7", + "@ngtools/webpack": "17.0.8", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.16", @@ -245,12 +245,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1700.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.7.tgz", - "integrity": "sha512-B9Mg/qYDpE5my8PJ3VPQyRSUV0Oq1bFUzU8s0ZpqEZl1URKc04pm0LtLmebrMIcUZgDiGk0RHaD+O1E9IV/bdQ==", + "version": "0.1700.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.8.tgz", + "integrity": "sha512-GA7QlCAlYB3uBkRaUYgIC/Vfajb9jMmouwYiAAEm34ZyP3ThFjdqsYd/A/exnuESt5o6Bh++C/PI34sV3lawRA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.7", + "@angular-devkit/architect": "0.1700.8", "rxjs": "7.8.1" }, "engines": { @@ -264,9 +264,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.7.tgz", - "integrity": "sha512-vATobHo5O5tJba424hJfQWLb40GzvZPNsI74dcgSUTgrDph8ksmk5xB9OvEvf0INorQZ2IMphj/VIWj4/+JqSA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.8.tgz", + "integrity": "sha512-gI8+SOwGUwr0WOlFrhLjohLolMzcguuoR0LTZEcGjdXvQyPgH4NDSRIIrfWCdu+ZVhfy76o3zQYdYc9QN8NrjQ==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -291,12 +291,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.7.tgz", - "integrity": "sha512-BY11OkJkM3xyXcvyD7x5kGY/c8Ufd4AfPvI0D9imhVxbns45Q48b1DlvCQvSnCJ/s+OwnkrYb/Efa70ZiaGu8A==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.8.tgz", + "integrity": "sha512-syo814SVWfJvne448IijjZvpWbuqJsEutdNqHWLTewTfX2U3KrIAr/XRVcXQMuyMvLCDiuxjMgEJxOIP7mcIPw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", + "@angular-devkit/core": "17.0.8", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -423,15 +423,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.7.tgz", - "integrity": "sha512-oSa0GVAQNA7wFbLJYeaO3kV4iUcbKEqXDLxcIE8s1GfHddBOlXH2P1T4fXonCBl5qvV+joP0G0+fs7I0w2utZQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.8.tgz", + "integrity": "sha512-yZXYNLAFv9u2qypsVqtS+rRCsnjsIPYXr6TcI/r5buzOtC7UQ2lleYsWJqX47SsyGMk/o3gaYg5Bj2I5mmRDLA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.7", - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", - "@schematics/angular": "17.0.7", + "@angular-devkit/architect": "0.1700.8", + "@angular-devkit/core": "17.0.8", + "@angular-devkit/schematics": "17.0.8", + "@schematics/angular": "17.0.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -457,9 +457,9 @@ } }, "node_modules/@angular/common": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.7.tgz", - "integrity": "sha512-bPPL6x0KOAOTxKSE2j4EWmEUOnqZYzOYiHzroa5b9UEyA9NvGkd9bm3zIxw8xcndRj1Ehcmvpi6KBLcYBBbWfg==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.8.tgz", + "integrity": "sha512-fFfwtdg7H+OkqnvV/ENu8F8KGfgIiH16DDbQqYY5KQyyQB+SMsoVW29F1fGx6Y30s7ZlsLOy6cHhgrw74itkSw==", "dependencies": { "tslib": "^2.3.0" }, @@ -467,14 +467,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.7", + "@angular/core": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.7.tgz", - "integrity": "sha512-QHPuLti2c2tGZmOGZ0cfCHo4LxiHUkC27I0aZFDyQSSQqEI5obQGVlEREHysw0nsS3sYIcLvqcwcKcRtXlXtxQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.8.tgz", + "integrity": "sha512-48jWypuhBGTrUUbkz1vB9gjbKKZ3hpuJ2DUUncd331Yw4tqkqZQbBa/E3ei4IHiCxEvW2uX3lI4AwlhuozmUtA==", "dependencies": { "tslib": "^2.3.0" }, @@ -482,7 +482,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.7" + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -491,9 +491,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.7.tgz", - "integrity": "sha512-YnL38idjIYtl3BXYpv+sVJKWGbUjHT6eyQSQVAfO/1AwWqVa21K9hnE+Q37VmUKEcKFMnQembeuErA+KVsGI6A==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.8.tgz", + "integrity": "sha512-ny2SMVgl+icjMuU5ZM57yFGUrhjR0hNxfCn0otAD3jUFliz/Onu9l6EPRKA5Cr8MZx3mg3rTLSBMD17YT8rsOg==", "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -513,14 +513,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.0.7", + "@angular/compiler": "17.0.8", "typescript": ">=5.2 <5.3" } }, "node_modules/@angular/core": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.7.tgz", - "integrity": "sha512-mEkelXkzEi6+A9GjdKOSGGzQAfo1iAjVTn6YsplNUeGE5JgDZYZ7sXGQqs0Lin7dzJxnPAgGjCOl7SpWLXIPSQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.8.tgz", + "integrity": "sha512-tzYsK24LdkNuKNJK6efF4XOqspvF/qOe9j/n1Y61a6mNvFwsJFGbcmdZMby4hI/YRm6oIDoIIFjSep8ycp6Pbw==", "dependencies": { "tslib": "^2.3.0" }, @@ -533,9 +533,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.7.tgz", - "integrity": "sha512-28BxRxEmgZIofGwVp6s2v3ri/kuWW+/EY/ZXhavlWKJEh4ATJl72k0RkRWNcQi4wnvn0Qb8tFdnVJnvRZvvKEw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.8.tgz", + "integrity": "sha512-WZBHbMQjaSovAzOMhKqZN+m7eUPGfOzh9rKFKvj6UQLIJ9qSpEpqlvL0omU1z/47s3XXeLiBzomMiRfQISJvvw==", "dependencies": { "tslib": "^2.3.0" }, @@ -543,16 +543,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.7", - "@angular/core": "17.0.7", - "@angular/platform-browser": "17.0.7", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/localize": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.7.tgz", - "integrity": "sha512-avYYQ8zin2thzvsH2YP3WxlwkvOzjNEXxjv4yyZBx6wul68e/753kQK/0RmSUYaBpDTUEZYzrPpDay00TKwBOA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.0.8.tgz", + "integrity": "sha512-1zW8qWKNMH3r/x4KpwzzUmVY+iN76vYdhjA6gzZDnpJxpon9eyljNEildj9+zSWeNUr2LgJ6HnkIX9q1f3mXfA==", "dependencies": { "@babel/core": "7.23.2", "fast-glob": "3.3.1", @@ -567,14 +567,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.0.7", - "@angular/compiler-cli": "17.0.7" + "@angular/compiler": "17.0.8", + "@angular/compiler-cli": "17.0.8" } }, "node_modules/@angular/platform-browser": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.7.tgz", - "integrity": "sha512-bm9/wt51nc/MPjft/FlRNIgFSeLjDtfJOT7M32Rt6kOHhNKSK7ZTPWdMe9ahuHSbAhLzd0G/4NsT5sKrWSeVZg==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.8.tgz", + "integrity": "sha512-XaI+p2AxQaIHzR761lhPUf4OcOp46WDW0IfbvOzaezHE+8r81joZyVSDQPgXSa/aRfI58YhcfUavuGqyU3PphA==", "dependencies": { "tslib": "^2.3.0" }, @@ -582,9 +582,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.0.7", - "@angular/common": "17.0.7", - "@angular/core": "17.0.7" + "@angular/animations": "17.0.8", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/animations": { @@ -593,9 +593,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.7.tgz", - "integrity": "sha512-OquwUX9fLWA2JUZW5Jm6atk0CPt0sA7Tg24eGLsr6g1XfTS7jRZprlGaa72NgPLnQVV6m84o/ZiNYS6yPmq1Gg==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.8.tgz", + "integrity": "sha512-BIXNKnfBZb8sdluQ7WIhIXFuVnsJJ0SV+aiMKzQ7B6XhWoAXZQnlvON2thydjIIVuCvaF3YmWTbILI2K8YZ2jQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -603,16 +603,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.7", - "@angular/compiler": "17.0.7", - "@angular/core": "17.0.7", - "@angular/platform-browser": "17.0.7" + "@angular/common": "17.0.8", + "@angular/compiler": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8" } }, "node_modules/@angular/router": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.7.tgz", - "integrity": "sha512-rUFPe1uDlYYw6+3Gq68czW7WxBH7zT/D3UsT1otqwUV4RnQQsVze4fIit9FqJh7tuP4y3WpB4XBNf7p7Oi6TJw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.8.tgz", + "integrity": "sha512-ptphcRe1RG/mIS60R7ZPilkkrxautqB0sOhds3h5VP3g628G1a2HWzvnmvjEfpJWDMFivV32VJMMBtTLqGr+0Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -620,9 +620,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.7", - "@angular/core": "17.0.7", - "@angular/platform-browser": "17.0.7", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2895,9 +2895,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3941,9 +3941,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.7.tgz", - "integrity": "sha512-gwhUhpwXn0trwwKdSu9WlJbEcLt+s/2fPwoD9lZ0y3wXfrOogsfcNBJKeO5BZf1h+A3AWt7ePmgrZXSJM+865Q==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.8.tgz", + "integrity": "sha512-wx0XBMrbpDeailK2uIhp/ZVMC3GK3BWwJjUu5SbT4BFrcoi2Zd9/9m0RCBAY54UXLBCqKd+ih7pJ6JSvprZmWw==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -4459,13 +4459,13 @@ } }, "node_modules/@schematics/angular": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.7.tgz", - "integrity": "sha512-d7QKmcKrM4owb/2bR7Ipf23roiNbvbD/x7reNhQAtKAPLSHJ3Ulkf1+Yv+dj+9f+K7y9SBviEUSrD27BQ9WaxQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.8.tgz", + "integrity": "sha512-1h5mwKFv1B/L5JWZ0mxnC4ms06iwnSi/w+GgRZPeM3P5BpuZuvAkFiClNnM55iLlQJXRQioPNLM3sOsz7spR6w==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", + "@angular-devkit/core": "17.0.8", + "@angular-devkit/schematics": "17.0.8", "jsonc-parser": "3.2.0" }, "engines": { @@ -4878,9 +4878,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4896,9 +4896,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -4995,16 +4995,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", + "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/type-utils": "6.14.0", - "@typescript-eslint/utils": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.17.0", + "@typescript-eslint/type-utils": "6.17.0", + "@typescript-eslint/utils": "6.17.0", + "@typescript-eslint/visitor-keys": "6.17.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -5030,13 +5030,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", + "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/typescript-estree": "6.17.0", + "@typescript-eslint/utils": "6.17.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5057,17 +5057,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", + "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/scope-manager": "6.17.0", + "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/typescript-estree": "6.17.0", "semver": "^7.5.4" }, "engines": { @@ -5082,15 +5082,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", + "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.17.0", + "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/typescript-estree": "6.17.0", + "@typescript-eslint/visitor-keys": "6.17.0", "debug": "^4.3.4" }, "engines": { @@ -5110,13 +5110,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", + "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" + "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/visitor-keys": "6.17.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5211,9 +5211,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", + "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5224,16 +5224,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", + "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/visitor-keys": "6.17.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -5250,6 +5251,30 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { "version": "6.13.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", @@ -5350,12 +5375,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", + "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.17.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8687,15 +8712,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/src-ui/package.json b/src-ui/package.json index fddb9677c..904c2b9a0 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -12,14 +12,14 @@ "private": true, "dependencies": { "@angular/cdk": "^17.0.4", - "@angular/common": "~17.0.7", - "@angular/compiler": "~17.0.7", - "@angular/core": "~17.0.7", - "@angular/forms": "~17.0.7", - "@angular/localize": "~17.0.7", - "@angular/platform-browser": "~17.0.7", - "@angular/platform-browser-dynamic": "~17.0.7", - "@angular/router": "~17.0.7", + "@angular/common": "~17.0.8", + "@angular/compiler": "~17.0.8", + "@angular/core": "~17.0.8", + "@angular/forms": "~17.0.8", + "@angular/localize": "~17.0.8", + "@angular/platform-browser": "~17.0.8", + "@angular/platform-browser-dynamic": "~17.0.8", + "@angular/router": "~17.0.8", "@ng-bootstrap/ng-bootstrap": "^16.0.0", "@ng-select/ng-select": "^12.0.4", "@ngneat/dirty-check-forms": "^3.0.3", @@ -39,21 +39,21 @@ }, "devDependencies": { "@angular-builders/jest": "17.0.0", - "@angular-devkit/build-angular": "~17.0.7", + "@angular-devkit/build-angular": "~17.0.8", "@angular-eslint/builder": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/schematics": "17.1.1", "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "~17.0.7", + "@angular/cli": "~17.0.8", "@angular/compiler-cli": "~17.0.7", "@playwright/test": "^1.40.1", "@types/jest": "^29.5.10", - "@types/node": "^20.10.2", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/node": "^20.10.6", + "@typescript-eslint/eslint-plugin": "^6.17.0", + "@typescript-eslint/parser": "^6.17.0", "concurrently": "^8.2.2", - "eslint": "^8.53.0", + "eslint": "^8.56.0", "jest": "29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-preset-angular": "^13.1.4", diff --git a/src/documents/file_handling.py b/src/documents/file_handling.py index d9601ccd9..246d03d55 100644 --- a/src/documents/file_handling.py +++ b/src/documents/file_handling.py @@ -222,7 +222,7 @@ def generate_filename( ).strip() if settings.FILENAME_FORMAT_REMOVE_NONE: - path = path.replace("-none-/", "") # remove empty directories + path = path.replace("/-none-/", "/") # remove empty directories path = path.replace(" -none-", "") # remove when spaced, with space path = path.replace("-none-", "") # remove rest of the occurences diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index 89c2e6e46..225008b78 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -1007,6 +1007,9 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase): self.assertEqual(generate_filename(doc_a), "ThisIsAFolder/4/2020-06-25.pdf") self.assertEqual(generate_filename(doc_b), "SomeImportantNone/2020-07-25.pdf") + @override_settings( + FILENAME_FORMAT=None, + ) def test_no_path_fallback(self): """ GIVEN: @@ -1157,3 +1160,28 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase): self.assertEqual(generate_filename(text_doc), "logs.txt") self.assertEqual(generate_filename(text_doc, archive_filename=True), "logs.pdf") + + @override_settings( + FILENAME_FORMAT="XX{correspondent}/{title}", + FILENAME_FORMAT_REMOVE_NONE=True, + ) + def test_remove_none_not_dir(self): + """ + GIVEN: + - A document with & filename format that includes correspondent as part of directory name + - FILENAME_FORMAT_REMOVE_NONE is True + WHEN: + - the filename is generated for the document + THEN: + - the missing correspondent is removed but directory structure retained + """ + document = Document.objects.create( + title="doc1", + mime_type="application/pdf", + ) + document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED + document.save() + + # Ensure that filename is properly generated + document.filename = generate_filename(document) + self.assertEqual(document.filename, "XX/doc1.pdf") diff --git a/src/paperless/views.py b/src/paperless/views.py index 16423671a..73b383a6f 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -56,11 +56,7 @@ class StandardPagination(PageNumberPagination): except Exception: pass else: - for obj in self.page.paginator.object_list: - if hasattr(obj, "id"): - ids.append(obj.id) - elif hasattr(obj, "fields"): - ids.append(obj.fields()["id"]) + ids = self.page.paginator.object_list.values_list("pk", flat=True) return ids def get_paginated_response_schema(self, schema):