mirror of
https://github.com/inventree/InvenTree.git
synced 2026-09-09 22:30:17 +00:00
Update next breaking (#12666)
* build(docker): compile backend translations during image build (#12203) * build(docker): compile backend trasnlations during image build * test(docker): verify compiled backend translations exist in image Add checks to the "Test Docker Image" step that assert the compiled django.mo files are present for a few representative languages (de, fr, ru, zh_Hans). This guards the newly added backend translation compilation step in the production Dockerfile, ensuring the multilingual artifacts are produced at the expected locale paths. * test(docker): verify compiled frontend translations exist in image * Add meaningful message on CSRF failure (#12216) * Add meaningful message on CSRF failure * Add link to CSRF_FAILURE_VIEW * Add unit test for new CSRF feedback * devops: fix chromium test uploads to flakiness.io (#12219) Currently, only Firefox test results get uploaded to Flakiness.io. This patch fixes the upload for chromium results as well, per https://docs.flakiness.io/ci/github-actions-setup/ * Bump ty (#12211) * bump ty * various fixes * fix settings * bump stubs * update pre-commit setup * update ignore * fix various issues * fix style * fix ignores * fix wrong ty warnings * color scheme: Use the users prefered mode by default (#12227) * color scheme: Use the users prefered colour scheme if one isn't defined in the store * fix style --------- Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump the dependencies group with 3 updates (#12220) Bumps the dependencies group with 3 updates: [oasdiff/oasdiff-action](https://github.com/oasdiff/oasdiff-action), [CodSpeedHQ/action](https://github.com/codspeedhq/action) and [crowdin/github-action](https://github.com/crowdin/github-action). Updates `oasdiff/oasdiff-action` from 0.0.57 to 0.1.1 - [Release notes](https://github.com/oasdiff/oasdiff-action/releases) - [Commits](https://github.com/oasdiff/oasdiff-action/compare/3530478ec30f84adedbfeb28f0d9527a290f50a9...5fbe96ede8d0c53aeadef122d7a0abb79152d493) Updates `CodSpeedHQ/action` from 4.17.0 to 4.17.5 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/9d332c4d90b43981c3e55ae8e38e68709996240f...c145068895e045cc725ee76fcd2307624b65c3af) Updates `crowdin/github-action` from 2.16.2 to 2.16.3 - [Release notes](https://github.com/crowdin/github-action/releases) - [Commits](https://github.com/crowdin/github-action/compare/8868a33591d21088edfc398968173a3b98d51706...52aa776766211d83d975df51f3b9c53c2f8ba35f) --- updated-dependencies: - dependency-name: oasdiff/oasdiff-action dependency-version: 0.1.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 4.17.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: crowdin/github-action dependency-version: 2.16.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * extend barcode scans API (#12233) * extend barcode scans with user perm check * fix import * fix call * align error message * add missing permissions to test * remove erronous assign * ensure permission erros knock through * New Crowdin translations by GitHub Action (#12192) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * [UI] Tweak today color (#12235) - Make "today" more obvious in calendar views * [UI] Tweak "order parts" wizard (#12236) - Order supplier parts by "primary" value - Attempt to auto-fill primary supplier part * [bug] Allocated query fix (#12234) * Fix BuildLineFilter.filter_allocated - Required for mysql backend * Spoecify output field * 1.5.0 (#12239) * Add release entry for 1.4.0 * Add blank entry for 1.5.0 * Bump version to 1.5.0 dev * [report] Tweak datamatrix helper (#12240) * [report] Tweak datamatrix helper - Add support for "rectangular" display - Support different image output formats * Fix unit tests * !feat(backend): bump minimum python version (#12223) * bump ci versions * bump installer version * bump tooling version ref * bump doc refs * bump / refactor code refs * bump debug ref * remove now unneeded deps * bump release version * remove distutils * fix finder call * remove old compat code * add changelog entry * lower cov target for now * Update devcontainer Dockerfile (#12244) - Update to python 3.14 - Fix base packages * Allow stock transfer to merge into existing stock (optional) #6951 (#12022) * working on merge transfer * fix history when merging * update messaging, add 'added' line in history * reworked history logic * removed old transfer logic * remove formatting changes from vite file * Bumped API version, added entry in docs for new global setting * removed the tracking item overwrite, Use existing tracking event from transfer * run pre-commit checks --------- Co-authored-by: Matthias Mair <code@mjmair.com> * New Crowdin translations by GitHub Action (#12238) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Revert devcontainer to python 3.12 (#12249) * Project code active (#12250) * Add 'active' field to the ProjectCode model - Allows retiring of old project codes without deleting * Update UI table * Refactor ProjectCodeField * Add unit test * Bump API version and CHANGELOG * fix js-yaml, esbuild vulns (#12190) * fix js-yaml, esbuild vulns * update bump * upgrade vite * Skip "many" fields in DataExport (#12255) - Exporting multi-dimensional datasets requires a custom exporter * [UI] Improve revision selector (#12254) - Display upstream revisions too * Bug fix for exception handler (#12257) * chore(backend): typing fixes (#12247) * bump ty * various fixes * fix settings * bump stubs * update pre-commit setup * update ignore * fix various issues * fix style * fix ignores * fix wrong ty warnings * ignore __class__ type checking errors see https://github.com/astral-sh/ty/issues/3122 * fix exception logging * update ignoring * bump ty further * add cleanup cmd * Merge branch 'master' of https://github.com/inventree/InvenTree into typechecking-remove-ignore * bump ty * remove now unused class ignores * chore(backend): harden gh setup (#12262) * pin plugin creator version * hard pin install script * chore(backend): dep bump (#12258) * general deps bump * cleanup other dep files * [UI] Stock column fix (#12268) * [UI] Fix StockColumn component * stock table rendering tweaks * chore(backend): Remove devops (#12265) * update sponsored ressources * remove az devops * update sponsored ressources (#12264) * [UI] Table tweaks (#12271) * [UI] Make part cell text copyable * Reduce text size * Reduce text size * [UI] Fix stock dates (#12272) * [UI] Fix stock dates - Display creation date - Display stocktake date * Switch to date type * fix: preserve supplier import stock workflow (#12215) Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * Fix dashboard issue (#12275) * chore(deps): bump the dependencies group with 5 updates (#12278) * chore(deps): bump the dependencies group with 5 updates Bumps the dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `6.0.3` | `7.0.0` | | [oasdiff/oasdiff-action/diff](https://github.com/oasdiff/oasdiff-action) | `0.1.1` | `0.1.3` | | [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `4.17.5` | `4.17.6` | | [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.6` | `0.5.7` | | [pkgr/action/publish](https://github.com/pkgr/action) | `3bce081ae512c5020856e237d37b3f5479d4aa71` | `c5666febcd31750da6428042193fc5b2fb765435` | Updates `actions/checkout` from 6.0.3 to 7.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) Updates `oasdiff/oasdiff-action/diff` from 0.1.1 to 0.1.3 - [Release notes](https://github.com/oasdiff/oasdiff-action/releases) - [Commits](https://github.com/oasdiff/oasdiff-action/compare/5fbe96ede8d0c53aeadef122d7a0abb79152d493...ccc2442df0d99f8c419ed73e3de88641c91b3bc6) Updates `CodSpeedHQ/action` from 4.17.5 to 4.17.6 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/c145068895e045cc725ee76fcd2307624b65c3af...63f3e98b61959fe67f146a3ff022e4136fe9bb9c) Updates `zizmorcore/zizmor-action` from 0.5.6 to 0.5.7 - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) - [Commits](https://github.com/zizmorcore/zizmor-action/compare/5f14fd08f7cf1cb1609c1e344975f152c7ee938d...192e21d79ab29983730a13d1382995c2307fbcaa) Updates `pkgr/action/publish` from 3bce081ae512c5020856e237d37b3f5479d4aa71 to c5666febcd31750da6428042193fc5b2fb765435 - [Release notes](https://github.com/pkgr/action/releases) - [Commits](https://github.com/pkgr/action/compare/3bce081ae512c5020856e237d37b3f5479d4aa71...c5666febcd31750da6428042193fc5b2fb765435) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: oasdiff/oasdiff-action/diff dependency-version: 0.1.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 4.17.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: zizmorcore/zizmor-action dependency-version: 0.5.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pkgr/action/publish dependency-version: c5666febcd31750da6428042193fc5b2fb765435 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * Update checkout action version comment in workflow * fix pins * change pin * fix pin --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * [UI] Fix 'available' display (#12279) - Hide entirely for items not "in_stock" * Fix stocktake bug for counting serialized items (#12280) * Fix stocktake bug for counting serialized items * Add unit test * [UI] Table field refactor (#12274) * Use callback funcs * Don't use idx to identify rows * Add debug function for finding why a component re-rendered * Do not pass 'control' through to each row * Prevent unnecessary re-rendering of table rows * Adjust order of operations for hooks * Keep props hidden * Use lightweight NumberInput * Use NumberInput elsewhere * Add comment * use rowId instead of idx * Generic row memos * Compare errors too * Fix for BomItemSubstituteRow * Adjust more forms * memoize quantity * Memoize build lines * Fix re-rendering issues for build allocation * Fix for useConsumeBuildLinesForm * Fix for transfer order table * Fix useReceiveLineItems * Remove memoized pattern * Fix row keys * Cleanup * Create useStockItems hook for memoizing items * Refactoring * More refactoring * Remove obj reference - preventing shallow comparison from working * Add error message to useWhyDidYouUpdate * Cleanup * Cleanup dead code * Adjust modal width * Change attr name * Remove autoFillFilters prop * Adjustments for serialized stock * Fix typing * Bump frontend version * Adjustments for playwright testing * Fix ref issue * Remove debug entry * Update CHANGELOG.md * Reintroduce index to table header * Refactor common component * Fix for STOCK_COUNT event (#12281) * Fix for STOCK_COUNT event - Prevent double emission of event type string * adjust unit test * Allow stock adjustment from "category" detail view (#12256) * New Crowdin translations by GitHub Action (#12251) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * [UI] Tree select in form fields (#12217) * Add TreeField component * Add chevrons in dropdown menu * Custom node rendering * Add childIdentifier * Ensure full value gets displayed * Fix for search results * Refactor old renderers * Override field types * use definition filters * Better location validation messages * Tweaks * Fix unit test * Include icon * Fix playwright test * Fix call to onValueChange * Updated playwright tests * Use pathstring in selectedLabel (if available) * Mark structural nodes * Retain selected value when dropdown open * Add better placeholder values * Simplify field selection * Check build complete (#12289) * Display non-field errors in table field * Refactor validation for build output completion - Run validation BEFORE trying to complete (serializer validation) - Refactor and simplify common code * Adjust unit tests * Fix typing * Remove debug * Display login errors to user (#12288) * Improved error message extraction * Updated playwright test * Add playwright test for part image upload (#11597) * fix pin syntax (#12287) * fix pin syntax * make pins precise * update target name and version * [UI] Fix imports (#12292) - Adjust import structure - Prevent wall-of-text warnings from vite * [UI] Tweak unique keys (#12293) - Reduce reliance on mutable idx * chore(deps): bump the dependencies group across 1 directory with 27 updates (#12260) * chore(deps): bump the dependencies group across 1 directory with 27 updates Bumps the dependencies group with 27 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@codemirror/search](https://github.com/codemirror/search) | `6.7.0` | `6.7.1` | | [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core) | `6.1.20` | `6.1.21` | | [@fullcalendar/daygrid](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/daygrid) | `6.1.20` | `6.1.21` | | [@fullcalendar/interaction](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/interaction) | `6.1.20` | `6.1.21` | | [@fullcalendar/react](https://github.com/fullcalendar/fullcalendar-react) | `6.1.20` | `6.1.21` | | [@mantine/carousel](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/carousel) | `9.2.1` | `9.3.2` | | [@mantine/charts](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/charts) | `9.2.1` | `9.3.2` | | [@mantine/core](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/core) | `9.2.1` | `9.3.2` | | [@mantine/dates](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dates) | `9.2.1` | `9.3.2` | | [@mantine/dropzone](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dropzone) | `9.2.1` | `9.3.2` | | [@mantine/form](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/form) | `9.2.1` | `9.3.2` | | [@mantine/hooks](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/hooks) | `9.2.1` | `9.3.2` | | [@mantine/modals](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/modals) | `9.2.1` | `9.3.2` | | [@mantine/notifications](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/notifications) | `9.2.1` | `9.3.2` | | [@mantine/spotlight](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/spotlight) | `9.2.1` | `9.3.2` | | [@mantine/vanilla-extract](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/vanilla-extract) | `9.2.1` | `9.3.2` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.57.0` | `10.58.0` | | [mantine-contextmenu](https://github.com/icflorescu/mantine-contextmenu) | `9.2.1` | `9.3.0` | | [mantine-datatable](https://github.com/icflorescu/mantine-datatable) | `9.2.2` | `9.3.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.78.0` | `7.79.0` | | [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.29.7` | `8.0.1` | | [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) | `7.29.7` | `8.0.1` | | [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) | `7.29.7` | `8.0.1` | | [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) | `7.29.7` | `8.0.0` | | [@playwright/test](https://github.com/microsoft/playwright) | `1.60.0` | `1.61.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.9.2` | `25.9.3` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `5.2.0` | `6.0.2` | Updates `@codemirror/search` from 6.7.0 to 6.7.1 - [Changelog](https://github.com/codemirror/search/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/search/commits) Updates `@fullcalendar/core` from 6.1.20 to 6.1.21 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/v6.1.21/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.21/packages/core) Updates `@fullcalendar/daygrid` from 6.1.20 to 6.1.21 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/v6.1.21/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.21/packages/daygrid) Updates `@fullcalendar/interaction` from 6.1.20 to 6.1.21 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/v6.1.21/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.21/packages/interaction) Updates `@fullcalendar/react` from 6.1.20 to 6.1.21 - [Release notes](https://github.com/fullcalendar/fullcalendar-react/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar-react/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar-react/compare/v6.1.20...v6.1.21) Updates `@mantine/carousel` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/carousel) Updates `@mantine/charts` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/charts) Updates `@mantine/core` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/core) Updates `@mantine/dates` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/dates) Updates `@mantine/dropzone` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/dropzone) Updates `@mantine/form` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/form) Updates `@mantine/hooks` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/hooks) Updates `@mantine/modals` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/modals) Updates `@mantine/notifications` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/notifications) Updates `@mantine/spotlight` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/spotlight) Updates `@mantine/vanilla-extract` from 9.2.1 to 9.3.2 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.3.2/packages/@mantine/vanilla-extract) Updates `@sentry/react` from 10.57.0 to 10.58.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.57.0...10.58.0) Updates `mantine-contextmenu` from 9.2.1 to 9.3.0 - [Changelog](https://github.com/icflorescu/mantine-contextmenu/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-contextmenu/commits) Updates `mantine-datatable` from 9.2.2 to 9.3.0 - [Changelog](https://github.com/icflorescu/mantine-datatable/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-datatable/commits) Updates `react-hook-form` from 7.78.0 to 7.79.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.78.0...v7.79.0) Updates `@babel/core` from 7.29.7 to 8.0.1 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v8.0.1/packages/babel-core) Updates `@babel/preset-react` from 7.29.7 to 8.0.1 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v8.0.1/packages/babel-preset-react) Updates `@babel/preset-typescript` from 7.29.7 to 8.0.1 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v8.0.1/packages/babel-preset-typescript) Updates `@babel/runtime` from 7.29.7 to 8.0.0 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v8.0.0/packages/babel-runtime) Updates `@playwright/test` from 1.60.0 to 1.61.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.60.0...v1.61.0) Updates `@types/node` from 25.9.2 to 25.9.3 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vitejs/plugin-react` from 5.2.0 to 6.0.2 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.2/packages/plugin-react) --- updated-dependencies: - dependency-name: "@codemirror/search" dependency-version: 6.7.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fullcalendar/core" dependency-version: 6.1.21 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fullcalendar/daygrid" dependency-version: 6.1.21 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fullcalendar/interaction" dependency-version: 6.1.21 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fullcalendar/react" dependency-version: 6.1.21 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/carousel" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/charts" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/core" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dates" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dropzone" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/form" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/hooks" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/modals" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/notifications" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/spotlight" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/vanilla-extract" dependency-version: 9.3.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.58.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: mantine-contextmenu dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: mantine-datatable dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.79.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@babel/core" dependency-version: 8.0.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@babel/preset-react" dependency-version: 8.0.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@babel/preset-typescript" dependency-version: 8.0.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@babel/runtime" dependency-version: 8.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@playwright/test" dependency-version: 1.61.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 25.9.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@vitejs/plugin-react" dependency-version: 6.0.2 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * lower @vitejs/plugin-react * fix matching * temp fix for the non-loading of plugin settings * remove loading badge for now * fix test * make test more precise * fix syntax * fix memo issues * remove wasLoaded hack --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * fix test assumption (#12296) * [API] Refactor API for duplicating objects (#12294) * Implement generic serializer for custom model duplication * Apply pattern to BuildOrder * Add more generic options * Bump API version * Adjust default option * Refactor existing implementations * Dynamic class typing * Add duplicate field to more model types - Company - ManufacturerPart - SupplierPart - SalesOrderShipment * Implement parameter duplication for more models: - Company - ManufacturerPart - SupplierPart * Simplify code * Refactor * [UI] Snippet editor (#12299) * Implement admin editor for report snippets * Report asset management * Add playwright test for report snippets * Add playwright test for "Report Assets" panel * Updated docs * [UI] Add "IPN" column to installed items table (#12297) * [docs] Report helper docs (#12300) * [docs] Report helper docs * Split out docs for assets and snippets * Updates * [db] Fix for UUID fields (#12301) * Fix OpenAPI multipart file fields to use binary format (#12298) * Fix OpenAPI multipart file fields to use binary format Fixes #11246 * Update API version * fix api version --------- Co-authored-by: Matthias Mair <code@mjmair.com> * reduce duplication (#12302) * [UI] Pricing override (#12306) * Correct display of pricing overrides * Add min/max override reference lines * Fix BarChart component * [feature] Consumable part (#12295) * Add "consumable" field to the Part model * Add frontend integration * Add badge * Add docs * Updated docs * Add API filtering for new field * Adjust API filters * Update backend logic * Adjust frontend * Additional unit tests * Update API version * update test * Add consumable icon --------- Co-authored-by: Matthias Mair <code@mjmair.com> * Order click-through on pricing panel (#12307) * Pricing bugs (#12305) * bug fix for get_price method - Remove unused argument moq - Allow case where 'multiples' = False * Error handling for convert_to * Error handling for PartPricing.save * Remove unused function * Revert function definition * coverage ignore * Add --keep option to setup-test task (#12308) Allow keeping existing data * Table refactor (#12309) * Refactor table components - Move underlying components into src/components/tables - Actual table implementation stay in src/tables * Fix vite warnings * chore(deps): bump python in /contrib/container (#12276) Bumps python from `44dd044` to `b877e50`. --- updated-dependencies: - dependency-name: python dependency-version: 3.14.6-slim-trixie dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group across 1 directory with 31 updates (#12316) Bumps the dependencies group with 31 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@codemirror/language](https://github.com/codemirror/language) | `6.12.3` | `6.12.4` | | [@codemirror/state](https://github.com/codemirror/state) | `6.6.0` | `6.7.0` | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.1` | `6.43.4` | | [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) | `7.2.0` | `7.3.0` | | [@fortawesome/free-regular-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.2.0` | `7.3.0` | | [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.2.0` | `7.3.0` | | [@mantine/carousel](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/carousel) | `9.3.2` | `9.4.1` | | [@mantine/charts](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/charts) | `9.3.2` | `9.4.1` | | [@mantine/core](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/core) | `9.3.2` | `9.4.1` | | [@mantine/dates](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dates) | `9.3.2` | `9.4.1` | | [@mantine/dropzone](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dropzone) | `9.3.2` | `9.4.1` | | [@mantine/form](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/form) | `9.3.2` | `9.4.1` | | [@mantine/hooks](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/hooks) | `9.3.2` | `9.4.1` | | [@mantine/modals](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/modals) | `9.3.2` | `9.4.1` | | [@mantine/notifications](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/notifications) | `9.3.2` | `9.4.1` | | [@mantine/spotlight](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/spotlight) | `9.3.2` | `9.4.1` | | [@mantine/vanilla-extract](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/vanilla-extract) | `9.3.2` | `9.4.1` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.58.0` | `10.62.0` | | [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.101.0` | `5.101.2` | | [@vanilla-extract/css](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/css) | `1.20.1` | `1.21.0` | | [mantine-contextmenu](https://github.com/icflorescu/mantine-contextmenu) | `9.3.0` | `9.3.1` | | [mantine-datatable](https://github.com/icflorescu/mantine-datatable) | `9.3.0` | `9.3.1` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.79.0` | `7.80.0` | | [recharts](https://github.com/recharts/recharts) | `3.8.1` | `3.9.0` | | [styled-components](https://github.com/styled-components/styled-components) | `6.4.2` | `6.4.3` | | [@flakiness/playwright](https://github.com/flakiness/playwright) | `1.15.0` | `1.16.0` | | [@playwright/test](https://github.com/microsoft/playwright) | `1.61.0` | `1.61.1` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.9.3` | `26.0.1` | | [@vanilla-extract/vite-plugin](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/vite-plugin) | `5.2.2` | `5.2.3` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `7.3.5` | `7.3.6` | | [vite-plugin-dts](https://github.com/qmhc/unplugin-dts/tree/HEAD/packages/vite-plugin-dts) | `5.0.2` | `5.0.3` | Updates `@codemirror/language` from 6.12.3 to 6.12.4 - [Changelog](https://github.com/codemirror/language/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/language/commits) Updates `@codemirror/state` from 6.6.0 to 6.7.0 - [Changelog](https://github.com/codemirror/state/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/state/commits) Updates `@codemirror/view` from 6.43.1 to 6.43.4 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@fortawesome/fontawesome-svg-core` from 7.2.0 to 7.3.0 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.2.0...7.3.0) Updates `@fortawesome/free-regular-svg-icons` from 7.2.0 to 7.3.0 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.2.0...7.3.0) Updates `@fortawesome/free-solid-svg-icons` from 7.2.0 to 7.3.0 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.2.0...7.3.0) Updates `@mantine/carousel` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/carousel) Updates `@mantine/charts` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/charts) Updates `@mantine/core` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/core) Updates `@mantine/dates` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/dates) Updates `@mantine/dropzone` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/dropzone) Updates `@mantine/form` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/form) Updates `@mantine/hooks` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/hooks) Updates `@mantine/modals` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/modals) Updates `@mantine/notifications` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/notifications) Updates `@mantine/spotlight` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/spotlight) Updates `@mantine/vanilla-extract` from 9.3.2 to 9.4.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.4.1/packages/@mantine/vanilla-extract) Updates `@sentry/react` from 10.58.0 to 10.62.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.58.0...10.62.0) Updates `@tanstack/react-query` from 5.101.0 to 5.101.2 - [Release notes](https://github.com/TanStack/query/releases) - [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md) - [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.2/packages/react-query) Updates `@vanilla-extract/css` from 1.20.1 to 1.21.0 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/css/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/css@1.21.0/packages/css) Updates `mantine-contextmenu` from 9.3.0 to 9.3.1 - [Changelog](https://github.com/icflorescu/mantine-contextmenu/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-contextmenu/commits) Updates `mantine-datatable` from 9.3.0 to 9.3.1 - [Changelog](https://github.com/icflorescu/mantine-datatable/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-datatable/commits) Updates `react-hook-form` from 7.79.0 to 7.80.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.79.0...v7.80.0) Updates `recharts` from 3.8.1 to 3.9.0 - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v3.8.1...v3.9.0) Updates `styled-components` from 6.4.2 to 6.4.3 - [Release notes](https://github.com/styled-components/styled-components/releases) - [Commits](https://github.com/styled-components/styled-components/compare/styled-components@6.4.2...styled-components@6.4.3) Updates `@flakiness/playwright` from 1.15.0 to 1.16.0 - [Release notes](https://github.com/flakiness/playwright/releases) - [Commits](https://github.com/flakiness/playwright/compare/v1.15.0...v1.16.0) Updates `@playwright/test` from 1.61.0 to 1.61.1 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.61.0...v1.61.1) Updates `@types/node` from 25.9.3 to 26.0.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vanilla-extract/vite-plugin` from 5.2.2 to 5.2.3 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/vite-plugin/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/vite-plugin@5.2.3/packages/vite-plugin) Updates `vite` from 7.3.5 to 7.3.6 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.3.6/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.3.6/packages/vite) Updates `vite-plugin-dts` from 5.0.2 to 5.0.3 - [Release notes](https://github.com/qmhc/unplugin-dts/releases) - [Changelog](https://github.com/qmhc/unplugin-dts/blob/main/packages/vite-plugin-dts/CHANGELOG.md) - [Commits](https://github.com/qmhc/unplugin-dts/commits/vite-plugin-dts@5.0.3/packages/vite-plugin-dts) --- updated-dependencies: - dependency-name: "@codemirror/language" dependency-version: 6.12.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@codemirror/state" dependency-version: 6.7.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@codemirror/view" dependency-version: 6.43.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fortawesome/fontawesome-svg-core" dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@fortawesome/free-regular-svg-icons" dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@fortawesome/free-solid-svg-icons" dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/carousel" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/charts" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/core" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dates" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dropzone" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/form" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/hooks" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/modals" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/notifications" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/spotlight" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/vanilla-extract" dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.62.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@tanstack/react-query" dependency-version: 5.101.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@vanilla-extract/css" dependency-version: 1.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: mantine-contextmenu dependency-version: 9.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: mantine-datatable dependency-version: 9.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.80.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: recharts dependency-version: 3.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: styled-components dependency-version: 6.4.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@flakiness/playwright" dependency-version: 1.16.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@playwright/test" dependency-version: 1.61.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 26.0.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@vanilla-extract/vite-plugin" dependency-version: 5.2.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: vite dependency-version: 7.3.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: vite-plugin-dts dependency-version: 5.0.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * New Crowdin translations by GitHub Action (#12284) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group with 4 updates (#12312) Bumps the dependencies group with 4 updates: [actions/setup-python](https://github.com/actions/setup-python), [actions/cache](https://github.com/actions/cache), [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) and [CodSpeedHQ/action](https://github.com/codspeedhq/action). Updates `actions/setup-python` from 6.2.0 to 6.3.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/a309ff8b426b58ec0e2a45f0f869d46889d02405...ece7cb06caefa5fff74198d8649806c4678c61a1) Updates `actions/cache` from 5.0.5 to 6.1.0 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab90386fccae...55cc8345863c7cc4c66a329aec7e433d2d1c52a9) Updates `stefanzweifel/git-auto-commit-action` from 7.1.0 to 7.2.0 - [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases) - [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/04702edda442b2e678b25b537cec683a1493fcb9...4a55954c782fc1ea30b9056cd3e7a2b40ca8887d) Updates `CodSpeedHQ/action` from 4.17.6 to 4.18.1 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/63f3e98b61959fe67f146a3ff022e4136fe9bb9c...a4a36bb07c0638b0b4ca52bf1f3dad1b4289e52f) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: actions/cache dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: stefanzweifel/git-auto-commit-action dependency-version: 7.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 4.18.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [bug] Barcode bug fix (#12319) * [bug] Check for null line_item when receiving items * Additional unit testing * Additional context * Fix tests * Fix for stocktake exporter (#12324) * Robustify playwright tests (#12331) * Robustify playwright tests * More test tweaks * [UI] Add form submission shortcut (#12328) - Ctrl + enter submits the form * Fix currency choices for PartPricing model (#12336) * Fix currency choices for PartPricing model - Remove dynamic choices from model definition - Move validation step to the serializer - Add validator to ensure only valid currencies can be used * Add regression test * Bump API version * Fix notes on part creation (#12332) Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * [bug] Plugin load fix (#12329) * Update plugin name * Backup accessor for plugin name * Add null check for plg_db * Adjust default behavior of "migrate" command (#12320) * Adjust default behavior of "migrate" command - Does not create new migration files automatically * Add dummy field - ensure detected by CI * Revert "Add dummy field - ensure detected by CI" This reverts commite7a101fe87. * Fix typo * Adjust contributing docs * Add CHANGELOG entry * Import internal price (#12341) * Enable download from frontend panels * Enable data import for part internal pricing * Bump API version * Update CHANGELOG * [UI] Docs links (#12342) * Simplify navigation links * simplify version.py * Simplify docs links * Consolidate * [docs] Admin docs (#12345) * Enhanced documentation for admin center and django-admin * Fix links and wording * remove placeholders * Fix links * Fix more links * Currency options fix (#12343) - Ensure currency options are loaded dynamically * Add IPN column to BOM pricing panel (#12344) * [UI] Form fix (#12348) * Refactor API form fields - Prevent reconstruction of all fields when single value changes - Memoize components more intelligently - Fix enter key callback ref * memoize other field types too * More memo * Prevent duplicate API calls for related model field * Add aria-label for IconField * add playwright tests for form field coverage * [UI] Page Load Improvements (#12334) * Parallel initial requests * Remove debouncing * Refactor lazy loading of desktop / mobile view * Reduce initial waiting for loadable components * Fix duplication of API calls * Further reduce duplicate calls * Combine user roles into /user/me/ endpoint * lazy load global import drawer * lazy load table in plugin context * Patch ScanButton * Added playwright tests for login * Adjust thresholds * Bug fixes for PO receive (#12349) * Bug fixes for PO receive - Fix shadowed variable - Notify listeners for all received items * Cache part subs * Improved error context (#12350) - More useful error messaging if a task fails * Fix data import bug (#12355) - Fixes bug where imported data headers get out of sync - Additional unit tests * Remove dead pricing code on Part model (#12357) * [refactor] Refactor StockItem methods (#12358) * Refactor StockItem methods - Refactor out common functionality - Code cleanup * Cleanup * Prevent override of existing deltas * [feature] Break apart assemblies (#12310) * Implement API endpoint for stock disassembly * Add basic frontend implementation * Adjust required user permission * Add preFormContent * Read-only if serialized * Adjust location and status of each subcomponent * Handle null value * display installed items in frontend form * More unit tests * Traceability * Add docs * Exclude virtual / consumable stock * Additional docs * Added bundled items docs * More docs * more docs tweaks * Updated part docs * Add playwright tests * Robustify test * suppress certain warnings in schema * Adjust playwright tests * bug fix * Tweak playwright tests * [refactor] Bulk actions (#12359) * Add helper to bulk offload task * bulk offload events * Add unit test for bulk_offload_task * Add context wrapper for bulk event creation inside looped funcs * Add batching for stock tracking events * Context wrapper for capturing offloaded tasks * apply batching to other stock adjustment endpoints * Add benchmarking tests for other API endpoints * Benchmark test for serialize stock * Reduce commet verbosity * Apply benchmark to PO receive * Refactor benchmarking * PrefetchedPrimaryKeyRelatedField - Provides O(1) lookup for serializer validation - Significant improvements for large datasets * Adjust unit test code * Check for correct order of tracking operations * [UI] Preview Drawer (#12117) * Add <GlobalPreviewDrawer> component * Allow plugins to interact * provide either pk or instance data * open preview drawer from calendar views * Launch preview drawer directly from tables * Add preview types * Fix types * CLear data on close * Fix transition * Allow caller to pass preview component * AttributeGrid * Use a table component * Display info items * Navigate to detail page from drawer * Updates * Refactor to use part detail view * Display parameters * Fix image caching * Apply same to StockItem * Remove old component * Refactor details grid component * Preview panel for PurchaseOrder model * Implement for SalesOrder * Support ReturnOrder * SupplierPart and ManufacturerPart * Support preview in parameteric tables * support Company and BuildOrder * Fix numbervalue * BuildOrder and SalesOrderShipment * location and category * add user setting * Fix typing * Handle link clicks within preview drawer * fixes * Implement onClose callback * Handle row click when panel preview is disabled * Support custom detail links * update playwright tests * UI tweaks * Add CHANGELOG entry * docs * define default API params per model type * Split out more docs pages * Simplify state ref * Refactoring * Simplify PreviewDrawer component * observe user setting in calendar view * Enable PreviewDrawer from RowViewAction * Push render functions onto ModelInformation dict * Fix lib compilation * Refactor internal uses of RowViewAction * typescript fixes * Simplify PreviewDrawer component structure * remove TODO placeholders * [bug] prevent double-complete of shipments (#12366) * [bug] Transfer order fixes (#12367) * Handle failed transfer order transaction * Prevent duplicate completion of transfer order * Progressive falloff for delay (#12369) * Prevent duplicate receive operation on ReturnOrder (#12368) * [refactor] Remove MPTT mixin from StockItem model (#12360) * Remove MPTT from StockItem model * cleanup stock fixture file * Remove tree rebuild code for StockItem * Adjust API * Update CHANGELOG and API version * remove tree references * Additional checks * Remove unused tests * Add data migration test * fix fk fields * Cleanup * Tweak unit test * Revert bulk-create in unit test * Don't rebuild StockItem models * Add bulk_create_and_fetch helper model - Overcome limitations of mysql * Add unit test for new bulk-create helper * Apply new helper to codebase * Adjust unit test * bug fix * Adjust query limits * Remove assert * [bug] Child fix (#12374) * Remove outdated helper * Fix children prop and add regression test * Hardening build outputs (#12376) - ensure outputs cannot be double completed * fix concurrent update issues (#12380) - Ensure database values are used for delta updates - Regression tests * use new helper func (#12373) * Uninstall fix (#12378) * Prevent uninstall into structural location * Regression tests * [bug] Quantity fixes (#12375) - Ensure valid quantity values on stock operations - Regression testing * [refactor] SalesOrder allocation fixes (#12379) * Use API for unit test * Refactor SalesOrderSerialAllocationSerializer - Move business logic into the SalesOrder model * Add unit testing for serial allocation * Apply row-level locking when updating stock item quantity (#12385) * Prevent duplication completion of ReturnOrder (#12386) * Fix for BuildItem with zero quantity (#12387) * [feature] Unique parameters (#12388) * Add uniqueness requirement for parameter values * Add documentation * Do not copy unique parameters * Updated playwright tests * Enhanced validation checks for uniqueness * Update documentation * Update CHANGELOG * Bump API version * Bug fixes (#12365) * Bug fixes: - Enforce serial number requirements when receiving items - Stricter merge checking - Fix count-into-location bug - Unit testing * Additional unit tests * Fix StockItem parent update on delete (#12377) * Fix StockItem parent update on delete * Check for null parents * Add revision to SO and BO tables (#12398) * Add a Revision column renderer * Add Revision to SO and BO tables * Move Description column after IPN and Revision to be consistent with other tables * [bug] Tree parent fix (#12401) * Refactor * row locking on bulk-update * Rebuild tree in background task * Regression testing * Fix unit test * Allow more generous timeout * Bulk delete line items (#12391) * Add bulk-delete mixin for order line items * Add unit tests * Enable frontend support * Add CHANGELOG entry * Add locking control for TransferOrder * Fix playwright tests * Fix playwright tests * prevent duplicate save event when creating a part (#12406) * Bulk create events (#12405) * Add initial benchmark test * Enable event batching for BulkdCreate API mixin * Fix duplicate save event for Parameter * Apply event batching for bulk_update * Similar testing for bulk_delete * [UI] Display error information in boundary (#12403) * Display error information in boundary * Fix SecurityContext * New Crowdin translations by GitHub Action (#12318) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix docs reqs (#12407) * bump soupsieve * general deps bump * feat(ui): show variant stock indicator in parts table (#5959) (#12413) * Fix update notification deduplication and release link (#12424) * New Crowdin translations by GitHub Action (#12408) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Fix creation date formatting on part detail page (#12423) Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * fix(ui): show initial stock fields when PART_CREATE_INITIAL enabled (#12415) * fix(ui): show initial stock fields when PART_CREATE_INITIAL enabled (#12266) * Fix Docker setup for local Windows deployment. Disable Redis disk persistence to avoid bind-mount permission errors that caused login 500s, and configure localhost as the default site URL. * Apply Biome formatting to Playwright test file. Fixes Style [prek] CI failure on PR #12415. * Use specific locators in initial stock Playwright tests. Avoid strict-mode violations from getByText('Initial Stock') matching multiple form elements. * Scope initial stock Playwright test to part detail Stock tab. Avoid strict-mode violations from duplicate Stock tabs on the part page. * Use raw SQL inserts in MPTT migration test setup. Avoid duplicate status_custom_key ORM bug in historical StockItem models. * [feature] Line discount (#12393) * Add "discount" support to order line items * Fix total_price annotation for ExtraLineItem * Add regression tests * Add frontend support * Updated documentation * Added docs * Bump API version and CHANGELOG * Remove 'total_price' annotation - Can be achieved using in-memory python methods * Apply fix for migration testing * Revert "Apply fix for migration testing" This reverts commit8d9f2dce8c. * Different approach * Adjust playwright threshold * Improve request caching for plugin config objects (#12430) * Improve request caching for plugin config objects * Cache configs dict further * New Crowdin translations by GitHub Action (#12425) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * [bug] Bom table fix (#12436) * Fix logic for table context menu * Memoize handleCellContextMenu * Locking fixes (#12435) * Secure row locks when trimming allocated stock * Secure row locks when completing a SalesOrder * Regression testing * Further improvements and regression testing * Ignore locking test for sqlite * chore(deps): bump the dependencies group across 1 directory with 9 updates (#12428) Bumps the dependencies group with 9 updates in the / directory: | Package | From | To | | --- | --- | --- | | [dorny/paths-filter](https://github.com/dorny/paths-filter) | `4.0.1` | `4.0.2` | | [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) | `4.1.0` | `4.2.0` | | [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `4.1.0` | `4.2.0` | | [docker/login-action](https://github.com/docker/login-action) | `4.2.0` | `4.4.0` | | [docker/metadata-action](https://github.com/docker/metadata-action) | `6.1.0` | `6.2.0` | | [oasdiff/oasdiff-action/diff](https://github.com/oasdiff/oasdiff-action) | `3e9d440d37f468355457604348009f50e0cddbf3` | `024f6c399f9a21ada1addb0f9a36ce1bfac995f1` | | [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `4.18.1` | `4.18.5` | | [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.36.2` | `4.37.0` | | [actions/stale](https://github.com/actions/stale) | `10.3.0` | `10.4.0` | Updates `dorny/paths-filter` from 4.0.1 to 4.0.2 - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](https://github.com/dorny/paths-filter/compare/fbd0ab8f3e69293af611ebaee6363fc25e6d187d...7b450fff21473bca461d4b92ce414b9d0420d706) Updates `docker/setup-qemu-action` from 4.1.0 to 4.2.0 - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/06116385d9baf250c9f4dcb4858b16962ea869c3...96fe6ef7f33517b61c61be40b68a1882f3264fb8) Updates `docker/setup-buildx-action` from 4.1.0 to 4.2.0 - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5...bb05f3f5519dd87d3ba754cc423b652a5edd6d2c) Updates `docker/login-action` from 4.2.0 to 4.4.0 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/650006c6eb7dba73a995cc03b0b2d7f5ca915bee...af1e73f918a031802d376d3c8bbc3fe56130a9b0) Updates `docker/metadata-action` from 6.1.0 to 6.2.0 - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9...dc802804100637a589fabce1cb79ff13a1411302) Updates `oasdiff/oasdiff-action/diff` from 3e9d440d37f468355457604348009f50e0cddbf3 to 024f6c399f9a21ada1addb0f9a36ce1bfac995f1 - [Release notes](https://github.com/oasdiff/oasdiff-action/releases) - [Commits](https://github.com/oasdiff/oasdiff-action/compare/3e9d440d37f468355457604348009f50e0cddbf3...024f6c399f9a21ada1addb0f9a36ce1bfac995f1) Updates `CodSpeedHQ/action` from 4.18.1 to 4.18.5 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/a4a36bb07c0638b0b4ca52bf1f3dad1b4289e52f...f99becdce5e5d51fd556489ebef684f4ecfd6286) Updates `github/codeql-action/upload-sarif` from 4.36.2 to 4.37.0 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...99df26d4f13ea111d4ec1a7dddef6063f76b97e9) Updates `actions/stale` from 10.3.0 to 10.4.0 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899...1e223db275d687790206a7acac4d1a11bd6fe629) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-version: 4.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: docker/setup-qemu-action dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: docker/setup-buildx-action dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: docker/login-action dependency-version: 4.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: docker/metadata-action dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: oasdiff/oasdiff-action/diff dependency-version: 024f6c399f9a21ada1addb0f9a36ce1bfac995f1 dependency-type: direct:production dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 4.18.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: actions/stale dependency-version: 10.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Read report/label templates in binary mode (#12432) * Read report/label templates in binary mode file_from_template read the template in text mode and wrapped the string in a ContentFile. The ContentFile size then reflected the character count, which differs from the UTF-8 byte length for any template that contains multi-byte characters. Strict S3 implementations such as Backblaze B2 validate the Content-Length header and reject the upload with an IncompleteBody error. AWS S3 tolerates the mismatch, so the problem is not visible there. inventree_transfer_order_report.html is 1458 characters but 1460 bytes. Its upload fails during create_default_reports, the transaction rolls back, and the default template is recreated and fails again on every startup. Use Path.read_bytes() so the ContentFile size matches the uploaded bytes and the file handle is closed. Add a regression test asserting the size equals the file's byte length. * Test file_from_template across text encodings * chore(deps): bump brace-expansion from 5.0.6 to 5.0.7 in /src/frontend (#12439) Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.6 to 5.0.7. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.6...v5.0.7) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 5.0.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump pillow from 12.2.0 to 12.3.0 in /src/backend (#12438) * chore(deps): bump pillow from 12.2.0 to 12.3.0 in /src/backend Bumps [pillow](https://github.com/python-pillow/Pillow) from 12.2.0 to 12.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.2.0...12.3.0) --- updated-dependencies: - dependency-name: pillow dependency-version: 12.3.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump the dependencies group across 2 directories with 22 updates (#12417) * chore(deps): bump the dependencies group across 2 directories with 22 updates Bumps the dependencies group with 1 update in the /docs directory: [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings). Bumps the dependencies group with 21 updates in the /src/backend directory: | Package | From | To | | --- | --- | --- | | [blessed](https://github.com/jquast/blessed) | `1.44.0` | `1.47.0` | | [boto3](https://github.com/boto/boto3) | `1.43.36` | `1.43.45` | | [botocore](https://github.com/boto/botocore) | `1.43.36` | `1.43.45` | | [cffi](https://github.com/python-cffi/cffi) | `2.0.0` | `2.1.0` | | [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.4.7` | `3.4.9` | | [drf-spectacular](https://github.com/tfranzel/drf-spectacular) | `0.29.0` | `0.30.0` | | [dulwich](https://github.com/dulwich/dulwich) | `1.2.6` | `1.2.10` | | [fido2](https://github.com/Yubico/python-fido2) | `2.2.0` | `2.2.1` | | [grpcio](https://github.com/grpc/grpc) | `1.81.1` | `1.82.1` | | [jinxed](https://github.com/Rockhopper-Technologies/jinxed) | `2.0.4` | `2.1.0` | | [pillow](https://github.com/python-pillow/Pillow) | `12.2.0` | `12.3.0` | | [python-fsutil](https://github.com/fabiocaccamo/python-fsutil) | `0.16.1` | `0.17.0` | | [rpds-py](https://github.com/crate-py/rpds) | `2026.5.1` | `2026.6.3` | | [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.63.0` | `2.64.0` | | [setuptools](https://github.com/pypa/setuptools) | `82.0.1` | `83.0.0` | | [tqdm](https://github.com/tqdm/tqdm) | `4.68.3` | `4.68.4` | | [typing-extensions](https://github.com/python/typing_extensions) | `4.15.0` | `4.16.0` | | [tzdata](https://github.com/python/tzdata) | `2026.2` | `2026.3` | | [wcwidth](https://github.com/jquast/wcwidth) | `0.8.1` | `0.8.2` | | [coverage](https://github.com/coveragepy/coveragepy) | `7.14.3` | `7.15.0` | | [prek](https://github.com/j178/prek) | `0.4.5` | `0.4.8` | Updates `mkdocstrings` from 1.0.4 to 1.0.5 - [Release notes](https://github.com/mkdocstrings/mkdocstrings/releases) - [Changelog](https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/mkdocstrings/compare/1.0.4...1.0.5) Updates `blessed` from 1.44.0 to 1.47.0 - [Release notes](https://github.com/jquast/blessed/releases) - [Changelog](https://github.com/jquast/blessed/blob/master/docs/history.rst) - [Commits](https://github.com/jquast/blessed/commits) Updates `boto3` from 1.43.36 to 1.43.45 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.43.36...1.43.45) Updates `botocore` from 1.43.36 to 1.43.45 - [Commits](https://github.com/boto/botocore/compare/1.43.36...1.43.45) Updates `cffi` from 2.0.0 to 2.1.0 - [Release notes](https://github.com/python-cffi/cffi/releases) - [Commits](https://github.com/python-cffi/cffi/compare/v2.0.0...v2.1.0) Updates `charset-normalizer` from 3.4.7 to 3.4.9 - [Release notes](https://github.com/jawah/charset_normalizer/releases) - [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md) - [Commits](https://github.com/jawah/charset_normalizer/compare/3.4.7...3.4.9) Updates `drf-spectacular` from 0.29.0 to 0.30.0 - [Release notes](https://github.com/tfranzel/drf-spectacular/releases) - [Changelog](https://github.com/tfranzel/drf-spectacular/blob/master/CHANGELOG.rst) - [Commits](https://github.com/tfranzel/drf-spectacular/compare/0.29.0...0.30.0) Updates `dulwich` from 1.2.6 to 1.2.10 - [Release notes](https://github.com/dulwich/dulwich/releases) - [Changelog](https://github.com/jelmer/dulwich/blob/main/NEWS) - [Commits](https://github.com/dulwich/dulwich/compare/dulwich-1.2.6...dulwich-1.2.10) Updates `fido2` from 2.2.0 to 2.2.1 - [Release notes](https://github.com/Yubico/python-fido2/releases) - [Changelog](https://github.com/Yubico/python-fido2/blob/main/NEWS) - [Commits](https://github.com/Yubico/python-fido2/compare/2.2.0...2.2.1) Updates `grpcio` from 1.81.1 to 1.82.1 - [Release notes](https://github.com/grpc/grpc/releases) - [Commits](https://github.com/grpc/grpc/compare/v1.81.1...v1.82.1) Updates `jinxed` from 2.0.4 to 2.1.0 - [Release notes](https://github.com/Rockhopper-Technologies/jinxed/releases) - [Commits](https://github.com/Rockhopper-Technologies/jinxed/compare/2.0.4...2.1.0) Updates `pillow` from 12.2.0 to 12.3.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.2.0...12.3.0) Updates `python-fsutil` from 0.16.1 to 0.17.0 - [Release notes](https://github.com/fabiocaccamo/python-fsutil/releases) - [Changelog](https://github.com/fabiocaccamo/python-fsutil/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabiocaccamo/python-fsutil/compare/0.16.1...0.17.0) Updates `rpds-py` from 2026.5.1 to 2026.6.3 - [Release notes](https://github.com/crate-py/rpds/releases) - [Changelog](https://github.com/crate-py/rpds/blob/main/release.toml) - [Commits](https://github.com/crate-py/rpds/compare/v2026.5.1...v2026.6.3) Updates `sentry-sdk` from 2.63.0 to 2.64.0 - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.63.0...2.64.0) Updates `setuptools` from 82.0.1 to 83.0.0 - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v82.0.1...v83.0.0) Updates `tqdm` from 4.68.3 to 4.68.4 - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.68.3...v4.68.4) Updates `typing-extensions` from 4.15.0 to 4.16.0 - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.15.0...4.16.0) Updates `tzdata` from 2026.2 to 2026.3 - [Release notes](https://github.com/python/tzdata/releases) - [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md) - [Commits](https://github.com/python/tzdata/compare/2026.2...2026.3) Updates `wcwidth` from 0.8.1 to 0.8.2 - [Release notes](https://github.com/jquast/wcwidth/releases) - [Commits](https://github.com/jquast/wcwidth/compare/0.8.1...0.8.2) Updates `coverage` from 7.14.3 to 7.15.0 - [Release notes](https://github.com/coveragepy/coveragepy/releases) - [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst) - [Commits](https://github.com/coveragepy/coveragepy/compare/7.14.3...7.15.0) Updates `prek` from 0.4.5 to 0.4.8 - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.4.5...v0.4.8) --- updated-dependencies: - dependency-name: mkdocstrings dependency-version: 1.0.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: blessed dependency-version: 1.47.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: boto3 dependency-version: 1.43.45 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: botocore dependency-version: 1.43.45 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: cffi dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: charset-normalizer dependency-version: 3.4.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: drf-spectacular dependency-version: 0.30.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: dulwich dependency-version: 1.2.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: fido2 dependency-version: 2.2.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: grpcio dependency-version: 1.82.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: jinxed dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: pillow dependency-version: 12.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: python-fsutil dependency-version: 0.17.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: rpds-py dependency-version: 2026.6.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: sentry-sdk dependency-version: 2.64.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: setuptools dependency-version: 83.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: tqdm dependency-version: 4.68.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: typing-extensions dependency-version: 4.16.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: tzdata dependency-version: '2026.3' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: wcwidth dependency-version: 0.8.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: coverage dependency-version: 7.15.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: prek dependency-version: 0.4.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style * lower drf-spectacular to remove api diff --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * Fix typo in terminology.md (#12452) Corrected the spelling of 'shelf life' in the IMS section. * Fix admin search for Address and Contact models (#12440) * chore(deps): bump dompurify from 3.4.11 to 3.4.12 in /src/frontend (#12448) Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.11 to 3.4.12. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.11...3.4.12) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.12 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * general deps bump (#12409) * chore(deps): bump the dependencies group across 1 directory with 13 updates Bumps the dependencies group with 13 updates in the /src/backend directory: | Package | From | To | | --- | --- | --- | | [coverage](https://github.com/coveragepy/coveragepy) | `7.14.3` | `7.15.0` | | [prek](https://github.com/j178/prek) | `0.4.5` | `0.4.6` | | [typing-extensions](https://github.com/python/typing_extensions) | `4.15.0` | `4.16.0` | | [blessed](https://github.com/jquast/blessed) | `1.44.0` | `1.45.0` | | [boto3](https://github.com/boto/boto3) | `1.43.36` | `1.43.40` | | [botocore](https://github.com/boto/botocore) | `1.43.36` | `1.43.40` | | [dulwich](https://github.com/dulwich/dulwich) | `1.2.6` | `1.2.7` | | [fido2](https://github.com/Yubico/python-fido2) | `2.2.0` | `2.2.1` | | [jinxed](https://github.com/Rockhopper-Technologies/jinxed) | `2.0.4` | `2.1.0` | | [pillow](https://github.com/python-pillow/Pillow) | `12.2.0` | `12.3.0` | | [rpds-py](https://github.com/crate-py/rpds) | `2026.5.1` | `2026.6.3` | | [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.63.0` | `2.64.0` | | [wcwidth](https://github.com/jquast/wcwidth) | `0.8.1` | `0.8.2` | Updates `coverage` from 7.14.3 to 7.15.0 - [Release notes](https://github.com/coveragepy/coveragepy/releases) - [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst) - [Commits](https://github.com/coveragepy/coveragepy/compare/7.14.3...7.15.0) Updates `prek` from 0.4.5 to 0.4.6 - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.4.5...v0.4.6) Updates `typing-extensions` from 4.15.0 to 4.16.0 - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.15.0...4.16.0) Updates `blessed` from 1.44.0 to 1.45.0 - [Release notes](https://github.com/jquast/blessed/releases) - [Changelog](https://github.com/jquast/blessed/blob/master/docs/history.rst) - [Commits](https://github.com/jquast/blessed/commits) Updates `boto3` from 1.43.36 to 1.43.40 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.43.36...1.43.40) Updates `botocore` from 1.43.36 to 1.43.40 - [Commits](https://github.com/boto/botocore/compare/1.43.36...1.43.40) Updates `dulwich` from 1.2.6 to 1.2.7 - [Release notes](https://github.com/dulwich/dulwich/releases) - [Changelog](https://github.com/jelmer/dulwich/blob/main/NEWS) - [Commits](https://github.com/dulwich/dulwich/compare/dulwich-1.2.6...dulwich-1.2.7) Updates `fido2` from 2.2.0 to 2.2.1 - [Release notes](https://github.com/Yubico/python-fido2/releases) - [Changelog](https://github.com/Yubico/python-fido2/blob/main/NEWS) - [Commits](https://github.com/Yubico/python-fido2/compare/2.2.0...2.2.1) Updates `jinxed` from 2.0.4 to 2.1.0 - [Release notes](https://github.com/Rockhopper-Technologies/jinxed/releases) - [Commits](https://github.com/Rockhopper-Technologies/jinxed/compare/2.0.4...2.1.0) Updates `pillow` from 12.2.0 to 12.3.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/12.2.0...12.3.0) Updates `rpds-py` from 2026.5.1 to 2026.6.3 - [Release notes](https://github.com/crate-py/rpds/releases) - [Changelog](https://github.com/crate-py/rpds/blob/main/release.toml) - [Commits](https://github.com/crate-py/rpds/compare/v2026.5.1...v2026.6.3) Updates `sentry-sdk` from 2.63.0 to 2.64.0 - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.63.0...2.64.0) Updates `wcwidth` from 0.8.1 to 0.8.2 - [Release notes](https://github.com/jquast/wcwidth/releases) - [Commits](https://github.com/jquast/wcwidth/compare/0.8.1...0.8.2) --- updated-dependencies: - dependency-name: coverage dependency-version: 7.15.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: prek dependency-version: 0.4.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: typing-extensions dependency-version: 4.16.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: blessed dependency-version: 1.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: boto3 dependency-version: 1.43.40 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: botocore dependency-version: 1.43.40 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: dulwich dependency-version: 1.2.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: fido2 dependency-version: 2.2.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: jinxed dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: pillow dependency-version: 12.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: rpds-py dependency-version: 2026.6.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: sentry-sdk dependency-version: 2.64.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: wcwidth dependency-version: 0.8.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style * master bump * api bump * bump a bit further --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Improvements to `PrintingOptionsSerializer` (#12434) * Fixed issue with default `driver_options on `InvenTreeLabelPlugin` * Provide current `machine` to `LabelPrinterBaseDriver.get_printing_options_serializer` * [docs] Report discovery (#12449) * Adds decorator to mark an attribute for report context discovery * Update context variables in docs * Include fields captured against each model type * Expose more properties * Image URL tags * Add more attributes * Rearrange docs * Simplify docs * Enforce type hinting for reportable properties * Expose more properties for the Order model * Auto-discover related / linked models * Remove extra text * Collapsible blocks * Reduce boilerplate * Remove cruft * Enhance documentation for filename generation * Cleanup * [bug] BOM checksum fix (#12455) * Enforce ordering of BOM items * Add prefetch to getRequiredParts * Add regression test * [refactor] Complete shipment API endpoint (#12363) * Use API for unit test * Loop unrolling is super effective * Additional unit testing * Fix for bulk_create - use bulk_create_and_fetch * Fix unit tests * Fix unit tests * Adjust unit test * Revert return type on helper func * Evaluate returned QuerySet * Adjust unit tests * Adjust complete_allocations * Fix for bulk_create in unit test * Reimplement complete_allocation for compatibility --------- Co-authored-by: Matthias Mair <code@mjmair.com> * [bug] Attachment str fix (#12461) * Fix stringify for Attachment model * Add regression tests * Bug fix for exporting SalesOrderAllocation data (#12463) * Bug fix for exporting SalesOrderAllocation data * Regression test * Bump API version * Bug fix for unit test * chore(backend): major allauth bump (#12454) * mayjor allauth bump * add PR link * [refactor] Build allocation endpoints (#12361) * Create benchmark for completing a build and consuming all items * Refactor build consume task * Add benchmarking * Unroll allocate-stock serializer * Complete build only after allocations are consumed * re-export batch_events * Add BulkPrefetchSerializerMixin * Reduce queries even further * Refactoring * Unroll code and use bulk operations * Refactoring for auto-allocation * Add more test coverage for auto-allocation * Fix model_reference_fields * adjust unit test * Apply concurrency protection * Additional unit tests * Remove per-line validation * Fix unit test * Adjust unit test * Use bulk_create_and_fetch * Cleanup * Reimplement wrapper func for backwards compatibility * Fix unit test * Increase max query time * Fix serializer * Enforce pk ordering * FIx for mysql * chore(deps): bump the dependencies group across 1 directory with 2 updates (#12465) * chore(deps): bump the dependencies group across 1 directory with 2 updates Bumps the dependencies group with 2 updates in the /docs directory: [mkdocs-material](https://github.com/squidfunk/mkdocs-material) and [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings). Updates `mkdocs-material` from 9.7.6 to 9.7.7 - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.7.6...9.7.7) Updates `mkdocstrings` from 1.0.5 to 1.0.6 - [Release notes](https://github.com/mkdocstrings/mkdocstrings/releases) - [Changelog](https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/mkdocstrings/compare/1.0.5...1.0.6) --- updated-dependencies: - dependency-name: mkdocs-material dependency-version: 9.7.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: mkdocstrings dependency-version: 1.0.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style * update pin --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump the dependencies group across 1 directory with 17 updates (#12427) * chore(deps): bump the dependencies group across 1 directory with 17 updates Bumps the dependencies group with 17 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.4` | `6.43.6` | | [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome) | `3.3.1` | `3.4.0` | | [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core-types) | `6.1.21` | `7.0.0` | | [@fullcalendar/react](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/react) | `6.1.21` | `7.0.0` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.62.0` | `10.65.0` | | [@uiw/codemirror-theme-vscode](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` | | [@uiw/react-codemirror](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` | | [@vanilla-extract/css](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/css) | `1.21.0` | `1.21.1` | | [dompurify](https://github.com/cure53/DOMPurify) | `3.4.11` | `3.4.12` | | [fuse.js](https://github.com/krisk/Fuse) | `7.4.2` | `7.5.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.80.0` | `7.81.0` | | [recharts](https://github.com/recharts/recharts) | `3.9.0` | `3.9.2` | | [undici](https://github.com/nodejs/undici) | `8.5.0` | `8.7.0` | | [@flakiness/playwright](https://github.com/flakiness/playwright) | `1.16.0` | `1.18.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.0.1` | `26.1.1` | | [@vanilla-extract/vite-plugin](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/vite-plugin) | `5.2.3` | `5.2.4` | | [typescript](https://github.com/microsoft/TypeScript) | `5.9.3` | `7.0.2` | Updates `@codemirror/view` from 6.43.4 to 6.43.6 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@fortawesome/react-fontawesome` from 3.3.1 to 3.4.0 - [Release notes](https://github.com/FortAwesome/react-fontawesome/releases) - [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/react-fontawesome/compare/v3.3.1...v3.4.0) Updates `@fullcalendar/core` from 6.1.21 to 7.0.0 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v7.0.0/packages/core-types) Updates `@fullcalendar/react` from 6.1.21 to 7.0.0 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v7.0.0/packages/react) Updates `@sentry/react` from 10.62.0 to 10.65.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.62.0...10.65.0) Updates `@uiw/codemirror-theme-vscode` from 4.25.10 to 4.25.11 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11) Updates `@uiw/react-codemirror` from 4.25.10 to 4.25.11 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11) Updates `@vanilla-extract/css` from 1.21.0 to 1.21.1 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/css/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/css@1.21.1/packages/css) Updates `dompurify` from 3.4.11 to 3.4.12 - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.11...3.4.12) Updates `fuse.js` from 7.4.2 to 7.5.0 - [Release notes](https://github.com/krisk/Fuse/releases) - [Changelog](https://github.com/krisk/Fuse/blob/main/CHANGELOG.md) - [Commits](https://github.com/krisk/Fuse/compare/v7.4.2...v7.5.0) Updates `react-hook-form` from 7.80.0 to 7.81.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.80.0...v7.81.0) Updates `recharts` from 3.9.0 to 3.9.2 - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v3.9.0...v3.9.2) Updates `undici` from 8.5.0 to 8.7.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v8.5.0...v8.7.0) Updates `@flakiness/playwright` from 1.16.0 to 1.18.0 - [Release notes](https://github.com/flakiness/playwright/releases) - [Commits](https://github.com/flakiness/playwright/compare/v1.16.0...v1.18.0) Updates `@types/node` from 26.0.1 to 26.1.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vanilla-extract/vite-plugin` from 5.2.3 to 5.2.4 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/vite-plugin/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/vite-plugin@5.2.4/packages/vite-plugin) Updates `typescript` from 5.9.3 to 7.0.2 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Commits](https://github.com/microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-version: 6.43.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fortawesome/react-fontawesome" dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@fullcalendar/core" dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@fullcalendar/react" dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.65.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@uiw/codemirror-theme-vscode" dependency-version: 4.25.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@uiw/react-codemirror" dependency-version: 4.25.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@vanilla-extract/css" dependency-version: 1.21.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: dompurify dependency-version: 3.4.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: fuse.js dependency-version: 7.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.81.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: recharts dependency-version: 3.9.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: undici dependency-version: 8.7.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@flakiness/playwright" dependency-version: 1.18.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 26.1.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@vanilla-extract/vite-plugin" dependency-version: 5.2.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: typescript dependency-version: 7.0.2 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix tsconfig * fix setup for build - lower typescript * fix resolution * lower fullcalendar --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump gitpython from 3.1.52 to 3.1.54 in /docs (#12467) * chore(deps): bump gitpython from 3.1.52 to 3.1.54 in /docs Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.52 to 3.1.54. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.52...3.1.54) --- updated-dependencies: - dependency-name: gitpython dependency-version: 3.1.54 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * Add order sorting for sales order allocation tables (#12468) * Fix part SalesOrder table (#12469) * Fix part SalesOrder table - Show line item quantity, not number of lines * add regression test * Bump API version * Fix Redis write failures on Windows Docker bind mounts (#12418) * Fix Docker setup for local Windows deployment. Disable Redis disk persistence to avoid bind-mount permission errors that caused login 500s, and configure localhost as the default site URL. * Fix Redis write failures on Windows Docker bind mounts. Disable RDB persistence for the cache container so login and other cache writes do not fail when the Redis data volume cannot be written on Windows hosts. * Keep Redis volume mount while disabling disk persistence. Addresses review feedback on #12418: retain the external /data volume from #11100 but disable RDB/AOF writes so Windows bind mounts no longer trigger MISCONF errors. * Offfload email notification (#12470) * Offfload email notification * Run email sync in testing * Add configurable default for PO line item merging (#12472) * Add configurable default for PO line item merging Introduce PURCHASEORDER_MERGE_LINE_ITEMS global setting to control the default state of the merge_items option when creating purchase order lines. Fixes #10947 * Apply ruff and biome formatting for CI * On order filter (#12476) * Add "on order" filter for Part model - Added API filter - Added table filter - Added table column * Bump API version * Add table sorting * Adjust API text * [UI] Add search result preview (#12475) * [UI] Add search result preview * Updated search docs * [UI] Display all error table field error messages (#12456) * Display all error table field error messages * Adjust playwright test * Refactor sales order methods: (#12477) - Cancel sales order - Assign serial numbers * chore(deps): bump python in /contrib/container (#12479) Bumps python from `b877e50` to `cea0e60`. --- updated-dependencies: - dependency-name: python dependency-version: 3.14.6-slim-trixie dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(backend): registry install command (#11657) * Unable to install plugins through web UI using custom registry and/or Python wheel files. Fixes #11460 * use more fitting variable name * add typing * clean up logic flow - make easier to understand * make check easier to understand * reduce complexity * ensure user is tested * add more tests * add user validation * move test * disable uninstall in test * Update test_api.py * style fix * fix typing * check if pip exsists * fix gate * fix typo * reference pip instead * make test more tolerant * revert permission check change * remove new test --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * chore(deps): bump the dependencies group with 7 updates (#12480) * chore(deps): bump the dependencies group with 7 updates Bumps the dependencies group with 7 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `7.0.0` | `7.0.1` | | [actions/setup-python](https://github.com/actions/setup-python) | `6.3.0` | `7.0.0` | | [j178/prek-action](https://github.com/j178/prek-action) | `2.0.5` | `2.0.6` | | [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.7` | `0.6.0` | | [actions/attest](https://github.com/actions/attest) | `4.1.1` | `4.2.0` | | [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.37.0` | `4.37.1` | | [crowdin/github-action](https://github.com/crowdin/github-action) | `2.16.3` | `2.16.4` | Updates `actions/checkout` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1) Updates `actions/setup-python` from 6.3.0 to 7.0.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/ece7cb06caefa5fff74198d8649806c4678c61a1...5fda3b95a4ea91299a34e894583c3862153e4b97) Updates `j178/prek-action` from 2.0.5 to 2.0.6 - [Release notes](https://github.com/j178/prek-action/releases) - [Commits](https://github.com/j178/prek-action/compare/e98a699c41eb69ab013a45817a0406469a748f8d...5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16) Updates `zizmorcore/zizmor-action` from 0.5.7 to 0.6.0 - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) - [Commits](https://github.com/zizmorcore/zizmor-action/compare/192e21d79ab29983730a13d1382995c2307fbcaa...6599ee8b7a49aef6a770f63d261d214911a7ce02) Updates `actions/attest` from 4.1.1 to 4.2.0 - [Release notes](https://github.com/actions/attest/releases) - [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest/compare/a1948c3f048ba23858d222213b7c278aabede763...f7c74d28b9d84cb8768d0b8ca14a4bac6ef463e6) Updates `github/codeql-action/upload-sarif` from 4.37.0 to 4.37.1 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/99df26d4f13ea111d4ec1a7dddef6063f76b97e9...7188fc363630916deb702c7fdcf4e481b751f97a) Updates `crowdin/github-action` from 2.16.3 to 2.16.4 - [Release notes](https://github.com/crowdin/github-action/releases) - [Commits](https://github.com/crowdin/github-action/compare/52aa776766211d83d975df51f3b9c53c2f8ba35f...e0c8f73cdc0fafde9396e056c5038217000a32d1) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/setup-python dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: j178/prek-action dependency-version: 2.0.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: zizmorcore/zizmor-action dependency-version: 0.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: actions/attest dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: crowdin/github-action dependency-version: 2.16.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix pin --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump postcss from 8.5.15 to 8.5.23 in /src/frontend (#12466) Bumps [postcss](https://github.com/postcss/postcss) from 8.5.15 to 8.5.23. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.5.15...8.5.23) --- updated-dependencies: - dependency-name: postcss dependency-version: 8.5.23 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump the dependencies group across 1 directory with 14 updates (#12485) Bumps the dependencies group with 14 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) | `7.3.0` | `7.3.1` | | [@fortawesome/free-regular-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.3.0` | `7.3.1` | | [@fortawesome/free-solid-svg-icons](https://github.com/FortAwesome/Font-Awesome) | `7.3.0` | `7.3.1` | | [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome) | `3.4.0` | `3.5.0` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.65.0` | `10.67.0` | | [@tabler/icons-react](https://github.com/tabler/tabler-icons/tree/HEAD/packages/icons-react) | `3.44.0` | `3.45.0` | | [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.101.2` | `5.101.3` | | [mantine-contextmenu](https://github.com/icflorescu/mantine-contextmenu) | `9.3.1` | `9.4.0` | | [mantine-datatable](https://github.com/icflorescu/mantine-datatable) | `9.3.1` | `9.4.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.81.0` | `7.82.0` | | [recharts](https://github.com/recharts/recharts) | `3.9.2` | `3.10.0` | | [styled-components](https://github.com/styled-components/styled-components) | `6.4.3` | `6.4.4` | | [undici](https://github.com/nodejs/undici) | `8.7.0` | `8.8.0` | | [@vanilla-extract/vite-plugin](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/vite-plugin) | `5.2.4` | `5.2.5` | Updates `@fortawesome/fontawesome-svg-core` from 7.3.0 to 7.3.1 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.3.0...7.3.1) Updates `@fortawesome/free-regular-svg-icons` from 7.3.0 to 7.3.1 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.3.0...7.3.1) Updates `@fortawesome/free-solid-svg-icons` from 7.3.0 to 7.3.1 - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/7.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/7.3.0...7.3.1) Updates `@fortawesome/react-fontawesome` from 3.4.0 to 3.5.0 - [Release notes](https://github.com/FortAwesome/react-fontawesome/releases) - [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/main/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/react-fontawesome/compare/v3.4.0...v3.5.0) Updates `@sentry/react` from 10.65.0 to 10.67.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.65.0...10.67.0) Updates `@tabler/icons-react` from 3.44.0 to 3.45.0 - [Release notes](https://github.com/tabler/tabler-icons/releases) - [Commits](https://github.com/tabler/tabler-icons/commits/v3.45.0/packages/icons-react) Updates `@tanstack/react-query` from 5.101.2 to 5.101.3 - [Release notes](https://github.com/TanStack/query/releases) - [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md) - [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.3/packages/react-query) Updates `mantine-contextmenu` from 9.3.1 to 9.4.0 - [Changelog](https://github.com/icflorescu/mantine-contextmenu/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-contextmenu/commits) Updates `mantine-datatable` from 9.3.1 to 9.4.0 - [Changelog](https://github.com/icflorescu/mantine-datatable/blob/main/CHANGELOG.md) - [Commits](https://github.com/icflorescu/mantine-datatable/commits) Updates `react-hook-form` from 7.81.0 to 7.82.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.81.0...v7.82.0) Updates `recharts` from 3.9.2 to 3.10.0 - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v3.9.2...v3.10.0) Updates `styled-components` from 6.4.3 to 6.4.4 - [Release notes](https://github.com/styled-components/styled-components/releases) - [Commits](https://github.com/styled-components/styled-components/compare/styled-components@6.4.3...styled-components@6.4.4) Updates `undici` from 8.7.0 to 8.8.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v8.7.0...v8.8.0) Updates `@vanilla-extract/vite-plugin` from 5.2.4 to 5.2.5 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/vite-plugin/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/vite-plugin@5.2.5/packages/vite-plugin) --- updated-dependencies: - dependency-name: "@fortawesome/fontawesome-svg-core" dependency-version: 7.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fortawesome/free-regular-svg-icons" dependency-version: 7.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fortawesome/free-solid-svg-icons" dependency-version: 7.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@fortawesome/react-fontawesome" dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.67.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@tabler/icons-react" dependency-version: 3.45.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@tanstack/react-query" dependency-version: 5.101.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: mantine-contextmenu dependency-version: 9.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: mantine-datatable dependency-version: 9.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.82.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: recharts dependency-version: 3.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: styled-components dependency-version: 6.4.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: undici dependency-version: 8.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@vanilla-extract/vite-plugin" dependency-version: 5.2.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [bug] Fix concurrency issues for allocation (#12478) * Fix concurrency issues for allocation * Remove duplicate atomic call * Reduce query count * [bug] Unique constraint for serial numbers (#12483) * Unique constraint for serial numbers * Revert unrelated changes * Updated tests * Build output serial number docs (#12486) * Remove serial number restriction when creating build outputs * Updated docs * additional docs * [API] Refactor stock adjustment endpoints (#12488) * Filtering for report snippets (#12487) * Filtering for report snippets * Bump API version * Token save fix (#12491) - Only update 'last_seen' field * Improve validation for import session (#12492) - Ensure that validated data is a dict shape * Concurrency fix for scheduled tasks (#12493) - Prevent multiple instances of scheduled tasks from plugins * remove errant test report (#12496) * Adjust demo-dataset for CI (#12500) * New Crowdin translations by GitHub Action (#12437) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Fix admin search for PurchaseOrderLineItem (#12508) Expand search_fields on PurchaseOrderLineItemAdmin to allow searching by part name, part description, supplier SKU, order reference, and supplier name. Previously, only the optional 'reference' field was searchable, making it impossible to find line items by part or order details. - part__part__name: search by underlying Part name - part__part__description: search by Part description - part__SKU: search by Supplier SKU - order__reference: search by Purchase Order reference - order__supplier__name: search by Supplier name Also adds a unit test to verify the search_fields are correctly configured. * Fix for data import "update" (#12513) - Use partial update on serializer - Mark other fields as not required (pk only) * Handle report error on missing svg data (#12514) * Handle report error on missing svg data * Add regression tests * Row locking for data import / update (#12515) - Concurrency protection for data imports * Fix for TreeFieldComponent (#12519) - Prevent deselect by clicking on same entry - Updated playwright tests * Robustify playwright test (#12522) * [UI] Keep Add Parts button visible in Parametric View (#12392) * [UI] Keep Add Parts button visible in Parametric View * [UI] Add PartCreationMenu component for shared part creation actions * [UI] Fix unused imports and import ordering in PartTable and ParametricDataTable * [UI] Fix ambiguous text locator in parametric view test * [UI] Fix import formatting in PartTable --------- Co-authored-by: Hana <hana@MacBook-Air-M1.local> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * New Crowdin translations by GitHub Action (#12512) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Demo ci check (#12530) * Remove branch checking in workflow files * Detect demo branch based on software version * Fix typo * Fix for N+1 issues in stock item serializing (#12534) * chore(deps): bump the dependencies group across 1 directory with 9 updates (#12526) * chore(deps): bump the dependencies group across 1 directory with 9 updates Bumps the dependencies group with 9 updates in the /src/backend directory: | Package | From | To | | --- | --- | --- | | [boto3](https://github.com/boto/boto3) | `1.43.53` | `1.43.55` | | [botocore](https://github.com/boto/botocore) | `1.43.53` | `1.43.55` | | [django-oauth-toolkit](https://github.com/django-oauth/django-oauth-toolkit) | `3.3.0` | `3.4.0` | | [grpcio](https://github.com/grpc/grpc) | `1.82.1` | `1.83.0` | | [s3transfer](https://github.com/boto/s3transfer) | `0.19.1` | `0.19.2` | | [tqdm](https://github.com/tqdm/tqdm) | `4.69.0` | `4.69.1` | | [prek](https://github.com/j178/prek) | `0.4.10` | `0.4.11` | | [types-psycopg2](https://github.com/python/typeshed) | `2.9.21.20260712` | `2.9.21.20260724` | | [types-pyyaml](https://github.com/python/typeshed) | `6.0.12.20260518` | `6.0.12.20260724` | Updates `boto3` from 1.43.53 to 1.43.55 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.43.53...1.43.55) Updates `botocore` from 1.43.53 to 1.43.55 - [Commits](https://github.com/boto/botocore/compare/1.43.53...1.43.55) Updates `django-oauth-toolkit` from 3.3.0 to 3.4.0 - [Release notes](https://github.com/django-oauth/django-oauth-toolkit/releases) - [Changelog](https://github.com/django-oauth/django-oauth-toolkit/blob/master/CHANGELOG.md) - [Commits](https://github.com/django-oauth/django-oauth-toolkit/compare/3.3.0...3.4.0) Updates `grpcio` from 1.82.1 to 1.83.0 - [Release notes](https://github.com/grpc/grpc/releases) - [Commits](https://github.com/grpc/grpc/compare/v1.82.1...v1.83.0) Updates `s3transfer` from 0.19.1 to 0.19.2 - [Changelog](https://github.com/boto/s3transfer/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/s3transfer/compare/0.19.1...0.19.2) Updates `tqdm` from 4.69.0 to 4.69.1 - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.69.0...v4.69.1) Updates `prek` from 0.4.10 to 0.4.11 - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.4.10...v0.4.11) Updates `types-psycopg2` from 2.9.21.20260712 to 2.9.21.20260724 - [Commits](https://github.com/python/typeshed/commits) Updates `types-pyyaml` from 6.0.12.20260518 to 6.0.12.20260724 - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: boto3 dependency-version: 1.43.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: botocore dependency-version: 1.43.55 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: django-oauth-toolkit dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: grpcio dependency-version: 1.83.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: s3transfer dependency-version: 0.19.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: tqdm dependency-version: 4.69.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: prek dependency-version: 0.4.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: types-psycopg2 dependency-version: 2.9.21.20260724 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: types-pyyaml dependency-version: 6.0.12.20260724 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * [API] Optional field permissions (#12529) * Add permissions check for OptionalField * Adjust existing unit tests * Add caching * Additional tests * Additional testing * Add exclusions for owner and group models * Bump CHANGELOG * Detect demo branch based on software version * Updated docstrings * chore(deps): bump undici from 8.8.0 to 8.9.0 in /src/frontend (#12543) Bumps [undici](https://github.com/nodejs/undici) from 8.8.0 to 8.9.0. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v8.8.0...v8.9.0) --- updated-dependencies: - dependency-name: undici dependency-version: 8.9.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump gitpython from 3.1.54 to 3.1.57 in /docs (#12545) * chore(deps): bump gitpython from 3.1.54 to 3.1.57 in /docs Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.54 to 3.1.57. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.54...3.1.57) --- updated-dependencies: - dependency-name: gitpython dependency-version: 3.1.57 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump the dependencies group across 1 directory with 23 updates (#12547) Bumps the dependencies group with 23 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.6` | `6.43.7` | | [@mantine/carousel](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/carousel) | `9.4.1` | `9.5.0` | | [@mantine/charts](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/charts) | `9.4.1` | `9.5.0` | | [@mantine/core](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/core) | `9.4.1` | `9.5.0` | | [@mantine/dates](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dates) | `9.4.1` | `9.5.0` | | [@mantine/dropzone](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dropzone) | `9.4.1` | `9.5.0` | | [@mantine/form](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/form) | `9.4.1` | `9.5.0` | | [@mantine/hooks](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/hooks) | `9.4.1` | `9.5.0` | | [@mantine/modals](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/modals) | `9.4.1` | `9.5.0` | | [@mantine/notifications](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/notifications) | `9.4.1` | `9.5.0` | | [@mantine/spotlight](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/spotlight) | `9.4.1` | `9.5.0` | | [@mantine/vanilla-extract](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/vanilla-extract) | `9.4.1` | `9.5.0` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.67.0` | `10.68.0` | | [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.101.3` | `5.101.4` | | [@vanilla-extract/css](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/css) | `1.21.1` | `1.21.2` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.82.0` | `7.83.0` | | [react-is](https://github.com/react/react/tree/HEAD/packages/react-is) | `19.2.7` | `19.2.8` | | [recharts](https://github.com/recharts/recharts) | `3.10.0` | `3.10.1` | | [@flakiness/playwright](https://github.com/flakiness/playwright) | `1.18.0` | `2.0.0` | | [@playwright/test](https://github.com/microsoft/playwright) | `1.61.1` | `1.62.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.1` | `26.1.2` | | [@vanilla-extract/vite-plugin](https://github.com/vanilla-extract-css/vanilla-extract/tree/HEAD/packages/vite-plugin) | `5.2.5` | `5.2.6` | | [rollup](https://github.com/rollup/rollup) | `4.62.2` | `4.62.3` | Updates `@codemirror/view` from 6.43.6 to 6.43.7 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@mantine/carousel` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/carousel) Updates `@mantine/charts` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/charts) Updates `@mantine/core` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/core) Updates `@mantine/dates` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/dates) Updates `@mantine/dropzone` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/dropzone) Updates `@mantine/form` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/form) Updates `@mantine/hooks` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/hooks) Updates `@mantine/modals` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/modals) Updates `@mantine/notifications` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/notifications) Updates `@mantine/spotlight` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/spotlight) Updates `@mantine/vanilla-extract` from 9.4.1 to 9.5.0 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.0/packages/@mantine/vanilla-extract) Updates `@sentry/react` from 10.67.0 to 10.68.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/10.68.0/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.67.0...10.68.0) Updates `@tanstack/react-query` from 5.101.3 to 5.101.4 - [Release notes](https://github.com/TanStack/query/releases) - [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md) - [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.4/packages/react-query) Updates `@vanilla-extract/css` from 1.21.1 to 1.21.2 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/css/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/css@1.21.2/packages/css) Updates `react-hook-form` from 7.82.0 to 7.83.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.82.0...v7.83.0) Updates `react-is` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/react/react/releases) - [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-is) Updates `recharts` from 3.10.0 to 3.10.1 - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v3.10.0...v3.10.1) Updates `@flakiness/playwright` from 1.18.0 to 2.0.0 - [Release notes](https://github.com/flakiness/playwright/releases) - [Commits](https://github.com/flakiness/playwright/compare/v1.18.0...v2.0.0) Updates `@playwright/test` from 1.61.1 to 1.62.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.61.1...v1.62.0) Updates `@types/node` from 26.1.1 to 26.1.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@vanilla-extract/vite-plugin` from 5.2.5 to 5.2.6 - [Release notes](https://github.com/vanilla-extract-css/vanilla-extract/releases) - [Changelog](https://github.com/vanilla-extract-css/vanilla-extract/blob/master/packages/vite-plugin/CHANGELOG.md) - [Commits](https://github.com/vanilla-extract-css/vanilla-extract/commits/@vanilla-extract/vite-plugin@5.2.6/packages/vite-plugin) Updates `rollup` from 4.62.2 to 4.62.3 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.62.2...v4.62.3) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-version: 6.43.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/carousel" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/charts" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/core" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dates" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/dropzone" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/form" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/hooks" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/modals" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/notifications" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/spotlight" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@mantine/vanilla-extract" dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.68.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@tanstack/react-query" dependency-version: 5.101.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@vanilla-extract/css" dependency-version: 1.21.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.83.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-is dependency-version: 19.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: recharts dependency-version: 3.10.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@flakiness/playwright" dependency-version: 2.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies - dependency-name: "@playwright/test" dependency-version: 1.62.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 26.1.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@vanilla-extract/vite-plugin" dependency-version: 5.2.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: rollup dependency-version: 4.62.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump undici from 6.27.0 to 8.10.0 in /src/frontend (#12544) Bumps [undici](https://github.com/nodejs/undici) from 6.27.0 to 8.10.0. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v6.27.0...v8.10.0) --- updated-dependencies: - dependency-name: undici dependency-version: 8.10.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group with 7 updates (#12541) * chore(deps): bump the dependencies group with 7 updates Bumps the dependencies group with 7 updates: | Package | From | To | | --- | --- | --- | | [docker/login-action](https://github.com/docker/login-action) | `4.4.0` | `4.5.2` | | [oasdiff/oasdiff-action/diff](https://github.com/oasdiff/oasdiff-action) | `0.1.6` | `0.1.10` | | [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `4.18.5` | `4.19.1` | | [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.6.0` | `0.6.1` | | [ossf/scorecard-action](https://github.com/ossf/scorecard-action) | `2.4.3` | `2.4.4` | | [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.37.1` | `4.37.3` | | [actions/stale](https://github.com/actions/stale) | `10.4.0` | `11.0.0` | Updates `docker/login-action` from 4.4.0 to 4.5.2 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/af1e73f918a031802d376d3c8bbc3fe56130a9b0...371161bbe7024a29a25c5e19bfcbc0804fe9ad2c) Updates `oasdiff/oasdiff-action/diff` from 0.1.6 to 0.1.10 - [Release notes](https://github.com/oasdiff/oasdiff-action/releases) - [Commits](https://github.com/oasdiff/oasdiff-action/compare/024f6c399f9a21ada1addb0f9a36ce1bfac995f1...0ab8ad204b00d25acc5ae87106281433e288d0c1) Updates `CodSpeedHQ/action` from 4.18.5 to 4.19.1 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/f99becdce5e5d51fd556489ebef684f4ecfd6286...f22792bfac16f3e14eb9fbea76f4a48e9cc22b93) Updates `zizmorcore/zizmor-action` from 0.6.0 to 0.6.1 - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) - [Commits](https://github.com/zizmorcore/zizmor-action/compare/6599ee8b7a49aef6a770f63d261d214911a7ce02...6fc4b006235f201fdab3722e17240ab420d580e5) Updates `ossf/scorecard-action` from 2.4.3 to 2.4.4 - [Release notes](https://github.com/ossf/scorecard-action/releases) - [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md) - [Commits](https://github.com/ossf/scorecard-action/compare/4eaacf0543bb3f2c246792bd56e8cdeffafb205a...2d1146689b8cda280b9bc96326124645441f03bc) Updates `github/codeql-action/upload-sarif` from 4.37.1 to 4.37.3 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/7188fc363630916deb702c7fdcf4e481b751f97a...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81) Updates `actions/stale` from 10.4.0 to 11.0.0 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/1e223db275d687790206a7acac4d1a11bd6fe629...4391f3da665fdf50b6810c1a66712fb9ba21aa93) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: 4.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: oasdiff/oasdiff-action/diff dependency-version: 0.1.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 4.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: zizmorcore/zizmor-action dependency-version: 0.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: ossf/scorecard-action dependency-version: 2.4.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/stale dependency-version: 11.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * Update qc_checks.yaml --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump cryptography from 49.0.0 to 50.0.0 in /src/backend (#12546) * chore(deps): bump cryptography from 49.0.0 to 50.0.0 in /src/backend Bumps [cryptography](https://github.com/pyca/cryptography) from 49.0.0 to 50.0.0. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/49.0.0...50.0.0) --- updated-dependencies: - dependency-name: cryptography dependency-version: 50.0.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * Fix permissions for group and RuleSet endpoints (#12563) - Require StaffRole in addition to is_staff * Handle missing part (#12566) Part instance may have already been deleted in post_delete hook for related models. * Deduplicate part pricing updates per session (#12564) * Barcode API bugs (#12565) * Add explicit permission checks for barcode scanning - Previous role_required attribute did not do anything * Additional unit tests * [API] Handle AppRegistryNotReady (#12571) Explicit handling for AppRegistryNotReady error * [refactor] Improve efficiency of check_missing_pricing (#12572) * [bug] excel encoding for data import (#12576) - Handle different encoding types for excel import - Fail cleanly if cannot read file * [bug] Fix post-delete actions (#12575) - Check that underlying part is still available * [bug] Fix getLogoImage helper (#12577) * [bug] Fix getLogoImage helper - Do not return a file:// URI * cleanup code * [bug] Fix part duplicate checks (#12574) * [bug] Fix part duplicate checks * Additional unit tests * Fix flaky test on sqlite (#12582) * [sentry] Do not report MethodNotAllowed (#12584) * [bug] Handle deleted Part (#12578) * [API] Restrict barcode scan history (#12569) - A non-staff user can only view their own results * [bug] Validate location when completing build outputs (#12570) * [bug] Validate location when completing build outputs - Cannot be structural * Fix unit test --------- Co-authored-by: Matthias Mair <code@mjmair.com> * [bug] Fix PartStocktakeSerializer (#12587) Closes https://github.com/inventree/InvenTree/issues/12555 * [docs] Improve setup guide for non-standard hosting (#12588) * [docs] Updated docs for complex server setups Ref: https://github.com/inventree/InvenTree/discussions/12538 * Add FAQ entry * [docker] Include pip license file (#12583) * [docker] Include pip license file This file has been missing in production builds * Add CI test * Update contrib/container/Dockerfile Co-authored-by: Matthias Mair <code@mjmair.com> * Fix typo * path fix * More pathing fixes --------- Co-authored-by: Matthias Mair <code@mjmair.com> * [bug] Fix for plugin fetching (#12590) - Prevent operation on stale plugin * Data import fix (#12568) * Specify JSON encoder for data import fields - Fixes encoding issues when importing from XLSX file * Add regression test * Fix faulty error handler * Fix for unit test * Fix test result ordering by test timestamps (#12533) * Fix test result ordering by test timestamps * Refractor test result comparison helper * Apply formatting fixes * Fix frontend formatting * Avoid mutating test result records * Add migration for test result ordering * Retry documentation build --------- Co-authored-by: jayasree723 <confidentlehmann@tomorjerry.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * Fix Install Stock Items shows only selected parts (#12596) * Bug Fix Install Stock Item showing variant stock when BOM disallows variants * Add regression test for include_variants stock filter --------- Co-authored-by: Siddhartha Ravilla <ravilla.si@northeastern.edu> * [UI] Bulk Delete Enhancements (#12601) * Add optional filtering for bulkDelete * Enhanced pre-form content * chore(deps): bump gitpython from 3.1.57 to 3.1.58 in /docs (#12593) * chore(deps): bump gitpython from 3.1.57 to 3.1.58 in /docs Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.57 to 3.1.58. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.57...3.1.58) --- updated-dependencies: - dependency-name: gitpython dependency-version: 3.1.58 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * chore(deps): bump pypdf from 6.14.2 to 6.15.0 in /src/backend (#12594) * chore(deps): bump pypdf from 6.14.2 to 6.15.0 in /src/backend Bumps [pypdf](https://github.com/py-pdf/pypdf) from 6.14.2 to 6.15.0. - [Release notes](https://github.com/py-pdf/pypdf/releases) - [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md) - [Commits](https://github.com/py-pdf/pypdf/compare/6.14.2...6.15.0) --- updated-dependencies: - dependency-name: pypdf dependency-version: 6.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * [security] Additional SSRF protections (#12595) Tighten SSRF protections when fetching from external URLs * feat(backend): add throtteling by default (#11951) * feat(backend): add throtteling by default * add changelog entry * ignore throtetling in debug mode * increase threshold * chore(deps): bump the dependencies group across 1 directory with 10 updates (#12561) * chore(deps): bump the dependencies group across 1 directory with 10 updates Bumps the dependencies group with 10 updates in the /src/backend directory: | Package | From | To | | --- | --- | --- | | [boto3](https://github.com/boto/boto3) | `1.43.55` | `1.43.61` | | [botocore](https://github.com/boto/botocore) | `1.43.55` | `1.43.61` | | [django-anymail](https://github.com/anymail/django-anymail) | `15.0` | `15.1` | | [feedparser](https://github.com/kurtmckee/feedparser) | `6.0.12` | `6.0.14` | | [markdown](https://github.com/Python-Markdown/markdown) | `3.10.2` | `3.10.3` | | [redis](https://github.com/redis/redis-py) | `8.0.1` | `8.1.0` | | [tablib](https://github.com/jazzband/tablib) | `3.9.0` | `3.10.0` | | [tqdm](https://github.com/tqdm/tqdm) | `4.69.1` | `4.70.0` | | [wrapt](https://github.com/GrahamDumpleton/wrapt) | `2.2.2` | `2.3.0` | | [pip](https://github.com/pypa/pip) | `26.1.2` | `26.2` | Updates `boto3` from 1.43.55 to 1.43.61 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.43.55...1.43.61) Updates `botocore` from 1.43.55 to 1.43.61 - [Commits](https://github.com/boto/botocore/compare/1.43.55...1.43.61) Updates `django-anymail` from 15.0 to 15.1 - [Release notes](https://github.com/anymail/django-anymail/releases) - [Changelog](https://github.com/anymail/django-anymail/blob/main/CHANGELOG.rst) - [Commits](https://github.com/anymail/django-anymail/compare/v15.0...v15.1) Updates `feedparser` from 6.0.12 to 6.0.14 - [Release notes](https://github.com/kurtmckee/feedparser/releases) - [Changelog](https://github.com/kurtmckee/feedparser/blob/main/CHANGELOG.rst) - [Commits](https://github.com/kurtmckee/feedparser/compare/v6.0.12...v6.0.14) Updates `markdown` from 3.10.2 to 3.10.3 - [Release notes](https://github.com/Python-Markdown/markdown/releases) - [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md) - [Commits](https://github.com/Python-Markdown/markdown/compare/3.10.2...3.10.3) Updates `redis` from 8.0.1 to 8.1.0 - [Release notes](https://github.com/redis/redis-py/releases) - [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES) - [Commits](https://github.com/redis/redis-py/compare/v8.0.1...v8.1.0) Updates `tablib` from 3.9.0 to 3.10.0 - [Release notes](https://github.com/jazzband/tablib/releases) - [Changelog](https://github.com/jazzband/tablib/blob/master/HISTORY.md) - [Commits](https://github.com/jazzband/tablib/compare/v3.9.0...v3.10.0) Updates `tqdm` from 4.69.1 to 4.70.0 - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.69.1...v4.70.0) Updates `wrapt` from 2.2.2 to 2.3.0 - [Release notes](https://github.com/GrahamDumpleton/wrapt/releases) - [Changelog](https://github.com/GrahamDumpleton/wrapt/blob/develop/docs/changes.rst) - [Commits](https://github.com/GrahamDumpleton/wrapt/compare/2.2.2...2.3.0) Updates `pip` from 26.1.2 to 26.2 - [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/pip/compare/26.1.2...26.2) --- updated-dependencies: - dependency-name: boto3 dependency-version: 1.43.61 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: botocore dependency-version: 1.43.61 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: django-anymail dependency-version: '15.1' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: feedparser dependency-version: 6.0.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: markdown dependency-version: 3.10.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: redis dependency-version: 8.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: tablib dependency-version: 3.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: tqdm dependency-version: 4.70.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: wrapt dependency-version: 2.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: pip dependency-version: '26.2' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * Bump version number to 1.6.0-rev (#12603) * Bump version number to 1.6.0-rev * Add release date * Add next version entry * Fix for API exception_handler (#12604) - Only log unhandled exceptions to sentry.io - Check for valid handling first - Report second * chore(deps): bump dompurify from 3.4.12 to 3.4.13 in /src/frontend (#12592) Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.12 to 3.4.13. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.12...3.4.13) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.13 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * chore(deps): bump the dependencies group with 7 updates (#12608) Bumps the dependencies group with 7 updates: | Package | From | To | | --- | --- | --- | | [docker/login-action](https://github.com/docker/login-action) | `4.5.2` | `4.6.0` | | [j178/prek-action](https://github.com/j178/prek-action) | `2.0.6` | `3.0.0` | | [tcort/github-action-markdown-link-check](https://github.com/tcort/github-action-markdown-link-check) | `1.1.2` | `1.1.3` | | [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `4.19.1` | `5.0.2` | | [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.6.1` | `0.6.2` | | [actions/attest](https://github.com/actions/attest) | `4.2.0` | `4.2.1` | | [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.37.3` | `4.37.5` | Updates `docker/login-action` from 4.5.2 to 4.6.0 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/371161bbe7024a29a25c5e19bfcbc0804fe9ad2c...dbcb813823bdd20940b903addbd779551569679f) Updates `j178/prek-action` from 2.0.6 to 3.0.0 - [Release notes](https://github.com/j178/prek-action/releases) - [Commits](https://github.com/j178/prek-action/compare/5337cb91e0fa35a7ff31b9ca345126d8bbbcdf16...4e14d07f9231acabce116ccfca13b13dd9755ece) Updates `tcort/github-action-markdown-link-check` from 1.1.2 to 1.1.3 - [Release notes](https://github.com/tcort/github-action-markdown-link-check/releases) - [Changelog](https://github.com/tcort/github-action-markdown-link-check/blob/master/CHANGELOG.md) - [Commits](https://github.com/tcort/github-action-markdown-link-check/compare/e7c7a18363c842693fadde5d41a3bd3573a7a225...e047c5b37f24ab722bbef1a27b6fab7f96bc4068) Updates `CodSpeedHQ/action` from 4.19.1 to 5.0.2 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/f22792bfac16f3e14eb9fbea76f4a48e9cc22b93...0ca9cbbf4623b599a6c3ed4fc8a922942705d9f1) Updates `zizmorcore/zizmor-action` from 0.6.1 to 0.6.2 - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) - [Commits](https://github.com/zizmorcore/zizmor-action/compare/6fc4b006235f201fdab3722e17240ab420d580e5...3dc1ecc9bcb9e94e9b2c709687979e1298497054) Updates `actions/attest` from 4.2.0 to 4.2.1 - [Release notes](https://github.com/actions/attest/releases) - [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest/compare/f7c74d28b9d84cb8768d0b8ca14a4bac6ef463e6...508db95dd578ae2727ebd6217d5ba78e4fbda05d) Updates `github/codeql-action/upload-sarif` from 4.37.3 to 4.37.5 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...d1ba80a13dd99fba24a470575428917156a28b43) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: 4.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: j178/prek-action dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: tcort/github-action-markdown-link-check dependency-version: 1.1.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 5.0.2 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: zizmorcore/zizmor-action dependency-version: 0.6.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/attest dependency-version: 4.2.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group across 1 directory with 18 updates (#12609) Bumps the dependencies group with 18 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@mantine/carousel](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/carousel) | `9.5.0` | `9.5.1` | | [@mantine/charts](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/charts) | `9.5.0` | `9.5.1` | | [@mantine/core](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/core) | `9.5.0` | `9.5.1` | | [@mantine/dates](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dates) | `9.5.0` | `9.5.1` | | [@mantine/dropzone](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/dropzone) | `9.5.0` | `9.5.1` | | [@mantine/form](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/form) | `9.5.0` | `9.5.1` | | [@mantine/hooks](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/hooks) | `9.5.0` | `9.5.1` | | [@mantine/modals](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/modals) | `9.5.0` | `9.5.1` | | [@mantine/notifications](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/notifications) | `9.5.0` | `9.5.1` | | [@mantine/spotlight](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/spotlight) | `9.5.0` | `9.5.1` | | [@mantine/vanilla-extract](https://github.com/mantinedev/mantine/tree/HEAD/packages/@mantine/vanilla-extract) | `9.5.0` | `9.5.1` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.68.0` | `10.69.0` | | [@tabler/icons-react](https://github.com/tabler/tabler-icons/tree/HEAD/packages/icons-react) | `3.45.0` | `3.46.0` | | [axios](https://github.com/axios/axios) | `1.18.1` | `1.19.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.83.0` | `7.84.0` | | [@flakiness/playwright](https://github.com/flakiness/playwright) | `2.0.0` | `2.0.1` | | [@playwright/test](https://github.com/microsoft/playwright) | `1.62.0` | `1.62.1` | | [rollup](https://github.com/rollup/rollup) | `4.62.3` | `4.62.4` | Updates `@mantine/carousel` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/carousel) Updates `@mantine/charts` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/charts) Updates `@mantine/core` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/core) Updates `@mantine/dates` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/dates) Updates `@mantine/dropzone` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/dropzone) Updates `@mantine/form` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/form) Updates `@mantine/hooks` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/hooks) Updates `@mantine/modals` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/modals) Updates `@mantine/notifications` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/notifications) Updates `@mantine/spotlight` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/spotlight) Updates `@mantine/vanilla-extract` from 9.5.0 to 9.5.1 - [Release notes](https://github.com/mantinedev/mantine/releases) - [Changelog](https://github.com/mantinedev/mantine/blob/master/CHANGELOG.md) - [Commits](https://github.com/mantinedev/mantine/commits/9.5.1/packages/@mantine/vanilla-extract) Updates `@sentry/react` from 10.68.0 to 10.69.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/10.69.0/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.68.0...10.69.0) Updates `@tabler/icons-react` from 3.45.0 to 3.46.0 - [Release notes](https://github.com/tabler/tabler-icons/releases) - [Commits](https://github.com/tabler/tabler-icons/commits/v3.46.0/packages/icons-react) Updates `axios` from 1.18.1 to 1.19.0 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.18.1...v1.19.0) Updates `react-hook-form` from 7.83.0 to 7.84.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.83.0...v7.84.0) Updates `@flakiness/playwright` from 2.0.0 to 2.0.1 - [Release notes](https://github.com/flakiness/playwright/releases) - [Commits](https://github.com/flakiness/playwright/compare/v2.0.0...v2.0.1) Updates `@playwright/test` from 1.62.0 to 1.62.1 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.62.0...v1.62.1) Updates `rollup` from 4.62.3 to 4.62.4 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.62.3...v4.62.4) --- updated-dependencies: - dependency-name: "@mantine/carousel" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/charts" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/core" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/dates" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/dropzone" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/form" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/hooks" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/modals" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/notifications" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/spotlight" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@mantine/vanilla-extract" dependency-version: 9.5.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.69.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@tabler/icons-react" dependency-version: 3.46.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: axios dependency-version: 1.19.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.84.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@flakiness/playwright" dependency-version: 2.0.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@playwright/test" dependency-version: 1.62.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: rollup dependency-version: 4.62.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [CI] Improve robustness for playwright test (#12612) * Update version for @inventreedb/ui (#12611) * Update version for @inventreedb/ui * Revert yarn.lock changes * Bump version number for UI (#12615) * New Crowdin translations by GitHub Action (#12535) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix(frontend): Improve flakiness issues (#12617) * small improvements to reduce flakiness * disable throtteling to fix flaking tests * [bug] Handle duplicate email addresses for magic links (#12621) * refactor(backend): remove network dep from test (#12624) * feat(backend): switch to a more formal FSM approach (#12507) * full fsm implementation closes https://github.com/inventree/InvenTree/issues/12314 based on https://github.com/matmair/InvenTree/pull/721 * update assertations * refactor to reduce duplication * move for cleaner diff * more moving stuff around * fix assingment * remove skip * merge test classes * re-enable transition plugin tests * fix docstrings * add depreciation warning * fix type * nitpicks * small cleanup * ensure we alwas pass a str * add backport * fix marker position * full fsm implementation closes https://github.com/inventree/InvenTree/issues/12314 based on https://github.com/matmair/InvenTree/pull/721 * update assertations * refactor to reduce duplication * move for cleaner diff * more moving stuff around * fix assingment * remove skip * merge test classes * re-enable transition plugin tests * fix docstrings * add depreciation warning * fix type * nitpicks * small cleanup * ensure we alwas pass a str * add backport * fix marker position * fix ty issue * ignore this corner case * ensure invalid transitions can raise a nice validation error * compact code * add depreciation mark * make raise_error default (#754) * fix merge * adjust test as this is now not a no-op but a raised error * fix assertations * fix test to not take a broken path * remove unused test statements * converge * add test branch for actually working transition * reduce uneeded code * ignore depreceated methods * fix missing coverage * add prefetch * reduce diff * refactor fail limit to match allauth defaults more closely (#12623) * fix: support UUID notification references (#12616) * fix: support UUID notification references * test: update notification uid expectation --------- Co-authored-by: FurinaDog <FurinaDog@users.noreply.github.com> * [bug] OptionalField race condition (#12627) * [bug] OptionalField race condition Fixes subtle bug where OptionalField entries can be silenty dropped from an API request due to concurrent requests / race conditions * Additional unit tests * Additional guard in metadata.py * include extra kwargs * Adjust import/exporting options * Fix attribute sharing across class instances * reset errors on update (#12550) * reset errors on update * add empty line --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com> * Add docs for return order (#12632) * [bug] Fix ReturnOrder event registration (#12633) * Allow bulk-edit for ReturnOrderLineItem (#12635) * Allow bulk-edit for ReturnOrderLineItem - Allow bulk change of line item outcome * Update API version documentation with pull request links * [bug] Fix broken user setting (#12638) - Closes https://github.com/inventree/InvenTree/issues/12637 * try fixing this flaky test on firefox (#12640) * feat: add piece_count and piece_size fields to BomItem for cut-to-length parts (#12422) * feat: add piece_count and piece_size fields to BomItem for cut-to-length parts Manufacturing BOMs frequently require multiple pieces of a specific size cut from continuous stock (cables, tubing, structural profiles). Currently the only way to express "10 pieces of 250mm cable" is to enter the total length (2.5m) as quantity, which loses the piece-count information that purchasing and production need. This adds two optional fields to BomItem: - piece_count: number of discrete pieces required (default: 1) - piece_size: size/length of each piece (e.g. "250 mm") When piece_size is specified, the total quantity is auto-calculated as piece_count × piece_size, maintaining full backward compatibility (existing items effectively have piece_count=1 and empty piece_size). Changes: - Backend: new model fields, migration, updated recalculate_quantity() logic, hash_fields for BOM validation - API: serializer exposes piece_count and piece_size - Frontend: BOM form includes the new fields, BOM table shows them as optional columns Addresses #10274 * refactor: simplify to single piece_count field per reviewer feedback Remove the piece_size field entirely. The existing quantity field already represents the per-piece size/length, so piece_count multiplied by quantity gives the total material requirement. Example: quantity=200mm, piece_count=10 → total 2m of wire in 10 pieces. Changes: - Remove piece_size model field, serializer field, and frontend column/form - Update migration to only add piece_count - Update get_required_quantity() to multiply by piece_count - Restore original recalculate_quantity() without piece_size logic * test/docs: add unit tests and documentation for piece_count field * style: replace ambiguous × with x to fix RUF002 lint error * Address review feedback: api_version bump, changelog, style fix - Bump INVENTREE_API_VERSION to 531 with entry for piece_count field - Add CHANGELOG.md entry under Unreleased > Added - Fix RUF001: replace ambiguous × with x in serializers.py help_text * fix: align piece_count migration help_text with model (RUF001) The 0153 AddField recorded help_text with a Unicode multiplication sign (×), while the model field uses plain 'x' after the RUF001 fix. This mismatch made makemigrations --check flag an unstaged 0154_alter_bomitem_piece_count migration, failing the DB test CI jobs. Update the original migration's help_text (and docstring) to plain 'x' so the field definition matches the model, keeping a single clean migration instead of add-then-alter. * fix: use set_quantity() in piece_count tests BomItem.quantity is a derived field, recalculated from raw_amount on every save() via recalculate_quantity(). Setting item.quantity directly was overwritten back to the fixture value on save, so the tests computed against quantity=3 and failed. Use set_quantity() (which sets raw_amount) to match how quantity is meant to be updated. * ci: re-trigger CI to confirm Firefox E2E failures are transient --------- Co-authored-by: Aman Jain <jainamn@amazon.com> * Improve error handling for unit registry (#12643) * New Crowdin translations by GitHub Action (#12625) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group across 1 directory with 6 updates (#12651) Bumps the dependencies group with 6 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@codemirror/view](https://github.com/codemirror/view) | `6.43.7` | `6.43.8` | | [@sentry/react](https://github.com/getsentry/sentry-javascript) | `10.69.0` | `10.70.0` | | [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.84.0` | `7.85.0` | | [styled-components](https://github.com/styled-components/styled-components) | `6.4.4` | `6.5.1` | | [@flakiness/playwright](https://github.com/flakiness/playwright) | `2.0.1` | `2.0.2` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` | Updates `@codemirror/view` from 6.43.7 to 6.43.8 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/commits) Updates `@sentry/react` from 10.69.0 to 10.70.0 - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/10.70.0/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/10.69.0...10.70.0) Updates `react-hook-form` from 7.84.0 to 7.85.0 - [Release notes](https://github.com/react-hook-form/react-hook-form/releases) - [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md) - [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.84.0...v7.85.0) Updates `styled-components` from 6.4.4 to 6.5.1 - [Release notes](https://github.com/styled-components/styled-components/releases) - [Commits](https://github.com/styled-components/styled-components/compare/styled-components@6.4.4...styled-components@6.5.1) Updates `@flakiness/playwright` from 2.0.1 to 2.0.2 - [Release notes](https://github.com/flakiness/playwright/releases) - [Commits](https://github.com/flakiness/playwright/compare/v2.0.1...v2.0.2) Updates `@types/node` from 26.1.2 to 26.2.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-version: 6.43.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@sentry/react" dependency-version: 10.70.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: react-hook-form dependency-version: 7.85.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: styled-components dependency-version: 6.5.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@flakiness/playwright" dependency-version: 2.0.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 26.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group with 5 updates (#12652) Bumps the dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [dorny/paths-filter](https://github.com/dorny/paths-filter) | `4.0.2` | `4.0.3` | | [oasdiff/oasdiff-action/diff](https://github.com/oasdiff/oasdiff-action) | `0.1.11` | `0.1.12` | | [CodSpeedHQ/action](https://github.com/codspeedhq/action) | `5.0.2` | `5.0.3` | | [actions/attest](https://github.com/actions/attest) | `4.2.1` | `4.2.2` | | [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.37.5` | `4.37.6` | Updates `dorny/paths-filter` from 4.0.2 to 4.0.3 - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](https://github.com/dorny/paths-filter/compare/7b450fff21473bca461d4b92ce414b9d0420d706...ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d) Updates `oasdiff/oasdiff-action/diff` from 0.1.11 to 0.1.12 - [Release notes](https://github.com/oasdiff/oasdiff-action/releases) - [Commits](https://github.com/oasdiff/oasdiff-action/compare/b7c3adeb54330db1903d27c61db520e5661ad55b...033c15c845bef10f148afb0fa781bf1b2a7fe1bf) Updates `CodSpeedHQ/action` from 5.0.2 to 5.0.3 - [Release notes](https://github.com/codspeedhq/action/releases) - [Changelog](https://github.com/CodSpeedHQ/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codspeedhq/action/compare/0ca9cbbf4623b599a6c3ed4fc8a922942705d9f1...4296e51e7041e24dadb86d1d6e8b9320d223dbe8) Updates `actions/attest` from 4.2.1 to 4.2.2 - [Release notes](https://github.com/actions/attest/releases) - [Changelog](https://github.com/actions/attest/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest/compare/508db95dd578ae2727ebd6217d5ba78e4fbda05d...1e69f48acb82d1966a394da916b4c1698aa569d6) Updates `github/codeql-action/upload-sarif` from 4.37.5 to 4.37.6 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/d1ba80a13dd99fba24a470575428917156a28b43...5595ccaf912efad79be6eef63a5619ff05969be3) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-version: 4.0.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: oasdiff/oasdiff-action/diff dependency-version: 0.1.12 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: CodSpeedHQ/action dependency-version: 5.0.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/attest dependency-version: 4.2.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: github/codeql-action/upload-sarif dependency-version: 4.37.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the dependencies group across 1 directory with 14 updates (#12642) * chore(deps): bump the dependencies group across 1 directory with 14 updates Bumps the dependencies group with 14 updates in the /src/backend directory: | Package | From | To | | --- | --- | --- | | [cffi](https://github.com/python-cffi/cffi) | `2.1.0` | `2.1.1` | | [coverage](https://github.com/coveragepy/coveragepy) | `7.15.2` | `7.15.4` | | [django-stubs](https://github.com/typeddjango/django-stubs) | `6.0.7` | `6.0.9` | | [django-stubs-ext](https://github.com/typeddjango/django-stubs) | `6.0.6` | `6.0.9` | | [django-test-migrations](https://github.com/wemake-services/django-test-migrations) | `1.5.0` | `1.6.0` | | [packaging](https://github.com/pypa/packaging) | `26.2` | `26.3` | | [pip](https://github.com/pypa/pip) | `26.2` | `26.2.1` | | [prek](https://github.com/j178/prek) | `0.4.11` | `0.4.12` | | [pytest-django](https://github.com/pytest-dev/pytest-django) | `4.12.0` | `4.13.0` | | [blessed](https://github.com/jquast/blessed) | `1.47.0` | `1.48.0` | | [boto3](https://github.com/boto/boto3) | `1.43.61` | `1.43.66` | | [botocore](https://github.com/boto/botocore) | `1.43.61` | `1.43.66` | | [djangorestframework](https://github.com/encode/django-rest-framework) | `3.17.1` | `3.18.0` | | [googleapis-common-protos](https://github.com/googleapis/google-cloud-python) | `1.75.0` | `1.75.1` | Updates `cffi` from 2.1.0 to 2.1.1 - [Release notes](https://github.com/python-cffi/cffi/releases) - [Commits](https://github.com/python-cffi/cffi/compare/v2.1.0...v2.1.1) Updates `coverage` from 7.15.2 to 7.15.4 - [Release notes](https://github.com/coveragepy/coveragepy/releases) - [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst) - [Commits](https://github.com/coveragepy/coveragepy/compare/7.15.2...7.15.4) Updates `django-stubs` from 6.0.7 to 6.0.9 - [Release notes](https://github.com/typeddjango/django-stubs/releases) - [Commits](https://github.com/typeddjango/django-stubs/compare/6.0.7...6.0.9) Updates `django-stubs-ext` from 6.0.6 to 6.0.9 - [Release notes](https://github.com/typeddjango/django-stubs/releases) - [Commits](https://github.com/typeddjango/django-stubs/compare/6.0.6...6.0.9) Updates `django-test-migrations` from 1.5.0 to 1.6.0 - [Release notes](https://github.com/wemake-services/django-test-migrations/releases) - [Changelog](https://github.com/wemake-services/django-test-migrations/blob/master/CHANGELOG.md) - [Commits](https://github.com/wemake-services/django-test-migrations/compare/1.5.0...1.6.0) Updates `packaging` from 26.2 to 26.3 - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pypa/packaging/compare/26.2...26.3) Updates `pip` from 26.2 to 26.2.1 - [Changelog](https://github.com/pypa/pip/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/pip/compare/26.2...26.2.1) Updates `prek` from 0.4.11 to 0.4.12 - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.4.11...v0.4.12) Updates `pytest-django` from 4.12.0 to 4.13.0 - [Release notes](https://github.com/pytest-dev/pytest-django/releases) - [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst) - [Commits](https://github.com/pytest-dev/pytest-django/compare/v4.12.0...v4.13.0) Updates `blessed` from 1.47.0 to 1.48.0 - [Release notes](https://github.com/jquast/blessed/releases) - [Changelog](https://github.com/jquast/blessed/blob/master/docs/history.rst) - [Commits](https://github.com/jquast/blessed/commits/1.48) Updates `boto3` from 1.43.61 to 1.43.66 - [Release notes](https://github.com/boto/boto3/releases) - [Commits](https://github.com/boto/boto3/compare/1.43.61...1.43.66) Updates `botocore` from 1.43.61 to 1.43.66 - [Commits](https://github.com/boto/botocore/compare/1.43.61...1.43.66) Updates `djangorestframework` from 3.17.1 to 3.18.0 - [Release notes](https://github.com/encode/django-rest-framework/releases) - [Commits](https://github.com/encode/django-rest-framework/compare/3.17.1...3.18.0) Updates `googleapis-common-protos` from 1.75.0 to 1.75.1 - [Release notes](https://github.com/googleapis/google-cloud-python/releases) - [Changelog](https://github.com/googleapis/google-cloud-python/blob/main/packages/google-cloud-documentai/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-cloud-python/compare/googleapis-common-protos-v1.75.0...googleapis-common-protos-v1.75.1) --- updated-dependencies: - dependency-name: cffi dependency-version: 2.1.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: coverage dependency-version: 7.15.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: django-stubs dependency-version: 6.0.9 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: django-stubs-ext dependency-version: 6.0.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: django-test-migrations dependency-version: 1.6.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: packaging dependency-version: '26.3' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: pip dependency-version: 26.2.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: prek dependency-version: 0.4.12 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: pytest-django dependency-version: 4.13.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: blessed dependency-version: 1.48.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: boto3 dependency-version: 1.43.66 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: botocore dependency-version: 1.43.66 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: djangorestframework dependency-version: 3.18.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: googleapis-common-protos dependency-version: 1.75.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * Fix issue 10769 (#12286) * fix: Show badges for flagged stock items * Updated badge logic to only display on build order and sales order * refactor: Remove unused modelRenderer for RenderStockItem in BuildForms and SalesOrderForms * chore(deps): bump python in /contrib/container (#12650) Bumps python from 3.14.6-slim-trixie to 3.14.7-slim-trixie. --- updated-dependencies: - dependency-name: python dependency-version: 3.14.7-slim-trixie dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump sqlparse from 0.5.5 to 0.6.0 in /src/backend (#12653) * chore(deps): bump sqlparse from 0.5.5 to 0.6.0 in /src/backend Bumps [sqlparse](https://github.com/andialbrecht/sqlparse) from 0.5.5 to 0.6.0. - [Changelog](https://github.com/andialbrecht/sqlparse/blob/master/CHANGELOG) - [Commits](https://github.com/andialbrecht/sqlparse/compare/0.5.5...0.6.0) --- updated-dependencies: - dependency-name: sqlparse dependency-version: 0.6.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * fix style --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> * [FR] stop shipping docs with packages (#12657) Fixes #12610 * feat(frontend): Add persistant filtered detail navigation in the url (#12585) * Add filtered detail navigation * Satisfy navigation lint checks * Fix missing Fragment import in PageDetail * Address detail navigation review feedback * Move detail navigation into breadcrumb bar * Address URL and layout review feedback * Address detail navigation review feedback * fix doclinks * test: update stock return validation assertion * fix: keep detail navigation actions stable * style: apply biome formatting * fix: use ActionIcon disabled state * test: use ActionIcon disabled state * fix: isolate detail navigation query params --------- Co-authored-by: Matthias Mair <code@mjmair.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: 开源斗士 <43269525+geekcj12@users.noreply.github.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com> Co-authored-by: Andrey Lushnikov <aslushnikov@gmail.com> Co-authored-by: Phil <preid@electromag.com.au> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Neil Beukes <neilbeukes8@gmail.com> Co-authored-by: suzunn <suzun2@ogr.iu.edu.tr> Co-authored-by: Miklós Márton <martonmiklosqdev@gmail.com> Co-authored-by: Petr Ledvina <ledvinap@gmail.com> Co-authored-by: gunstr <41468206+gunstr@users.noreply.github.com> Co-authored-by: br413 <br198064@gmail.com> Co-authored-by: Leonid Zaliubovskyi <Leopoldius@users.noreply.github.com> Co-authored-by: Λamir <86316974+aamirasmal15@users.noreply.github.com> Co-authored-by: Alex K <alex@sengine.cloud> Co-authored-by: snipe <snipe@snipe.net> Co-authored-by: Bhumin Paladiya <139330832+bhumin18@users.noreply.github.com> Co-authored-by: Dean <me@dgardiner.net> Co-authored-by: Hana Lee <47701469+hanielee@users.noreply.github.com> Co-authored-by: Hana <hana@MacBook-Air-M1.local> Co-authored-by: Jayasree <srimadjaysnenis@gmail.com> Co-authored-by: jayasree723 <confidentlehmann@tomorjerry.com> Co-authored-by: siddhartha28 <31231363+siddhartha928@users.noreply.github.com> Co-authored-by: Siddhartha Ravilla <ravilla.si@northeastern.edu> Co-authored-by: FurinaDog <feixiang130214@outlook.com> Co-authored-by: FurinaDog <FurinaDog@users.noreply.github.com> Co-authored-by: ribsey <lukas.ribi@gmail.com> Co-authored-by: amanjain57-gif <aman.jain57@gmail.com> Co-authored-by: Aman Jain <jainamn@amazon.com> Co-authored-by: Alonso Lopez-Valdez <alonsl1@uci.edu> Co-authored-by: Jɤ KέϞϞψ <dalvidjr2022@gmail.com>
This commit is contained in:
co-authored by
dependabot[bot]
Oliver
开源斗士
Andrey Lushnikov
Phil
github-actions[bot]
Neil Beukes
suzunn
Miklós Márton
Petr Ledvina
gunstr
br413
Leonid Zaliubovskyi
Λamir
Alex K
snipe
Bhumin Paladiya
Dean
Hana Lee
Hana
Jayasree
jayasree723
siddhartha28
Siddhartha Ravilla
FurinaDog
FurinaDog
ribsey
amanjain57-gif
Aman Jain
Alonso Lopez-Valdez
Jɤ KέϞϞψ
parent
0d51f2dbe5
commit
a776c5d615
@@ -1,9 +1,7 @@
|
||||
# Dockerfile for the InvenTree devcontainer
|
||||
# This container is used for development of the InvenTree project, and includes all necessary dependencies for both backend and frontend development.
|
||||
|
||||
# In contrast with the "production" image (which is based on an Alpine image)
|
||||
# we use a Debian-based image for the devcontainer
|
||||
|
||||
FROM mcr.microsoft.com/devcontainers/python:3.11-bookworm@sha256:e754c29c4e3ffcf6c794c1020e36a0812341d88ec9569a34704b975fa89e8848
|
||||
FROM mcr.microsoft.com/devcontainers/python:3.12-trixie@sha256:5440cb68898d190ad6c6e8a4634ce89d0645bea47f9c8beb75612bb8e3983711
|
||||
|
||||
# InvenTree paths
|
||||
ENV INVENTREE_HOME="/home/inventree"
|
||||
@@ -25,10 +23,10 @@ RUN chmod +x init.sh
|
||||
|
||||
# Install required base packages
|
||||
RUN apt update && apt install -y \
|
||||
python3.11-dev python3.11-venv \
|
||||
python3-dev python3-venv \
|
||||
postgresql-client \
|
||||
libldap2-dev libsasl2-dev \
|
||||
libpango1.0-0 libcairo2 \
|
||||
libpango-1.0-0 libcairo2 \
|
||||
poppler-utils weasyprint
|
||||
|
||||
# Install packages required for frontend development
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- stable
|
||||
- refs/tags/*
|
||||
paths:
|
||||
include:
|
||||
- src/backend
|
||||
|
||||
pool:
|
||||
vmImage: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
Python39:
|
||||
PYTHON_VERSION: '3.11'
|
||||
maxParallel: 3
|
||||
|
||||
steps:
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: '$(PYTHON_VERSION)'
|
||||
architecture: 'x64'
|
||||
|
||||
- task: PythonScript@0
|
||||
displayName: 'Export project path'
|
||||
inputs:
|
||||
scriptSource: 'inline'
|
||||
script: |
|
||||
"""Search all subdirectories for `manage.py`."""
|
||||
from glob import iglob
|
||||
from os import path
|
||||
# Python >= 3.5
|
||||
manage_py = next(iglob(path.join('**', 'manage.py'), recursive=True), None)
|
||||
if not manage_py:
|
||||
raise SystemExit('Could not find a Django project')
|
||||
project_location = path.dirname(path.abspath(manage_py))
|
||||
print('Found Django project in', project_location)
|
||||
print('##vso[task.setvariable variable=projectRoot]{}'.format(project_location))
|
||||
|
||||
- script: |
|
||||
python -m pip install --upgrade pip setuptools wheel uv
|
||||
uv pip install --require-hashes -r src/backend/requirements.txt
|
||||
uv pip install --require-hashes -r src/backend/requirements-dev.txt
|
||||
sudo apt-get install poppler-utils
|
||||
sudo apt-get install libpoppler-dev
|
||||
uv pip install unittest-xml-reporting coverage invoke
|
||||
displayName: 'Install prerequisites'
|
||||
env:
|
||||
UV_SYSTEM_PYTHON: 1
|
||||
|
||||
- script: |
|
||||
pushd '$(projectRoot)'
|
||||
invoke update --uv
|
||||
coverage run manage.py test --testrunner xmlrunner.extra.djangotestrunner.XMLTestRunner --no-input
|
||||
coverage xml -i
|
||||
displayName: 'Run tests'
|
||||
env:
|
||||
INVENTREE_DB_ENGINE: sqlite3
|
||||
INVENTREE_DB_NAME: inventree
|
||||
INVENTREE_MEDIA_ROOT: ./media
|
||||
INVENTREE_STATIC_ROOT: ./static
|
||||
INVENTREE_BACKUP_DIR: ./backup
|
||||
INVENTREE_SITE_URL: http://localhost:8000
|
||||
INVENTREE_PLUGINS_ENABLED: true
|
||||
UV_SYSTEM_PYTHON: 1
|
||||
INVENTREE_DEBUG: true
|
||||
INVENTREE_LOG_LEVEL: INFO
|
||||
|
||||
- task: PublishTestResults@2
|
||||
inputs:
|
||||
testResultsFiles: "**/TEST-*.xml"
|
||||
testRunTitle: 'Python $(PYTHON_VERSION)'
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- task: PublishCodeCoverageResults@2
|
||||
inputs:
|
||||
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'
|
||||
@@ -39,14 +39,14 @@ runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4.2.2
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Python installs
|
||||
- name: Set up Python ${{ env.python_version }}
|
||||
if: ${{ inputs.python == 'true' && env.python_version != '3.14' }}
|
||||
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # pin@v5.0.0
|
||||
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
|
||||
with:
|
||||
python-version: ${{ env.python_version }}
|
||||
cache: pip
|
||||
@@ -57,7 +57,7 @@ runs:
|
||||
contrib/dev_reqs/requirements.txt
|
||||
- name: Setup Python 3.14
|
||||
if: ${{ inputs.python == 'true' && env.python_version == '3.14' }}
|
||||
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # pin@v5.0.0
|
||||
uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
|
||||
with:
|
||||
python-version: ${{ env.python_version }}
|
||||
- name: Install Base Python Dependencies
|
||||
@@ -106,7 +106,7 @@ runs:
|
||||
- name: Run invoke update
|
||||
if: ${{ inputs.update == 'true' }}
|
||||
shell: bash
|
||||
run: invoke update --skip-backup --skip-static
|
||||
run: invoke update --skip-backup --skip-static --no-frontend
|
||||
- name: Collect static files
|
||||
if: ${{ inputs.static == 'true' }}
|
||||
shell: bash
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
)
|
||||
steps:
|
||||
- name: Backport Action
|
||||
uses: sqren/backport-github-action@ad888e978060bc1b2798690dd9d03c4036560947 # pin@v9.2.2
|
||||
uses: sorenlouv/backport-github-action@8a6c0381851f43f9f1fddc7303f0e9015eb57b62 # v12.0.4
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
auto_backport_label_prefix: backport-to-
|
||||
|
||||
@@ -9,7 +9,7 @@ on:
|
||||
- l10
|
||||
|
||||
env:
|
||||
python_version: 3.11
|
||||
python_version: 3.12
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -46,4 +46,6 @@ jobs:
|
||||
run: |
|
||||
python ./.github/scripts/check_source_strings.py --frontend --backend
|
||||
- name: Check Migration Files
|
||||
run: python3 .github/scripts/check_migration_files.py
|
||||
run: |
|
||||
invoke migrate --detect
|
||||
python3 .github/scripts/check_migration_files.py
|
||||
|
||||
@@ -39,10 +39,10 @@ jobs:
|
||||
docker: ${{ steps.filter.outputs.docker }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # pin@v4.0.1
|
||||
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
@@ -62,12 +62,12 @@ jobs:
|
||||
contents: read
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
python_version: "3.11"
|
||||
python_version: 3.12
|
||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||
|
||||
steps:
|
||||
- name: Check out repo
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Test Docker Image
|
||||
@@ -84,6 +84,19 @@ jobs:
|
||||
docker run --rm inventree-test test -f /home/inventree/gunicorn.conf.py
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/requirements.txt
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/manage.py
|
||||
# Check that license information was generated into the image
|
||||
docker run --rm inventree-test test -s /home/inventree/src/backend/InvenTree/InvenTree/licenses.txt
|
||||
docker run --rm inventree-test test -s /home/inventree/src/backend/InvenTree/web/static/web/.vite/dependencies.json
|
||||
# Check that backend translations were compiled into the image (a few representative languages)
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/locale/de/LC_MESSAGES/django.mo
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/locale/fr/LC_MESSAGES/django.mo
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/locale/ru/LC_MESSAGES/django.mo
|
||||
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/locale/zh_Hans/LC_MESSAGES/django.mo
|
||||
# Check that frontend translations (lingui) were compiled into the static build output (a few representative languages)
|
||||
docker run --rm inventree-test grep -q '"src/locales/de/messages.ts"' /home/inventree/src/backend/InvenTree/web/static/web/.vite/manifest.json
|
||||
docker run --rm inventree-test grep -q '"src/locales/fr/messages.ts"' /home/inventree/src/backend/InvenTree/web/static/web/.vite/manifest.json
|
||||
docker run --rm inventree-test grep -q '"src/locales/ru/messages.ts"' /home/inventree/src/backend/InvenTree/web/static/web/.vite/manifest.json
|
||||
docker run --rm inventree-test grep -q '"src/locales/zh_Hans/messages.ts"' /home/inventree/src/backend/InvenTree/web/static/web/.vite/manifest.json
|
||||
- name: Build Docker Image
|
||||
# Build the development docker image (using docker-compose.yml)
|
||||
run: docker compose --project-directory . -f contrib/container/dev-docker-compose.yml build --no-cache
|
||||
@@ -124,12 +137,12 @@ jobs:
|
||||
contents: read
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
python_version: "3.11"
|
||||
python_version: 3.12
|
||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||
|
||||
steps:
|
||||
- name: Check out repo
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Run Migration Tests
|
||||
@@ -148,16 +161,16 @@ jobs:
|
||||
id-token: write
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
python_version: "3.11"
|
||||
python_version: 3.12
|
||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||
|
||||
steps:
|
||||
- name: Check out repo
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set Up Python ${{ env.python_version }}
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # pin@v6.2.0
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: ${{ env.python_version }}
|
||||
- name: Version Check
|
||||
@@ -168,13 +181,13 @@ jobs:
|
||||
echo "git_commit_date=$(git show -s --format=%ci)" >> $GITHUB_ENV
|
||||
- name: Set up QEMU
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # pin@v4.0.0
|
||||
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
|
||||
- name: Set up Docker Buildx
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # pin@v4.0.0
|
||||
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
||||
- name: Set up cosign
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # pin@v4.1.2
|
||||
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
|
||||
- name: Check if Dockerhub login is required
|
||||
id: docker_login
|
||||
run: |
|
||||
@@ -185,14 +198,14 @@ jobs:
|
||||
fi
|
||||
- name: Login to Dockerhub
|
||||
if: github.event_name != 'pull_request' && steps.docker_login.outputs.skip_dockerhub_login != 'true'
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # pin@v4.1.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Log into registry ghcr.io
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # pin@v4.1.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
@@ -201,16 +214,16 @@ jobs:
|
||||
- name: Extract Docker metadata
|
||||
if: github.event_name != 'pull_request'
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # pin@v6.0.0
|
||||
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
||||
with:
|
||||
images: |
|
||||
inventree/inventree
|
||||
ghcr.io/${{ github.repository }}
|
||||
- uses: depot/setup-action@15c09a5f77a0840ad4bce955686522a257853461 # pin@v1
|
||||
- uses: depot/setup-action@15c09a5f77a0840ad4bce955686522a257853461 # v1
|
||||
- name: Push Docker Images
|
||||
id: push-docker
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: depot/build-push-action@5f3b3c2e5a00f0093de47f657aeaefcedff27d18 # pin@v1
|
||||
uses: depot/build-push-action@98e78adca7817480b8185f474a400b451d74e287 # v1
|
||||
with:
|
||||
project: jczzbjkk68
|
||||
context: .
|
||||
|
||||
@@ -0,0 +1,312 @@
|
||||
# Playwright testing for frontend code
|
||||
# Runs the following tests:
|
||||
# - Playwright tests in Firefox (against compiled frontend code)
|
||||
# - Playwright tests in Chromium (coverage enabled, against vite frontend code)
|
||||
# - Build frontend code and upload as artifact
|
||||
|
||||
name: Frontend
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore: ["l10*", "dependabot/**", "backport/**"]
|
||||
pull_request:
|
||||
branches-ignore: ["l10*"]
|
||||
|
||||
env:
|
||||
python_version: 3.12
|
||||
node_version: 24
|
||||
plugin_creator_version: 1.20.0
|
||||
# The OS version must be set per job
|
||||
server_start_sleep: 60
|
||||
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
INVENTREE_DB_ENGINE: postgresql
|
||||
INVENTREE_DB_NAME: inventree
|
||||
INVENTREE_DB_HOST: "127.0.0.1"
|
||||
INVENTREE_DB_PORT: 5432
|
||||
INVENTREE_DB_USER: inventree_user
|
||||
INVENTREE_DB_PASSWORD: inventree_password
|
||||
INVENTREE_DEBUG: true
|
||||
INVENTREE_PLUGINS_ENABLED: false
|
||||
INVENTREE_MEDIA_ROOT: /home/runner/work/InvenTree/test_inventree_media
|
||||
INVENTREE_STATIC_ROOT: /home/runner/work/InvenTree/test_inventree_static
|
||||
INVENTREE_BACKUP_DIR: /home/runner/work/InvenTree/test_inventree_backup
|
||||
INVENTREE_SITE_URL: http://localhost:8000
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
paths-filter:
|
||||
name: Filter
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
frontend: ${{ steps.filter.outputs.frontend }}
|
||||
force: ${{ steps.force.outputs.force }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
frontend:
|
||||
- 'src/frontend/**'
|
||||
- name: Is CI being forced?
|
||||
run: echo "force=true" >> $GITHUB_OUTPUT
|
||||
id: force
|
||||
if: |
|
||||
contains(github.event.pull_request.labels.*.name, 'dependency') ||
|
||||
contains(github.event.pull_request.labels.*.name, 'full-run')
|
||||
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 60
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
- name: Install dependencies
|
||||
run: cd src/frontend && yarn install
|
||||
- name: Build frontend
|
||||
run: cd src/frontend && yarn run compile && yarn run lib && yarn run build
|
||||
- name: Write version file - SHA
|
||||
run: cd src/backend/InvenTree/web/static/web/.vite && echo "$GITHUB_SHA" > sha.txt
|
||||
- name: Zip frontend
|
||||
run: |
|
||||
cd src/backend/InvenTree/web/static
|
||||
zip -r frontend-build.zip web/ web/.vite
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: frontend-build
|
||||
path: src/backend/InvenTree/web/static/web
|
||||
include-hidden-files: true
|
||||
|
||||
firefox:
|
||||
name: Tests [Firefox ${{ matrix.shard }} / 2]
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 60
|
||||
needs: ["build", "paths-filter"]
|
||||
if: github.ref == 'refs/heads/master' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shard: [1, 2]
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17
|
||||
env:
|
||||
POSTGRES_DB: inventree
|
||||
POSTGRES_USER: inventree_user
|
||||
POSTGRES_PASSWORD: inventree_password
|
||||
ports:
|
||||
- 5432:5432
|
||||
options: >-
|
||||
--health-cmd "pg_isready -U testuser"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
permissions:
|
||||
contents: read # Required for actions/checkout
|
||||
id-token: write # Required for GitHub OIDC
|
||||
env:
|
||||
VITE_COVERAGE: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
install: true
|
||||
update: true
|
||||
apt-dependency: gettext postgresql-client libpq-dev
|
||||
pip-dependency: psycopg2
|
||||
- name: Set up test data
|
||||
run: |
|
||||
invoke dev.setup-test -iv
|
||||
invoke int.rebuild-thumbnails
|
||||
- name: Install dependencies
|
||||
run: invoke int.frontend-compile --extract
|
||||
- name: Cache Playwright browsers
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
id: playwright-cache
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-${{ hashFiles('src/frontend/yarn.lock') }}
|
||||
- name: Install Playwright browsers
|
||||
if: steps.playwright-cache.outputs.cache-hit != 'true'
|
||||
run: cd src/frontend && npx playwright install --with-deps
|
||||
- name: Install Playwright OS dependencies
|
||||
if: steps.playwright-cache.outputs.cache-hit == 'true'
|
||||
run: cd src/frontend && npx playwright install-deps
|
||||
- name: Install Sample Plugin
|
||||
run: |
|
||||
pip install -U inventree-plugin-creator==${{ env.plugin_creator_version }}
|
||||
create-inventree-plugin --default
|
||||
cd MyCustomPlugin && pip install -e . && cd frontend && npm install && npm run translate && npm run build
|
||||
- name: Run Playwright tests
|
||||
id: tests
|
||||
run: |
|
||||
cd src/frontend
|
||||
cp ./tests/fixtures/playwright_custom_logo.png ../backend/InvenTree/InvenTree/static/img/playwright_custom_logo.png
|
||||
cp ./tests/fixtures/playwright_custom_splash.png ../backend/InvenTree/InvenTree/static/img/playwright_custom_splash.png
|
||||
invoke static
|
||||
env INVENTREE_CUSTOM_SPLASH="img/playwright_custom_splash.png" INVENTREE_CUSTOM_LOGO="img/playwright_custom_logo.png" PLAYWRIGHT_BASE_URL=http://localhost:8000 npx playwright test --project=firefox --shard=${{ matrix.shard }}/2
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
if: ${{ !cancelled() && steps.tests.outcome == 'failure' }}
|
||||
with:
|
||||
name: playwright-report-firefox-${{ matrix.shard }}
|
||||
path: src/frontend/playwright-report/
|
||||
retention-days: 14
|
||||
|
||||
chromium:
|
||||
name: Tests [Chromium ${{ matrix.shard }} / 4]
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 60
|
||||
needs: ["build", "paths-filter"]
|
||||
if: github.ref == 'refs/heads/master' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shard: [1, 2, 3, 4]
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17
|
||||
env:
|
||||
POSTGRES_DB: inventree
|
||||
POSTGRES_USER: inventree_user
|
||||
POSTGRES_PASSWORD: inventree_password
|
||||
ports:
|
||||
- 5432:5432
|
||||
options: >-
|
||||
--health-cmd "pg_isready -U testuser"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
permissions:
|
||||
contents: read # Required for actions/checkout
|
||||
id-token: write # Required for GitHub OIDC
|
||||
|
||||
env:
|
||||
COVERAGE: true
|
||||
VITE_COVERAGE: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
install: true
|
||||
update: true
|
||||
apt-dependency: gettext postgresql-client libpq-dev
|
||||
pip-dependency: psycopg2
|
||||
- name: Set up test data
|
||||
run: |
|
||||
invoke dev.setup-test -iv
|
||||
invoke int.rebuild-thumbnails
|
||||
- name: Install dependencies
|
||||
run: invoke int.frontend-compile --extract
|
||||
- name: Cache Playwright browsers
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
id: playwright-cache
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: ${{ runner.os }}-playwright-${{ hashFiles('src/frontend/yarn.lock') }}
|
||||
- name: Install Playwright browsers
|
||||
if: steps.playwright-cache.outputs.cache-hit != 'true'
|
||||
run: cd src/frontend && npx playwright install --with-deps
|
||||
- name: Install Playwright OS dependencies
|
||||
if: steps.playwright-cache.outputs.cache-hit == 'true'
|
||||
run: cd src/frontend && npx playwright install-deps
|
||||
- name: Install Sample Plugin
|
||||
run: |
|
||||
pip install -U inventree-plugin-creator==${{ env.plugin_creator_version }}
|
||||
create-inventree-plugin --default
|
||||
cd MyCustomPlugin && pip install -e . && cd frontend && npm install && npm run translate && npm run build
|
||||
- name: Playwright [${{ matrix.shard }} / 4]
|
||||
id: tests
|
||||
run: |
|
||||
cd src/frontend
|
||||
npx nyc playwright test --project=chromium --shard=${{ matrix.shard }}/4
|
||||
- name: Playwright Report [${{ matrix.shard }} / 4]
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
if: ${{ !cancelled() && steps.tests.outcome == 'failure' }}
|
||||
with:
|
||||
name: playwright-report-chromium-${{ matrix.shard }}
|
||||
path: src/frontend/playwright-report/
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
- name: Upload Coverage Artifact [${{ matrix.shard }} / 4]
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
id: coverage-upload
|
||||
if: ${{ !cancelled() && steps.tests.outcome != 'failure' }}
|
||||
with:
|
||||
name: coverage-${{ matrix.shard }}
|
||||
path: src/frontend/.nyc_output/
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
retention-days: 1
|
||||
|
||||
# Recombine the coverage reports from the 4 shards, and upload to Codecov
|
||||
coverage:
|
||||
name: Merge coverage reports and upload to Codecov
|
||||
runs-on: ubuntu-latest
|
||||
needs: chromium
|
||||
timeout-minutes: 30
|
||||
if: always()
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
install: false
|
||||
update: false
|
||||
|
||||
- name: Download Coverage Artifacts
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
pattern: coverage-*
|
||||
path: all-coverage/
|
||||
merge-multiple: true
|
||||
|
||||
- name: Merge Coverage Reports
|
||||
run: |
|
||||
mkdir -p .nyc_output
|
||||
cp all-coverage/*.json .nyc_output/ 2>/dev/null || true
|
||||
npx nyc merge .nyc_output merged-coverage.json
|
||||
npx nyc report \
|
||||
--tempdir .nyc_output \
|
||||
--reporter=lcov \
|
||||
--reporter=text-summary \
|
||||
--report-dir ./coverage \
|
||||
|
||||
- name: Upload coverage reports to Codecov
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/master' }}
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
slug: inventree/InvenTree
|
||||
flags: web
|
||||
files: ./coverage/lcov.info
|
||||
@@ -7,7 +7,7 @@ name: Import / Export
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore: ["l10*"]
|
||||
branches-ignore: ["l10*", "dependabot/**", "backport/**"]
|
||||
pull_request:
|
||||
branches-ignore: ["l10*"]
|
||||
|
||||
@@ -15,7 +15,7 @@ permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
python_version: 3.11
|
||||
python_version: 3.12
|
||||
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -48,10 +48,10 @@ jobs:
|
||||
outputs:
|
||||
server: ${{ steps.filter.outputs.server }}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # pin@v4.0.1
|
||||
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
@@ -4,12 +4,12 @@ name: QC
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore: ["l10*"]
|
||||
branches-ignore: ["l10*", "dependabot/**", "backport/**"]
|
||||
pull_request:
|
||||
branches-ignore: ["l10*"]
|
||||
|
||||
env:
|
||||
python_version: 3.11
|
||||
python_version: 3.12
|
||||
node_version: 24
|
||||
# The OS version must be set per job
|
||||
server_start_sleep: 60
|
||||
@@ -44,10 +44,10 @@ jobs:
|
||||
submit-performance: ${{ steps.runner-perf.outputs.submit-performance }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # pin@v4.0.1
|
||||
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
@@ -108,16 +108,16 @@ jobs:
|
||||
if: needs.paths-filter.outputs.cicd == 'true' || needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python ${{ env.python_version }}
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # pin@v6.2.0
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: ${{ env.python_version }}
|
||||
cache: "pip"
|
||||
- name: Run pre commit hook Checks
|
||||
uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # pin@v2
|
||||
uses: j178/prek-action@4e14d07f9231acabce116ccfca13b13dd9755ece # v3.0.0
|
||||
- name: Check Version
|
||||
run: |
|
||||
pip install --require-hashes -r contrib/dev_reqs/requirements.txt
|
||||
@@ -130,7 +130,7 @@ jobs:
|
||||
if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.requirements == 'true' || needs.paths-filter.outputs.force == 'true'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -152,11 +152,11 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python ${{ env.python_version }}
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # pin@v6.2.0
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: ${{ env.python_version }}
|
||||
- name: Check Config
|
||||
@@ -165,7 +165,7 @@ jobs:
|
||||
pip install --require-hashes -r docs/requirements.txt
|
||||
python docs/ci/check_mkdocs_config.py
|
||||
- name: Check Links
|
||||
uses: gaurav-nelson/github-action-markdown-link-check@5c5dfc0ac2e225883c0e5f03a85311ec2830d368 # pin@v1
|
||||
uses: tcort/github-action-markdown-link-check@e047c5b37f24ab722bbef1a27b6fab7f96bc4068 # v1
|
||||
with:
|
||||
folder-path: docs
|
||||
config-file: docs/mlc_config.json
|
||||
@@ -190,7 +190,7 @@ jobs:
|
||||
version: ${{ steps.version.outputs.version }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -202,7 +202,7 @@ jobs:
|
||||
- name: Export API Documentation
|
||||
run: invoke dev.schema --ignore-warnings --filename src/backend/InvenTree/schema.yml
|
||||
- name: Upload schema
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: schema.yml
|
||||
path: src/backend/InvenTree/schema.yml
|
||||
@@ -222,7 +222,7 @@ jobs:
|
||||
echo "Downloaded api.yaml"
|
||||
- name: Running OpenAPI Spec diff action
|
||||
id: breaking_changes
|
||||
uses: oasdiff/oasdiff-action/diff@6147a58e5d1249a12f42fc864ab791d571a30015 # pin@main
|
||||
uses: oasdiff/oasdiff-action/diff@033c15c845bef10f148afb0fa781bf1b2a7fe1bf # v0.1.12
|
||||
with:
|
||||
base: "api.yaml"
|
||||
revision: "src/backend/InvenTree/schema.yml"
|
||||
@@ -251,17 +251,17 @@ jobs:
|
||||
- name: Extract settings / tags
|
||||
run: invoke int.export-definitions --basedir docs
|
||||
- name: Upload settings
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: inventree_settings.json
|
||||
path: docs/generated/inventree_settings.json
|
||||
- name: Upload tags
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: inventree_tags.yml
|
||||
path: docs/generated/inventree_tags.yml
|
||||
- name: Upload filters
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: inventree_filters.yml
|
||||
path: docs/generated/inventree_filters.yml
|
||||
@@ -275,7 +275,7 @@ jobs:
|
||||
version: ${{ needs.schema.outputs.version }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
name: Checkout Code
|
||||
with:
|
||||
repository: inventree/schema
|
||||
@@ -284,7 +284,7 @@ jobs:
|
||||
- name: Create artifact directory
|
||||
run: mkdir -p artifact
|
||||
- name: Download schema artifact
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # pin@v8.0.1
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
path: artifact
|
||||
merge-multiple: true
|
||||
@@ -301,7 +301,7 @@ jobs:
|
||||
echo "after move"
|
||||
ls -la artifact
|
||||
rm -rf artifact
|
||||
- uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # pin@v7.1.0
|
||||
- uses: stefanzweifel/git-auto-commit-action@4a55954c782fc1ea30b9056cd3e7a2b40ca8887d # v7.2.0
|
||||
name: Commit schema changes
|
||||
with:
|
||||
commit_message: "Update API schema for ${{ env.version }} / ${{ github.sha }}"
|
||||
@@ -332,7 +332,7 @@ jobs:
|
||||
node_version: '>=24'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -363,7 +363,7 @@ jobs:
|
||||
pip install .
|
||||
if: needs.paths-filter.outputs.submit-performance == 'true'
|
||||
- name: Performance Reporting
|
||||
uses: CodSpeedHQ/action@3194d9a39c4d46684cb44bf7207fc56626aad8fd # pin@v4.15.1
|
||||
uses: CodSpeedHQ/action@4296e51e7041e24dadb86d1d6e8b9320d223dbe8 # v5.0.3
|
||||
# check if we are in inventree/inventree - reporting only works in that OIDC context
|
||||
if: github.repository == 'inventree/InvenTree' && needs.paths-filter.outputs.submit-performance == 'true'
|
||||
with:
|
||||
@@ -379,7 +379,7 @@ jobs:
|
||||
continue-on-error: true # continue if a step fails so that coverage gets pushed
|
||||
strategy:
|
||||
matrix:
|
||||
python_version: [3.11, 3.14]
|
||||
python_version: [3.12, 3.14]
|
||||
|
||||
env:
|
||||
INVENTREE_DB_NAME: ./inventree.sqlite
|
||||
@@ -390,7 +390,7 @@ jobs:
|
||||
python_version: ${{ matrix.python_version }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -405,17 +405,19 @@ jobs:
|
||||
- name: Test Translations
|
||||
run: invoke dev.translate
|
||||
- name: Check Migration Files
|
||||
run: python3 .github/scripts/check_migration_files.py
|
||||
run: |
|
||||
invoke migrate --detect
|
||||
python3 .github/scripts/check_migration_files.py
|
||||
- name: Coverage Tests
|
||||
run: invoke dev.test --check --coverage --translations
|
||||
- name: Upload raw coverage to artifacts
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: coverage
|
||||
path: .coverage
|
||||
retention-days: 14
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # pin@v6.0.0
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
if: always()
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
@@ -441,7 +443,7 @@ jobs:
|
||||
INVENTREE_AUTO_UPDATE: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -454,7 +456,7 @@ jobs:
|
||||
env:
|
||||
node_version: '>=24'
|
||||
- name: Performance Reporting
|
||||
uses: CodSpeedHQ/action@3194d9a39c4d46684cb44bf7207fc56626aad8fd # pin@v4.15.1
|
||||
uses: CodSpeedHQ/action@4296e51e7041e24dadb86d1d6e8b9320d223dbe8 # v5.0.3
|
||||
with:
|
||||
mode: walltime
|
||||
run: inv dev.test --pytest
|
||||
@@ -492,7 +494,7 @@ jobs:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -541,7 +543,7 @@ jobs:
|
||||
- 3306:3306
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -584,7 +586,7 @@ jobs:
|
||||
- 5432:5432
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -597,7 +599,7 @@ jobs:
|
||||
- name: Run Tests
|
||||
run: invoke dev.test --check --migrations --report --coverage --translations
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # pin@v6.0.0
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
if: always()
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
@@ -618,7 +620,7 @@ jobs:
|
||||
INVENTREE_PLUGINS_ENABLED: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
name: Checkout Code
|
||||
@@ -664,118 +666,6 @@ jobs:
|
||||
chmod +rw /home/runner/work/InvenTree/db.sqlite3
|
||||
invoke migrate
|
||||
|
||||
web_ui:
|
||||
name: Tests - Web UI
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 60
|
||||
needs: ["code-style", "paths-filter"]
|
||||
if: needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true'
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17
|
||||
env:
|
||||
POSTGRES_DB: inventree
|
||||
POSTGRES_USER: inventree_user
|
||||
POSTGRES_PASSWORD: inventree_password
|
||||
ports:
|
||||
- 5432:5432
|
||||
options: >-
|
||||
--health-cmd "pg_isready -U testuser"
|
||||
--health-interval 10s
|
||||
--health-timeout 5s
|
||||
--health-retries 5
|
||||
|
||||
env:
|
||||
INVENTREE_DB_ENGINE: postgresql
|
||||
INVENTREE_DB_NAME: inventree
|
||||
INVENTREE_DB_HOST: "127.0.0.1"
|
||||
INVENTREE_DB_PORT: 5432
|
||||
INVENTREE_DB_USER: inventree_user
|
||||
INVENTREE_DB_PASSWORD: inventree_password
|
||||
INVENTREE_DEBUG: true
|
||||
INVENTREE_PLUGINS_ENABLED: false
|
||||
VITE_COVERAGE_BUILD: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
install: true
|
||||
update: true
|
||||
apt-dependency: gettext postgresql-client libpq-dev
|
||||
pip-dependency: psycopg2
|
||||
- name: Set up test data
|
||||
run: |
|
||||
invoke dev.setup-test -iv
|
||||
invoke int.rebuild-thumbnails
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
invoke int.frontend-compile --extract
|
||||
cd src/frontend && npx playwright install --with-deps
|
||||
- name: Run Playwright tests
|
||||
id: tests
|
||||
run: |
|
||||
cd src/frontend
|
||||
cp ./tests/fixtures/playwright_custom_logo.png ../backend/InvenTree/InvenTree/static/img/playwright_custom_logo.png
|
||||
cp ./tests/fixtures/playwright_custom_splash.png ../backend/InvenTree/InvenTree/static/img/playwright_custom_splash.png
|
||||
invoke static
|
||||
env INVENTREE_CUSTOM_SPLASH="img/playwright_custom_splash.png" INVENTREE_CUSTOM_LOGO="img/playwright_custom_logo.png" npx nyc playwright test --project=customization
|
||||
npx nyc playwright test --project=chromium --project=firefox
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
if: ${{ !cancelled() && steps.tests.outcome == 'failure' }}
|
||||
with:
|
||||
name: playwright-report
|
||||
path: src/frontend/playwright-report/
|
||||
retention-days: 14
|
||||
- name: Report coverage
|
||||
run: cd src/frontend && npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=lcov --exclude-after-remap false
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # pin@v6.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
slug: inventree/InvenTree
|
||||
flags: web
|
||||
- name: Upload bundler info
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
run: |
|
||||
cd src/frontend
|
||||
yarn install
|
||||
yarn run build
|
||||
|
||||
web_ui_build:
|
||||
name: Build - Web UI
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 60
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
uses: ./.github/actions/setup
|
||||
with:
|
||||
npm: true
|
||||
- name: Install dependencies
|
||||
run: cd src/frontend && yarn install
|
||||
- name: Build frontend
|
||||
run: cd src/frontend && yarn run compile && yarn run lib && yarn run build
|
||||
- name: Write version file - SHA
|
||||
run: cd src/backend/InvenTree/web/static/web/.vite && echo "$GITHUB_SHA" > sha.txt
|
||||
- name: Zip frontend
|
||||
run: |
|
||||
cd src/backend/InvenTree/web/static
|
||||
zip -r frontend-build.zip web/ web/.vite
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
with:
|
||||
name: frontend-build
|
||||
path: src/backend/InvenTree/web/static/web
|
||||
include-hidden-files: true
|
||||
|
||||
zizmor:
|
||||
name: Security [Zizmor]
|
||||
runs-on: ubuntu-24.04
|
||||
@@ -786,8 +676,8 @@ jobs:
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Run zizmor 🌈
|
||||
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
|
||||
uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2
|
||||
|
||||
@@ -7,7 +7,7 @@ on:
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
python_version: 3.11
|
||||
python_version: 3.12
|
||||
|
||||
jobs:
|
||||
stable:
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Version Check
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
pip install --require-hashes -r contrib/dev_reqs/requirements.txt
|
||||
python3 .github/scripts/version_check.py
|
||||
- name: Push to Stable Branch
|
||||
uses: ad-m/github-push-action@4cc74773234f74829a8c21bc4d69dd4be9cfa599 # pin@v1.1.0
|
||||
uses: ad-m/github-push-action@881a6320fdb16eb5318c5054f31c218aec2b324c # v1.3.0
|
||||
if: env.stable_release == 'true'
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -42,8 +42,10 @@ jobs:
|
||||
id-token: write
|
||||
contents: write
|
||||
attestations: write
|
||||
artifact-metadata: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -55,7 +57,7 @@ jobs:
|
||||
- name: Build frontend
|
||||
run: cd src/frontend && npm run compile && npm run build
|
||||
- name: Create SBOM for frontend
|
||||
uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # pin@v0
|
||||
uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0
|
||||
with:
|
||||
artifact-name: frontend-build.spdx
|
||||
path: src/frontend
|
||||
@@ -73,7 +75,7 @@ jobs:
|
||||
zip -r ../frontend-build.zip * .vite
|
||||
- name: Attest Build Provenance
|
||||
id: attest
|
||||
uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # pin@v1
|
||||
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
|
||||
with:
|
||||
subject-path: "${{ github.workspace }}/src/backend/InvenTree/web/static/frontend-build.zip"
|
||||
|
||||
@@ -83,15 +85,19 @@ jobs:
|
||||
REF: ${{ github.ref_name }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload frontend to artifacts
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: frontend-build
|
||||
path: src/backend/InvenTree/web/static/frontend-build.zip
|
||||
- name: Rename Attestation Bundle
|
||||
run: |
|
||||
mv ${BUNDLE_PATH} src/backend/InvenTree/web/static/frontend-build.intoto.jsonl
|
||||
env:
|
||||
BUNDLE_PATH: ${{ steps.attest.outputs.bundle-path}}
|
||||
- name: Upload Attestation
|
||||
run: gh release upload ${REF} ${BUNDLE_PATH}#frontend-build.intoto.jsonl
|
||||
run: gh release upload ${REF} src/backend/InvenTree/web/static/frontend-build.intoto.jsonl#frontend-build.intoto.jsonl
|
||||
env:
|
||||
REF: ${{ github.ref_name }}
|
||||
BUNDLE_PATH: ${{ steps.attest.outputs.bundle-path}}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
docs:
|
||||
@@ -109,7 +115,7 @@ jobs:
|
||||
INVENTREE_DEBUG: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -145,17 +151,17 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- ubuntu:22.04
|
||||
- ubuntu:24.04
|
||||
- debian:12
|
||||
- ubuntu:26.04
|
||||
- debian:13
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Get frontend artifact
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # pin@v8.0.1
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: frontend-build
|
||||
- name: Setup
|
||||
@@ -209,8 +215,14 @@ jobs:
|
||||
echo "calculate release channel"
|
||||
pip install --require-hashes -r contrib/dev_reqs/requirements.txt
|
||||
python3 .github/scripts/version_check.py
|
||||
- name: Package
|
||||
uses: pkgr/action/package@c5666febcd31750da6428042193fc5b2fb765435 # pin@main
|
||||
- name: cleanup
|
||||
run: |
|
||||
# remove .map files from static build - these are only needed for debug
|
||||
find src/backend/InvenTree/web/static/web -name "*.map" -type f -delete
|
||||
# remove the whole docs dir - we are not doing anything with them
|
||||
rm -rf docs
|
||||
- name: Package - current release channel
|
||||
uses: pkgr/action/package@c5666febcd31750da6428042193fc5b2fb765435 # main
|
||||
id: package
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
@@ -227,8 +239,8 @@ jobs:
|
||||
INVENTREE_PLUGIN_FILE=/opt/inventree/plugins.txt
|
||||
INVENTREE_CONFIG_FILE=/opt/inventree/config.yaml
|
||||
APP_REPO=inventree/InvenTree
|
||||
- name: Publish to go.packager.io
|
||||
uses: pkgr/action/publish@3bce081ae512c5020856e237d37b3f5479d4aa71 # pin@main
|
||||
- name: Publish to go.packager.io - current release channel
|
||||
uses: pkgr/action/publish@c5666febcd31750da6428042193fc5b2fb765435 # main
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
token: ${{ secrets.PACKAGER_RELEASE_TOKEN }}
|
||||
@@ -240,5 +252,31 @@ jobs:
|
||||
env:
|
||||
REF: ${{ github.ref_name }}
|
||||
PACKAGE_PATH: ${{ steps.package.outputs.package_path }}
|
||||
PACKAGE_NAME: ${{ matrix.target }}-{{ steps.setup.outputs.version }}.tar.gz
|
||||
PACKAGE_NAME: ${{ matrix.target }}-${{ steps.setup.outputs.version }}.tar.gz
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Package - stable release channel
|
||||
uses: pkgr/action/package@c5666febcd31750da6428042193fc5b2fb765435 # main
|
||||
id: package-stable
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
version: ${{ steps.setup.outputs.version }}
|
||||
debug: true
|
||||
cache_prefix: ${{ github.ref_name }}
|
||||
env: |
|
||||
INVENTREE_DB_ENGINE=sqlite3
|
||||
INVENTREE_DB_NAME=database.sqlite3
|
||||
INVENTREE_PLUGINS_ENABLED=true
|
||||
INVENTREE_MEDIA_ROOT=/opt/inventree/media
|
||||
INVENTREE_STATIC_ROOT=/opt/inventree/static
|
||||
INVENTREE_BACKUP_DIR=/opt/inventree/backup
|
||||
INVENTREE_PLUGIN_FILE=/opt/inventree/plugins.txt
|
||||
INVENTREE_CONFIG_FILE=/opt/inventree/config.yaml
|
||||
APP_REPO=inventree/InvenTree
|
||||
- name: Publish to go.packager.io - stable release channel
|
||||
uses: pkgr/action/publish@c5666febcd31750da6428042193fc5b2fb765435 # main
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
token: ${{ secrets.PACKAGER_RELEASE_TOKEN }}
|
||||
repository: inventree/InvenTree
|
||||
channel: stable
|
||||
file: ${{ steps.package-stable.outputs.package_path }}
|
||||
|
||||
@@ -32,12 +32,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: "Run analysis"
|
||||
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
|
||||
uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4
|
||||
with:
|
||||
results_file: results.sarif
|
||||
results_format: sarif
|
||||
@@ -67,6 +67,6 @@ jobs:
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4
|
||||
uses: github/codeql-action/upload-sarif@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # pin@v10.2.0
|
||||
- uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: "This issue seems stale. Please react to show this is still important."
|
||||
|
||||
@@ -6,7 +6,7 @@ on:
|
||||
- master
|
||||
|
||||
env:
|
||||
python_version: 3.11
|
||||
python_version: 3.12
|
||||
node_version: 24
|
||||
|
||||
permissions:
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # pin@v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Environment Setup
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
echo "Resetting to HEAD~"
|
||||
git reset HEAD~ || true
|
||||
- name: crowdin action
|
||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # pin@v2
|
||||
uses: crowdin/github-action@c7af9bc98b01694653031fef2a0dc6c7888ce9bc # v2
|
||||
with:
|
||||
upload_sources: true
|
||||
upload_translations: false
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4.2.2
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Setup
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
run: pip-compile --output-file=requirements.txt requirements.in -U
|
||||
- name: Update requirements-dev.txt
|
||||
run: pip-compile --generate-hashes --output-file=requirements-dev.txt requirements-dev.in -U
|
||||
- uses: stefanzweifel/git-auto-commit-action@fd157da78fa13d9383e5580d1fd1184d89554b51 # pin@v4.15.1
|
||||
- uses: stefanzweifel/git-auto-commit-action@fd157da78fa13d9383e5580d1fd1184d89554b51 # v4.15.1
|
||||
with:
|
||||
commit_message: "[Bot] Updated dependency"
|
||||
branch: dep-update
|
||||
|
||||
+2
-1
@@ -111,5 +111,6 @@ api.yaml
|
||||
src/backend/InvenTree/web/static
|
||||
InvenTree/web/static
|
||||
|
||||
# performance test results
|
||||
# test results and logs
|
||||
_tests*.txt
|
||||
.codspeed/
|
||||
|
||||
@@ -21,9 +21,9 @@ before:
|
||||
dependencies:
|
||||
- curl
|
||||
- poppler-utils
|
||||
- "python3.11 | python3.12 | python3.13 | python3.14"
|
||||
- "python3.11-venv | python3.12-venv | python3.13-venv | python3.14-venv"
|
||||
- "python3.11-dev | python3.12-dev | python3.13-dev | python3.14-dev"
|
||||
- "python3.12 | python3.13 | python3.14"
|
||||
- "python3.12-venv | python3.13-venv | python3.14-venv"
|
||||
- "python3.12-dev | python3.13-dev | python3.14-dev"
|
||||
- python3-pip
|
||||
- python3-cffi
|
||||
- python3-brotli
|
||||
@@ -36,6 +36,6 @@ dependencies:
|
||||
- jq
|
||||
- "libffi7 | libffi8"
|
||||
targets:
|
||||
ubuntu-22.04: true
|
||||
ubuntu-24.04: true
|
||||
debian-12: true
|
||||
ubuntu-26.04: true
|
||||
debian-13: true
|
||||
|
||||
@@ -37,7 +37,7 @@ repos:
|
||||
files: src/backend/requirements-dev\.(in|txt)$
|
||||
- id: pip-compile
|
||||
name: pip-compile requirements-dev.in 3.14
|
||||
args: [src/backend/requirements-dev.in, -o, src/backend/requirements-dev-3.14.txt, -c, src/backend/requirements-3.14.txt, --python-version=3.14, -c, src/backend/requirements.txt]
|
||||
args: [src/backend/requirements-dev.in, -o, src/backend/requirements-dev-3.14.txt, -c, src/backend/requirements-3.14.txt, --python-version=3.14, -c, src/backend/requirements.txt, -c, src/backend/requirements-dev.txt]
|
||||
files: src/backend/requirements-dev\.(in|txt)$
|
||||
- id: pip-compile
|
||||
name: pip-compile requirements.txt
|
||||
@@ -97,4 +97,4 @@ repos:
|
||||
rev: 0.4.3
|
||||
hooks:
|
||||
- id: teyit
|
||||
language_version: python3.11
|
||||
language_version: python3.12
|
||||
|
||||
Vendored
+1
-1
@@ -47,7 +47,7 @@
|
||||
"name": "InvenTree invoke schema",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/.venv/lib/python3.11/site-packages/invoke/__main__.py",
|
||||
"program": "${workspaceFolder}/.venv/lib/python3.12/site-packages/invoke/__main__.py",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"args": [
|
||||
"dev.schema","--ignore-warnings"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for codebase guidance.
|
||||
Security reports must follow the security policy in [SECURITY.md](docs/docs/SECURITY.md) and provide how they interact with the [threat model](docs/docs/concepts/threat_model.md).
|
||||
|
||||
Do not open a pull request without manual review by a human. Do not file AI generated issues under any circumstances.
|
||||
Using AI generated content in issue/PR discussions might lead to code of conduct violations and/or bans.
|
||||
+59
-4
@@ -5,7 +5,6 @@ All major notable changes to this project will be documented in this file (start
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
|
||||
## 2.0 - yyyy-mm-dd
|
||||
|
||||
### Breaking Changes - Remove deprecated features and APIs
|
||||
@@ -16,15 +15,68 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- [#11985](https://github.com/inventree/InvenTree/pull/11985) - removes legacy user endpoint fallback
|
||||
|
||||
|
||||
## Unreleased - YYYY-MM-DD
|
||||
## Unreleased - xxxx.xx.xx
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [#9604](https://github.com/inventree/InvenTree/pull/9604) - refactors user API endpoint to be less ambiguous
|
||||
- [#11893](https://github.com/inventree/InvenTree/pull/11893) bumps Node environment to version 24 LTS - this is only relevant if you build the frontend assets yourself
|
||||
- [#12507](https://github.com/inventree/InvenTree/pull/12507) calling an invalid or repeated state transition now raises a ValidationError. Plugins implementing state transitions should evaluate the PR and adapt their usage of transitions to gain the new safeguards.
|
||||
|
||||
### Added
|
||||
|
||||
### Changed
|
||||
|
||||
### Removed
|
||||
|
||||
## 1.5.0 - 2026-08-11
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [#12529](https://github.com/inventree/InvenTree/pull/12529) removes related detail fields on API endpoints for which the user does not have view permissions.
|
||||
- [#12360](https://github.com/inventree/InvenTree/pull/12360) removes the MPTT mixin from the StockItem model, and removes the self-referential tree structure from the database. This change was made to simplify the StockItem model and improve performance, as the MPTT tree structure was causing significant overhead in certain operations. Any external client applications which made use of the MPTT functionality will need to be updated to account for this change.
|
||||
- [#12320](https://github.com/inventree/InvenTree/pull/12320) changes the default behavior of the `invoke migrate` command. Now, it no longer generates new migrations by default. Instead, it will only apply existing migrations to the database. If you want to detect and generate new migrations, you must now explicitly use the `--detect` flag. This change was made to prevent accidental generation of migrations when running the command, which could lead to unexpected changes in the database schema. Additionally, `invoke update` will no longer result in new migrations being generated, and will only apply existing migrations to the database. This change was made to ensure that the update process is predictable and does not introduce unexpected changes to the database schema.
|
||||
- [#12223](https://github.com/inventree/InvenTree/pull/12223) removes support for python 3.11 and stops providing packages for Debian 11 and Ubuntu 20.04.
|
||||
|
||||
### Added
|
||||
|
||||
- [#12422](https://github.com/inventree/InvenTree/pull/12422) adds a "piece_count" field to the BomItem model, for representing cut-to-length parts. The total material required is calculated as `quantity x piece_count`.
|
||||
- Adds configurable default for merging purchase order line items via the `PURCHASEORDER_MERGE_LINE_ITEMS` global setting
|
||||
- [#12393](https://github.com/inventree/InvenTree/pull/12393) adds "discount" attribute to order line items, allowing users to specify a discount for each line item on an order. The discount can be specified as either a percentage or a fixed amount, and is applied to the line item total when calculating the order total.
|
||||
- [#12391](https://github.com/inventree/InvenTree/pull/12391) adds facility for bulk deleting line items against orders
|
||||
- [#12388](https://github.com/inventree/InvenTree/pull/12388) adds uniqueness requirements options for the Parameter and ParameterTemplate models. This allows users to specify whether a parameter value should be unique for a given model type, or globally unique across all models.
|
||||
- [#12310](https://github.com/inventree/InvenTree/pull/12310) adds the ability to disassemble (or break apart) assembled stock items into their component parts, based on the Bill of Materials (BOM) associated with the stock item. This allows users to easily break down assembled items into their constituent parts, which can be useful for inventory management and tracking purposes.
|
||||
- [#12117](https://github.com/inventree/InvenTree/pull/12117) adds a "preview" drawer to the InvenTree table component, allowing users to preview the details of a selected row without navigating away from the table view. This feature is optional and can be enabled or disabled via the `PREVIEW_DRAWER_ENABLED` system setting.
|
||||
- [#12341](https://github.com/inventree/InvenTree/pull/12341) adds support for importing internal part prices.
|
||||
- [#12295](https://github.com/inventree/InvenTree/pull/12295) adds "consumable" field to the Part model and API endpoints
|
||||
- [#12250](https://github.com/inventree/InvenTree/pull/12250) adds "active" field to the ProjectCode model and API endpoints
|
||||
|
||||
### Changed
|
||||
|
||||
- [#12274](https://github.com/inventree/InvenTree/pull/12274) fixes a bug in rendering the "table field" component in frontend forms. Any plugins which make use of the "table field" component in their forms may be affected by this change, and will need to update their form definitions accordingly.
|
||||
|
||||
### Removed
|
||||
|
||||
## 1.4.0 - 2026-06-24
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [#12160](https://github.com/inventree/InvenTree/pull/12160) changes the way that remote URIs are loaded into the PDF report generator. Remote URIs (e.g. `http://` and `https://`) are now blocked by default, and can be enabled via the `REPORT_FETCH_URLS` system setting. This change was made to improve the security of the report generation process, as allowing remote URL fetching can potentially expose internal network services to SSRF attacks. Additionally, file URIs (e.g. `file://`) are now always blocked, and assets must be embedded as `data:` URIs before reaching the PDF generator.
|
||||
- [#12107](https://github.com/inventree/InvenTree/pull/12107) makes a breaking change to the `SalesOrderStatusGroups` enum, fixing a bug where the "shipped" status was not included in the "active" group. This change may affect any external client applications which make use of the `SalesOrderStatusGroups` enum, as the "shipped" status will now be included in the "active" group instead of the "complete" group. If you are using this enum in an external client application, you will need to update your application to account for this change.
|
||||
- [#9604](https://github.com/inventree/InvenTree/pull/9604) refactors user API endpoint to be less ambiguous
|
||||
- [#11893](https://github.com/inventree/InvenTree/pull/11893) bumps Node environment to version 24 LTS - this is only relevant if you build the frontend assets yourself
|
||||
- [#11951](https://github.com/inventree/InvenTree/pull/11951) adds API throtteling by default to make DoS attacks more difficult. This can be disabled by setting the `INVENTREE_THROTTLE_ANON` and `INVENTREE_THROTTLE_USER` settings to `None` (either via environment variable or config file). The default throttling rates are 20 requests per minute for anonymous users, and 20 requests per second for authenticated users.
|
||||
|
||||
### Added
|
||||
|
||||
- [#12208](https://github.com/inventree/InvenTree/pull/12208) adds custom locale support for rendering currencies, dates and numbers within reports. This allows users to specify a custom locale for report rendering, which can be used to control the formatting of dates, numbers and currency values in the generated reports.
|
||||
- [#12204](https://github.com/inventree/InvenTree/pull/12204) adds new filtering options to PartCategoryTree and StockLocationTree API endpoints, allowing tree data to be fetched dynamically
|
||||
- [#12165](https://github.com/inventree/InvenTree/pull/12165) adds support for parameters against the PartCategory model
|
||||
- [#12103](https://github.com/inventree/InvenTree/pull/12103) adds column-based filtering to table views in the user interface. This extends the existing table filtering functionality by allowing users to apply filters directly to individual columns.
|
||||
- [#12093](https://github.com/inventree/InvenTree/pull/12093) adds "read_only" attribute to PluginSetting API endpoint, which indicates whether a particular plugin setting is read-only (i.e. cannot be modified via the API)
|
||||
- [#12079](https://github.com/inventree/InvenTree/pull/12079) adds the ability to save filter groups for table and calendar views in the user interface. This allows users to save and reuse commonly used filter configurations, improving the usability and efficiency of the interface.
|
||||
- [#12077](https://github.com/inventree/InvenTree/pull/12077) adds "tags" fields to multiple new model types and a /api/tag/ endpoint for fetching tags. Also adds the ability to filter various model types by tags.
|
||||
- [#12019](https://github.com/inventree/InvenTree/pull/12019) adds a "location" field to the StockCount API endpoint, allowing users to specify a location when performing a stock count. This field is optional, and if not provided, the stock count will be performed without changing the location of the stock item. If a location is provided, the stock item(s) will be moved to the specified location as part of the stock count operation.
|
||||
- [#12011](https://github.com/inventree/InvenTree/pull/12011) adds a "creation_date" field to the StockItem API endpoint, allowing users to track when each stock item was created. This field is read-only and is automatically set to the current date and time when a new stock item is created.
|
||||
- [#12000](https://github.com/inventree/InvenTree/pull/12000) adds support for auto-allocation of stock items against sales orders. This includes both backend and frontend changes, allowing users to trigger auto-allocation via the API or through the UI. The auto-allocation process will attempt to allocate available stock items to the sales order line items, based on the specified stock sorting and allocation rules.
|
||||
- [#11920](https://github.com/inventree/InvenTree/pull/11920) adds support for renaming attachments after they have been uploaded. This includes both backend and frontend changes, allowing users to rename attachments via the API or through the UI.
|
||||
- [#11914](https://github.com/inventree/InvenTree/pull/11914) adds a "maximum_stock" field to the Part model, allowing users to specify a maximum preferred stock level for each part. This is used in conjunction with the existing "minimum_stock" field to allow users to define a preferred stock range for each part. The "high_stock" filter has also been added to the Part API endpoint, allowing users to filter parts which are above their maximum stock level.
|
||||
- [#11631](https://github.com/inventree/InvenTree/pull/11631) adds "raw_amount" field to the BomItem model, allowing BOM quantities to account for the units of measure of the underlying part.
|
||||
@@ -39,12 +91,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
### Changed
|
||||
|
||||
- [#12197](https://github.com/inventree/InvenTree/pull/12197) requires staff permissions to restart machines via the API.
|
||||
- [#12142](https://github.com/inventree/InvenTree/pull/12142) prevents users from printing reports or labels against models for which they do not have adequate permissions. This change improves the security of the system by ensuring that users cannot access or print reports or labels for models they do not have permission to view.
|
||||
- [#11990](https://github.com/inventree/InvenTree/pull/11990) build output operations performed via the API now offload the work to a background task, and now return a task ID which can be used to monitor the progress of the task. This allows for better performance and responsiveness when performing build output operations, as the work is performed asynchronously in the background.
|
||||
- [#11825](https://github.com/inventree/InvenTree/pull/11825) adds a new "bom" ruleset and associated permissions for BOM management, separate from the "part" ruleset which remains focused on part management. This allows for more granular control over user permissions, allowing users to have different levels of access to part management and BOM management functionality.
|
||||
- [#11816](https://github.com/inventree/InvenTree/pull/11816) makes the `issued_by` field on the `Build` API read only, and instead sets the `issued_by` field to the current user when a build is created. This change was made to ensure that the `issued_by` field accurately reflects the user who created the build, and to prevent users from setting this field to an arbitrary value when creating or updating a build.
|
||||
|
||||
### Removed
|
||||
|
||||
- [#12071](https://github.com/inventree/InvenTree/pull/12071) removes the "review_needed" field on the StockItem model. Note that this field was never exposed to the API or any business logic, and is essentially a no-op field which is not used for anything. This field was removed to simplify the StockItem model and reduce confusion around its purpose.
|
||||
- [#11962](https://github.com/inventree/InvenTree/pull/11962) removes the "remote_image" field from the Part API endpoint, which (previously) allowed the user to specify a remote URL for an image to be downloaded and associated with the part. This field was removed due to security concerns around downloading images from arbitrary URLs. If you were using this field in an external client application, you will need to update your application to use the new "download_image_from_url" API endpoint instead.
|
||||
|
||||
## 1.3.0 - 2026-04-11
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for codebase guidance.
|
||||
Security reports must follow the security policy in [SECURITY.md](docs/docs/SECURITY.md) and provide how they interact with the [threat model](docs/docs/concepts/threat_model.md).
|
||||
|
||||
Do not open a pull request without manual review by a human. Do not file AI generated issues under any circumstances.
|
||||
Using AI generated content in issue/PR discussions might lead to code of conduct violations and/or bans.
|
||||
+215
-4
@@ -1,15 +1,28 @@
|
||||
### Contributing to InvenTree
|
||||
# Contributing to InvenTree
|
||||
|
||||
Hi there, thank you for your interest in contributing!
|
||||
Please read our contribution guidelines, before submitting your first pull request to the InvenTree codebase.
|
||||
|
||||
### Project File Structure
|
||||
## About InvenTree
|
||||
|
||||
InvenTree is an open-source inventory management system designed for makers, engineers, and small manufacturers.
|
||||
|
||||
The codebase is split into two independently deployable layers:
|
||||
|
||||
**Backend — Django (Python)**
|
||||
A REST API built with Django and Django REST Framework. It owns all business logic, the database schema, background task processing (Django-Q2), plugin execution, and report generation. The backend can be used standalone via the API without the frontend.
|
||||
|
||||
**Frontend — React (TypeScript)**
|
||||
A single-page application built with React 19, Mantine 9, and Vite. It communicates exclusively through the backend REST API. It has its own build pipeline, test suite (Playwright), and i18n system (Lingui). The frontend lives entirely in `src/frontend/` and has no Django awareness.
|
||||
|
||||
When making changes, be clear about which layer you are working in — they have separate toolchains, test runners, and linting rules.
|
||||
|
||||
## Project File Structure
|
||||
|
||||
The InvenTree project is split into two main components: frontend and backend. This source is located in the `src` directory. All other files are used for project management, documentation, and testing.
|
||||
|
||||
```bash
|
||||
```
|
||||
InvenTree/
|
||||
├─ .devops/ # Files for Azure DevOps
|
||||
├─ .github/ # Files for GitHub
|
||||
│ ├─ actions/ # Reused actions
|
||||
│ ├─ ISSUE_TEMPLATE/ # Templates for issues and pull requests
|
||||
@@ -39,11 +52,209 @@ InvenTree/
|
||||
│ │ ├─ tsconfig.json # Settings for frontend compilation
|
||||
├─ .pkgr.yml # Build definition for Debian/Ubuntu packages
|
||||
├─ .pre-commit-config.yaml # Code formatter/linter configuration
|
||||
├─ biome.json # JS/TS linting and formatting config
|
||||
├─ CONTRIBUTING.md # Contribution guidelines and overview
|
||||
├─ Procfile # Process definition for Debian/Ubuntu packages
|
||||
├─ pyproject.toml # Python tooling config (Ruff, pytest, coverage, djLint, ty)
|
||||
├─ README.md # General project information and overview
|
||||
├─ SECURITY.md # Project security policy
|
||||
├─ tasks.py # Action definitions for development, testing and deployment
|
||||
```
|
||||
|
||||
### Backend app domains
|
||||
|
||||
The following Django apps are defined in `src/backend/InvenTree/`:
|
||||
|
||||
| Directory | Domain |
|
||||
|-----------|--------|
|
||||
| `build/` | Build (manufacturing/assembly) orders |
|
||||
| `common/` | Shared models, settings, utilities |
|
||||
| `company/` | Suppliers, customers, manufacturers |
|
||||
| `data_exporter/` | Data export functionality |
|
||||
| `generic/` | Shared enums, events, and state machine utilities |
|
||||
| `importer/` | Data import functionality |
|
||||
| `InvenTree/` | Core configuration (settings, URLs, middleware) |
|
||||
| `machine/` | Support for external machines and devices |
|
||||
| `order/` | Purchase orders and sales orders |
|
||||
| `part/` | Parts catalogue and categories |
|
||||
| `stock/` | Stock items and locations |
|
||||
| `report/` | Report templates and generation |
|
||||
| `plugin/` | Plugin system |
|
||||
| `users/` | User accounts and permissions |
|
||||
| `web/` | Serves the React frontend static build to Django |
|
||||
|
||||
### Frontend layout
|
||||
|
||||
```
|
||||
src/frontend/src/
|
||||
components/ # Reusable React components
|
||||
pages/ # Page-level route components
|
||||
tables/ # Data table components
|
||||
forms/ # Form components
|
||||
hooks/ # Custom React hooks
|
||||
states/ # Zustand global state
|
||||
locales/ # i18n translation catalogues (Lingui)
|
||||
```
|
||||
|
||||
## Development Setup
|
||||
|
||||
The project uses [Invoke](https://www.pyinvoketasks.com/) (`tasks.py`) as the task runner.
|
||||
|
||||
```bash
|
||||
# One-time setup: creates venv at dev/venv/, installs deps, sets up pre-commit hooks
|
||||
invoke dev.setup-dev
|
||||
|
||||
# Apply database migrations (and detect/create new migration files if required)
|
||||
invoke migrate --detect
|
||||
|
||||
# Create an admin account (required to log in)
|
||||
invoke superuser
|
||||
|
||||
# Terminal 1 — Django dev server (port 8000)
|
||||
invoke dev.server
|
||||
|
||||
# Terminal 2 — Vite dev server with HMR (port 5173)
|
||||
invoke dev.frontend-server
|
||||
|
||||
# Terminal 3 (optional) — Background task worker
|
||||
invoke worker
|
||||
```
|
||||
|
||||
A VS Code Dev Container configuration is available at `.devcontainer/` and includes PostgreSQL 15 and Redis 7 sidecar services.
|
||||
|
||||
To see all available tasks, run `invoke --list`.
|
||||
|
||||
## Running Backend Tests
|
||||
|
||||
Always pass `--keepdb` to backend test commands. It reuses the existing test database instead of rebuilding it from scratch on every run, which is significantly faster.
|
||||
|
||||
```bash
|
||||
# All backend tests
|
||||
invoke dev.test --keepdb
|
||||
|
||||
# Specific test module
|
||||
invoke dev.test --keepdb --runtest=company.test_api
|
||||
|
||||
# With coverage
|
||||
invoke dev.test --keepdb --coverage
|
||||
|
||||
# Migration tests only (skip --keepdb here — migrations must run against a fresh DB)
|
||||
invoke dev.test --migrations
|
||||
```
|
||||
|
||||
## Running Frontend Tests
|
||||
|
||||
Frontend tests use [Playwright](https://playwright.dev/) and target Chromium and Firefox. The test runner automatically starts the Vite dev server (port 5173), the Django backend (port 8000), and the background worker — no manual server startup is needed.
|
||||
|
||||
```bash
|
||||
# Open Playwright's interactive UI (recommended for local development)
|
||||
invoke dev.frontend-test
|
||||
|
||||
# Run tests in headless mode from the frontend directory
|
||||
cd src/frontend && npx playwright test
|
||||
|
||||
# Run a specific test file
|
||||
cd src/frontend && npx playwright test tests/pui_login.spec.ts
|
||||
|
||||
# Run tests in a specific browser only
|
||||
cd src/frontend && npx playwright test --project=chromium
|
||||
```
|
||||
|
||||
Test files live in `src/frontend/tests/` and follow the `pui_*.spec.ts` naming convention.
|
||||
|
||||
Locally, tests run with a single worker (required for Vite HMR compatibility). In CI they run with multiple workers against a production build for speed.
|
||||
|
||||
## Code Style and Linting
|
||||
|
||||
All formatting and linting runs automatically on commit via pre-commit hooks. Never skip them.
|
||||
|
||||
### Python (Backend)
|
||||
|
||||
Tool: **Ruff** (replaces Black, isort, flake8, and others).
|
||||
|
||||
```bash
|
||||
ruff check src/backend/ # Lint
|
||||
ruff format src/backend/ # Format
|
||||
```
|
||||
|
||||
- Google-style docstrings enforced
|
||||
- Enabled rule sets: A, B, C, D, F, I, N, SIM, PIE, PLE, PLW, RUF, UP, W
|
||||
- Type checking: `ty` (configured in `pyproject.toml`)
|
||||
|
||||
### Django Templates
|
||||
|
||||
Tool: **djLint**
|
||||
|
||||
```bash
|
||||
djlint src/backend/ --check
|
||||
```
|
||||
|
||||
### JavaScript / TypeScript (Frontend)
|
||||
|
||||
Tool: **Biome** (replaces ESLint + Prettier).
|
||||
|
||||
```bash
|
||||
cd src/frontend
|
||||
yarn biome check . # Lint + format check
|
||||
yarn biome format . # Format only
|
||||
```
|
||||
|
||||
- Single quotes, space indentation
|
||||
- `noUnusedImports` is an error
|
||||
|
||||
## Making Changes
|
||||
|
||||
### Backend
|
||||
|
||||
- Each Django app has its own `models.py`, `serializers.py`, `views.py`, `urls.py`, and `filters.py`.
|
||||
- API endpoints use Django REST Framework; document them with drf-spectacular decorators.
|
||||
- After changing models, create a migration: `invoke dev.makemigrations`.
|
||||
- Tests live in `test_*.py` files within each app directory.
|
||||
- Background tasks go through Django-Q2; define them in the app's `tasks.py`.
|
||||
|
||||
### Frontend
|
||||
|
||||
- Pages register themselves in `src/frontend/src/router.tsx`.
|
||||
- Server state fetching uses TanStack Query (React Query); avoid raw `useEffect` for data fetching.
|
||||
- Global UI state uses Zustand stores in `states/`.
|
||||
- UI components come from Mantine 9.x; use the Mantine component library before writing custom CSS.
|
||||
- Add i18n strings with Lingui (`t` macro / `Trans` component); run `invoke int.frontend-trans` to extract from source and compile. (`invoke dev.translate` is for the full translation pipeline and is not intended for local use.)
|
||||
- Playwright tests live in `src/frontend/tests/`.
|
||||
|
||||
### Dependencies
|
||||
|
||||
**Python:** Add packages to `src/backend/requirements.in` (or `requirements-dev.in` for dev-only tools). The pre-commit hook runs `pip-compile` automatically on commit to regenerate `requirements.txt`. Never edit `requirements.txt` directly.
|
||||
|
||||
**Frontend:** Add packages with `yarn add <package>` from `src/frontend/`.
|
||||
|
||||
### Migrations
|
||||
|
||||
- Never edit existing migration files; always generate new ones.
|
||||
- Keep migrations reversible where possible.
|
||||
- Migration tests run in CI under the tag `migration_test`.
|
||||
|
||||
## CI / CD
|
||||
|
||||
GitHub Actions workflows live in `.github/workflows/`. Key workflows:
|
||||
|
||||
| Workflow | Purpose |
|
||||
|----------|---------|
|
||||
| `qc_checks.yaml` | Lint, type-check, backend tests, API schema |
|
||||
| `frontend.yaml` | Playwright E2E tests, frontend build |
|
||||
| `docker.yaml` | Docker image builds |
|
||||
| `translations.yaml` | Crowdin i18n sync |
|
||||
|
||||
CI uses path-based filtering — only affected jobs run per PR. Coverage tracked via Codecov; quality analysis via SonarCloud.
|
||||
|
||||
## Key Conventions
|
||||
|
||||
- **REST API versioning:** Endpoint changes must not break the published API schema. Run `invoke dev.schema` and check the diff before opening a PR.
|
||||
- **Plugin safety:** The plugin system (`plugin/`) is a public extension point; avoid breaking its interfaces.
|
||||
- **No hardcoded secrets:** gitleaks runs in pre-commit and CI — any credential-shaped string will block merges.
|
||||
- **Database portability:** Code must work on PostgreSQL, MySQL/MariaDB, and SQLite. Avoid database-specific SQL or ORM features.
|
||||
- **Frontend translations:** Every user-visible string must be wrapped in a Lingui `t` macro or `<Trans>` component.
|
||||
- **Test tagging:** Tag slow or special tests (`@tag('migration_test')`, `@tag('performance_test')`) so CI can filter them selectively.
|
||||
|
||||
---
|
||||
|
||||
Refer to our [contribution guidelines](https://docs.inventree.org/en/latest/develop/contributing/) for more information!
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
[](https://inventree.readthedocs.io/en/latest/?badge=latest)
|
||||

|
||||
[](https://app.netlify.com/sites/inventree/deploys)
|
||||
[](https://dev.azure.com/InvenTree/InvenTree%20test%20statistics/_build/latest?definitionId=3&branchName=testing)
|
||||
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/7179)
|
||||
[](https://securityscorecards.dev/viewer/?uri=github.com/inventree/InvenTree)
|
||||
@@ -202,6 +201,7 @@ Find a full list of used third-party libraries in the license information dialog
|
||||
<a href="https://www.netlify.com"> <img src="https://www.netlify.com/v3/img/components/netlify-color-bg.svg" alt="Deploys by Netlify" /> </a>
|
||||
<a href="https://crowdin.com"> <img src="https://crowdin.com/images/crowdin-logo.svg" alt="Translation by Crowdin" /> </a> <br>
|
||||
<a href="https://codspeed.io/inventree/InvenTree?utm_source=badge"><img src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" alt="CodSpeed Badge"/></a>
|
||||
<a href="https://flakiness.io/InvenTree/InvenTree"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fflakiness.io%2Fapi%2Fbadge%3Finput%3D%257B%2522badgeToken%2522%253A%2522badge-35mqq5Ht4uL3vGF8lR9P2D%2522%257D" alt="Flakiness Badge"/></a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
+5
-2
@@ -24,7 +24,7 @@ flag_management:
|
||||
carryforward: true
|
||||
statuses:
|
||||
- type: project
|
||||
target: 40%
|
||||
target: 38%
|
||||
- name: web
|
||||
carryforward: true
|
||||
statuses:
|
||||
@@ -43,8 +43,10 @@ component_management:
|
||||
name: Backend Apps
|
||||
paths:
|
||||
- src/backend/InvenTree/build/**
|
||||
- src/backend/InvenTree/common/**
|
||||
- src/backend/InvenTree/company/**
|
||||
- src/backend/InvenTree/data_exporter/**
|
||||
- src/backend/InvenTree/generic/**
|
||||
- src/backend/InvenTree/importer/**
|
||||
- src/backend/InvenTree/machine/**
|
||||
- src/backend/InvenTree/order/**
|
||||
@@ -70,7 +72,8 @@ component_management:
|
||||
- component_id: web
|
||||
name: Frontend
|
||||
paths:
|
||||
- src/frontend/**
|
||||
- src/frontend/lib/**
|
||||
- src/frontend/src/**
|
||||
statuses:
|
||||
- type: project
|
||||
target: 68% # 90%
|
||||
|
||||
+14
-6
@@ -9,11 +9,19 @@ COMPOSE_PROJECT_NAME=inventree
|
||||
INVENTREE_TAG=stable
|
||||
|
||||
# InvenTree server URL - update this to match your server URL
|
||||
INVENTREE_SITE_URL="http://inventree.localhost"
|
||||
#INVENTREE_SITE_URL="http://192.168.1.2" # You can specify a local IP address here
|
||||
# Local: http://localhost or http://inventree.localhost (requires hosts entry)
|
||||
# LAN: http://192.168.133.37
|
||||
INVENTREE_SITE_URL="http://localhost"
|
||||
#INVENTREE_SITE_URL="http://inventree.localhost"
|
||||
#INVENTREE_SITE_URL="https://inventree.my-domain.com" # Or a public domain name (which you control)
|
||||
|
||||
# Port that the InvenTree server listens on *inside* the container - do not change unless you know what you are doing
|
||||
INVENTREE_WEB_PORT=8000
|
||||
|
||||
# Ports that the proxy (Caddy) publishes on the *host* - change these to serve InvenTree on a non-standard port
|
||||
#INVENTREE_HTTP_PORT=80
|
||||
#INVENTREE_HTTPS_PORT=443
|
||||
|
||||
# InvenTree proxy forwarding settings
|
||||
INVENTREE_USE_X_FORWARDED_HOST=True
|
||||
INVENTREE_USE_X_FORWARDED_PORT=True
|
||||
@@ -34,10 +42,10 @@ INVENTREE_PLUGINS_ENABLED=True
|
||||
INVENTREE_AUTO_UPDATE=True
|
||||
|
||||
# InvenTree superuser account details
|
||||
# Un-comment (and complete) these lines to auto-create an admin account
|
||||
#INVENTREE_ADMIN_USER=
|
||||
#INVENTREE_ADMIN_PASSWORD=
|
||||
#INVENTREE_ADMIN_EMAIL=
|
||||
# Demo dataset includes its own users — see docs/demo.md
|
||||
#INVENTREE_ADMIN_USER=admin
|
||||
#INVENTREE_ADMIN_PASSWORD=admin
|
||||
#INVENTREE_ADMIN_EMAIL=admin@localhost
|
||||
|
||||
# Database configuration options
|
||||
# DO NOT CHANGE THESE SETTINGS (unless you really know what you are doing)
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
# - Runs InvenTree web server under django development server
|
||||
# - Monitors source files for any changes, and live-reloads server
|
||||
|
||||
# Base image last bumped 2026-03-20
|
||||
FROM python:3.14-slim-trixie@sha256:fb83750094b46fd6b8adaa80f66e2302ecbe45d513f6cece637a841e1025b4ca AS inventree_base
|
||||
# Base image last bumped 2026-06-16
|
||||
FROM python:3.14.7-slim-trixie@sha256:ce40764625a4ff50df3548277632e7f96c4e77fe75fa848aae9885476e7df5a4 AS inventree_base
|
||||
|
||||
# Build arguments for this image
|
||||
ARG commit_tag=""
|
||||
@@ -18,6 +18,7 @@ ARG commit_hash=""
|
||||
ARG commit_date=""
|
||||
|
||||
ARG data_dir="data"
|
||||
ARG NODE_VERSION=24
|
||||
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
|
||||
@@ -118,15 +119,11 @@ RUN pip install --user --require-hashes -r base_requirements.txt --no-cache-dir
|
||||
rm -rf /root/.cache/pip
|
||||
|
||||
# Install frontend build dependencies
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
nodejs npm \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN npm install -g n yarn --ignore-scripts && \
|
||||
yarn config set network-timeout 600000 -g
|
||||
RUN bash -c "n lts"
|
||||
RUN cd "${INVENTREE_HOME}" && invoke int.frontend-compile --extract
|
||||
# pinned to v0.40.5
|
||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/1889911f0841e669de0be5bd02c737a3f1fd20fa/install.sh | bash && \
|
||||
bash -c "export NVM_DIR="$HOME/.nvm" && source $HOME/.nvm/nvm.sh && \
|
||||
nvm install $NODE_VERSION && corepack enable yarn && yarn config set network-timeout 600000 -g"
|
||||
RUN bash -c "source $HOME/.nvm/nvm.sh && cd '${INVENTREE_HOME}' && invoke int.frontend-compile --extract"
|
||||
|
||||
# InvenTree production image:
|
||||
# - Copies required files from local directory
|
||||
@@ -149,6 +146,13 @@ ENV PATH=/root/.local/bin:$PATH
|
||||
COPY --from=builder_stage ${INVENTREE_BACKEND_DIR}/InvenTree/web/static/web ${INVENTREE_BACKEND_DIR}/InvenTree/web/static/web
|
||||
COPY --from=builder_stage /root/.local /root/.local
|
||||
|
||||
# Compile Django backend translations during image build
|
||||
RUN bash -c "cd '${INVENTREE_HOME}' && invoke int.backend-compilemessages"
|
||||
|
||||
# Generate license information for installed python packages
|
||||
RUN pip-licenses --format=json --with-license-file --no-license-path > "${INVENTREE_BACKEND_DIR}/InvenTree/InvenTree/licenses.txt" \
|
||||
&& test -s "${INVENTREE_BACKEND_DIR}/InvenTree/InvenTree/licenses.txt"
|
||||
|
||||
# Launch the production server
|
||||
CMD ["sh", "-c", "exec gunicorn -c ./gunicorn.conf.py InvenTree.wsgi -b ${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT} --chdir ${INVENTREE_BACKEND_DIR}/InvenTree"]
|
||||
|
||||
|
||||
@@ -60,6 +60,9 @@ services:
|
||||
inventree-cache:
|
||||
image: redis:7-alpine
|
||||
container_name: inventree-cache
|
||||
# Disable disk persistence to avoid permission errors on Windows bind mounts.
|
||||
# The /data volume is retained for layout consistency (#11100); cache data is ephemeral.
|
||||
command: redis-server --save "" --appendonly no
|
||||
env_file:
|
||||
- .env
|
||||
expose:
|
||||
|
||||
@@ -19,7 +19,7 @@ threads = 4
|
||||
|
||||
|
||||
# Worker timeout (default = 90 seconds)
|
||||
timeout = os.environ.get('INVENTREE_GUNICORN_TIMEOUT', '90')
|
||||
timeout = int(os.environ.get('INVENTREE_GUNICORN_TIMEOUT', '90'))
|
||||
|
||||
# Number of worker processes
|
||||
workers = os.environ.get('INVENTREE_GUNICORN_WORKERS', None)
|
||||
@@ -43,7 +43,13 @@ preload_app = True
|
||||
|
||||
|
||||
def post_fork(server, worker):
|
||||
"""Post-fork hook to set up logging for each worker."""
|
||||
"""Post-fork hook called after each worker process is forked."""
|
||||
from django.db import connections
|
||||
|
||||
# Close any DB connections inherited from the master process — PostgreSQL
|
||||
# connections are not fork-safe, so each worker must open its own.
|
||||
connections.close_all()
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
if not settings.TRACING_ENABLED:
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# Base python requirements for docker containers
|
||||
|
||||
# Basic package requirements
|
||||
invoke>=2.2.0 # Invoke build tool
|
||||
pyyaml>=6.0.1
|
||||
setuptools>=69.0.0
|
||||
wheel>=0.41.0
|
||||
invoke # Invoke build tool
|
||||
pyyaml
|
||||
setuptools
|
||||
wheel
|
||||
|
||||
# Database links
|
||||
psycopg[binary, pool]
|
||||
mysqlclient>=2.2.0
|
||||
mariadb>=1.1.8
|
||||
mysqlclient
|
||||
mariadb
|
||||
|
||||
# gunicorn web server
|
||||
gunicorn>=22.0.0
|
||||
gunicorn
|
||||
|
||||
# LDAP required packages
|
||||
django-auth-ldap # Django integration for ldap auth
|
||||
|
||||
+108
-108
@@ -1,14 +1,14 @@
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile contrib/container/requirements.in -o contrib/container/requirements.txt --python-version=3.14 -c src/backend/requirements.txt
|
||||
asgiref==3.11.1 \
|
||||
--hash=sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce \
|
||||
--hash=sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133
|
||||
asgiref==3.12.1 \
|
||||
--hash=sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340 \
|
||||
--hash=sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# django
|
||||
django==5.2.14 \
|
||||
--hash=sha256:58a63ba841662e5c686b57ba1fec52ddd68c0b93bd96ac3029d55728f00bf8a2 \
|
||||
--hash=sha256:6f712143bd3064310d1f50fac859c3e9a274bdcfc9595339853be7779297fc76
|
||||
django==5.2.16 \
|
||||
--hash=sha256:04f354bf9d807a86ad1a8392fe3808d362358a8eafc322848e0e43e59b24371d \
|
||||
--hash=sha256:59ea02020c3136fce14bef0bbece21a10a4febef5eed1c51c22ae468efa22200
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/container/requirements.in
|
||||
@@ -17,9 +17,9 @@ django-auth-ldap==5.3.0 \
|
||||
--hash=sha256:743d8107b146240b46f7e97207dc06cb11facc0cd70dce490b7ca09dd5643d19 \
|
||||
--hash=sha256:aa880415983149b072f876d976ef8ec755a438090e176817998263a6ed9e1038
|
||||
# via -r contrib/container/requirements.in
|
||||
gunicorn==25.3.0 \
|
||||
--hash=sha256:cacea387dab08cd6776501621c295a904fe8e3b7aae9a1a3cbb26f4e7ed54660 \
|
||||
--hash=sha256:f74e1b2f9f76f6cd1ca01198968bd2dd65830edc24b6e8e4d78de8320e2fe889
|
||||
gunicorn==26.0.0 \
|
||||
--hash=sha256:40233d26a5f0d1872916188c276e21641155111c2853f0c2cd55260aec0d24fc \
|
||||
--hash=sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/container/requirements.in
|
||||
@@ -53,82 +53,82 @@ mysqlclient==2.2.8 \
|
||||
--hash=sha256:9bed7c8d3b629bdc09e17fb628d5b3b0a5fd1f12b09432b464b9126c727bedc0 \
|
||||
--hash=sha256:a81f5e12f8d05439709cb02fba97f9f76d1a6c528164f2260d8798fec969e300
|
||||
# via -r contrib/container/requirements.in
|
||||
packaging==26.2 \
|
||||
--hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \
|
||||
--hash=sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661
|
||||
packaging==26.3 \
|
||||
--hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \
|
||||
--hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# gunicorn
|
||||
# mariadb
|
||||
# wheel
|
||||
psycopg[binary, pool]==3.3.3 \
|
||||
--hash=sha256:5e9a47458b3c1583326513b2556a2a9473a1001a56c9efe9e587245b43148dd9 \
|
||||
--hash=sha256:f96525a72bcfade6584ab17e89de415ff360748c766f0106959144dcbb38c698
|
||||
psycopg[binary, pool]==3.3.4 \
|
||||
--hash=sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a \
|
||||
--hash=sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc
|
||||
# via -r contrib/container/requirements.in
|
||||
psycopg-binary==3.3.3 \
|
||||
--hash=sha256:05f32239aec25c5fb15f7948cffdc2dc0dac098e48b80a140e4ba32b572a2e7d \
|
||||
--hash=sha256:07c7211f9327d522c9c47560cae00a4ecf6687f4e02d779d035dd3177b41cb12 \
|
||||
--hash=sha256:0dde92cfde09293fb63b3f547919ba7d73bd2654573c03502b3263dd0218e44e \
|
||||
--hash=sha256:111c59897a452196116db12e7f608da472fbff000693a21040e35fc978b23430 \
|
||||
--hash=sha256:162e5675efb4704192411eaf8e00d07f7960b679cd3306e7efb120bb8d9456cc \
|
||||
--hash=sha256:165f22ab5a9513a3d7425ffb7fcc7955ed8ccaeef6d37e369d6cc1dff1582383 \
|
||||
--hash=sha256:17bb6600e2455993946385249a3c3d0af52cd70c1c1cdbf712e9d696d0b0bf1b \
|
||||
--hash=sha256:19f93235ece6dbfc4036b5e4f6d8b13f0b8f2b3eeb8b0bd2936d406991bcdd40 \
|
||||
--hash=sha256:1bef235a50a80f6aba05147002bc354559657cb6386dbd04d8e1c97d1d7cbe84 \
|
||||
--hash=sha256:258d1ea53464d29768bf25930f43291949f4c7becc706f6e220c515a63a24edd \
|
||||
--hash=sha256:263a24f39f26e19ed7fc982d7859a36f17841b05bebad3eb47bb9cd2dd785351 \
|
||||
--hash=sha256:329ff393441e75f10b673ae99ab45276887993d49e65f141da20d915c05aafd8 \
|
||||
--hash=sha256:42961609ac07c232a427da7c87a468d3c82fee6762c220f38e37cfdacb2b178d \
|
||||
--hash=sha256:47f06fcbe8542b4d96d7392c476a74ada521c5aebdb41c3c0155f6595fc14c8d \
|
||||
--hash=sha256:48e500cf1c0984dacf1f28ea482c3cdbb4c2288d51c336c04bc64198ab21fc51 \
|
||||
--hash=sha256:497852c5eaf1f0c2d88ab74a64a8097c099deac0c71de1cbcf18659a8a04a4b2 \
|
||||
--hash=sha256:4d4606c84d04b80f9138d72f1e28c6c02dc5ae0c7b8f3f8aaf89c681ce1cd1b1 \
|
||||
--hash=sha256:5152d50798c2fa5bd9b68ec68eb68a1b71b95126c1d70adaa1a08cd5eefdc23d \
|
||||
--hash=sha256:533efe6dc3a7cba5e2a84e38970786bb966306863e45f3db152007e9f48638a6 \
|
||||
--hash=sha256:56c767007ca959ca32f796b42379fc7e1ae2ed085d29f20b05b3fc394f3715cc \
|
||||
--hash=sha256:5958dbf28b77ce2033482f6cb9ef04d43f5d8f4b7636e6963d5626f000efb23e \
|
||||
--hash=sha256:59aa31fe11a0e1d1bcc2ce37ed35fe2ac84cd65bb9036d049b1a1c39064d0f14 \
|
||||
--hash=sha256:642050398583d61c9856210568eb09a8e4f2fe8224bf3be21b67a370e677eead \
|
||||
--hash=sha256:6698dbab5bcef8fdb570fc9d35fd9ac52041771bfcfe6fd0fc5f5c4e36f1e99d \
|
||||
--hash=sha256:73eaaf4bb04709f545606c1db2f65f4000e8a04cdbf3e00d165a23004692093e \
|
||||
--hash=sha256:74eae563166ebf74e8d950ff359be037b85723d99ca83f57d9b244a871d6c13b \
|
||||
--hash=sha256:78c9ce98caaf82ac8484d269791c1b403d7598633e0e4e2fa1097baae244e2f1 \
|
||||
--hash=sha256:7c84f9d214f2d1de2fafebc17fa68ac3f6561a59e291553dfc45ad299f4898c1 \
|
||||
--hash=sha256:883d68d48ca9ff3cb3d10c5fdebea02c79b48eecacdddbf7cce6e7cdbdc216b8 \
|
||||
--hash=sha256:8e7e9eca9b363dbedeceeadd8be97149d2499081f3c52d141d7cd1f395a91f83 \
|
||||
--hash=sha256:90eecd93073922f085967f3ed3a98ba8c325cbbc8c1a204e300282abd2369e13 \
|
||||
--hash=sha256:97c839717bf8c8df3f6d983a20949c4fb22e2a34ee172e3e427ede363feda27b \
|
||||
--hash=sha256:9d6a1e56dd267848edb824dbeb08cf5bac649e02ee0b03ba883ba3f4f0bd54f2 \
|
||||
--hash=sha256:9f7d0cf072c6fbac3795b08c98ef9ea013f11db609659dcfc6b1f6cc31f9e181 \
|
||||
--hash=sha256:a39f34c9b18e8f6794cca17bfbcd64572ca2482318db644268049f8c738f35a6 \
|
||||
--hash=sha256:a4aab31bd6d1057f287c96c0effca3a25584eb9cc702f282ecb96ded7814e830 \
|
||||
--hash=sha256:a6af77b6626ce92b5817bf294b4d45ec1a6161dba80fc2d82cdffdd6814fd023 \
|
||||
--hash=sha256:a89bb9ee11177b2995d87186b1d9fa892d8ea725e85eab28c6525e4cc14ee048 \
|
||||
--hash=sha256:ae07a3114313dd91fce686cab2f4c44af094398519af0e0f854bc707e1aeedf1 \
|
||||
--hash=sha256:b27d3a23c79fa59557d2cc63a7e8bb4c7e022c018558eda36f9d7c4e6b99a6e0 \
|
||||
--hash=sha256:b3385b58b2fe408a13d084c14b8dcf468cd36cbbe774408250facc128f9fa75c \
|
||||
--hash=sha256:b62cf8784eb6d35beaee1056d54caf94ec6ecf2b7552395e305518ab61eb8fd2 \
|
||||
--hash=sha256:cab7bc3d288d37a80aa8c0820033250c95e40b1c2b5c57cf59827b19c2a8b69d \
|
||||
--hash=sha256:cb85b1d5702877c16f28d7b92ba030c1f49ebcc9b87d03d8c10bf45a2f1c7508 \
|
||||
--hash=sha256:d257c58d7b36a621dcce1d01476ad8b60f12d80eb1406aee4cf796f88b2ae482 \
|
||||
--hash=sha256:d593612758d0041cb13cb0003f7f8d3fabb7ad9319e651e78afae49b1cf5860e \
|
||||
--hash=sha256:da2f331a01af232259a21573a01338530c6016dcfad74626c01330535bcd8628 \
|
||||
--hash=sha256:dac7ee2f88b4d7bb12837989ca354c38d400eeb21bce3b73dac02622f0a3c8d6 \
|
||||
--hash=sha256:e77957d2ba17cada11be09a5066d93026cdb61ada7c8893101d7fe1c6e1f3925 \
|
||||
--hash=sha256:e7800e6c6b5dc4b0ca7cc7370f770f53ac83886b76afda0848065a674231e856 \
|
||||
--hash=sha256:e7b607f0e14f2a4cf7e78a05ebd13df6144acfba87cb90842e70d3f125d9f53f \
|
||||
--hash=sha256:eb072949b8ebf4082ae24289a2b0fd724da9adc8f22743409d6fd718ddb379df \
|
||||
--hash=sha256:eb36a08859b9432d94ea6b26ec41a2f98f83f14868c91321d0c1e11f672eeae7 \
|
||||
--hash=sha256:f24e8e17035200a465c178e9ea945527ad0738118694184c450f1192a452ff25 \
|
||||
--hash=sha256:fab6b5e37715885c69f5d091f6ff229be71e235f272ebaa35158d5a46fd548a0
|
||||
psycopg-binary==3.3.4 \
|
||||
--hash=sha256:018fbed325936da502feb546642c982dcc4b9ffdea32dfef78dbf3b7f7ad4070 \
|
||||
--hash=sha256:0579252a1202cd73e4da137a1426e2dae993ae44e757605344282af3a082848c \
|
||||
--hash=sha256:136f199a407b5348b9b857c504aff60c77622a28482e7195839ce1b51238c4cc \
|
||||
--hash=sha256:13a7f380824c35896dcac7fe0f61440f7ca49d6dc73f3c13a9a4471e6a3b302e \
|
||||
--hash=sha256:17a21953a9e5ff3a16dab692625a3676e2f101db5e40072f39dbee2250194d68 \
|
||||
--hash=sha256:1dc1f79fd16bb1f3f4421417a514607539f17804d95c7ed617265369d1981cae \
|
||||
--hash=sha256:1fbaa292a3c8bb61b45df1ad3da1908ccee7cb889db9425e3557d9e34e2a4829 \
|
||||
--hash=sha256:22cdbf5f91ef7bb91fe0c5757e1962d3127a8010256eefd9c61fcaf441802097 \
|
||||
--hash=sha256:26df2717e59c0473e4465a97dfb1b7afebaa479277870fd5784d1436470db47c \
|
||||
--hash=sha256:276904e3452d6a23d474ef9a21eee19f20eed3d53ddd2576af033827e0ba0992 \
|
||||
--hash=sha256:28b7398fdd19db3232c884fb24550bdfe951221f510e195e233299e4c9b78f97 \
|
||||
--hash=sha256:2c09aad7051326e7603c14e50636db9c01f78272dc54b3accff03d46370461e6 \
|
||||
--hash=sha256:32a6fbf8481e3a370d0d72b860d35948a693cb01281da217f7b2f307636e591a \
|
||||
--hash=sha256:41f2ec0fea529832982bcb6c9415de3c86264ebe562b77a467c0fbcd7efbba8d \
|
||||
--hash=sha256:46893c26858be12cc49ca4226ed6a60b4bfccadd946b3bebb783a60b38788228 \
|
||||
--hash=sha256:47c656a8a7ba6eb0cff1801a4caaa9c8bdc12d03080e273aff1c8ac39971a77e \
|
||||
--hash=sha256:494ca54901be8cf9eb7e02c25b731f2317c378efa44f43e8f9bd0e1184ae7be4 \
|
||||
--hash=sha256:514404ed543efd620c85602b747df2a23cf1241b4067199e1a66f2d2757aaa41 \
|
||||
--hash=sha256:574ea21a9651958f1535c5a1c649c7409e9168bcbffa29a3f2f961f58b322949 \
|
||||
--hash=sha256:580ae30a5f95ccd90008ec697d3ed6a4a2047a516407ad904283fa42086936e9 \
|
||||
--hash=sha256:5ab28a2a7649df3b72e6b674b4c190e448e8e77cf496a65bd846472048de2089 \
|
||||
--hash=sha256:5c4ab71be17bdca30cb34c34c4e1496e2f5d6f20c199c12bad226070b22ef9bf \
|
||||
--hash=sha256:612a627d733f695b1de1f9b4bd511c15f999a5d8b915d444bbd7dd71cf3370da \
|
||||
--hash=sha256:6402a9d8146cf4b3974ded3fd28a971e83dc6a0333eb7822524a3aa20b546578 \
|
||||
--hash=sha256:6b9016b1714da4dd5ecaaa75b82098aa5a0b87854ce9b092e21c27c4ae23e014 \
|
||||
--hash=sha256:71e55ccbdfae79a2ed9c6369c3008a3025817ff9d7e27b32a2d84e2a4267e66e \
|
||||
--hash=sha256:7465bfe6087d2d5b42d4c53b9b11ca9f218e477317a4a162a10e3c19e984ba8e \
|
||||
--hash=sha256:75a9067e236f9b9ae3535b66fe99bddb33d39c0de10112e49b9ab11eee53dc31 \
|
||||
--hash=sha256:773d573e11f437ce0bdb95b7c18dc58390494f96d43f8b45b9760436114f7652 \
|
||||
--hash=sha256:77df19583501ea288eaf15ac0fe7ad01e6d8091a91d5c41df5c718f307d8e31b \
|
||||
--hash=sha256:7f7668f30b9dd5163197e5cbf4e0efd54e00f0a859cc566ce56cfc31f4054839 \
|
||||
--hash=sha256:8c0056529e68dbe9184cd4019a1f3d8f3a4ead2f6fc7a5afcf27d3314edd1277 \
|
||||
--hash=sha256:94596f9e7633ee3f6440711d43bb70aa31cc0a46a900ab8b4201a366ace5c9e7 \
|
||||
--hash=sha256:ab8cca8ef8fb1ccf5b048ae5bd78ba55b9e4b5d472e3ce5ca39ff4d2a9c249e4 \
|
||||
--hash=sha256:ad3bc94054876155549fdaedf4a46d1ec69d39a5bcee377148afe498e84c4b8e \
|
||||
--hash=sha256:b56b603ebcea8aa10b46228b8410ba7f13e7c2ee54389d4d9be0927fd8ce2a70 \
|
||||
--hash=sha256:b6f5a29e9c775b9f12a1a717aa7a2c80f9e1db6f27ba44a5b59c80ac61d2ffcf \
|
||||
--hash=sha256:b7bfff1ca23732b488cbca3076fc11bc98d520ee122514fdb17a8e20d3338f5a \
|
||||
--hash=sha256:bdef84570ebbce1d42b4e7ea952d21c414c5f118ad02fee00c5625f35e134429 \
|
||||
--hash=sha256:c37e024c07308cd06cf3ec51bfd0e7f6157585a4d84d1bce4a7f5f7913719bf8 \
|
||||
--hash=sha256:c677c4ad433cb7150c8cd304a0769ae3bcfbe5ea0676eb53faa7b1443b16d0d3 \
|
||||
--hash=sha256:cf7f73a4a792bc5db58a4b385d8a1467e8d468f7548702fb0ed1e9b7501b1c13 \
|
||||
--hash=sha256:cffc3408d77a27973f33e5d909b624cce683db5fc25964b02fe0aae7886c1007 \
|
||||
--hash=sha256:d7b4d40c153fa352ab3cca530f3a0baedf7621b2ebcbd7f084009522c21788fc \
|
||||
--hash=sha256:dbfdb9b6cc79f31104a7b162a2b921b765fcc62af6c00540a167a8de47e4ed38 \
|
||||
--hash=sha256:df1d567fc430f6df15c9fcf67d87685fc49bdb325adc0db5af1adfb2f44eb5c9 \
|
||||
--hash=sha256:e2631da29253a98bd496e6c4813b24e09a4fe3fb2a9e88513305d6f8747cce95 \
|
||||
--hash=sha256:e7510c37550f91a187e3660a8cc50d4b760f8c3b8b2f89ebc5698cd2c7f2c85d \
|
||||
--hash=sha256:eb05ee1c2b817d27c537333224c9e83c7afb86fe7296ba970990068baf819b16 \
|
||||
--hash=sha256:eb4eed2079c01a4850bf467deacfab56d356d4225040170af03dc9958321242d \
|
||||
--hash=sha256:ee17a2cf4943cde261adfad1bbc5bf38d6b3776d7afff74c7cabcbeaeb08c260 \
|
||||
--hash=sha256:f80e3f2b5331dbbf0901bcb658056c03eeb2c1ef31d774afb0d61598b242e744 \
|
||||
--hash=sha256:f9b1c2533af01cd7648378599f82b0b8ae32f293296e6eec5753a625bc97ef28 \
|
||||
--hash=sha256:fa1cbc10768a796c96d3243656016bf4e337c81c71097270bb7b0ad6210d9765 \
|
||||
--hash=sha256:fbd1d4ed566895ad2d3bf4ddfd8bae90026930ddf29df3b9d91d32c8c47866a7
|
||||
# via psycopg
|
||||
psycopg-pool==3.3.0 \
|
||||
--hash=sha256:2e44329155c410b5e8666372db44276a8b1ebd8c90f1c3026ebba40d4bc81063 \
|
||||
--hash=sha256:fa115eb2860bd88fce1717d75611f41490dec6135efb619611142b24da3f6db5
|
||||
psycopg-pool==3.3.1 \
|
||||
--hash=sha256:2af5b432941c4c9ad5c87b3fa410aec910ec8f7c122855897983a06c45f2e4b5 \
|
||||
--hash=sha256:b10b10b7a175d5cc1592147dc5b7eec8a9e0834eb3ed2c4a92c858e2f51eb63c
|
||||
# via psycopg
|
||||
pyasn1==0.6.3 \
|
||||
--hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \
|
||||
--hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde
|
||||
pyasn1==0.6.4 \
|
||||
--hash=sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81 \
|
||||
--hash=sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b
|
||||
# via
|
||||
# pyasn1-modules
|
||||
# python-ldap
|
||||
@@ -136,8 +136,8 @@ pyasn1-modules==0.4.2 \
|
||||
--hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \
|
||||
--hash=sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6
|
||||
# via python-ldap
|
||||
python-ldap==3.4.5 \
|
||||
--hash=sha256:b2f6ef1c37fe2c6a5a85212efe71311ee21847766a7d45fcb711f3b270a5f79a
|
||||
python-ldap==3.4.7 \
|
||||
--hash=sha256:bacd9fb680d20263d8570ade1cf234d90d281149a8beb4f079dd8f33f7613dc8
|
||||
# via
|
||||
# -r contrib/container/requirements.in
|
||||
# django-auth-ldap
|
||||
@@ -218,44 +218,44 @@ pyyaml==6.0.3 \
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/container/requirements.in
|
||||
setuptools==82.0.1 \
|
||||
--hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \
|
||||
--hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb
|
||||
setuptools==83.0.0 \
|
||||
--hash=sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef \
|
||||
--hash=sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/container/requirements.in
|
||||
sqlparse==0.5.5 \
|
||||
--hash=sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba \
|
||||
--hash=sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e
|
||||
sqlparse==0.6.0 \
|
||||
--hash=sha256:113c35c75365ab9cc9c7231d68c6428fb11c085fc8e9eb1ad659b7ddbf6cd2b9 \
|
||||
--hash=sha256:b861c0288ce2fa56209a9a6412d2e066ac664b3873b89c26c9d8415e8e32996f
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# django
|
||||
typing-extensions==4.15.0 \
|
||||
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
|
||||
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
|
||||
typing-extensions==4.16.0 \
|
||||
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
|
||||
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# psycopg-pool
|
||||
uv==0.11.7 \
|
||||
--hash=sha256:0df59ab0c6a4b14a763e8445e1c303af9abeb53cdfa4428daf9ff9642c0a3cce \
|
||||
--hash=sha256:162fa961a9a081dcea6e889c79f738a5ae56507047e4672964972e33c301bea9 \
|
||||
--hash=sha256:23d457d6731ebdb83f1bffebe4894edab2ef43c1ec5488433c74300db4958924 \
|
||||
--hash=sha256:46d971489b00bdb27e0aa715e4a5cd4ef2c28ea5b6ef78f2b67bf861eb44b405 \
|
||||
--hash=sha256:4e4d5e31bea86e1b6e0f5a0f95e14e80018e6f6c0129256d2915a4b3d793644d \
|
||||
--hash=sha256:553e67cc766d013ce24353fecd4ea5533d2aedcfd35f9fac430e07b1d1f23ed4 \
|
||||
--hash=sha256:5674dfb5944513f4b3735b05c2deba6b1b01151f46729d533d413a9a905f8c5d \
|
||||
--hash=sha256:5985a15a92bd9a170fc1947abb1fbc3e9828c5a430ad85b5bed8356c20b67a71 \
|
||||
--hash=sha256:6158b7e39464f1aa1e040daa0186cae4749a78b5cd80ac769f32ca711b8976b1 \
|
||||
--hash=sha256:750ee5b96959b807cf442b73dd8b55111862d63f258f896787ea5f06b68aaca9 \
|
||||
--hash=sha256:7d6a17507b8139b8803f445a03fd097f732ce8356b1b7b13cdb4dd8ef7f4b2e0 \
|
||||
--hash=sha256:8b2fe1ec6775dad10183e3fdce430a5b37b7857d49763c884f3a67eaa8ca6f8a \
|
||||
--hash=sha256:ceae53b202ea92bc954759bc7c7570cdcd5c3512fce15701198c19fd2dfb8605 \
|
||||
--hash=sha256:dd48823ca4b505124389f49ae50626ba9f57212b9047738efc95126ed5f3844d \
|
||||
--hash=sha256:eb91f52ee67e10d5290f2c2897e2171357f1a10966de38d83eefa93d96843b0c \
|
||||
--hash=sha256:f394331f0507e80ee732cb3df737589de53bed999dd02a6d24682f08c2f8ac4f \
|
||||
--hash=sha256:f422d39530516b1dfb28bb6e90c32bb7dacd50f6a383cd6e40c1a859419fbc8c \
|
||||
--hash=sha256:f97e9f4e4d44fb5c4dfaa05e858ef3414a96416a2e4af270ecd88a3e5fb049a9 \
|
||||
--hash=sha256:fab0bb43fbbc0ee5b5fee212078d2300c371b725faff7cf72eeaafa0bff0606b
|
||||
uv==0.11.29 \
|
||||
--hash=sha256:0222a51972e42bc1c132761ea027b9086d710ff5fa5199af658955bd03bee4d8 \
|
||||
--hash=sha256:157ed0bcfef5aba9b53ff4b322e009b3261d83fbf5d9423e367a33c0416c85ac \
|
||||
--hash=sha256:257c6df4393116114f296f7a02f51db9a2117f68c3ae93bbe218fa79e6521df3 \
|
||||
--hash=sha256:2b49e175bfbcd8ac1e09e06f0b9d544b9e671d2cdecf753aa3fbff4d61d19317 \
|
||||
--hash=sha256:2dc8012a693b6bb9ec17dcb2c2345cf273ccad06ae2ab4a8c7a0833955812c75 \
|
||||
--hash=sha256:606e2bc7880d70448ff4359faa43a7c71743283010262fc142e1ca9fcb6937cf \
|
||||
--hash=sha256:60e792b00f4cd6c5eadd814161cd046fa8418d83621d85d3e65aae28dc5b53ff \
|
||||
--hash=sha256:66b250d102f0e49f3d2306353aaabb43f39da5ccfa4e84fe10ba8a25de85316c \
|
||||
--hash=sha256:7711c46452b44332352d344b5818ad8faf04596efaf837d8114aa9984e4a9610 \
|
||||
--hash=sha256:7d618b4a2ae2b367d20710858838344604d5b9e8c0863343d5f793142408ea11 \
|
||||
--hash=sha256:865f09f5de0c1913bf9ed424bcc5c1a15780d01debd4d62b8a22c8f3e9bdb420 \
|
||||
--hash=sha256:91b5d1407ac8757e1757268e9d983e9e7b72eeb826808f9e2404344a6de1d3fb \
|
||||
--hash=sha256:a4ca34dc3b247740e511ca7c718181d5300e7899bbef755db45bb6c993610a64 \
|
||||
--hash=sha256:aa166ce529cfbce6b3afaabdc4cdbfdf9e3e3d82413c709d679ff374eb76d5e9 \
|
||||
--hash=sha256:abc641b24be42dc5d62f63ecb3500c07a0fb3c596e407963708f59114f0816ad \
|
||||
--hash=sha256:db119a3ec9d7ce42e98de3d014427d74fd92f1f7c40fc9dfe62b14601a9e83da \
|
||||
--hash=sha256:e245e6f95f154ae56793bfc7742ec27334a546469bba4d09c03624470ab451d2 \
|
||||
--hash=sha256:eec03a8b63d55915694db3af4e91324b39ced49e2aeac7af37851c7eb3f470ea \
|
||||
--hash=sha256:f7e4c709397468264764f571003fd278cbd384321f5c497370c28352bdb8b6a9
|
||||
# via -r contrib/container/requirements.in
|
||||
wheel==0.47.0 \
|
||||
--hash=sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Packages needed for CI/packages
|
||||
requests==2.33.1
|
||||
requests==2.34.2
|
||||
pyyaml==6.0.3
|
||||
jc==1.25.6
|
||||
jc
|
||||
|
||||
+106
-142
@@ -1,153 +1,117 @@
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile contrib/dev_reqs/requirements.in -o contrib/dev_reqs/requirements.txt -c src/backend/requirements.txt
|
||||
certifi==2026.4.22 \
|
||||
--hash=sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a \
|
||||
--hash=sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580
|
||||
certifi==2026.7.22 \
|
||||
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
|
||||
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# requests
|
||||
charset-normalizer==3.4.7 \
|
||||
--hash=sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc \
|
||||
--hash=sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c \
|
||||
--hash=sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67 \
|
||||
--hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \
|
||||
--hash=sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0 \
|
||||
--hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \
|
||||
--hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \
|
||||
--hash=sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444 \
|
||||
--hash=sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153 \
|
||||
--hash=sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9 \
|
||||
--hash=sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01 \
|
||||
--hash=sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217 \
|
||||
--hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \
|
||||
--hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \
|
||||
--hash=sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a \
|
||||
--hash=sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83 \
|
||||
--hash=sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5 \
|
||||
--hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \
|
||||
--hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \
|
||||
--hash=sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c \
|
||||
--hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \
|
||||
--hash=sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42 \
|
||||
--hash=sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab \
|
||||
--hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \
|
||||
--hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \
|
||||
--hash=sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207 \
|
||||
--hash=sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18 \
|
||||
--hash=sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734 \
|
||||
--hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \
|
||||
--hash=sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 \
|
||||
--hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \
|
||||
--hash=sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44 \
|
||||
--hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \
|
||||
--hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \
|
||||
--hash=sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e \
|
||||
--hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \
|
||||
--hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \
|
||||
--hash=sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53 \
|
||||
--hash=sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790 \
|
||||
--hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \
|
||||
--hash=sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b \
|
||||
--hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \
|
||||
--hash=sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d \
|
||||
--hash=sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10 \
|
||||
--hash=sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6 \
|
||||
--hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \
|
||||
--hash=sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776 \
|
||||
--hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \
|
||||
--hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \
|
||||
--hash=sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008 \
|
||||
--hash=sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943 \
|
||||
--hash=sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374 \
|
||||
--hash=sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246 \
|
||||
--hash=sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e \
|
||||
--hash=sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5 \
|
||||
--hash=sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616 \
|
||||
--hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \
|
||||
--hash=sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41 \
|
||||
--hash=sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960 \
|
||||
--hash=sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752 \
|
||||
--hash=sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e \
|
||||
--hash=sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72 \
|
||||
--hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \
|
||||
--hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \
|
||||
--hash=sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b \
|
||||
--hash=sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4 \
|
||||
--hash=sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545 \
|
||||
--hash=sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706 \
|
||||
--hash=sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366 \
|
||||
--hash=sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb \
|
||||
--hash=sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a \
|
||||
--hash=sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e \
|
||||
--hash=sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 \
|
||||
--hash=sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f \
|
||||
--hash=sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a \
|
||||
--hash=sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1 \
|
||||
--hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \
|
||||
--hash=sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356 \
|
||||
--hash=sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319 \
|
||||
--hash=sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4 \
|
||||
--hash=sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad \
|
||||
--hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \
|
||||
--hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \
|
||||
--hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \
|
||||
--hash=sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0 \
|
||||
--hash=sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686 \
|
||||
--hash=sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34 \
|
||||
--hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \
|
||||
--hash=sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c \
|
||||
--hash=sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1 \
|
||||
--hash=sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e \
|
||||
--hash=sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60 \
|
||||
--hash=sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0 \
|
||||
--hash=sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274 \
|
||||
--hash=sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d \
|
||||
--hash=sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0 \
|
||||
--hash=sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae \
|
||||
--hash=sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f \
|
||||
--hash=sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d \
|
||||
--hash=sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe \
|
||||
--hash=sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3 \
|
||||
--hash=sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393 \
|
||||
--hash=sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1 \
|
||||
--hash=sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af \
|
||||
--hash=sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44 \
|
||||
--hash=sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00 \
|
||||
--hash=sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c \
|
||||
--hash=sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3 \
|
||||
--hash=sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7 \
|
||||
--hash=sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd \
|
||||
--hash=sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e \
|
||||
--hash=sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b \
|
||||
--hash=sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8 \
|
||||
--hash=sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259 \
|
||||
--hash=sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859 \
|
||||
--hash=sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46 \
|
||||
--hash=sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30 \
|
||||
--hash=sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b \
|
||||
--hash=sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 \
|
||||
--hash=sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24 \
|
||||
--hash=sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a \
|
||||
--hash=sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24 \
|
||||
--hash=sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc \
|
||||
--hash=sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215 \
|
||||
--hash=sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 \
|
||||
--hash=sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832 \
|
||||
--hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \
|
||||
--hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \
|
||||
--hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464
|
||||
charset-normalizer==3.4.9 \
|
||||
--hash=sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380 \
|
||||
--hash=sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62 \
|
||||
--hash=sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c \
|
||||
--hash=sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226 \
|
||||
--hash=sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5 \
|
||||
--hash=sha256:0fa1aec2d32bcc03c8fa0f6f1712caad1adc38509f31142112e5c9daf5b9c833 \
|
||||
--hash=sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b \
|
||||
--hash=sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99 \
|
||||
--hash=sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501 \
|
||||
--hash=sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec \
|
||||
--hash=sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698 \
|
||||
--hash=sha256:231ddcbb35e2ff8973e1365db41fe0572662893b99a05deb183b68ad4c0c8bd4 \
|
||||
--hash=sha256:253a4a220747e8b5faf57ec320c4f5efb0cef05f647420bf267143ec15dba10a \
|
||||
--hash=sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3 \
|
||||
--hash=sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2 \
|
||||
--hash=sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a \
|
||||
--hash=sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e \
|
||||
--hash=sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4 \
|
||||
--hash=sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419 \
|
||||
--hash=sha256:3c09a49d6cde137258beb3d551994a2927fd35ad5cf96aed573f61bbd67c5f84 \
|
||||
--hash=sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da \
|
||||
--hash=sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519 \
|
||||
--hash=sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe \
|
||||
--hash=sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381 \
|
||||
--hash=sha256:43b9e366a31fdd1c87d0eb08f579b4a82b723ea54338f040d6b4e518a026ea29 \
|
||||
--hash=sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614 \
|
||||
--hash=sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0 \
|
||||
--hash=sha256:476743fe6dfe14a2da12e3ac79125dc84a3b2cf8094369a47a1529b0cd8549fe \
|
||||
--hash=sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29 \
|
||||
--hash=sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0 \
|
||||
--hash=sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917 \
|
||||
--hash=sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9 \
|
||||
--hash=sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32 \
|
||||
--hash=sha256:58150c9f9b9a552505912d182ccdf26f6396fb6094816ceebcbb20eecabaed94 \
|
||||
--hash=sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63 \
|
||||
--hash=sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd \
|
||||
--hash=sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198 \
|
||||
--hash=sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde \
|
||||
--hash=sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012 \
|
||||
--hash=sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1 \
|
||||
--hash=sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15 \
|
||||
--hash=sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b \
|
||||
--hash=sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993 \
|
||||
--hash=sha256:68ce9f4d6b26d5ccbf7fd4459bf75f74a0a146677ebba80597df60cbdb20e6f4 \
|
||||
--hash=sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5 \
|
||||
--hash=sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8 \
|
||||
--hash=sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35 \
|
||||
--hash=sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642 \
|
||||
--hash=sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2 \
|
||||
--hash=sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d \
|
||||
--hash=sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9 \
|
||||
--hash=sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c \
|
||||
--hash=sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33 \
|
||||
--hash=sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db \
|
||||
--hash=sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf \
|
||||
--hash=sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9 \
|
||||
--hash=sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee \
|
||||
--hash=sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84 \
|
||||
--hash=sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44 \
|
||||
--hash=sha256:920079c3f7456fa213e0829ed2073aaa727fd39d889ead5b4f35d0de5460d04f \
|
||||
--hash=sha256:93d59d504b230e83c7a843251681959a0b6a9cd76f6e146ce1b8a80eb8739af9 \
|
||||
--hash=sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9 \
|
||||
--hash=sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177 \
|
||||
--hash=sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8 \
|
||||
--hash=sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b \
|
||||
--hash=sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39 \
|
||||
--hash=sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41 \
|
||||
--hash=sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0 \
|
||||
--hash=sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616 \
|
||||
--hash=sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d \
|
||||
--hash=sha256:ad41ba96094304aa090f5a30cb6e4fb3b3f1c264c523394b4c39bbacc4dc92ba \
|
||||
--hash=sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2 \
|
||||
--hash=sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b \
|
||||
--hash=sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9 \
|
||||
--hash=sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b \
|
||||
--hash=sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209 \
|
||||
--hash=sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48 \
|
||||
--hash=sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046 \
|
||||
--hash=sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632 \
|
||||
--hash=sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a \
|
||||
--hash=sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2 \
|
||||
--hash=sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1 \
|
||||
--hash=sha256:ddf4af30b417d9fe16481e9b81c27ab2a7cde1ff7ba3e85653b02db7d145dc7b \
|
||||
--hash=sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990 \
|
||||
--hash=sha256:df7276909358e5635ae203673ab7e509ddd224225a8d6b0790bf13eb2bde1cc5 \
|
||||
--hash=sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b \
|
||||
--hash=sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9 \
|
||||
--hash=sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534 \
|
||||
--hash=sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81 \
|
||||
--hash=sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a \
|
||||
--hash=sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d \
|
||||
--hash=sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf \
|
||||
--hash=sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# requests
|
||||
idna==3.15 \
|
||||
--hash=sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 \
|
||||
--hash=sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc
|
||||
idna==3.18 \
|
||||
--hash=sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2 \
|
||||
--hash=sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# requests
|
||||
jc==1.25.6 \
|
||||
--hash=sha256:27f58befc7ae0a4c63322926c5f1ec892e3eac4a065eff3b07cfe420a6924a07 \
|
||||
--hash=sha256:7367b59e6e0da8babeede1e5b0da083f3c5aa6b6e585b4aed28dd7c4b2d76162
|
||||
jc==1.25.7 \
|
||||
--hash=sha256:5ed6a0da915c931c04693cab806d5c31d9ef14ca998c6c32308460d37cb30baf \
|
||||
--hash=sha256:63481e34d92715781e1b094eca7d76d122a14489463d45b7f3e8180f44ea3a10
|
||||
# via -r contrib/dev_reqs/requirements.in
|
||||
pygments==2.20.0 \
|
||||
--hash=sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f \
|
||||
@@ -230,9 +194,9 @@ pyyaml==6.0.3 \
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/dev_reqs/requirements.in
|
||||
requests==2.33.1 \
|
||||
--hash=sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517 \
|
||||
--hash=sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a
|
||||
requests==2.34.2 \
|
||||
--hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \
|
||||
--hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed
|
||||
# via
|
||||
# -c src/backend/requirements.txt
|
||||
# -r contrib/dev_reqs/requirements.in
|
||||
|
||||
@@ -79,7 +79,7 @@ function detect_python() {
|
||||
echo "${On_Red}"
|
||||
echo "# POI07| Python ${SETUP_PYTHON} not found - aborting!"
|
||||
echo "# POI07| Please ensure python can be executed with the command '$SETUP_PYTHON' by the current user '$USER'."
|
||||
echo "# POI07| If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.11'."
|
||||
echo "# POI07| If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.12'."
|
||||
echo "${Color_Off}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -26,7 +26,7 @@ export DATA_DIR=${APP_HOME}/data
|
||||
export SETUP_NGINX_FILE=${SETUP_NGINX_FILE:-/etc/nginx/sites-enabled/inventree.conf}
|
||||
export SETUP_ADMIN_PASSWORD_FILE=${CONF_DIR}/admin_password.txt
|
||||
export SETUP_NO_CALLS=${SETUP_NO_CALLS:-false}
|
||||
export SETUP_PYTHON=${SETUP_PYTHON:-python3.11}
|
||||
export SETUP_PYTHON=${SETUP_PYTHON:-python3.12}
|
||||
export SETUP_ADMIN_NOCREATION=${SETUP_ADMIN_NOCREATION:-false}
|
||||
# SETUP_DEBUG can be set to get debug info
|
||||
# SETUP_EXTRA_PIP can be set to install extra pip packages
|
||||
|
||||
@@ -48,7 +48,7 @@ Users can authenticate against the API using basic authentication - specifically
|
||||
Each user is assigned an authentication token which can be used to access the API. This token is persistent for that user (unless invalidated by an administrator) and can be used across multiple sessions.
|
||||
|
||||
!!! info "Token Administration"
|
||||
User tokens can be created and/or invalidated via the user settings, [Admin Center](../settings/admin.md#admin-center) or admin interface.
|
||||
User tokens can be created and/or invalidated via the user settings, [Admin Center](../settings/admin.md#admin-center), or the [Database Admin interface](../settings/db_admin.md).
|
||||
|
||||
#### Requesting a Token
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@ Transfer the currently selected stock location into another location. Scanning a
|
||||
|
||||
Receive incoming purchase order items into the selected location. Scanning a *new* barcode which is associated with an item in an incoming purchase order will receive the item into the selected location.
|
||||
|
||||
*Note: Both purchase order number and supplier SKU's are required to be found on the barcode for this function to find the associated line item. Missing one will lead to an error.*
|
||||
|
||||
#### Scan Items Into Location
|
||||
|
||||
the *Scan Items Into Location* action allows you to scan items into the selected location. Scanning a valid barcode associated with a stock item (already in the database) will result in that item being transferred to the selected location.
|
||||
@@ -105,6 +107,8 @@ From the [Purchase Order detail page](./po.md#purchase-order-detail) page, the f
|
||||
|
||||
Receive incoming purchase order items against the selected purchase order. Scanning a *new* barcode which is associated with an item in an incoming purchase order will receive the item into stock.
|
||||
|
||||
*Note: supplier SKU's are required to be found on the barcode for this function to find the associated line item.*
|
||||
|
||||
### Sales Order Actions
|
||||
|
||||
The following barcode actions are available for [Sales Orders](./so.md):
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 40 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 152 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -31,7 +31,7 @@ The barcode is tested as follows, in decreasing order of priority:
|
||||
|
||||
InvenTree comes with a few builtin supplier plugins, which handle their respective barcode formats.
|
||||
|
||||
Scanning a supplier barcode for a supplied part will link to the corresponding supplier part if the [SKU](../report/context_variables.md#supplierpart) from the barcode could be matched.
|
||||
Scanning a supplier barcode for a supplied part will link to the corresponding supplier part if the [SKU](../report/model_context.md#supplier-part) from the barcode could be matched.
|
||||
|
||||
The following suppliers (and barcode formats) are currently supported:
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ If enabled, InvenTree can retain logs of the most recent barcode scans. This can
|
||||
|
||||
Refer to the [barcode settings](../settings/global.md#barcodes) to enable barcode history logging.
|
||||
|
||||
The barcode history can be viewed via the admin panel in the web interface.
|
||||
The barcode history can be viewed in the [Admin Center](../settings/admin.md#admin-center) in the web interface.
|
||||
|
||||
## Barcode Settings
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ title: Importing Data
|
||||
|
||||
## Importing Data
|
||||
|
||||
External data can be imported via the admin interface, allowing for rapid integration of existing datasets, or bulk editing of table data.
|
||||
External data can be imported via the [Admin Center](../settings/admin.md#admin-center), allowing for rapid integration of existing datasets, or bulk editing of table data.
|
||||
|
||||
!!! danger "Danger"
|
||||
Uploading bulk data directly is a non-reversible action.
|
||||
@@ -57,7 +57,7 @@ An import session can be initiated from a number of different contexts within th
|
||||
|
||||
Staff users can create an import session from within the [Admin Center](../settings/admin.md#admin-center). This is a general-purpose import session, and the user will be required to select the type of data to import.
|
||||
|
||||
Users can quickly navigate to the data import management page from the [spotlight search](../concepts/user_interface.md#spotlight), by searching for "import" and selecting the "Import data" option.
|
||||
Users can quickly navigate to the data import management page from the [spotlight search](./ui/index.md#spotlight), by searching for "import" and selecting the "Import data" option.
|
||||
|
||||
### Data Tables
|
||||
|
||||
|
||||
@@ -30,12 +30,13 @@ Parameter templates are used to define the different types of parameters which a
|
||||
| Choices | A comma-separated list of valid choices for parameter values linked to this template. |
|
||||
| Checkbox | If set, parameters linked to this template can only be assigned values *true* or *false* |
|
||||
| Selection List | If set, parameters linked to this template can only be assigned values from the linked [selection list](#selection-lists) |
|
||||
| Unique | Enforce a [uniqueness requirement](#parameter-uniqueness) on parameter values linked to this template |
|
||||
|
||||
{{ image("concepts/parameter-template.png", "Parameters Template") }}
|
||||
|
||||
### Create Template
|
||||
|
||||
Parameter templates are created and edited via the [admin interface](../settings/admin.md).
|
||||
Parameter templates are created and edited via the [Admin Center](../settings/admin.md#admin-center).
|
||||
|
||||
To create a template:
|
||||
|
||||
@@ -59,6 +60,45 @@ To add a parameter, navigate to a specific part detail page, click on the "Param
|
||||
|
||||
Select the parameter `Template` you would like to use for this parameter, fill-out the `Data` field (value of this specific parameter) and click the "Submit" button.
|
||||
|
||||
### Parameter Uniqueness
|
||||
|
||||
A parameter template can be configured to enforce a uniqueness requirement on the values of any parameters linked to it. This is useful for parameters which are expected to act as a unique identifier and prevents duplicate values from being entered by mistake.
|
||||
|
||||
The `Unique` attribute on a parameter template supports the following options:
|
||||
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| No uniqueness required | The default option - no restriction is placed on parameter values |
|
||||
| Unique for model type | A parameter value must be unique amongst all other parameters (linked to this template) which are assigned to the *same* model type. For example, a template with this option enabled could be used to enforce unique serial numbers across all `Part` instances, without preventing the same value from also being used against a `Company` instance |
|
||||
| Globally unique | A parameter value must be unique amongst *all* other parameters linked to this template, regardless of the model type to which they are assigned |
|
||||
|
||||
!!! info "Case Insensitive"
|
||||
Uniqueness checks are case-insensitive - for example, the values `ABC123` and `abc123` are considered to be duplicates of each other.
|
||||
|
||||
If a parameter value is entered which does not satisfy the uniqueness requirement of its template, it will be rejected and an error message displayed.
|
||||
|
||||
#### Validation Against Numeric Value
|
||||
|
||||
If a parameter template defines a set of [units](#parameter-units), uniqueness is checked against the *normalized numeric value* of the parameter, rather than the raw text entered. This ensures that equivalent values expressed in different (but compatible) units are correctly detected as duplicates.
|
||||
|
||||
For example, if a *Resistance* template (with base units of `ohm`) enforces uniqueness, then a value of `1k` would be rejected as a duplicate of an existing value of `1000`, as they both represent the same physical quantity.
|
||||
|
||||
Templates which do not define a set of units are compared using a direct (case-insensitive) text comparison of the raw parameter value.
|
||||
|
||||
#### Copying Caveats
|
||||
|
||||
Some workflows in InvenTree allow parameters to be copied from one object to another - for example, when duplicating a part, build order, or other object which supports parameters.
|
||||
|
||||
Any parameter which is linked to a template with a uniqueness requirement is *skipped* when copying parameters in this way. This prevents the copy operation from creating a duplicate (and therefore invalid) value on the new object. If this occurs, the new object simply will not have a parameter created against that particular template - it can be added manually (with a distinct value) afterwards.
|
||||
|
||||
#### Category Parameter Caveats
|
||||
|
||||
A parameter template can be linked to a part category, along with a default value which is automatically applied to any new parts created within that category (or a sub-category).
|
||||
|
||||
This default value system is not compatible with a template which enforces a uniqueness requirement - applying the *same* default value to every part in a category would immediately conflict with the "unique" requirement, as soon as more than one part exists in that category.
|
||||
|
||||
For this reason, a category-based default value is *not* applied for any parameter template which has a uniqueness requirement configured. If you need to assign values for such parameters, this must be done manually (or via the API) on a per-part basis.
|
||||
|
||||
## Parametric Tables
|
||||
|
||||
Parametric tables gather all parameters from all objects of a particular type, to be sorted and filtered.
|
||||
|
||||
@@ -23,6 +23,36 @@ Throughout this documentation (and within InvenTree) the concepts of *cost* and
|
||||
| Price | The theoretical amount of money required to pay for something. |
|
||||
| Cost | The actual amount of money paid. |
|
||||
|
||||
## Line Items
|
||||
|
||||
Orders (Purchase Orders, Sales Orders, and Return Orders) are made up of *line items*, each linking a *Quantity* to a *Unit Price*. A line item's *Line Total* is calculated as follows:
|
||||
|
||||
```
|
||||
Line Total = Quantity * Unit Price
|
||||
```
|
||||
|
||||
An order's overall *Total Price* is calculated by summing the *Line Total* of every line item and [extra line item](#extra-line-items) associated with the order.
|
||||
|
||||
### Extra Line Items
|
||||
|
||||
*Extra Line Items* provide a way to add itemized costs to an order which are not tied to a specific part or stock item - for example freight charges, service fees, or other miscellaneous costs. Extra line items support the same *Quantity* and *Unit Price* fields as regular line items, and are included in the order's *Total Price* calculation.
|
||||
|
||||
### Line Item Discount
|
||||
|
||||
Line items - and their associated [extra line items](#extra-line-items) - support an optional *Discount* field, expressed as a percentage between 0% and 100%. This is available on:
|
||||
|
||||
- [Purchase Order](../purchasing/purchase_order.md#add-line-items) line items and [extra line items](../purchasing/purchase_order.md#extra-line-items)
|
||||
- [Sales Order](../sales/sales_order.md#add-line-items) line items and [extra line items](../sales/sales_order.md#extra-line-items)
|
||||
- [Return Order](../sales/return_order.md#line-items) line items and [extra line items](../sales/return_order.md#extra-line-items)
|
||||
|
||||
If specified, the discount is applied to the *Line Total*, using the following formula:
|
||||
|
||||
```
|
||||
Line Total = Quantity * Unit Price * (1 - Discount / 100)
|
||||
```
|
||||
|
||||
!!! info "Optional"
|
||||
The discount percentage is optional, and defaults to 0% (no discount) if not specified.
|
||||
|
||||
## Currency Support
|
||||
|
||||
@@ -63,3 +93,9 @@ Currency exchange rates are updated periodically, using the configured currency
|
||||
## Pricing Settings
|
||||
|
||||
Refer to the [global settings](../settings/global.md#pricing-and-currency) documentation for more information on available currency settings.
|
||||
|
||||
## Rendering Currencies in Reports
|
||||
|
||||
Currency values can be rendered in report templates using the [`render_currency`](../report/helpers.md#render_currency) helper function. This function formats a currency amount according to a locale, and supports currency conversion within the template.
|
||||
|
||||
See the [report helpers documentation](../report/helpers.md#currency-formatting) for full details and examples.
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
---
|
||||
title: Tags
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
*Tags* are short, arbitrary labels that can be attached to InvenTree objects to group or classify them in flexible ways that don't require changes to the underlying data model. Unlike [parameters](./parameters.md), tags carry no typed value — they are simply names. A tag can be applied to objects of any supported model type, and tags are shared across the entire InvenTree instance.
|
||||
|
||||
!!! note "Shared Tag Namespace"
|
||||
Tags are global: a tag named `prototype` applied to a Part and the same tag applied to a Build Order refer to the same underlying tag record. Renaming or deleting a tag affects every object to which it is attached.
|
||||
|
||||
### Supported Models
|
||||
|
||||
Tags can be attached to the following InvenTree objects:
|
||||
|
||||
- [Parts](../part/index.md)
|
||||
- [Supplier Parts](../purchasing/supplier.md#supplier-parts)
|
||||
- [Manufacturer Parts](../purchasing/manufacturer.md#manufacturer-parts)
|
||||
- [Companies](./company.md)
|
||||
- [Stock Items](../stock/index.md#stock-item)
|
||||
- [Stock Locations](../stock/index.md#stock-location)
|
||||
- [Build Orders](../manufacturing/build.md)
|
||||
- [Purchase Orders](../purchasing/purchase_order.md)
|
||||
- [Sales Orders](../sales/sales_order.md)
|
||||
- [Return Orders](../sales/return_order.md)
|
||||
- [Sales Order Shipments](../sales/sales_order.md#shipments)
|
||||
|
||||
## Managing Tags
|
||||
|
||||
### Adding and Removing Tags
|
||||
|
||||
Any object that supports tags will expose a *Tags* field in its detail and edit forms. Tags are entered as a comma-separated list of names and can be freely added or removed at any time. Tag names are case-insensitive — `Prototype`, `prototype`, and `PROTOTYPE` all refer to the same tag.
|
||||
|
||||
### Tag Names
|
||||
|
||||
Tag names must be unique within the InvenTree instance (case-insensitively). If you type a name that already exists under a different capitalisation, the existing tag is assigned rather than a new one created. Tag names may contain spaces, but leading and trailing whitespace is stripped automatically.
|
||||
|
||||
## Filtering by Tags
|
||||
|
||||
Tables that support tags can be filtered by one or more tag names. When multiple tags are specified, only objects that carry **all** of the specified tags are returned (AND logic).
|
||||
|
||||
For example, filtering a Parts table by the tags `approved` and `prototype` returns only parts tagged with both.
|
||||
|
||||
## API Access
|
||||
|
||||
### Tag Endpoints
|
||||
|
||||
The tag list is available at `/api/tag/`. Individual tags can be retrieved, updated, or deleted at `/api/tag/<id>/`.
|
||||
|
||||
The `model_type` query parameter narrows the tag list to tags currently applied to a specific model type:
|
||||
|
||||
```
|
||||
GET /api/tag/?model_type=part
|
||||
```
|
||||
|
||||
### Tags on Model Endpoints
|
||||
|
||||
For models that support tags, the `tags` field is returned in the detail endpoint response as a list of tag name strings:
|
||||
|
||||
```json
|
||||
{
|
||||
"pk": 42,
|
||||
"name": "Widget",
|
||||
"tags": ["approved", "prototype"]
|
||||
}
|
||||
```
|
||||
|
||||
Tags can be updated via a `PATCH` or `POST` request by supplying a JSON-encoded list of tag name strings. The full list of tags replaces the previous set — omitting a tag removes it:
|
||||
|
||||
```json
|
||||
{
|
||||
"tags": ["approved", "production"]
|
||||
}
|
||||
```
|
||||
|
||||
Tags can also be used as a filter parameter on list endpoints. Supply a comma-separated list of tag names to the `tags` query parameter:
|
||||
|
||||
```
|
||||
GET /api/part/?tags=approved,prototype
|
||||
```
|
||||
|
||||
This returns only parts tagged with **both** `approved` and `prototype`.
|
||||
@@ -9,7 +9,7 @@ There are different systems in the industry for the management of getting, stori
|
||||
**InvenTree** is mainly focused on [**IMS**](#inventory-management-system-ims) and [**PLM**](#part-library-management-plm) functionality.
|
||||
|
||||
### Inventory Management System *(IMS)*
|
||||
Evolves around manufacturing of parts out of other parts. It keeps track of stock, part origin, orders, shelf live and more.
|
||||
Evolves around manufacturing of parts out of other parts. It keeps track of stock, part origin, orders, shelf life and more.
|
||||
|
||||
### Part Library Management *(PLM)*
|
||||
Keeps track of BOMs, part variants, possible substitutions, versions, IPNs and further part parameters.
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: Forms
|
||||
---
|
||||
|
||||
## Forms
|
||||
|
||||
Data entry and editing within InvenTree is typically performed through the use of forms, which provide a structured interface for inputting and modifying data. Forms are designed to be user-friendly and efficient, allowing users to quickly enter and update information within the system.
|
||||
|
||||
Forms are typically displayed as a modal dialog, separated into multiple sections and fields.
|
||||
|
||||
### Data Creation
|
||||
|
||||
Example: Creating a new part via the "Add Part" form:
|
||||
|
||||
{{ image("concepts/ui_form_add_part.png", "Add Part Button") }}
|
||||
|
||||
On several forms is displayed option "Keep form open" in bottom part of the form on left side of Submit button (option is visible on the screenshot above). When this switch is turned on, form window is not closed after submit and filled form data is not reset. This is useful for creating more entries at one time with similar properties (e.g. only different number in name).
|
||||
|
||||
### Data Editing
|
||||
|
||||
Example: Editing an existing purchase order via the "Edit Purchase Order" form:
|
||||
|
||||
{{ image("concepts/ui_form_edit_po.png", "Edit Purchase Order") }}
|
||||
|
||||
### Form Submission
|
||||
|
||||
A form can be submitted by clicking the "Submit" button located at the bottom-right corner of the form.
|
||||
|
||||
Alternatively, an open form can be submitted using the keyboard shortcut `Ctrl + Enter` (or `Cmd + Enter` on macOS). This shortcut works even while typing in a form field, providing a quick way to submit the form without needing to reach for the mouse. It is particularly useful in multi-line text fields, where pressing `Enter` inserts a new line rather than submitting the form.
|
||||
|
||||
The keyboard shortcut is only active while a form is open, and follows the same rules as the "Submit" button - for example, it has no effect while the form is loading, or when editing an existing item without any changes.
|
||||
|
||||
### Confirm Actions
|
||||
|
||||
Many actions within InvenTree require user confirmation before they can be executed. This is typically implemented through the use of confirmation dialogs, which prompt the user to confirm their intention before proceeding with the action.
|
||||
|
||||
{{ image("concepts/ui_form_hold_po.png", "Confirmation Dialog") }}
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: Global Search
|
||||
---
|
||||
|
||||
## Global Search
|
||||
|
||||
Accessible from the [main menu](./index.md#main-menu), the global search functionality allows users to quickly find specific items or information within the InvenTree system. The search icon is located at the top of the interface and provides a convenient way to search across all sections of the system.
|
||||
|
||||
Clicking on the "search" icon (in the menu bar) opens the search menu, which allows users to enter search queries and view results from across the system.
|
||||
|
||||
{{ image("concepts/ui_global_search.png", "Global Search") }}
|
||||
|
||||
Search results are organized by category (e.g. Parts, Stock, Manufacturing, etc.) and provide quick access to the relevant pages for each search result.
|
||||
|
||||
### Detail View
|
||||
|
||||
To navigate to the detail page for a particular search result, simply click on the desired result from the search results list. This will take you directly to the relevant page within the InvenTree system, allowing you to view and interact with the specific item or information you were searching for.
|
||||
|
||||
### Preview Panel
|
||||
|
||||
Instead of navigating directly to a result's detail page, search results can be configured to open in the [preview panel](./preview_panels.md), keeping the global search menu open behind it.
|
||||
|
||||
To enable this behavior, both of the following user settings must be enabled, found in the *Search* tab of the [user settings](../../settings/user.md) page:
|
||||
|
||||
- **Table Preview Panel** - enables the preview panel feature generally
|
||||
- **Search Results Preview Panel** - enables the preview panel specifically for global search results
|
||||
|
||||
With both settings enabled, clicking on a search result opens the preview drawer instead of navigating away. As with other preview panel usages, hold `Ctrl` (or `Cmd` on macOS) while clicking, or middle-click, to bypass the preview and navigate directly to the detail page.
|
||||
|
||||
### Full Results
|
||||
|
||||
The "global search" menu provides a limited set of search results for each category, typically showing the most relevant or recent results. To view the full set of search results for a particular category, click on the "View all results" button located at the top-left of the search results list for that category:
|
||||
|
||||
{{ image("concepts/ui_global_search_view_all.png", "View Full Search Results") }}
|
||||
|
||||
### Collapse Result Groups
|
||||
|
||||
To collapse a particular category of search results in the global search menu, click on the "collapse" icon located at the top-right corner of the search results list for that category. This will hide the search results for that category, allowing you to focus on other categories or search results.
|
||||
|
||||
### Remove Result Groups
|
||||
|
||||
To remove a particular category of search results from the global search menu, click on the "remove" icon located at the top-right corner of the search results list for that category.
|
||||
@@ -0,0 +1,190 @@
|
||||
---
|
||||
title: User Interface
|
||||
---
|
||||
|
||||
## User Interface
|
||||
|
||||
The InvenTree user interface is designed to be intuitive and user-friendly, providing easy access to the various features and functions of the system. The interface is organized into several key components, including navigation menus, settings, forms, tables, search functionality, and more.
|
||||
|
||||
The interface is designed for large-format displays, and as such is explicitly *not* optimized for mobile devices. However, the interface is responsive and should work on a wide range of desktop screen sizes.
|
||||
|
||||
## Navigation
|
||||
|
||||
Navigation throughout the InvenTree interface is designed to be straightforward and efficient, allowing users to quickly access the various sections and features of the system. The navigation is organized into several key areas, including the main menu, navigation menu, and page panels.
|
||||
|
||||
### Main Menu
|
||||
|
||||
The main menu is located at the top of the interface and provides access to the primary sections of the system:
|
||||
|
||||
{{ image("concepts/ui_main_menu.png", "Main Menu") }}
|
||||
|
||||
From the main menu, users can access the following items:
|
||||
|
||||
- [Navigation Menu](#navigation-menu)
|
||||
- [Dashboard](#dashboard)
|
||||
- [Global Search](./global_search.md)
|
||||
- [Spotlight](#spotlight)
|
||||
- [Barcode Scanning](../../barcodes/index.md#quick-scan)
|
||||
- [Notifications](../../part/notification.md)
|
||||
- [User Menu](#user-menu)
|
||||
|
||||
As well as allowing navigation to the following main sections:
|
||||
|
||||
- [Parts](../../part/index.md)
|
||||
- [Stock](../../stock/index.md)
|
||||
- [Manufacturing](../../manufacturing/index.md)
|
||||
- [Purchasing](../../purchasing/index.md)
|
||||
- [Sales](../../sales/index.md)
|
||||
|
||||
### Navigation Menu
|
||||
|
||||
The global navigation menu is located on the left-hand side of the interface and provides access to the various sections of the system.
|
||||
|
||||
{{ image("concepts/ui_navigation_menu.png", "Navigation Menu") }}
|
||||
|
||||
The navigation menu is organized into several key areas, including:
|
||||
|
||||
- **Navigation:** Provides access to the main sections of the system, including Parts, Stock, Manufacturing, Purchasing, and Sales.
|
||||
- **Settings:** Quick access to user settings, system settings, and the admin center.
|
||||
- **Actions:** Provides quick access to commonly used actions
|
||||
- **Documentation:** Links to the online documentation.
|
||||
- **About:** InvenTree version and license information.
|
||||
|
||||
### User Menu
|
||||
|
||||
The user menu is located in the top-right corner of the interface and provides access to user-specific settings and actions.
|
||||
|
||||
{{ image("concepts/ui_user_menu.png", "User Menu") }}
|
||||
|
||||
The user menu provides access to the following items:
|
||||
|
||||
- **User Settings:** Access to [user settings](../../settings/user.md).
|
||||
- **System Settings:** Access to [global settings](../../settings/global.md) settings. *Note: Access to system settings may be restricted based on user permissions.*
|
||||
- **Admin Center:** Access to the [admin center](../../settings/admin.md#admin-center) for operational administration
|
||||
- **Database Admin Interface:** Low level administration via the [Database Admin Interface](../../settings/db_admin.md). *Note: Access may be restricted based on user permissions.*
|
||||
- **Change Color Mode:** Toggle between light and dark color modes.
|
||||
- **About InvenTree:** View version and license information about InvenTree.
|
||||
- **Logout:** Log out of the InvenTree system.
|
||||
|
||||
### Page Panels
|
||||
|
||||
Most detail pages views within InvenTree are organized into panels, which provide a structured layout for displaying information and actions related to the current page.
|
||||
|
||||
Panels are arranged in a vertical stack on the left side of the page, with the main content area on the right. Each panel contains related information and actions, allowing users to easily navigate and interact with the content.
|
||||
|
||||
{{ image("concepts/ui_panels.png", "Page Panels") }}
|
||||
|
||||
#### Collapse Panels
|
||||
|
||||
The panel sidebar can be collapsed to provide more space for the main content area. To collapse or expand the panel sidebar, click the collapse icon located at the bottom of the sidebar. To expand the sidebar again, click the expand icon that appears when the sidebar is collapsed.
|
||||
|
||||
### Breadcrumbs
|
||||
|
||||
On some pages, a breadcrumb navigation trail is provided at the top of the page, just below the main menu. Breadcrumbs provide a visual representation of the user's current location within the system and allow for easy navigation back to previous pages.
|
||||
|
||||
{{ image("concepts/ui_breadcrumbs.png", "Breadcrumb Navigation") }}
|
||||
|
||||
#### Filtered Detail Navigation
|
||||
|
||||
When a detail page is opened from a table that supports detail navigation, the breadcrumb bar can show the current position in the table result set together with Previous and Next buttons. The navigation uses the table's active filters and sort order, so moving between records follows the same list the user was viewing.
|
||||
|
||||
The navigation context is stored in the detail URL. This makes links shareable and allows the same filtered result set to be restored when the link is opened in a fresh browser context. The position indicator uses the full result count, while the buttons are hidden at the first and last records.
|
||||
|
||||
The navigation controls also work with detail pages provided by frontend plugins that use the standard table and page components.
|
||||
|
||||
### Navigation Tree
|
||||
|
||||
On some pages, a navigation tree is provided on the left-hand side of the page, next to the breadcrumbs. The navigation tree provides a hierarchical view of the current section of the system, allowing users to quickly navigate to related pages and sections.
|
||||
|
||||
Click on the navigation tree icon to expand the tree and view the available navigation options:
|
||||
|
||||
{{ image("concepts/ui_navigation_tree.png", "Navigation Tree") }}
|
||||
|
||||
#### Searching
|
||||
|
||||
The navigation tree includes a search bar at the top of the panel. Typing into the search bar filters the tree to show only entries that match the search query. When a search is active, all matching results are expanded and displayed in a flat list. Clearing the search field returns the tree to its normal browsing mode.
|
||||
|
||||
#### Highlight Selected Entry
|
||||
|
||||
The currently selected entry in the navigation tree is highlighted with a distinct background color, making it easy to identify the active page or section within the hierarchy.
|
||||
|
||||
#### Auto-Expand to Selected Entry
|
||||
|
||||
When the navigation tree is opened, it automatically expands to reveal the currently selected entry. All ancestor nodes in the hierarchy are expanded so the active entry is immediately visible, without requiring manual navigation through the tree.
|
||||
|
||||
## Dashboard
|
||||
|
||||
The dashboard provides a customizable landing page for users when they log in to the system. The dashboard can be configured to display a variety of widgets and information panels, providing users with quick access to important data and actions.
|
||||
|
||||
{{ image("concepts/ui_dashboard.png", "Dashboard") }}
|
||||
|
||||
### Editing Layout
|
||||
|
||||
To edit the layout (add, remove, or rearrange widgets) of the dashboard, open the dashboard context menu (located at the top-right corner of the dashboard) and view the available options:
|
||||
|
||||
{{ image("concepts/ui_dashboard_edit.png", "Dashboard Context Menu") }}
|
||||
|
||||
### Custom Widgets
|
||||
|
||||
In addition to the set of built-in widgets provided by InvenTree, custom dashboard widgets can be implemented using [plugins](../../plugins/mixins/ui.md#dashboard-items). This allows users to create personalized dashboard experiences tailored to their specific needs and workflows.
|
||||
|
||||
## Tables
|
||||
|
||||
Information throughout the InvenTree interface is often presented in tabular format. Table views support a wide range of features, including pagination, sorting, filtering, and data export.
|
||||
|
||||
Read more about working with table views on the dedicated [Tables](./tables.md) page.
|
||||
|
||||
## Preview Panels
|
||||
|
||||
Rather than navigating directly to an item's detail page, clicking on a table row can instead open a "preview" drawer, providing a quick summary of that item without leaving the current view.
|
||||
|
||||
Read more about this optional feature on the dedicated [Preview Panels](./preview_panels.md) page.
|
||||
|
||||
## Forms
|
||||
|
||||
Data entry and editing within InvenTree is typically performed through the use of forms, which provide a structured interface for inputting and modifying data.
|
||||
|
||||
Read more about working with forms on the dedicated [Forms](./forms.md) page.
|
||||
|
||||
## Global Search
|
||||
|
||||
Accessible from the [main menu](#main-menu), the global search functionality allows users to quickly find specific items or information within the InvenTree system.
|
||||
|
||||
Read more about the global search feature on the dedicated [Global Search](./global_search.md) page.
|
||||
|
||||
## Spotlight
|
||||
|
||||
The user interface features a "spotlight" search functionality, which provides a quick and efficient way to access common actions or navigate to specific pages within the InvenTree system. The spotlight search is designed to enhance user productivity by allowing users to quickly find and execute actions without needing to navigate through menus or remember specific page locations.
|
||||
|
||||
{{ image("concepts/ui_spotlight.png", "Spotlight Search") }}
|
||||
|
||||
### Open Spotlight
|
||||
|
||||
To open the "spotlight" search, click on the "spotlight" icon located in the main menu at the top of the interface. This will open the spotlight search menu, allowing you to enter search queries and view available actions.
|
||||
|
||||
Alternatively, the spotlight search can be opened using the keyboard shortcut `Ctrl + K` (or `Cmd + K` on macOS), providing a quick and convenient way to access the spotlight functionality without needing to click on the menu icon.
|
||||
|
||||
### Disable Spotlight
|
||||
|
||||
Users may opt to disable the spotlight search functionality if they do not find it useful or prefer not to use it. To disable the spotlight search, navigate to your [user settings](../../settings/user.md) and locate the option to disable the spotlight feature. Once disabled, the spotlight search will no longer be accessible from the main menu or via keyboard shortcuts.
|
||||
|
||||
## Copy Button
|
||||
|
||||
Many fields within the InvenTree user interface include a "copy" button, which allows users to quickly copy the value of that field to their clipboard. This is particularly useful for fields that contain important identifiers, such as part numbers, stock item codes, or other relevant data that may need to be easily copied and pasted elsewhere.
|
||||
|
||||
!!! important "Secure Context"
|
||||
The "copy" button functionality relies on the browser's clipboard API, which may not be available in all contexts (e.g. if the user is accessing the InvenTree interface via a non-https connection, or through an embedded iframe or a non-standard browser). In such cases, the "copy" button may not function as intended.
|
||||
|
||||
## User Permissions
|
||||
|
||||
Many aspects of the user interface are controlled by user permissions, which determine what actions and features are available to each user based on their assigned roles and permissions within the system. This allows for a highly customizable user experience, where different users can have access to different features and functionality based on their specific needs and responsibilities within the organization.
|
||||
|
||||
If a user does not have permission to access a particular feature or section of the system, that feature will be hidden from their view in the user interface. This helps to ensure that users only see the features and information that are relevant to their role, reducing clutter and improving usability.
|
||||
|
||||
## Language Support
|
||||
|
||||
The InvenTree user interface supports multiple languages, allowing users to interact with the system in their preferred language.
|
||||
|
||||
The default system language can be configured by the system administrator in the [server configuration options](../../start/config.md#basic-options).
|
||||
|
||||
Additionally, users can select their preferred language in their [user settings](../../settings/user.md), allowing them to override the system default language with their own choice. This provides a personalized experience for each user, ensuring that they can interact with the system in the language they are most comfortable with.
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: Preview Panels
|
||||
---
|
||||
|
||||
## Preview Panels
|
||||
|
||||
Many [table views](./tables.md) in InvenTree link each row to the detail page for the underlying item. By default, clicking on a row navigates directly to that detail page.
|
||||
|
||||
If the preview panel feature is enabled, clicking on a row instead opens a "preview" drawer on the right-hand side of the screen. The preview drawer displays a summary of the selected item, without navigating away from the current table view.
|
||||
|
||||
{{ image("concepts/ui_preview_drawer.png", "Preview Drawer") }}
|
||||
|
||||
## Enabling the Preview Panel
|
||||
|
||||
The preview panel is disabled by default. It can be enabled on a per-user basis via the **Table Preview Panel** option, found in the *Display Options* tab of the [user settings](../../settings/user.md) page.
|
||||
|
||||
## Using the Preview Panel
|
||||
|
||||
Once enabled, clicking on a row in a supported table opens the preview drawer for that item, rather than navigating to its detail page.
|
||||
|
||||
### Viewing Full Details
|
||||
|
||||
The preview drawer title includes an arrow icon, linking to the full detail page for the previewed item. Click on the title (or the arrow icon) to navigate to the detail page and close the drawer.
|
||||
|
||||
{{ image("concepts/ui_preview_details_link.png", "View Details Link") }}
|
||||
|
||||
### Following Links
|
||||
|
||||
Any link within the preview drawer (for example, a link to a related part or category) can be clicked to navigate directly to that page. The preview drawer closes automatically when a link is followed.
|
||||
|
||||
### Bypassing the Preview
|
||||
|
||||
To navigate directly to an item's detail page without opening the preview drawer, hold `Ctrl` (or `Cmd` on macOS) while clicking the row, or middle-click the row to open the detail page in a new tab.
|
||||
|
||||
### Closing the Preview
|
||||
|
||||
The preview drawer can be closed by clicking the close button, clicking outside the drawer, or pressing `Escape`.
|
||||
@@ -0,0 +1,149 @@
|
||||
---
|
||||
title: Tables
|
||||
---
|
||||
|
||||
## Table Views
|
||||
|
||||
Information throughout the InvenTree interface is often presented in tabular format, allowing users to easily view and interact with large datasets. Tables are designed to be flexible and customizable, providing a range of features to enhance the user experience.
|
||||
|
||||
{{ image("concepts/ui_table.png", "Table View") }}
|
||||
|
||||
### Pagination
|
||||
|
||||
The pagination controls are located at the bottom of the table, allowing users to navigate through large datasets by moving between pages. Users can also adjust the number of rows displayed per page using the pagination settings.
|
||||
|
||||
### Row Selection
|
||||
|
||||
For tables where data selection is supported, a checkbox is provided at the left-hand side of each row, allowing users to select one or more rows for further actions. A master checkbox is also provided in the table header, allowing users to quickly select or deselect all rows in the table.
|
||||
|
||||
!!! info "Pagination and Row Selection"
|
||||
When using the "master select" checkbox to select all rows, only the rows on the current page will be selected.
|
||||
|
||||
{{ image("concepts/ui_table_row_selection.png", "Row Selection") }}
|
||||
|
||||
### Table Actions
|
||||
|
||||
A particular table view may have a set of actions associated with it, which are typically located at the top-left corner of the table. These actions may include options for adding new entries, or performing bulk actions on [selected rows](#row-selection).
|
||||
|
||||
{{ image("concepts/ui_table_actions.png", "Table Actions") }}
|
||||
|
||||
### Searching
|
||||
|
||||
Some tables support searching, allowing users to quickly find specific entries within the dataset. The search bar is located at the top-right corner of the table view:
|
||||
|
||||
{{ image("concepts/ui_table_search.png", "Table Search") }}
|
||||
|
||||
### Column Selection
|
||||
|
||||
Some tables allow the user to toggle the visibility of certain columns to, enabling a more customized view of the data.
|
||||
|
||||
Column selection is accessed via the "Select Columns" menu, located to the top-right of the table view:
|
||||
|
||||
{{ image("concepts/ui_table_column_selection.png", "Column Selection") }}
|
||||
|
||||
### Filtering
|
||||
|
||||
The dataset (which is fetched dynamically from the server via an API request) can be filtered by providing query parameters to the API endpoint.
|
||||
|
||||
Select the "table filters" button to open the filter selection menu
|
||||
|
||||
{{ image("concepts/ui_table_filter_button.png", "Table Filter Button") }}
|
||||
|
||||
{{ image("concepts/ui_table_filter_menu.png", "Table Filter Menu") }}
|
||||
|
||||
Table filters are saved across browser sessions, allowing users to maintain their preferred filter settings when returning to the particular table view.
|
||||
|
||||
#### Column Filters
|
||||
|
||||
Many table columns expose an inline filter icon directly in the column header, providing a quick way to filter by that column without opening the full filter drawer. Columns that support filtering display a small filter icon alongside the column title. The icon is highlighted when a filter for that column is currently active, giving an at-a-glance indication of which columns have active filters.
|
||||
|
||||
Clicking the icon opens a compact popover anchored to the column header:
|
||||
|
||||
{{ image("concepts/ui_table_column_filter_popover.png", "Column Filter Popover") }}
|
||||
|
||||
**Single-filter columns** — for columns linked to one filter (e.g. *Active*, *Has IPN*, *Status*), selecting a value immediately applies the filter and the popover closes automatically.
|
||||
|
||||
**Range columns** — for columns that represent a range concept (e.g. *Start Date*, *Target Date*, *Creation Date*), the popover stays open and presents multiple controls — for example *before* and *after* date pickers — so both bounds can be set in a single interaction.
|
||||
|
||||
Once a filter is active, the popover shows a badge with the current value and a remove button (red ×) instead of the value picker. Clicking the × clears only that column's filter.
|
||||
|
||||
!!! info "Column filters and the filter drawer share the same state"
|
||||
Filters applied via a column popover appear immediately in the filter drawer's active-filter list, and filters added through the drawer are reflected in the column icons. Clearing all filters from the drawer also removes any filters set via column popovers.
|
||||
|
||||
#### Saved Filter Groups
|
||||
|
||||
Frequently used combinations of filters can be saved as a named *filter group*, allowing them to be quickly recalled later without having to re-add each filter individually.
|
||||
|
||||
The **Saved Filter Groups** panel is displayed at the bottom of the filter drawer. When one or more filters are active, a **Save current filters** button is available. Clicking it opens an inline name input — enter a name and press Enter (or click the confirm icon) to save the group. Press Escape or click the cancel icon to discard.
|
||||
|
||||
{{ image("concepts/ui_table_filter_group.png", "Filter Groups") }}
|
||||
|
||||
Previously saved filter groups are listed in the panel. Each entry shows the group name alongside two actions:
|
||||
|
||||
- **Load** (green reload icon): Replaces the current active filters with the filters stored in that group. The table immediately re-fetches data using the restored filters.
|
||||
- **Delete** (red × icon): Permanently removes the saved filter group.
|
||||
|
||||
Saved filter groups are stored in the browser's local storage and are specific to each table or calendar view, so groups saved for one view are not available in another. They persist across local browser sessions until explicitly deleted. Filter groups are not shared to other devices.
|
||||
|
||||
!!! info "Loading a filter group replaces active filters"
|
||||
Loading a saved filter group replaces all currently active filters with those stored in the group. Any unsaved active filters will be overwritten.
|
||||
|
||||
### Data Sorting
|
||||
|
||||
Some table columns support data sorting, allowing the dataset to be sorted in ascending or descending order based on the values in that column. To sort a column, click on the column header. Clicking the column header again will toggle the sort order between ascending and descending. The current sort order is indicated by an arrow icon in the column header.
|
||||
|
||||
{{ image("concepts/ui_table_sorting.png", "Data Sorting") }}
|
||||
|
||||
### Data Export
|
||||
|
||||
Some tables support downloading of the dataset in various formats (e.g. CSV, Excel, PDF). If data download is available for a given table, the "export data" button will be located at the top-right corner of the table view.
|
||||
|
||||
This opens the "Export Data" form, which allows the user to select the desired file format for download, as well as any additional options related to the data export.
|
||||
|
||||
{{ image("concepts/ui_table_download.png", "Data Download") }}
|
||||
|
||||
### Row Actions
|
||||
|
||||
In some tables, there may be specific actions associated with individual rows, allowing users to perform actions directly on a particular entry in the dataset. Row actions are typically accessed via an "actions" menu located at the right-hand side of each row.
|
||||
|
||||
{{ image("concepts/ui_table_row_actions.png", "Row Actions") }}
|
||||
|
||||
### Right-Click Context Menu
|
||||
|
||||
For rows that support row actions, a right-click context menu is also available, providing quick access to the same set of actions without needing to click on the "actions" menu.
|
||||
|
||||
{{ image("concepts/ui_table_context_menu.png", "Right-Click Context Menu") }}
|
||||
|
||||
### Row Navigation
|
||||
|
||||
For tables which reference other objects within the system, clicking on a row will navigate to the detail page for that particular entry. For example, clicking on a row in the "Part" table will navigate to the detail page for that specific part.
|
||||
|
||||
If the [preview panel](./preview_panels.md) feature is enabled, clicking on a row instead opens a preview drawer for that entry, rather than navigating directly to its detail page.
|
||||
|
||||
## Calendar Views
|
||||
|
||||
Some [table views](#table-views) associated with various order types can be switched to a calendar view, which provides a visual representation of data based on date fields. The calendar view allows users to easily see and interact with data that is organized by date, such as scheduled tasks, events, or deadlines.
|
||||
|
||||
To switch to the "calendar view" (for a table which supports it), click on the "calendar view" button located above and to the right of the table view:
|
||||
|
||||
{{ image("concepts/ui_calendar_select.png", "Calendar View Button") }}
|
||||
|
||||
This will display the data in a calendar format:
|
||||
|
||||
{{ image("concepts/ui_calendar_view.png", "Calendar View") }}
|
||||
|
||||
### Calendar Horizon
|
||||
|
||||
The calendar view provides a configurable "horizon" setting, which allows users to adjust the number of months displayed in the calendar view.
|
||||
|
||||
## Parametric Views
|
||||
|
||||
Some [table views](#table-views) can be switched to a parametric view, which provides a visual representation of data based on specific parameters or attributes. The parametric view allows users to easily see and interact with data that is organized by certain characteristics, such as categories, types, or other relevant attributes.
|
||||
|
||||
To switch to the "parametric view" (for a table which supports it), click on the "parametric view" button located above and to the right of the table view:
|
||||
|
||||
{{ image("concepts/ui_parametric_select.png", "Parametric View Button") }}
|
||||
|
||||
This will display the data in a parametric format:
|
||||
|
||||
{{ image("concepts/ui_parametric_view.png", "Parametric View") }}
|
||||
@@ -60,15 +60,17 @@ invoke dev.setup-dev
|
||||
InvenTree roughly follow the [GitLab flow](https://about.gitlab.com/topics/version-control/what-are-gitlab-flow-best-practices/) branching style, to allow simple management of multiple tagged releases, short-lived branches, and development on the main branch.
|
||||
|
||||
There are nominally 5 active branches:
|
||||
- `master` - The main development branch
|
||||
- `stable` - The latest stable release
|
||||
- `next-breaking` - The next breaking release (e.g. 2.0, 3.0) with all deprecated features removed
|
||||
- `l10n` - Translation branch: Source to Crowdin
|
||||
- `l10_crowdin` - Translation branch: Source from Crowdin
|
||||
- `y.y.x` - Release branch for the currently supported version (e.g. `0.5.x`)
|
||||
|
||||
All other branches are removed periodically by maintainers or core team members. This includes old release branches.
|
||||
Do not use them as base for feature development or forks as patches from them might not be accepted without rebasing.
|
||||
| Branch | Description |
|
||||
| --- | --- |
|
||||
| `master` | The main development branch |
|
||||
| `stable` | The latest stable release |
|
||||
| `next-breaking` | The next breaking release (e.g. 2.0, 3.0) with all deprecated features removed |
|
||||
| `l10n` | Translation branch: Source to Crowdin |
|
||||
| `l10_crowdin` | Translation branch: Source from Crowdin |
|
||||
| `y.y.x` | Release branch for the currently supported version (e.g. `0.5.x`) |
|
||||
|
||||
All other branches are removed periodically by maintainers or core team members. This includes old release branches. Do not use them as base for feature development or forks as patches from them might not be accepted without rebasing.
|
||||
|
||||
### Version Numbering
|
||||
|
||||
@@ -182,7 +184,7 @@ django-upgrade --target-version {{ config.extra.django_version }} `find . -name
|
||||
|
||||
## Migration Files
|
||||
|
||||
Any required migration files **must** be included in the commit, or the pull-request will be rejected. If you change the underlying database schema, make sure you run `invoke migrate` and commit the migration files before submitting the PR.
|
||||
Any required migration files **must** be included in the commit, or the pull-request will be rejected. If you change the underlying database schema, make sure you run `invoke migrate --detect` and commit the migration files before submitting the PR.
|
||||
|
||||
*Note: A github action checks for unstaged migration files and will reject the PR if it finds any!*
|
||||
|
||||
|
||||
+22
-2
@@ -35,7 +35,7 @@ If the installed version of invoke is too old, users may see error messages duri
|
||||
Make sure you are running a stable or production release of InvenTree. The frontend panel is not included in development releases.
|
||||
More Information: [Error Codes - INVE-E1](./settings/error_codes.md#inve-e1)
|
||||
|
||||
### No module named <xxx>
|
||||
### No module named xyz
|
||||
|
||||
During the install or update process, you may be presented with an error like:
|
||||
|
||||
@@ -196,13 +196,33 @@ This means that either:
|
||||
|
||||
In either case, ensure that the directory is available *on your local machine* and the user account has the required permissions.
|
||||
|
||||
### Running on a Non-Standard Port / Behind an Existing Reverse Proxy
|
||||
|
||||
If you want to serve InvenTree on a port other than 80/443 (for example, because those ports are already used by another service on your host), or you want to place InvenTree behind an existing reverse proxy which already handles SSL for other services, refer to:
|
||||
|
||||
- [Proxy (external) port configuration](./start/docker_install.md#proxy-external-port) - the `INVENTREE_HTTP_PORT` / `INVENTREE_HTTPS_PORT` variables
|
||||
- [Integrating with an existing reverse proxy](./start/processes.md#integrating-with-existing-proxy) - a worked example, including the required `INVENTREE_TRUSTED_ORIGINS` setting
|
||||
|
||||
!!! tip "Automatic HTTPS"
|
||||
The bundled Caddy proxy's [Automatic HTTPS](./start/docker.md#ssl-certificates) only works if it is reachable on the standard ports 80/443, for the Let's Encrypt ACME challenge. If that is not the case for your setup, terminate SSL at your external proxy instead.
|
||||
|
||||
|
||||
## Error Rendering Component
|
||||
|
||||
Sometimes, following a software update, you may find that certain components of the web interface are not rendering correctly, and presented with a message similar to the screenshow below:
|
||||
Sometimes, following a software update, you may find that certain components of the web interface are not rendering correctly, and presented with a message similar to the screenshot below:
|
||||
|
||||
{{ image("faq/boundary.png", "Error Rendering Component") }}
|
||||
|
||||
This is often due to a caching issue with your web browser. Try performing a hard refresh of the page to clear the cache, this should resolve the issue in most cases.
|
||||
|
||||
If the problem persists, refer to the [troubleshooting guide](./troubleshooting.md) for further assistance.
|
||||
|
||||
## Expression tree is too large
|
||||
|
||||
If you are running a large InvenTree deployment on an SQLite database, you may encounter an error similar to:
|
||||
|
||||
```
|
||||
Expression tree is too large (maximum depth 1000)
|
||||
```
|
||||
|
||||
This is a [known limitation of SQLite](https://www.sqlite.org/limits.html) which can occur when performing complex queries on a large database. Due to [structural limitations](./start/processes.md#sqlite-limitations) of SQLite, it is recommended to use a more robust database backend such as PostgreSQL for larger deployments.
|
||||
|
||||
+2
-2
@@ -4,10 +4,10 @@ import json
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from distutils.version import StrictVersion # type: ignore[import]
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
from packaging.version import Version
|
||||
|
||||
here = Path(__file__).parent
|
||||
|
||||
@@ -57,7 +57,7 @@ def fetch_rtd_versions():
|
||||
print('No RTD token found - skipping RTD version fetch')
|
||||
|
||||
# Sort versions by version number
|
||||
versions = sorted(versions, key=lambda x: StrictVersion(x['version']), reverse=True)
|
||||
versions = sorted(versions, key=lambda x: Version(x['version']), reverse=True)
|
||||
|
||||
# Add "latest" version first
|
||||
if not any(x['title'] == 'latest' for x in versions):
|
||||
|
||||
@@ -35,10 +35,12 @@ A [Bill of Materials](./bom.md) to generate an assembly may consist of a mixture
|
||||
|
||||
### Tracked Build Outputs
|
||||
|
||||
If a Build Order is created for an assembled part which is itself designed as *trackable*, some extra restrictions apply:
|
||||
If the [BOM](./bom.md) for the assembled part contains one or more *tracked* (trackable) components, some extra restrictions apply when creating build outputs:
|
||||
|
||||
- Build outputs must be single quantity
|
||||
- Build outputs must be serialized as they are created
|
||||
- Serial numbers *must* be provided when the build output is created - this allows the tracked sub-components to be allocated against a specific unit
|
||||
- Each generated build output is single quantity (one output per serial number)
|
||||
|
||||
If the assembled part itself is *trackable*, but the BOM does not contain any tracked components, serial numbers are *not* required at the point of creation - a single build output may be created with a batch quantity, and [serialized later](../part/trackable.md#build-outputs-without-serial-numbers).
|
||||
|
||||
## Allocating Untracked Stock
|
||||
|
||||
@@ -80,7 +82,16 @@ The *Deallocate Stock* button can be used to remove all allocations of untracked
|
||||
|
||||
## Automatic Stock Allocation
|
||||
|
||||
To speed up the allocation process, the *Auto Allocate* button can be used to allocate untracked stock items to the build. Automatic allocation of stock items does not work in every situation, as a number of criteria must be met.
|
||||
To speed up the allocation process, the *Auto Allocate* button can be used to automatically allocate stock items to the build.
|
||||
|
||||
!!! info "Background Task"
|
||||
Auto-allocation runs as a background task. The UI will display a progress indicator while the task is running.
|
||||
|
||||
#### Selecting Lines to Allocate
|
||||
|
||||
By default, auto-allocation processes **all eligible BOM line items** in the build order. To restrict allocation to a subset of lines, select the desired rows in the allocation table before pressing the button — the dialog will indicate how many lines are selected.
|
||||
|
||||
#### Auto Allocation Options
|
||||
|
||||
The *Automatic Allocation* dialog is presented as shown below:
|
||||
|
||||
@@ -90,12 +101,16 @@ The *Automatic Allocation* dialog is presented as shown below:
|
||||
|
||||
Select the master location where stock items are to be allocated from. Leave this input blank to allocate stock items from any available location.
|
||||
|
||||
**Exclude Location**
|
||||
|
||||
Exclude stock from a specific location (and all of its sub-locations). Useful for reserving stock in a particular area.
|
||||
|
||||
**Interchangeable Stock**
|
||||
|
||||
Set this option to *True* to signal that stock items can be used interchangeably. This means that in the case where multiple stock items are available, the auto-allocation routine does not care which stock item it uses.
|
||||
|
||||
!!! warning "Take Care"
|
||||
If the *Interchangeable Stock* option is enabled, and there are multiple stock items available, the results of the automatic allocation algorithm may somewhat unexpected.
|
||||
If the *Interchangeable Stock* option is enabled, and there are multiple stock items available, the results of the automatic allocation algorithm may be somewhat unexpected.
|
||||
|
||||
!!! info "Example"
|
||||
Let's say that we have 5 reels of our *C_100nF_0603* capacitor, each with 4,000 parts available. If we do not mind which of these reels the stock should be taken from, we enable the *Interchangeable Stock* option in the dialog above. In this case, the stock will be allocated from one of these reels, and eventually subtracted from stock when the build is completed.
|
||||
@@ -104,6 +119,32 @@ Set this option to *True* to signal that stock items can be used interchangeably
|
||||
|
||||
Set this option to *True* to allow substitute parts (as specified by the BOM) to be allocated, if the primary parts are not available.
|
||||
|
||||
**Optional Items**
|
||||
|
||||
Set this option to *True* to include optional BOM line items in the auto-allocation. By default, optional items are not automatically allocated.
|
||||
|
||||
**Item Type**
|
||||
|
||||
Controls which category of BOM line items is considered for auto-allocation:
|
||||
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| Untracked Items | Only untracked (non-serialized) BOM lines are allocated *(default)* |
|
||||
| Tracked Items | Only tracked BOM lines are allocated |
|
||||
| All Items | Both tracked and untracked BOM lines are allocated |
|
||||
|
||||
**Stock Priority**
|
||||
|
||||
Controls the order in which matching stock items are consumed:
|
||||
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| Oldest stock first (FIFO) | Stock items updated least recently are consumed first *(default)* |
|
||||
| Newest stock first (LIFO) | Stock items updated most recently are consumed first |
|
||||
| Smallest quantity first | Stock items with the lowest available quantity are consumed first |
|
||||
| Largest quantity first | Stock items with the highest available quantity are consumed first |
|
||||
| Soonest expiry date first | Stock items expiring earliest are consumed first; items with no expiry date are used last |
|
||||
|
||||
## Allocating Tracked Stock
|
||||
|
||||
Allocation of tracked stock items is slightly more complex. Instead of being allocated against the *Build Order*, tracked stock items must be allocated against an individual *Build Output*.
|
||||
|
||||
@@ -22,6 +22,7 @@ A BOM for a particular assembly is comprised of a number (zero or more) of BOM "
|
||||
| Quantity | The quantity of *Part* required for the assembly - this value is automatically calculated from the "raw amount" field, taking into account the units of measure associated with the underlying part. |
|
||||
| Attrition | Estimated attrition losses for a production run. Expressed as a percentage of the base quantity (e.g. 2%) |
|
||||
| Setup Quantity | An additional quantity of the part which is required to account for fixed setup losses during the production process. This is added to the base quantity of the BOM line item |
|
||||
| Piece Count | The number of individual pieces required per assembly (for cut-to-length items). Defaults to 1. Total material = quantity x piece_count. |
|
||||
| Rounding Multiple | A value which indicates that the required quantity should be rounded up to the nearest multiple of this value. |
|
||||
| Consumable | A boolean field which indicates whether this BOM Line Item is *consumable* |
|
||||
| Inherited | A boolean field which indicates whether this BOM Line Item will be "inherited" by BOMs for parts which are a variant (or sub-variant) of the part for which this BOM is defined. |
|
||||
@@ -40,6 +41,45 @@ If the underlying part does not have a defined unit of measure, the `raw_amount`
|
||||
|
||||
The `raw_amount` field also allows for fractional representation of the required quantity. For example, if the required quantity is 0.5 kg, the user can specify this as `500 g`, `0.5 kg`, `1/2 kg`, etc. The `quantity` field will be automatically calculated as 0.5 kg, regardless of the specific representation used in the `raw_amount` field.
|
||||
|
||||
### Piece Count (Cut-to-Length Parts)
|
||||
|
||||
The `piece_count` field supports scenarios where a material is cut or divided into multiple identical pieces for each assembly. This is common for cables, wires, tubing, extrusions, and similar length-based materials.
|
||||
|
||||
When `piece_count` is greater than 1, the `quantity` field represents the size or length of each individual piece, and `piece_count` indicates how many such pieces are needed per assembly. The total material required is calculated as:
|
||||
|
||||
```
|
||||
Total material = quantity x piece_count x build_quantity
|
||||
```
|
||||
|
||||
#### Example: Wire Harness Assembly
|
||||
|
||||
Consider an assembly that requires 10 pieces of wire, each cut to 200mm length:
|
||||
|
||||
| Field | Value | Description |
|
||||
| --- | --- | --- |
|
||||
| Quantity | 200 (mm) | Length of each individual wire piece |
|
||||
| Piece Count | 10 | Number of wire pieces per assembly |
|
||||
| Build Quantity | 5 | Number of assemblies to build |
|
||||
| **Total Required** | **10,000 mm (10m)** | 200 x 10 x 5 = 10,000 mm |
|
||||
|
||||
#### Example: Tubing for Hydraulic System
|
||||
|
||||
An assembly requires 4 pieces of tubing, each 500mm long, with 5% attrition:
|
||||
|
||||
| Field | Value | Description |
|
||||
| --- | --- | --- |
|
||||
| Quantity | 500 (mm) | Length of each tube section |
|
||||
| Piece Count | 4 | Number of tube pieces per assembly |
|
||||
| Build Quantity | 3 | Number of assemblies to build |
|
||||
| Attrition | 5% | Account for cutting waste |
|
||||
| **Total Required** | **6,300 mm (6.3m)** | (500 x 4 x 3) x 1.05 = 6,300 mm |
|
||||
|
||||
!!! note "Default Behavior"
|
||||
When `piece_count` is left at its default value of 1, the BOM line item behaves exactly as it did before this feature was introduced. Existing BOMs are unaffected.
|
||||
|
||||
!!! tip "When to Use Piece Count"
|
||||
Use `piece_count` when you are cutting or dividing a material into multiple identical pieces. If each piece has a different length, create separate BOM line items instead.
|
||||
|
||||
### Consumable BOM Line Items
|
||||
|
||||
If a BOM line item is marked as *consumable*, this means that while the part and quantity information is tracked in the BOM, this line item does not get allocated to a [Build Order](./build.md). This may be useful for certain items that the user does not wish to track through the build process, as they may be low value, in abundant stock, or otherwise complicated to track.
|
||||
@@ -50,6 +90,8 @@ In the example below, see that the *Wood Screw* line item is marked as consumabl
|
||||
|
||||
Further, in the [Build Order](./build.md) stock allocation table, we see that this line item cannot be allocated, as it is *consumable*.
|
||||
|
||||
Marking a BOM line item as consumable is a per-assembly override - it only affects how the part is treated within *this* particular BOM, and does not change the underlying part definition. A part can also be marked as consumable directly - refer to the [consumable parts documentation](../part/consumable.md) for more information on the distinction between the two, and reasons why a part may be marked as consumable.
|
||||
|
||||
### Optional BOM Line Items
|
||||
|
||||
If a BOM line item is marked as *optional*, this means that the part and quantity information is tracked in the BOM, but this line item is not required to be allocated to a [Build Order](./build.md). This may be useful for certain items which are not strictly required for the build process to be completed.
|
||||
@@ -163,6 +205,7 @@ The following BOM item fields are used when calculating the BOM checksum:
|
||||
- *Attrition* - The attrition percentage of the BOM line item.
|
||||
- *Setup Quantity* - The setup quantity of the BOM line item.
|
||||
- *Rounding Multiple* - The rounding multiple of the BOM line item.
|
||||
- *Piece Count* - The number of pieces required per assembly (for cut-to-length items).
|
||||
- *Consumable* - Whether the BOM line item is consumable.
|
||||
- *Inherited* - Whether the BOM line item is inherited.
|
||||
- *Optional* - Whether the BOM line item is optional.
|
||||
|
||||
@@ -65,6 +65,8 @@ Once the purchase order has been created, add the assembly part to the purchase
|
||||
|
||||
Follow the normal process for receiving items against the purchase order. When the items are received from the external supplier, they will be marked as "build outputs" against the external build order.
|
||||
|
||||
If the assembled part is [trackable](../part/trackable.md), [serial numbers](../purchasing/purchase_order.md#serial-numbers) may optionally be entered at the point of receipt - or the items can be received without serial numbers, and [serialized later](../part/trackable.md#build-outputs-without-serial-numbers).
|
||||
|
||||
{{ image("build/external_build_receive_items.png", "Receive items against purchase order") }}
|
||||
|
||||
The received items will now be registered as "incomplete outputs" against the external build order:
|
||||
|
||||
@@ -23,3 +23,9 @@ Read more about build orders in the [Build Order documentation](./build.md).
|
||||
InvenTree allows users to allocate stock items to specific build orders, ensuring that the required components are reserved for production. This helps to prevent stock shortages and ensures that the right parts are available when needed.
|
||||
|
||||
Read more about stock allocation in the [Stock Allocation documentation](./allocate.md).
|
||||
|
||||
### Disassembly
|
||||
|
||||
The reverse process is also supported - an assembled stock item can be broken back down into its component parts, based on its BOM. This is useful for reworking or scrapping an assembly, or for splitting a bundled "kit" product purchased from a supplier into its individual components.
|
||||
|
||||
Read more about this process in the [Stock Disassembly documentation](../stock/disassemble.md).
|
||||
|
||||
@@ -35,7 +35,7 @@ The following options are available when creating a new build output:
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| Quantity | The number of items to create as part of this build output |
|
||||
| Serial Numbers | If this is a tracked build output, the serial numbers for each of the generated outputs |
|
||||
| Serial Numbers | Optional serial numbers for the generated outputs - see [below](#creating-outputs-without-serial-numbers) for when this field may be left blank |
|
||||
| Batch Code | Batch code identifier for the generated output(s) |
|
||||
| Auto Allocate Serial Numbers | If selected, any available tracked subcomponents which already have serial numbers assigned, will be automatically assigned to matching build outputs |
|
||||
|
||||
@@ -43,6 +43,15 @@ The following options are available when creating a new build output:
|
||||
|
||||
Refer to the [serial number generation guide](../stock/tracking.md#generating-serial-numbers) for further information on serial number input.
|
||||
|
||||
### Creating Outputs Without Serial Numbers
|
||||
|
||||
Serial numbers are not required when creating a build output, even if the part being built is marked as [trackable](../part/trackable.md). This allows a batch quantity to be produced up-front - for example, a quantity of PCBs which will not be individually serialized until later in the manufacturing process, or units received into an [external build order](./external.md) which are not yet serialized.
|
||||
|
||||
If the *Serial Numbers* field is left blank, a single build output is created with the specified *Quantity*, rather than one output per unit. This output remains a single (non-serialized) [stock item](../stock/index.md), which can be serialized at a later stage - for example, by splitting it into individual units and assigning serial numbers - before it is [completed](#complete-build-output).
|
||||
|
||||
!!! note "Tracked BOM Items"
|
||||
If the [Bill of Materials](./bom.md) for the assembled part contains tracked sub-components, serial numbers are still required when creating build outputs - see [tracked build outputs](./allocate.md#tracked-build-outputs) for further information.
|
||||
|
||||
## Complete Build Output
|
||||
|
||||
*Completing* a build output marks that output as finished, in the context of the given build order.
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Consumable Parts
|
||||
---
|
||||
|
||||
## Consumable Parts
|
||||
|
||||
A *Consumable* part is one which is generally used up, or expended, during a build or other process, rather than being tracked and allocated as a discrete item.
|
||||
|
||||
Consumable parts can be used to represent things such as:
|
||||
|
||||
- Glue or adhesive
|
||||
- Solder
|
||||
- Cleaning fluid
|
||||
- Fasteners or other low-value hardware
|
||||
- Other general workshop supplies
|
||||
|
||||
Marking a part as consumable is intended to help distinguish these types of supplies from other parts in the inventory, making it easier to filter and report on "real" stock items versus general consumables.
|
||||
|
||||
### Why Mark a Part as Consumable?
|
||||
|
||||
Not every item required to complete a build needs to be tracked and allocated with the same rigor as a high-value component. A part might be marked as consumable because it is:
|
||||
|
||||
- Low value, making the overhead of precise allocation not worth the effort
|
||||
- Kept in abundant stock, such that running out is unlikely to be a concern
|
||||
- Difficult to track in discrete units, such as a fluid or adhesive
|
||||
- Not something the business needs (or wants) visibility into at the build order level
|
||||
|
||||
Marking a part as consumable communicates this intent clearly wherever the part is used, without needing to remember to configure each individual BOM line item.
|
||||
|
||||
### Stock Items
|
||||
|
||||
Consumable parts can have stock items associated with them, the same as any other part. Stock levels for consumable parts can be tracked and managed as normal.
|
||||
|
||||
### Bills of Material
|
||||
|
||||
Consumable parts can be added as a subcomponent to the [Bills of Material](../manufacturing/bom.md) for an assembled part, in the same way as any other component.
|
||||
|
||||
### Build Orders
|
||||
|
||||
Unlike a regular component, a consumable part is not allocated to (or consumed by) a [Build Order](../manufacturing/build.md). When a build order is completed, stock quantities for consumable parts are not adjusted.
|
||||
|
||||
If stock levels for a consumable part need to be updated to reflect usage during a build, this must be done manually.
|
||||
|
||||
### Consumable BOM Line Items
|
||||
|
||||
Separately from the *Consumable* flag on the part itself, an individual [BOM line item](../manufacturing/bom.md#consumable-bom-line-items) can also be marked as *consumable*.
|
||||
|
||||
This allows a part which is **not** normally marked as consumable to be treated as consumable *for the purposes of a specific BOM*. For example, a fastener which is usually tracked precisely in one assembly might be treated as consumable in another assembly, without needing to change the underlying part definition.
|
||||
|
||||
In other words:
|
||||
|
||||
- The part-level *Consumable* flag is a permanent property of the part, and applies everywhere that part is used.
|
||||
- The BOM line item *Consumable* flag is a per-assembly override, and only affects how that part is treated within that particular BOM.
|
||||
|
||||
If a part is already marked as consumable, marking the corresponding BOM line item as consumable as well has no additional effect.
|
||||
@@ -85,4 +85,4 @@ In addition to the primary methods for creating or importing part data, the foll
|
||||
|
||||
- [Via the REST API](../api/index.md)
|
||||
- [Using the Python library](../api/python/index.md)
|
||||
- [Within the Admin interface](../settings/admin.md)
|
||||
- [Within the Database Admin interface](../settings/db_admin.md)
|
||||
|
||||
@@ -53,6 +53,8 @@ A *Template* part is one which can have *variants* which exist underneath it. [R
|
||||
|
||||
If a part is designated as an *Assembly* it can be created (or built) from other component parts. As an example, a circuit board assembly is made using multiple electronic components, which are tracked in the system. An *Assembly* Part has a Bill of Materials (BOM) which lists all the required sub-components. [Read further information about BOM management here](../manufacturing/bom.md).
|
||||
|
||||
An assembled stock item can also be broken back down into its component parts, using the [disassembly](../stock/disassemble.md) process.
|
||||
|
||||
### Component
|
||||
|
||||
If a part is designated as a *Component* it can be used as a sub-component of an *Assembly*. [Read further information about BOM management here](../manufacturing/bom.md)
|
||||
@@ -87,6 +89,9 @@ A [Purchase Order](../purchasing/purchase_order.md) allows parts to be ordered f
|
||||
|
||||
If a part is designated as *Salable* it can be sold to external customers. Setting this flag allows parts to be added to sales orders.
|
||||
|
||||
### Consumable
|
||||
|
||||
A *Consumable* part is one which is generally used up during a build or other process, rather than being tracked and allocated as a discrete item. Refer to the [consumable parts documentation](./consumable.md) for more information.
|
||||
|
||||
## Locked Parts
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ title: Part Notifications
|
||||
Users can select to receive notifications when certain events occur.
|
||||
|
||||
!!! warning "Email Configuration Required"
|
||||
External notifications require correct [email configuration](../start/config.md#email-settings). They also need to be enabled in the settings under notifications`.
|
||||
External notifications require correct [email configuration](../start/config.md#email-settings). They also need to be enabled in the settings under *Notifications*.
|
||||
|
||||
!!! warning "Valid Email Address"
|
||||
Each user must have a valid email address associated with their account to receive email notifications
|
||||
|
||||
@@ -51,7 +51,7 @@ Each price range is calculated in the [Default Currency](../concepts/pricing.md#
|
||||
Price range data is [cached in the database](#price-data-caching) when underlying pricing information changes.
|
||||
|
||||
!!! tip "Refresh Pricing"
|
||||
While pricing data is [automatically updated](#data-updates), the user can also manually refresh the pricing calculations manually, by pressing the "Refresh" button in the overview section.
|
||||
While pricing data is [automatically updated](#pricing-updates), the user can also manually refresh the pricing calculations manually, by pressing the "Refresh" button in the overview section.
|
||||
|
||||
#### Overall Pricing
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ If this tab is not visible, ensure that the *Enable Stock History* [user setting
|
||||
|
||||
### Stocktake Entry Generation
|
||||
|
||||
By default, stocktake entries are generated automatically at regular intervals (see [settings](#stock-history-settings) below). However, users can generate a stocktake entry on demand, using the *Generate Stocktake Entry* button in the *Stock History* tab:
|
||||
By default, stocktake entries are generated automatically at regular intervals (see [settings](#stocktake-settings) below). However, users can generate a stocktake entry on demand, using the *Generate Stocktake Entry* button in the *Stock History* tab:
|
||||
|
||||
{{ image("part/part_stocktake_manual.png", "Generate stocktake entry") }}
|
||||
|
||||
@@ -95,7 +95,7 @@ Enable or disable stocktake functionality. Note that by default, stocktake funct
|
||||
|
||||
### Automatic Stocktake Period
|
||||
|
||||
Configure the number of days between generation of [automatic stocktake reports](#automatic-stocktake). If this value is set to zero, automatic stocktake reports will not be generated.
|
||||
Configure the number of days between generation of [automatic stocktake entries](#stocktake-entry-generation). If this value is set to zero, automatic stocktake entries will not be generated.
|
||||
|
||||
### Delete Old Stocktake Entries
|
||||
|
||||
|
||||
@@ -8,7 +8,9 @@ Denoting a part as *Trackable* changes the way that [stock items](../stock/index
|
||||
|
||||
For many parts in an InvenTree database, simply tracking current stock levels (and locations) is sufficient. However, some parts require more extensive tracking than simple stock level knowledge.
|
||||
|
||||
Any stock item associated with a trackable part *must* have either a batch number or a serial number. This includes stock created manually or via an internal process (such as a [Purchase Order](../purchasing/purchase_order.md) or a [Build Order](../manufacturing/build.md)).
|
||||
Generally, a stock item associated with a trackable part should have either a batch number or a serial number. This includes stock created manually or via an internal process (such as a [Purchase Order](../purchasing/purchase_order.md) or a [Build Order](../manufacturing/build.md)).
|
||||
|
||||
However, this is not strictly enforced when creating a [build output](../manufacturing/output.md#create-build-output) - see [below](#build-orders) for further information.
|
||||
|
||||
## Assign Serial Numbers
|
||||
|
||||
@@ -35,3 +37,12 @@ For example:
|
||||
## Build Orders
|
||||
|
||||
[Build orders](../manufacturing/build.md) have some extra requirements when either building a trackable part, or using parts in the Bill of Materials which are themselves trackable.
|
||||
|
||||
### Build Outputs Without Serial Numbers
|
||||
|
||||
When [creating a build output](../manufacturing/output.md#create-build-output) for a trackable part, serial numbers are *not* required at the point of creation. This allows a batch quantity of build outputs to be created up-front, and serialized at some later stage - for example, after receiving a batch of unserialized units against an [external build order](../manufacturing/external.md).
|
||||
|
||||
If serial numbers are not provided, a single build output is created with the specified quantity, rather than one output per unit. This output can subsequently be assigned [serial numbers](#assign-serial-numbers), or split into individual serialized units, before it is completed.
|
||||
|
||||
!!! note "Tracked BOM Items"
|
||||
If the Bill of Materials for the part being built contains *tracked* (trackable) sub-components, serial numbers are still required when creating build outputs, regardless of whether the assembled part itself is trackable. This is necessary so that each tracked sub-component can be allocated against a specific build output. Refer to the [build allocation documentation](../manufacturing/allocate.md#tracked-build-outputs) for further information.
|
||||
|
||||
+17
-1
@@ -8,7 +8,7 @@ The Part detail view page provides a detailed view of a single part in the syste
|
||||
|
||||
### Category Breadcrumb List
|
||||
|
||||
The categories of each part is displayed on the top navigation bar as show in the above screenshot.
|
||||
The categories of each part is displayed on the top navigation bar.
|
||||
[Click here](./index.md#part-category) for more information about categories.
|
||||
|
||||
## Part Details
|
||||
@@ -83,6 +83,10 @@ The *Build Orders* tab shows a list of the builds for this part. It provides a v
|
||||
|
||||
The *Used In* tab displays a list of other parts that this part is used to make. This tab is only visible if the Part is a *component*.
|
||||
|
||||
### Part Pricing
|
||||
|
||||
The *Part Pricing* tab displays all available pricing information for the part, aggregated from multiple sources (internal pricing, supplier pricing, purchase history, BOM pricing, sale pricing, etc). Refer to the [part pricing documentation](./pricing.md) for further information.
|
||||
|
||||
### Suppliers
|
||||
|
||||
The *Suppliers* tab displays all the *Part Suppliers* and *Part Manufacturers* for the selected *Part*.
|
||||
@@ -101,6 +105,14 @@ This tab is only displayed if the part is marked as *Purchaseable*.
|
||||
|
||||
The *Sales Orders* tab shows a list of the sales orders for this part. It provides a view for important sales order information like customer, status, creation and shipment dates.
|
||||
|
||||
### Return Orders
|
||||
|
||||
The *Return Orders* tab shows a list of the [return orders](../sales/return_order.md) which reference this part. This tab is only visible if the Part is marked as *Salable*, and the return order feature is enabled.
|
||||
|
||||
### Transfer Orders
|
||||
|
||||
The *Transfer Orders* tab shows a list of the [transfer orders](../stock/transfer_order.md) which reference this part. This tab is hidden if the Part is marked as *Virtual*, or the transfer order feature is not enabled.
|
||||
|
||||
### Stock History
|
||||
|
||||
The *Stock History* tab provide historical stock level information. Refer to the [stock history documentation](./stocktake.md) for further information.
|
||||
@@ -109,6 +121,10 @@ The *Stock History* tab provide historical stock level information. Refer to the
|
||||
|
||||
If a part is marked as *testable*, the user can define tests which must be performed on any stock items which are instances of this part. [Read more about testing](./test.md).
|
||||
|
||||
### Test Results
|
||||
|
||||
The *Test Results* tab displays [test result](../stock/test.md) data uploaded against *any* stock item of this part, aggregated into a single table. This differs from the *Test Templates* tab, which configures the tests themselves rather than displaying recorded results. This tab is only visible if the part is marked as *testable*.
|
||||
|
||||
### Related Parts
|
||||
|
||||
Related Part denotes a relationship between two parts, when users want to show their usage is "related" to another part or simply emphasize a link between two parts.
|
||||
|
||||
@@ -214,10 +214,10 @@ The frontend code for your plugin is located in the `frontend/src` directory. Yo
|
||||
|
||||
Refer to the `./frontend/src/Panel.tsx` file as a starting point. This is where the custom panel for the part detail page is implemented. You can modify this file to change the content and behavior of the panel.
|
||||
|
||||
While the `npm dev` server is running, any changes you make to the frontend code will be automatically reloaded allowing for rapid development and testing of your plugin's frontend features. This avoids the need to rebuild the frontend code every time you make a change.
|
||||
While the `npm dev` server is running, any changes to the frontend are reflected in the browser using React Fast Refresh, allowing for rapid development without rebuilding the frontend with every change.
|
||||
|
||||
!!! info "Page Reload"
|
||||
Due to the way the InvenTree frontend is structured, you will need to manually refresh the page in your browser to see changes to the frontend code. The development server will automatically reload the frontend code, but the InvenTree server needs to be aware of the changes.
|
||||
All exports in plugin modules that export React components must start with a capital letter. Otherwise, React Fast Refresh will fall back to a full page reload instead of performing a component-level update. Additionally, any render functions referenced from Python must also be capitalized.
|
||||
|
||||
## Build Plugin
|
||||
|
||||
|
||||
@@ -113,10 +113,10 @@ Refer to the [sample plugins]({{ sourcedir("src/backend/InvenTree/plugin/samples
|
||||
|
||||
A *PluginConfig* database entry will be created for each plugin "discovered" when the server launches. This configuration entry is used to determine if a particular plugin is enabled.
|
||||
|
||||
The configuration entries must be enabled via the [InvenTree admin interface](../settings/admin.md).
|
||||
The configuration entries must be enabled via the [Admin Center](../settings/admin.md#admin-center).
|
||||
|
||||
!!! warning "Disabled by Default"
|
||||
Newly discovered plugins are disabled by default, and must be manually enabled (in the admin interface) by a user with staff privileges.
|
||||
Newly discovered plugins are disabled by default, and must be manually enabled (in the Admin Center) by a user with staff privileges.
|
||||
|
||||
## Plugin Mixins
|
||||
|
||||
|
||||
@@ -54,14 +54,14 @@ class InvenTreeBarcodePlugin(BarcodeMixin, InvenTreePlugin):
|
||||
VERSION = "0.0.1"
|
||||
AUTHOR = "Michael"
|
||||
|
||||
def scan(self, barcode_data):
|
||||
def scan(self, barcode_data, user, **kwargs):
|
||||
if barcode_data.startswith("PART-"):
|
||||
try:
|
||||
pk = int(barcode_data.split("PART-")[1])
|
||||
instance = Part.objects.get(pk=pk)
|
||||
label = Part.barcode_model_type()
|
||||
|
||||
return {label: instance.format_matched_response()}
|
||||
return {label: instance.format_matched_response(user=user)}
|
||||
except Part.DoesNotExist:
|
||||
pass
|
||||
```
|
||||
|
||||
@@ -4,15 +4,57 @@ title: Report Mixin
|
||||
|
||||
## ReportMixin
|
||||
|
||||
The `ReportMixin` class provides a plugin with the ability to extend the functionality of custom [report templates](../../report/report.md). A plugin which implements the ReportMixin mixin class can add custom context data to a report template for rendering.
|
||||
The `ReportMixin` class provides a plugin with the ability to extend the functionality of custom [report templates](../../report/report.md). A plugin which implements the ReportMixin mixin class can add custom context data to a report template for rendering, and can also receive a callback when a report is generated.
|
||||
|
||||
### Add Report Context
|
||||
|
||||
A plugin which implements the ReportMixin mixin can define the `add_report_context` method, allowing custom context data to be added to a report template at time of printing.
|
||||
|
||||
This method is called each time a report is generated, and is passed the following arguments:
|
||||
|
||||
| Argument | Description |
|
||||
| --- | --- |
|
||||
| `report_instance` | The report template instance which is being rendered |
|
||||
| `model_instance` | The model instance against which the report is being generated |
|
||||
| `user` | The user who initiated the report generation |
|
||||
| `context` | The context dictionary, which can be modified in-place |
|
||||
|
||||
Any data added to the provided `context` dictionary is made available to the report template, and can be rendered using standard django template syntax:
|
||||
|
||||
```python
|
||||
def add_report_context(self, report_instance, model_instance, user, context):
|
||||
"""Add extra context data to the report template."""
|
||||
context['my_custom_data'] = self.calculate_custom_data(model_instance)
|
||||
```
|
||||
|
||||
### Add Label Context
|
||||
|
||||
Additionally the `add_label_context` method, allowing custom context data to be added to a label template at time of printing.
|
||||
Similarly, the `add_label_context` method allows custom context data to be added to a label template at time of printing:
|
||||
|
||||
| Argument | Description |
|
||||
| --- | --- |
|
||||
| `label_instance` | The label template instance which is being rendered |
|
||||
| `model_instance` | The model instance against which the label is being generated |
|
||||
| `user` | The user who initiated the label generation |
|
||||
| `context` | The context dictionary, which can be modified in-place |
|
||||
|
||||
### Report Callback
|
||||
|
||||
The `report_callback` method is called after a report has been generated, and allows the plugin to perform custom actions with the generated report - for example, forwarding the report to an external system, or performing custom post-processing.
|
||||
|
||||
| Argument | Description |
|
||||
| --- | --- |
|
||||
| `template` | The report template instance which was used to generate the report |
|
||||
| `instance` | The model instance against which the report was generated |
|
||||
| `report` | The generated report (PDF file data) |
|
||||
| `user` | The user who initiated the report generation |
|
||||
|
||||
```python
|
||||
def report_callback(self, template, instance, report, user, **kwargs):
|
||||
"""Custom callback function - called after a report is generated."""
|
||||
# For example, forward the generated report to an external service
|
||||
self.upload_to_external_service(report)
|
||||
```
|
||||
|
||||
### Sample Plugin
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
Copy the built `attachment_carousel` directory to the `inventree-data/plugins` directory and enable it via the admin interface.
|
||||
Copy the built `attachment_carousel` directory to the `inventree-data/plugins` directory and enable it via the [Admin Center](../settings/admin.md#admin-center).
|
||||
|
||||

|
||||
|
||||
@@ -119,7 +119,7 @@ function AttachmentCarouselPanel({context}: {context: InvenTreePluginContext;})
|
||||
}
|
||||
|
||||
// This is the function which is called by InvenTree to render the actual panel component
|
||||
export function renderAttachmentCarouselPanel(context: InvenTreePluginContext) {
|
||||
export function RenderAttachmentCarouselPanel(context: InvenTreePluginContext) {
|
||||
checkPluginVersion(context);
|
||||
return <AttachmentCarouselPanel context={context} />;
|
||||
}
|
||||
@@ -300,7 +300,7 @@ Back to the walkthrough, open `core.py` in the `attachment_carousel` folder and
|
||||
'title': 'Attachment Carousel',
|
||||
'description': 'Custom panel description',
|
||||
'icon': 'ti:carousel-horizontal:outline',
|
||||
'source': self.plugin_static_file('Panel.js:renderAttachmentCarouselPanel'),
|
||||
'source': self.plugin_static_file('Panel.js:RenderAttachmentCarouselPanel'),
|
||||
'context': {
|
||||
# Provide additional context data to the panel
|
||||
'settings': self.get_settings_dict(),
|
||||
@@ -385,7 +385,7 @@ panels.append({
|
||||
'description': 'Custom panel description',
|
||||
- 'icon': 'ti:mood-smile:outline',
|
||||
+ 'icon': 'ti:carousel-horizontal:outline',
|
||||
'source': self.plugin_static_file('Panel.js:renderAttachmentCarouselPanel'),
|
||||
'source': self.plugin_static_file('Panel.js:RenderAttachmentCarouselPanel'),
|
||||
'context': {
|
||||
# Provide additional context data to the panel
|
||||
'settings': self.get_settings_dict(),
|
||||
@@ -519,7 +519,7 @@ panels.append({
|
||||
'title': 'Attachment Carousel',
|
||||
'description': 'Custom panel description',
|
||||
'icon': 'ti:carousel-horizontal:outline',
|
||||
'source': self.plugin_static_file('Panel.js:renderAttachmentCarouselPanel'),
|
||||
'source': self.plugin_static_file('Panel.js:RenderAttachmentCarouselPanel'),
|
||||
'context': {
|
||||
# Provide additional context data to the panel
|
||||
'settings': self.get_settings_dict(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Resources InvenTree receives
|
||||
title: Sponsored Resources
|
||||
---
|
||||
|
||||
The InvenTree project is grateful to receive resources from various vendors free of charge.
|
||||
@@ -14,9 +14,12 @@ Individuals and companies can also support via [GitHub sponsors](https://github.
|
||||
- [Codecov](https://codecov.io) - Code coverage as a service, used to track the code coverage of the various components
|
||||
- [Netlify](https://www.netlify.com/) - Static site hosting provider, used to test deploy the frontend and website
|
||||
- [Depot](https://depot.dev/?utm_source=inventree) - Docker build accelerator, used to build the multi-arch images for the InvenTree docker image
|
||||
- [CodSpeed](https://codspeed.io/) - Performance testing platform, used to track the performance of a few performance benchmarks
|
||||
- [Flakiness](https://flakiness.io/) - Frontend test flakiness detection, used to track the flakiness of the various test harnesses
|
||||
|
||||
## Past Supporters
|
||||
|
||||
Non comprehensive list of past supporters. The project stops consuming resources for various reasons, this does not mean they are not good resources.
|
||||
|
||||
- [Coveralls](https://coveralls.io/) - Code coverage as a service
|
||||
- [Deepsource](https://deepsource.io/) - Code quality and security analysis
|
||||
@@ -92,6 +92,12 @@ Once the "Add Line Item" form opens, select a supplier part in the list.
|
||||
|
||||
Fill out the rest of the form then click on <span class="badge inventree confirm">Submit</span>
|
||||
|
||||
!!! info "Auto Pricing"
|
||||
Enable the *Auto Pricing* option to automatically calculate the line item's *Unit Price* from the [supplier part pricing data](../part/pricing.md#supplier-pricing), based on the line item quantity. While enabled, the *Unit Price* field is calculated automatically and cannot be edited manually. This option is disabled by default.
|
||||
|
||||
!!! info "Discount"
|
||||
An optional [discount](../concepts/pricing.md#line-item-discount) percentage can be applied to each line item.
|
||||
|
||||
#### Upload File
|
||||
|
||||
It is possible to upload an exported purchase order from the supplier instead of manually entering each line item. To start the process, click on <span class="badge inventree confirm">{{ icon("upload") }} Upload File</span> button next to the <span class="badge inventree add">{{ icon("plus-circle") }} Add Line Item</span> button and follow the steps.
|
||||
@@ -99,6 +105,10 @@ It is possible to upload an exported purchase order from the supplier instead of
|
||||
!!! info "Supported Formats"
|
||||
This process only supports tabular data and the following formats are supported: CSV, TSV, XLS, XLSX, JSON and YAML
|
||||
|
||||
### Extra Line Items
|
||||
|
||||
While [line items](#add-line-items) must reference a particular supplier part, extra line items are available for any other itemized information that needs to be conveyed with the order - for example freight charges or service fees. Extra line items support an optional [discount](../concepts/pricing.md#line-item-discount) percentage, the same as regular line items.
|
||||
|
||||
## Issue Order
|
||||
|
||||
Once all the line items were added, click on the {{ icon("send", title="Issue") }} button on the main purchase order detail panel and confirm the order has been submitted.
|
||||
@@ -129,12 +139,34 @@ Each item marked as "received" is automatically converted into a stock item.
|
||||
|
||||
To see the list of stock items created from the purchase order, click on the <span class="badge inventree nav side">{{ icon("arrow-right") }} Received Items</span> tab.
|
||||
|
||||
### Serial Numbers
|
||||
|
||||
If the part being received is [trackable](../part/trackable.md), serial numbers can optionally be entered at the point of receipt. If provided, an individual (serialized) stock item is created for each unit received.
|
||||
|
||||
Serial numbers are *not* required to receive a trackable part - if left blank, a single (non-serialized) stock item is created for the received quantity. This is useful, for example, when receiving a batch of units against an [external build order](../manufacturing/external.md) which will be [serialized later](../part/trackable.md#build-outputs-without-serial-numbers) in the manufacturing process.
|
||||
|
||||
### Item Value Currency
|
||||
|
||||
The unit cost of the purchase order line item is transferred across to the created stock item. By default, the same currency is used for the stock item as was used for the purchase order line item.
|
||||
|
||||
However, if the [Convert Currency](#purchase-order-settings) setting is enabled, the currency of the stock item will be converted to the [default currency](../concepts/pricing.md#default-currency) of the system. This may be useful when ordering stock in a different currency, to ensure that the unit cost of the stock item is converted to the base currency at the time of receipt.
|
||||
|
||||
## Bundled Items
|
||||
|
||||
Some suppliers only sell a group of components as a single bundled or "kit" product, rather than as individual purchasable line items - for example, a fastener kit containing an assortment of different screws, or a "starter kit" containing several components required for a particular use case.
|
||||
|
||||
Rather than receiving the bundle as a single opaque stock quantity, InvenTree allows the bundle to be modelled as an assembly, so that it can be broken apart into its individual components once required:
|
||||
|
||||
1. Create a part to represent the bundle itself, and mark it as an [assembly](../part/index.md#assembly)
|
||||
2. Link a [supplier part](./supplier.md#supplier-parts) to the bundle part, representing how it is purchased from the supplier
|
||||
3. Define a [Bill of Materials](../manufacturing/bom.md) for the bundle part, listing each of the individual components and the quantity contained within a single bundle
|
||||
4. Create and receive a purchase order against the bundle's supplier part, as normal - a single stock item is created for the bundle, retaining the purchase price and source purchase order of the order as a whole
|
||||
|
||||
Once the individual components are actually required, the received bundle stock item can be [disassembled](../stock/disassemble.md) into its component parts. The purchase price and traceability data (batch code, source purchase order) of the original bundle are automatically apportioned across the newly generated component stock items.
|
||||
|
||||
!!! tip "Pack Size vs Bundled Items"
|
||||
A supplier part with a [pack size](./supplier.md#supplier-part-pack-size) greater than one still represents multiple units of the *same* part - the pack size simply determines how many physical units are added to stock per unit ordered. A *bundled* item is different: a single supplier part represents an assortment of *different* components, which must be disassembled before the individual components can be used or sold separately.
|
||||
|
||||
## Complete Order
|
||||
|
||||
Once the quantity of all __received__ items is equal or above the quantity of all line items, the order will be automatically marked as __complete__.
|
||||
@@ -199,3 +231,4 @@ The following [global settings](../settings/global.md) are available for purchas
|
||||
{{ globalsetting("PURCHASEORDER_CONVERT_CURRENCY") }}
|
||||
{{ globalsetting("PURCHASEORDER_EDIT_COMPLETED_ORDERS") }}
|
||||
{{ globalsetting("PURCHASEORDER_AUTO_COMPLETE") }}
|
||||
{{ globalsetting("PURCHASEORDER_MERGE_LINE_ITEMS") }}
|
||||
|
||||
@@ -89,3 +89,6 @@ Supplier parts can have a pack size defined. This value is defined when creating
|
||||
When buying parts, they are bought in packs. This is taken into account in Purchase Orders: if a supplier part with a pack size of 5 is bought in a quantity of 4, 20 parts will be added to stock when the parts are received.
|
||||
|
||||
When adding stock manually, the supplier part can be added in packs or in individual parts. This is to allow the addition of items in opened packages. Set the flag "Use pack size" (`use_pack_size` in the API) to True in order to add parts in packs.
|
||||
|
||||
!!! tip "Bundled Items"
|
||||
A pack size only ever represents multiple units of the *same* part. If a supplier instead sells a kit or assortment of *different* components as a single purchasable item, refer to the [bundled items](./purchase_order.md#bundled-items) documentation instead.
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: Report Assets
|
||||
---
|
||||
|
||||
## Report Assets
|
||||
|
||||
Users can upload asset files (e.g. images) which can be used when generating reports. For example, you may wish to generate a report with your company logo in the header.
|
||||
|
||||
Asset files are managed from the [Admin Center](../settings/admin.md#admin-center), via the *Report Assets* panel. Staff users can upload new asset files, and remove assets which are no longer required.
|
||||
|
||||
Asset files can be rendered directly into the template as follows
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
<!-- Need to include the report template tags at the start of the template file -->
|
||||
{% load report %}
|
||||
|
||||
<!-- Simple stylesheet -->
|
||||
<head>
|
||||
<style>
|
||||
.company-logo {
|
||||
height: 50px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Report template code here -->
|
||||
|
||||
<!-- Render an uploaded asset image -->
|
||||
<img src="{% asset 'company_image.png' %}" class="company-logo">
|
||||
|
||||
<!-- ... -->
|
||||
</body>
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
!!! warning "Asset Naming"
|
||||
If the requested asset name does not match the name of an uploaded asset, the template will continue without loading the image.
|
||||
|
||||
!!! info "Assets location"
|
||||
Upload new assets via the *Report Assets* panel in the [Admin Center](../settings/admin.md#admin-center) to ensure they are uploaded to the correct location on the server.
|
||||
|
||||
There are various [helper functions](./helpers.md#report-assets) available to assist with embedding assets into templates.
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
title: Context Variables
|
||||
title: Report Context
|
||||
---
|
||||
|
||||
|
||||
## Context Variables
|
||||
## Report Context Variables
|
||||
|
||||
Context variables are provided to each template when it is rendered. The available context variables depend on the model type for which the template is being rendered.
|
||||
|
||||
@@ -13,9 +13,6 @@ In addition to the model-specific context variables, the following global contex
|
||||
|
||||
{{ report_context("base", "global") }}
|
||||
|
||||
::: report.models.ReportTemplateBase.base_context
|
||||
options:
|
||||
show_source: True
|
||||
|
||||
### Report Context
|
||||
|
||||
@@ -23,7 +20,7 @@ In addition to the [global context](#global-context), all *report* templates hav
|
||||
|
||||
{{ report_context("base", "report") }}
|
||||
|
||||
When using the `merge` context variable, the selected items are available in the `instances` list. {{ templatefile("report/inventree_stock_report_merge.html") }} shows a complete example. To access individual item attributes, you can either loop through the `instances` or access them by index like `instance.0.name`.
|
||||
When using the `merge` context variable, the selected items are available in the `instances` list. To access individual item attributes, you can either loop through the `instances` or access them by index like `instance.0.name`.
|
||||
|
||||
Below is an example template that generates a single report for some selected parts. Each part occupies a row in the table
|
||||
|
||||
@@ -69,12 +66,14 @@ Templates (whether for generating [reports](./report.md) or [labels](./labels.md
|
||||
|
||||
| Model Type | Description |
|
||||
| --- | --- |
|
||||
| company | A Company instance |
|
||||
| [company](#company) | A Company instance |
|
||||
| [build](#build-order) | A [Build Order](../manufacturing/build.md) instance |
|
||||
| [buildline](#build-line) | A [Build Order Line Item](../manufacturing/build.md) instance |
|
||||
| [salesorder](#sales-order) | A [Sales Order](../sales/sales_order.md) instance |
|
||||
| [salesordershipment](#sales-order-shipment) | A [Sales Order Shipment](../sales/sales_order.md#sales-order-shipments) instance |
|
||||
| [returnorder](#return-order) | A [Return Order](../sales/return_order.md) instance |
|
||||
| [purchaseorder](#purchase-order) | A [Purchase Order](../purchasing/purchase_order.md) instance |
|
||||
| [transferorder](#transfer-order) | A [Transfer Order](../stock/transfer_order.md) instance |
|
||||
| [stockitem](#stock-item) | A [StockItem](../stock/index.md#stock-item) instance |
|
||||
| [stocklocation](#stock-location) | A [StockLocation](../stock/index.md#stock-location) instance |
|
||||
| [part](#part) | A [Part](../part/index.md) instance |
|
||||
@@ -85,9 +84,8 @@ When printing a report or label against a Company instance, the following contex
|
||||
|
||||
{{ report_context("models", "company") }}
|
||||
|
||||
::: company.models.Company.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `Company` instance, refer to the [Model Context](model_context.md#company) page.
|
||||
|
||||
|
||||
### Build Order
|
||||
|
||||
@@ -95,9 +93,8 @@ When printing a report or label against a [Build Order](../manufacturing/build.m
|
||||
|
||||
{{ report_context("models", "build") }}
|
||||
|
||||
::: build.models.Build.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `Build` instance, refer to the [Model Context](model_context.md#build-order) page.
|
||||
|
||||
|
||||
### Build Line
|
||||
|
||||
@@ -105,9 +102,7 @@ When printing a report or label against a [BuildOrderLineItem](../manufacturing/
|
||||
|
||||
{{ report_context("models", "buildline") }}
|
||||
|
||||
::: build.models.BuildLine.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `BuildLine` instance, refer to the [Model Context](model_context.md#build-order-line-item) page.
|
||||
|
||||
### Sales Order
|
||||
|
||||
@@ -115,9 +110,7 @@ When printing a report or label against a [SalesOrder](../sales/sales_order.md)
|
||||
|
||||
{{ report_context("models", "salesorder") }}
|
||||
|
||||
::: order.models.Order.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `SalesOrder` instance, refer to the [Model Context](model_context.md#sales-order) page.
|
||||
|
||||
### Sales Order Shipment
|
||||
|
||||
@@ -125,9 +118,7 @@ When printing a report or label against a [SalesOrderShipment](../sales/sales_or
|
||||
|
||||
{{ report_context("models", "salesordershipment") }}
|
||||
|
||||
::: order.models.SalesOrderShipment.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `SalesOrderShipment` instance, refer to the [Model Context](model_context.md#sales-order-shipment) page.
|
||||
|
||||
### Return Order
|
||||
|
||||
@@ -135,21 +126,31 @@ When printing a report or label against a [ReturnOrder](../sales/return_order.md
|
||||
|
||||
{{ report_context("models", "returnorder") }}
|
||||
|
||||
For the fields and properties available on the underlying `ReturnOrder` instance, refer to the [Model Context](model_context.md#return-order) page.
|
||||
|
||||
### Purchase Order
|
||||
|
||||
When printing a report or label against a [PurchaseOrder](../purchasing/purchase_order.md) object, the following context variables are available:
|
||||
|
||||
{{ report_context("models", "purchaseorder") }}
|
||||
|
||||
For the fields and properties available on the underlying `PurchaseOrder` instance, refer to the [Model Context](model_context.md#purchase-order) page.
|
||||
|
||||
### Transfer Order
|
||||
|
||||
When printing a report or label against a [TransferOrder](../stock/transfer_order.md) object, the following context variables are available:
|
||||
|
||||
{{ report_context("models", "transferorder") }}
|
||||
|
||||
For the fields and properties available on the underlying `TransferOrder` instance, refer to the [Model Context](model_context.md#transfer-order) page.
|
||||
|
||||
### Stock Item
|
||||
|
||||
When printing a report or label against a [StockItem](../stock/index.md#stock-item) object, the following context variables are available:
|
||||
|
||||
{{ report_context("models", "stockitem") }}
|
||||
|
||||
::: stock.models.StockItem.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `StockItem` instance, refer to the [Model Context](model_context.md#stock-item) page.
|
||||
|
||||
### Stock Location
|
||||
|
||||
@@ -157,9 +158,7 @@ When printing a report or label against a [StockLocation](../stock/index.md#stoc
|
||||
|
||||
{{ report_context("models", "stocklocation") }}
|
||||
|
||||
::: stock.models.StockLocation.report_context
|
||||
options:
|
||||
show_source: True
|
||||
For the fields and properties available on the underlying `StockLocation` instance, refer to the [Model Context](model_context.md#stock-location) page.
|
||||
|
||||
### Part
|
||||
|
||||
@@ -167,195 +166,9 @@ When printing a report or label against a [Part](../part/index.md) object, the f
|
||||
|
||||
{{ report_context("models", "part") }}
|
||||
|
||||
::: part.models.Part.report_context
|
||||
options:
|
||||
show_source: True
|
||||
|
||||
## Model Variables
|
||||
|
||||
Additional to the context variables provided directly to each template, each model type has a number of attributes and methods which can be accessedd via the template.
|
||||
|
||||
For each model type, a subset of the most commonly used attributes are listed below. For a full list of attributes and methods, refer to the source code for the particular model type.
|
||||
|
||||
### Parts
|
||||
|
||||
#### Part
|
||||
|
||||
Each part object has access to a lot of context variables about the part. The following context variables are provided when accessing a `Part` object from within the template.
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| name | Brief name for this part |
|
||||
| full_name | Full name for this part (including IPN, if not null and including variant, if not null) |
|
||||
| variant | Optional variant number for this part - Must be unique for the part name
|
||||
| category | The [PartCategory](#part-category) object to which this part belongs
|
||||
| description | Longer form description of the part
|
||||
| keywords | Optional keywords for improving part search results
|
||||
| IPN | Internal part number (optional)
|
||||
| revision | Part revision
|
||||
| is_template | If True, this part is a 'template' part
|
||||
| link | Link to an external page with more information about this part (e.g. internal Wiki)
|
||||
| image | Image of this part
|
||||
| default_location | The default [StockLocation](#stock-location) object where the item is normally stored (may be null)
|
||||
| default_supplier | The default [SupplierPart](#supplierpart) which should be used to procure and stock this part
|
||||
| default_expiry | The default expiry duration for any StockItem instances of this part
|
||||
| minimum_stock | Minimum preferred quantity to keep in stock
|
||||
| units | Units of measure for this part (default='pcs')
|
||||
| salable | Can this part be sold to customers?
|
||||
| assembly | Can this part be build from other parts?
|
||||
| component | Can this part be used to make other parts?
|
||||
| purchaseable | Can this part be purchased from suppliers?
|
||||
| trackable | Trackable parts can have unique serial numbers assigned, etc, etc
|
||||
| active | Is this part active? Parts are deactivated instead of being deleted
|
||||
| virtual | Is this part "virtual"? e.g. a software product or similar
|
||||
| notes | Additional notes field for this part
|
||||
| creation_date | Date that this part was added to the database
|
||||
| creation_user | User who added this part to the database
|
||||
| responsible | User who is responsible for this part (optional)
|
||||
| starred | Whether the part is starred or not |
|
||||
| disabled | Whether the part is disabled or not |
|
||||
| total_stock | The total amount in stock |
|
||||
| quantity_being_built | The amount being built |
|
||||
| required_build_order_quantity | The amount required for build orders |
|
||||
| allocated_build_order_quantity | The amount allocated for build orders |
|
||||
| build_order_allocations | Query set with all build order allocations for that part |
|
||||
| required_sales_order_quantity | The amount required for sales orders |
|
||||
| allocated_sales_order_quantity | The amount allocated for sales orders |
|
||||
| available | Whether the part is available or not |
|
||||
| on_order | The amount that are on order |
|
||||
| required | The total amount required for build orders and sales orders |
|
||||
| allocated | The total amount allocated for build orders and sales orders |
|
||||
|
||||
#### Part Category
|
||||
For the fields and properties available on the underlying `Part` instance, refer to the [Model Context](model_context.md#part) page.
|
||||
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| name | Name of this category |
|
||||
| parent | Parent category |
|
||||
| default_location | Default [StockLocation](#stock-location) object for parts in this category or child categories |
|
||||
| default_keywords | Default keywords for parts created in this category |
|
||||
## Model Context
|
||||
|
||||
### Stock
|
||||
|
||||
#### StockItem
|
||||
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| parent | Link to another [StockItem](#stock-item) from which this StockItem was created |
|
||||
| uid | Field containing a unique-id which is mapped to a third-party identifier (e.g. a barcode) |
|
||||
| part | Link to the master abstract [Part](#part) that this [StockItem](#stock-item) is an instance of |
|
||||
| supplier_part | Link to a specific [SupplierPart](#supplierpart) (optional) |
|
||||
| location | The [StockLocation](#stock-location) Where this [StockItem](#stock-item) is located |
|
||||
| quantity | Number of stocked units |
|
||||
| batch | Batch number for this [StockItem](#stock-item) |
|
||||
| serial | Unique serial number for this [StockItem](#stock-item) |
|
||||
| link | Optional URL to link to external resource |
|
||||
| updated | Date that this stock item was last updated (auto) |
|
||||
| expiry_date | Expiry date of the [StockItem](#stock-item) (optional) |
|
||||
| stocktake_date | Date of last stocktake for this item |
|
||||
| stocktake_user | User that performed the most recent stocktake |
|
||||
| review_needed | Flag if [StockItem](#stock-item) needs review |
|
||||
| delete_on_deplete | If True, [StockItem](#stock-item) will be deleted when the stock level gets to zero |
|
||||
| status | Status of this [StockItem](#stock-item) (ref: InvenTree.status_codes.StockStatus) |
|
||||
| status_label | Textual representation of the status e.g. "OK" |
|
||||
| notes | Extra notes field |
|
||||
| build | Link to a Build (if this stock item was created from a build) |
|
||||
| is_building | Boolean field indicating if this stock item is currently being built (or is "in production") |
|
||||
| purchase_order | Link to a [PurchaseOrder](#purchase-order) (if this stock item was created from a PurchaseOrder) |
|
||||
| infinite | If True this [StockItem](#stock-item) can never be exhausted |
|
||||
| sales_order | Link to a [SalesOrder](#sales-order) object (if the StockItem has been assigned to a SalesOrder) |
|
||||
| purchase_price | The unit purchase price for this [StockItem](#stock-item) - this is the unit price at time of purchase (if this item was purchased from an external supplier) |
|
||||
| packaging | Description of how the StockItem is packaged (e.g. "reel", "loose", "tape" etc) |
|
||||
|
||||
#### StockLocation
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| barcode | Brief payload data (e.g. for labels). Example: `{"stocklocation": 826}` where 826 is the primary key|
|
||||
| description | The description of the location |
|
||||
| icon | The name of the icon if set, e.g. fas fa-warehouse |
|
||||
| item_count | Simply returns the number of stock items in this location |
|
||||
| name | The name of the location. This is only the name of this location, not the path |
|
||||
| owner | The owner of the location if it has one. The owner can only be assigned in the admin interface |
|
||||
| parent | The parent location. Returns None if it is already the top most one |
|
||||
| path | A queryset of locations that contains the hierarchy starting from the top most parent |
|
||||
| pathstring | A string that contains all names of the path separated by slashes e.g. A/B/C |
|
||||
| structural | True if the location is structural |
|
||||
|
||||
### Suppliers
|
||||
|
||||
#### Company
|
||||
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| name | Name of the company |
|
||||
| description | Longer form description |
|
||||
| website | URL for the company website |
|
||||
| primary_address | [Address](#address) object that is marked as primary address |
|
||||
| address | String format of the primary address |
|
||||
| contact | Contact Name |
|
||||
| phone | Contact phone number |
|
||||
| email | Contact email address |
|
||||
| link | A second URL to the company (Actually only accessible in the admin interface) |
|
||||
| notes | Extra notes about the company (Actually only accessible in the admin interface) |
|
||||
| is_customer | Boolean value, is this company a customer |
|
||||
| is_supplier | Boolean value, is this company a supplier |
|
||||
| is_manufacturer | Boolean value, is this company a manufacturer |
|
||||
| currency_code | Default currency for the company |
|
||||
| parts | Query set with all parts that the company supplies |
|
||||
|
||||
#### Address
|
||||
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| line1 | First line of the postal address |
|
||||
| line2 | Second line of the postal address |
|
||||
| postal_code | ZIP code of the city |
|
||||
| postal_city | City name |
|
||||
| country | Country name |
|
||||
|
||||
#### Contact
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| company | Company object where the contact belongs to |
|
||||
| name | First and second name of the contact |
|
||||
| phone | Phone number |
|
||||
| email | Email address |
|
||||
| role | Role of the contact |
|
||||
|
||||
#### SupplierPart
|
||||
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| part | Link to the master Part (Obsolete) |
|
||||
| source_item | The sourcing [StockItem](#stock-item) linked to this [SupplierPart](#supplierpart) instance |
|
||||
| supplier | [Company](#company) that supplies this part |
|
||||
| SKU | Stock keeping unit (supplier part number) |
|
||||
| link | Link to external website for this supplier part |
|
||||
| description | Descriptive notes field |
|
||||
| note | Longer form note field |
|
||||
| base_cost | Base charge added to order independent of quantity e.g. "Reeling Fee" |
|
||||
| multiple | Multiple that the part is provided in |
|
||||
| lead_time | Supplier lead time |
|
||||
| packaging | packaging that the part is supplied in, e.g. "Reel" |
|
||||
| pretty_name | The IPN, supplier name, supplier SKU and (if not null) manufacturer string joined by `|`. Ex. `P00037 | Company | 000021` |
|
||||
| unit_pricing | The price for one unit. |
|
||||
| price_breaks | Return the associated price breaks in the correct order |
|
||||
| has_price_breaks | Whether this [SupplierPart](#supplierpart) has price breaks |
|
||||
| manufacturer_string | Format a MPN string for this [SupplierPart](#supplierpart). Concatenates manufacture name and part number. |
|
||||
|
||||
### User
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| username | the username of the user |
|
||||
| fist_name | The first name of the user |
|
||||
| last_name | The last name of the user |
|
||||
| email | The email address of the user |
|
||||
| pk | The primary key of the user |
|
||||
For the underlying fields and properties available on each of the model instances above (plus related model types such as `Address` or `SupplierPart`), refer to the [Model Context](model_context.md) page.
|
||||
|
||||
+253
-15
@@ -320,15 +320,86 @@ The helper function `format_number` allows for some common number formatting opt
|
||||
show_docstring_description: false
|
||||
show_source: False
|
||||
|
||||
#### Example
|
||||
#### Examples
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
{% format_number 3.14159265359 decimal_places=5, leading=3 %}
|
||||
<!-- output: 0003.14159 -->
|
||||
|
||||
<!-- Basic usage: strip trailing zeros -->
|
||||
{% format_number 3.14159265359 decimal_places=5 %}
|
||||
<!-- output: 3.14159 -->
|
||||
|
||||
<!-- Leading zeros with 'leading' option -->
|
||||
{% format_number 3.14159265359 decimal_places=5 leading=3 %}
|
||||
<!-- output: 003.14159 -->
|
||||
|
||||
<!-- Round to integer -->
|
||||
{% format_number 3.14159265359 integer=True %}
|
||||
<!-- output: 3 -->
|
||||
|
||||
<!-- Thousands separator -->
|
||||
{% format_number 9988776.5 decimal_places=2 separator=True %}
|
||||
<!-- output: 9,988,776.50 -->
|
||||
|
||||
<!-- Locale-aware formatting: decimal comma, dot thousands separator -->
|
||||
{% format_number 9988776.5 decimal_places=2 separator=True locale='de-de' %}
|
||||
<!-- output: 9.988.776,50 -->
|
||||
|
||||
<!-- Scale a value with a multiplier before formatting -->
|
||||
{% format_number 0.175 multiplier=100 decimal_places=1 %}
|
||||
<!-- output: 17.5 -->
|
||||
|
||||
<!-- Allow up to N significant decimal places, but suppress trailing zeros -->
|
||||
{% format_number 1234.5 decimal_places=2 max_decimal_places=6 %}
|
||||
<!-- output: 1234.5 -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
#### Custom Format Strings
|
||||
|
||||
The `fmt` argument accepts a [Unicode number pattern](https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns) string (the same syntax used by [Babel](https://babel.pocoo.org/en/latest/numbers.html)). When `fmt` is provided it takes complete priority over the `decimal_places`, `max_decimal_places`, `leading`, and `separator` arguments — those arguments are silently ignored.
|
||||
|
||||
The `integer` and `multiplier` arguments **are** still applied to the number before the format string is used.
|
||||
|
||||
| Symbol | Meaning |
|
||||
| --- | --- |
|
||||
| `0` | Required digit — always rendered, even if zero |
|
||||
| `#` | Optional digit — suppressed when not significant |
|
||||
| `,` | Grouping separator (position defines group size) |
|
||||
| `.` | Decimal separator |
|
||||
|
||||
Common patterns:
|
||||
|
||||
| Pattern | Example output |
|
||||
| --- | --- |
|
||||
| `0` | `1235` |
|
||||
| `#,##0` | `1,235` |
|
||||
| `0.00` | `1234.57` |
|
||||
| `#,##0.00` | `1,234.57` |
|
||||
| `000` | `007` |
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
|
||||
<!-- Two decimal places, no grouping -->
|
||||
{% format_number 1234.5678 fmt='0.00' %}
|
||||
<!-- output: 1234.57 -->
|
||||
|
||||
<!-- Two decimal places with thousands separator -->
|
||||
{% format_number 1234.5678 fmt='#,##0.00' %}
|
||||
<!-- output: 1,234.57 -->
|
||||
|
||||
<!-- Same pattern, German locale: dot thousands, comma decimal -->
|
||||
{% format_number 1234.5678 fmt='#,##0.00' locale='de-de' %}
|
||||
<!-- output: 1.234,57 -->
|
||||
|
||||
<!-- Integer with thousands separator, large number -->
|
||||
{% format_number 9988776655.4321 fmt='#,##0' integer=True %}
|
||||
<!-- output: 9,988,776,655 -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
@@ -336,6 +407,25 @@ The helper function `format_number` allows for some common number formatting opt
|
||||
|
||||
For rendering date and datetime information, the following helper functions are available:
|
||||
|
||||
Both functions resolve their output using the following priority order:
|
||||
|
||||
1. **`fmt=` argument** — a [strftime format string](https://docs.python.org/3/library/datetime.html#format-codes). When provided, this takes full priority; `locale` and `date_format` are ignored.
|
||||
2. **`locale=` argument** — when no `fmt` is given, Babel formats the value using the style set by `date_format` (default `medium`).
|
||||
3. **Server `LANGUAGE_CODE`** — used as the locale when no `locale=` argument is supplied.
|
||||
|
||||
#### Date Format Styles
|
||||
|
||||
The `date_format` argument controls how Babel renders the date when locale-aware formatting is used. The four named styles are:
|
||||
|
||||
| Style | `format_date` example (en-us, 2025-01-12) | `format_datetime` example (en-us, 2025-01-12 14:30) |
|
||||
| --- | --- | --- |
|
||||
| `full` | `Sunday, January 12, 2025` | `Sunday, January 12, 2025 at 2:30:00 PM UTC` |
|
||||
| `long` | `January 12, 2025` | `January 12, 2025 at 2:30:00 PM UTC` |
|
||||
| `medium` *(default)* | `Jan 12, 2025` | `Jan 12, 2025, 2:30:00 PM` |
|
||||
| `short` | `1/12/25` | `1/12/25, 2:30 PM` |
|
||||
|
||||
The exact output varies by locale — the table above uses `en-us`.
|
||||
|
||||
### format_date
|
||||
|
||||
::: report.templatetags.report.format_date
|
||||
@@ -343,6 +433,35 @@ For rendering date and datetime information, the following helper functions are
|
||||
show_docstring_description: false
|
||||
show_source: False
|
||||
|
||||
#### Examples
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
|
||||
<!-- Default: medium style, locale from LANGUAGE_CODE -->
|
||||
{% format_date my_date %}
|
||||
<!-- output (en-us): Jan 12, 2025 -->
|
||||
|
||||
<!-- Explicit strftime format string — locale and date_format are ignored -->
|
||||
{% format_date my_date fmt="%d/%m/%Y" %}
|
||||
<!-- output: 12/01/2025 -->
|
||||
|
||||
<!-- Locale-aware, default medium style -->
|
||||
{% format_date my_date locale='en-us' %}
|
||||
<!-- output: Jan 12, 2025 -->
|
||||
|
||||
<!-- Short style -->
|
||||
{% format_date my_date locale='en-us' date_format='short' %}
|
||||
<!-- output: 1/12/25 -->
|
||||
|
||||
<!-- Full style -->
|
||||
{% format_date my_date locale='en-us' date_format='full' %}
|
||||
<!-- output: Sunday, January 12, 2025 -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
### format_datetime
|
||||
|
||||
::: report.templatetags.report.format_datetime
|
||||
@@ -350,20 +469,31 @@ For rendering date and datetime information, the following helper functions are
|
||||
show_docstring_description: false
|
||||
show_source: False
|
||||
|
||||
### Date Formatting
|
||||
|
||||
If not specified, these methods return a result which uses ISO formatting. Refer to the [datetime format codes](https://docs.python.org/3/library/datetime.html#format-codes) for more information! |
|
||||
|
||||
|
||||
### Example
|
||||
|
||||
A simple example of using the date formatting helper functions:
|
||||
#### Examples
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
Date: {% format_date my_date timezone="Australia/Sydney" %}
|
||||
Datetime: {% format_datetime my_datetime format="%d-%m-%Y %H:%M%S" %}
|
||||
|
||||
<!-- Default: medium style, locale from LANGUAGE_CODE -->
|
||||
{% format_datetime my_datetime %}
|
||||
<!-- output (en-us): Jan 12, 2025, 2:30:00 PM -->
|
||||
|
||||
<!-- Explicit strftime format — locale and date_format are ignored -->
|
||||
{% format_datetime my_datetime fmt="%d-%m-%Y %H:%M" %}
|
||||
<!-- output: 12-01-2025 14:30 -->
|
||||
|
||||
<!-- Locale-aware, default medium style -->
|
||||
{% format_datetime my_datetime locale='en-us' %}
|
||||
<!-- output: Jan 12, 2025, 2:30:00 PM -->
|
||||
|
||||
<!-- Short style -->
|
||||
{% format_datetime my_datetime locale='de-de' date_format='short' %}
|
||||
<!-- output: 12.01.25, 14:30 -->
|
||||
|
||||
<!-- Convert to a specific timezone before formatting -->
|
||||
{% format_datetime my_datetime timezone="Australia/Sydney" locale='en-au' %}
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
@@ -373,11 +503,115 @@ Datetime: {% format_datetime my_datetime format="%d-%m-%Y %H:%M%S" %}
|
||||
|
||||
The helper function `render_currency` allows for simple rendering of currency data. This function can also convert the specified amount of currency into a different target currency:
|
||||
|
||||
::: InvenTree.helpers_model.render_currency
|
||||
::: report.templatetags.report.render_currency
|
||||
options:
|
||||
show_docstring_description: false
|
||||
show_source: False
|
||||
|
||||
#### Decimal Places
|
||||
|
||||
When no decimal place arguments are provided, the locale/currency standard is used (e.g. 2 places for USD, 0 for JPY).
|
||||
|
||||
`decimal_places` and `max_decimal_places` work the same way as in [`format_number`](#format_number):
|
||||
|
||||
| Argument | Effect |
|
||||
| --- | --- |
|
||||
| `decimal_places=N` | Forces exactly N decimal digits (zero-padded) |
|
||||
| `max_decimal_places=M` | Allows up to M decimal digits, suppressing trailing zeros beyond `decimal_places` |
|
||||
| Both set | Forced minimum of `decimal_places`, optional up to `max_decimal_places` |
|
||||
| Neither set | Locale/currency default (e.g. 2 for USD) |
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
|
||||
<!-- locale default for USD: 2 decimal places -->
|
||||
{% render_currency order.total_price currency='USD' %}
|
||||
<!-- output: $1,234.56 -->
|
||||
|
||||
<!-- force 3 decimal places -->
|
||||
{% render_currency order.total_price currency='USD' decimal_places=3 %}
|
||||
<!-- output: $1,234.560 -->
|
||||
|
||||
<!-- at least 2, up to 4 — trailing zeros beyond the value are suppressed -->
|
||||
{% render_currency order.total_price currency='USD' decimal_places=2 max_decimal_places=4 %}
|
||||
<!-- output: $1,234.5600 or $1,234.56 depending on the value -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
#### Locale and Symbol Rendering
|
||||
|
||||
The locale controls how the currency symbol and separators are rendered. For example, `USD 1234.56` with various locales:
|
||||
|
||||
| Locale | Output |
|
||||
| --- | --- |
|
||||
| `en-us` | `$1,234.56` |
|
||||
| `en-gb` | `US$1,234.56` |
|
||||
| `en-au` | `USD1,234.56` |
|
||||
| `de-de` | `1.234,56 $` |
|
||||
|
||||
The locale is resolved in the following priority order:
|
||||
|
||||
1. **Explicit `locale=` argument** — highest priority, always wins
|
||||
2. **Server `LANGUAGE_CODE`** — fallback
|
||||
|
||||
#### Leading Digits
|
||||
|
||||
The `leading` argument specifies the minimum number of digits to render before the decimal point (zero-padded). This works identically to `leading` in [`format_number`](#format_number):
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
|
||||
<!-- default: no padding -->
|
||||
{% render_currency order.total_price currency='USD' %}
|
||||
<!-- output: $1.23 -->
|
||||
|
||||
<!-- force at least 4 integer digits -->
|
||||
{% render_currency order.total_price currency='USD' leading=4 %}
|
||||
<!-- output: $0,001.23 -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
#### Custom Format Strings
|
||||
|
||||
The `fmt` argument accepts a [Unicode number pattern](https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns) string (same syntax as [`format_number`](#custom-format-strings)). **When `fmt` is provided, it takes complete priority over `decimal_places`, `max_decimal_places`, and `leading`** — those arguments are ignored.
|
||||
|
||||
The `locale`, `currency`, `multiplier`, and `include_symbol` arguments are still applied when `fmt` is set.
|
||||
|
||||
To include the currency symbol in a `fmt` pattern, use the `¤` placeholder. Without it, no symbol appears regardless of `include_symbol`.
|
||||
|
||||
| Pattern | Example output (en-us, USD) |
|
||||
| --- | --- |
|
||||
| `#,##0.00` | `1,234.56` (no symbol) |
|
||||
| `¤#,##0.00` | `$1,234.56` |
|
||||
| `¤#,##0.0000` | `$1,234.5600` |
|
||||
| `¤ #,##0.00` | `$ 1,234.56` |
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
{% load report %}
|
||||
|
||||
<!-- No symbol (no ¤ in pattern) -->
|
||||
{% render_currency order.total_price currency='USD' fmt='#,##0.00' %}
|
||||
<!-- output: 1,234.56 -->
|
||||
|
||||
<!-- Symbol via ¤ placeholder -->
|
||||
{% render_currency order.total_price currency='USD' fmt='¤#,##0.0000' locale='en-us' %}
|
||||
<!-- output: $1,234.5600 -->
|
||||
|
||||
<!-- fmt + locale: de-de separators -->
|
||||
{% render_currency order.total_price currency='USD' fmt='#,##0.00' locale='de-de' %}
|
||||
<!-- output: 1.234,56 -->
|
||||
|
||||
<!-- fmt takes priority — decimal_places=2 is ignored -->
|
||||
{% render_currency order.total_price currency='USD' fmt='0.0000' decimal_places=2 %}
|
||||
<!-- output: 1234.5600 -->
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
#### Example
|
||||
|
||||
@@ -392,8 +626,12 @@ The helper function `render_currency` allows for simple rendering of currency da
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- Force 2 decimal places, convert to NZD -->
|
||||
Total Price: {% render_currency order.total_price currency='NZD' decimal_places=2 %}
|
||||
|
||||
<!-- US-style symbol, regardless of server locale -->
|
||||
Total Price: {% render_currency order.total_price currency='USD' locale='en-us' %}
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
@@ -669,7 +907,7 @@ If you have a custom logo, but explicitly wish to load the InvenTree logo itself
|
||||
|
||||
## Report Assets
|
||||
|
||||
[Report Assets](./index.md#report-assets) are files specifically uploaded by the user for inclusion in generated reports and labels.
|
||||
[Report Assets](./assets.md) are files specifically uploaded by the user for inclusion in generated reports and labels.
|
||||
|
||||
You can add asset images to the reports and labels by using the `{% raw %}{% asset ... %}{% endraw %}` template tag:
|
||||
|
||||
|
||||
+63
-78
@@ -53,37 +53,64 @@ To read more about the capabilities of the report templating engine, and how to
|
||||
|
||||
## Creating Templates
|
||||
|
||||
Report and label templates can be created (and edited) via the [admin interface](../settings/admin.md), under the *Report* section.
|
||||
Report and label templates are managed from the [Admin Center](../settings/admin.md#admin-center), which provides dedicated panels (under the *Reporting* group) for each template type:
|
||||
|
||||
Select the type of template you are wanting to create (a *Report Template* or *Label Template*) and press the *Add* button in the top right corner:
|
||||
- **Label Templates** - Create and edit [label templates](./labels.md)
|
||||
- **Report Templates** - Create and edit [report templates](./report.md)
|
||||
- **Report Snippets** - Manage reusable [snippet](#report-snippets) files
|
||||
- **Report Assets** - Manage uploaded [asset](#report-assets) files
|
||||
|
||||
{{ image("report/report_template_admin.png", "Report template admin") }}
|
||||
Label and report templates are created and edited using the built-in [template editor](./template_editor.md), which allows templates to be written directly within the browser, with a live preview of the rendered output.
|
||||
|
||||
!!! tip "Staff Access Only"
|
||||
Only users with staff access can upload or edit report template files.
|
||||
Only users with staff access can create, upload or edit templates, snippets and assets.
|
||||
|
||||
!!! info "Editing Reports"
|
||||
Existing reports can be edited from the admin interface, in the same location as described above. To change the contents of the template, re-upload a template file, to override the existing template data.
|
||||
|
||||
!!! tip "Template Editor"
|
||||
InvenTree also provides a powerful [template editor](./template_editor.md) which allows for the creation and editing of report templates directly within the browser.
|
||||
!!! info "Database Admin Interface"
|
||||
Templates can also be managed at a lower level via the [Database Admin interface](../settings/db_admin.md), under the *Report* section. This is recommended for advanced users only.
|
||||
|
||||
### Name and Description
|
||||
|
||||
Each report template requires a name and description, which identify and describe the report template.
|
||||
|
||||
### Revision
|
||||
|
||||
Each template has a revision number, which is automatically incremented each time the template is updated. This provides a simple mechanism for tracking changes to a template over time. The revision number is read-only, and cannot be edited directly.
|
||||
|
||||
!!! info "Template Revision Context"
|
||||
The revision number of the template is made available when rendering, via the `template_revision` [context variable](./context_variables.md#global-context).
|
||||
|
||||
### Enabled Status
|
||||
|
||||
Boolean field which determines if the specific report template is enabled, and available for use. Reports can be disabled to remove them from the list of available templates, but without deleting them from the database.
|
||||
|
||||
### Attach to Model
|
||||
|
||||
If the *Attach to Model on Print* option is enabled, a copy of the generated report is automatically saved as a file attachment against the item (model instance) for which it was generated, each time the template is printed.
|
||||
|
||||
!!! warning "Attachment Support"
|
||||
The report output is only attached if the target model type supports file attachments.
|
||||
|
||||
### Filename Pattern
|
||||
|
||||
The filename pattern used to generate the output `.pdf` file. Defaults to "report.pdf".
|
||||
|
||||
The filename pattern allows custom rendering with any context variables which are available to the report. For example, a test report for a particular [Stock Item](../stock/index.md#stock-item) can use the part name and serial number of the stock item when generating the report name:
|
||||
The filename pattern is rendered using the same Django template syntax (`{% raw %}{{ ... }}{% endraw %}`) as the report body, using the same context data - see the [context variables](./context_variables.md) and [model context](./model_context.md) documentation for the full list of variables available to a particular template type.
|
||||
|
||||
!!! info "Filename Pattern Context"
|
||||
The filename pattern has access to the *entire* context available to the report or label being generated - not a reduced subset.
|
||||
|
||||
For example, a test report for a particular [Stock Item](../stock/index.md#stock-item) can use the part name and serial number of the stock item when generating the report name:
|
||||
|
||||
{{ image("report/filename_pattern.png", "Report filename pattern") }}
|
||||
|
||||
Some further examples:
|
||||
|
||||
| Filename Pattern | Description |
|
||||
| --- | --- |
|
||||
| `{% raw %}{{ part.full_name }}-{{ serial }}.pdf{% endraw %}` | Combines the [Part](./model_context.md#part) name with the stock item serial number |
|
||||
| `{% raw %}PurchaseOrder-{{ reference }}.pdf{% endraw %}` | Uses the purchase order reference (this is the default pattern for the built-in Purchase Order report) |
|
||||
| `{% raw %}SalesOrder-{{ reference }}-{{ date }}.pdf{% endraw %}` | Combines the sales order reference with the current date |
|
||||
|
||||
|
||||
### Template Filters
|
||||
|
||||
@@ -147,86 +174,44 @@ Setting the *Debug Mode* option renders the template as raw HTML instead of PDF,
|
||||
|
||||
## Report Assets
|
||||
|
||||
User can upload asset files (e.g. images) which can be used when generating reports. For example, you may wish to generate a report with your company logo in the header. Asset files are uploaded via the admin interface.
|
||||
|
||||
Asset files can be rendered directly into the template as follows
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
<!-- Need to include the report template tags at the start of the template file -->
|
||||
{% load report %}
|
||||
|
||||
<!-- Simple stylesheet -->
|
||||
<head>
|
||||
<style>
|
||||
.company-logo {
|
||||
height: 50px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Report template code here -->
|
||||
|
||||
<!-- Render an uploaded asset image -->
|
||||
<img src="{% asset 'company_image.png' %}" class="company-logo">
|
||||
|
||||
<!-- ... -->
|
||||
</body>
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
!!! warning "Asset Naming"
|
||||
If the requested asset name does not match the name of an uploaded asset, the template will continue without loading the image.
|
||||
|
||||
!!! info "Assets location"
|
||||
Upload new assets via the [admin interface](../settings/admin.md) to ensure they are uploaded to the correct location on the server.
|
||||
User can upload asset files (e.g. images) which can be used when generating reports. For example, you may wish to generate a report with your company logo in the header.
|
||||
|
||||
Refer to the [report assets](./assets.md) documentation for further information.
|
||||
|
||||
## Report Snippets
|
||||
|
||||
A powerful feature provided by the django / WeasyPrint templating framework is the ability to include external template files. This allows commonly used template features to be broken out into separate files and reused across multiple templates.
|
||||
InvenTree provides report "snippets" - reusable template files which cannot be rendered by themselves, but can be included in other templates.
|
||||
|
||||
To support this, InvenTree provides report "snippets" - short (or not so short) template files which cannot be rendered by themselves, but can be called from other templates.
|
||||
Refer to the [report snippets](./snippets.md) documentation for further information.
|
||||
|
||||
Similar to assets files, snippet template files are uploaded via the admin interface.
|
||||
## Security
|
||||
|
||||
Snippets are included in a template as follows:
|
||||
Report templates are powerful by design — they have access to the full Django template language and to model data across the InvenTree database. For this reason, **template upload is restricted to staff users only**.
|
||||
|
||||
```
|
||||
{% raw %}{% include 'snippets/<snippet_name.html>' %}{% endraw %}
|
||||
```
|
||||
### URL Fetching
|
||||
|
||||
For example, consider a custom stocktake report for a particular stock location, where we wish to render a table with a row for each item in that location.
|
||||
When WeasyPrint renders a template to PDF it can make outbound requests to load images, stylesheets, and fonts referenced in the HTML. InvenTree restricts this through a custom URL fetcher with the following rules:
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
| URL Type | Behavior |
|
||||
|---|---|
|
||||
| `data:` URIs | Always permitted — self-contained, no network access |
|
||||
| `file://` | Always blocked — assets and images must be inlined as `data:` URIs before reaching WeasyPrint |
|
||||
| `http` / `https` | Disabled by default, but can be enabled - see *Remote URL Fetching* below |
|
||||
| Any other scheme | Always blocked |
|
||||
|
||||
<table class='stock-table'>
|
||||
<thead>
|
||||
<!-- table header data -->
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in location.stock_items %}
|
||||
{% include 'snippets/stock_row.html' with item=item %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
HTTP redirects are also disabled: a URL that passes validation cannot redirect to an internal address.
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
### Remote URL Fetching
|
||||
|
||||
!!! info "Snippet Arguments"
|
||||
Note above that named argument variables can be passed through to the snippet!
|
||||
The **Report URL Fetching** system setting (`REPORT_FETCH_URLS`) controls whether `http://` and `https://` URLs in templates are permitted. It defaults to **disabled**.
|
||||
|
||||
And the snippet file `stock_row.html` may be written as follows:
|
||||
When enabled, URLs are still validated against private, loopback, link-local, and reserved IP ranges before the request is made, preventing templates from being used as a vector for [Server-Side Request Forgery (SSRF)](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery) attacks against internal network services.
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
<!-- stock_row snippet -->
|
||||
<tr>
|
||||
<td>{{ item.part.full_name }}</td>
|
||||
<td>{{ item.quantity }}</td>
|
||||
</tr>
|
||||
{% endraw %}
|
||||
```
|
||||
!!! warning "Enable with care"
|
||||
Enabling remote URL fetching allows report templates to trigger outbound HTTP requests from the InvenTree server. Only enable this if your templates genuinely require it, and ensure that templates are reviewed before deployment.
|
||||
|
||||
### Asset Files
|
||||
|
||||
[Asset files](./assets.md) uploaded through the admin interface are embedded directly into the rendered PDF as base64 `data:` URIs — they are read via the Django storage API and never loaded through WeasyPrint's URL fetcher. This means assets work correctly regardless of whether remote URL fetching is enabled, and also work with remote storage backends such as S3.
|
||||
|
||||
There are various [helper functions](./helpers.md#report-assets) available to assist with embedding assets into templates.
|
||||
|
||||
@@ -128,6 +128,25 @@ As an example, consider a label template for a StockItem. A user may wish to def
|
||||
|
||||
To restrict the label accordingly, we could set the *filters* value to `part__IPN=IPN123`.
|
||||
|
||||
## Printing Labels
|
||||
|
||||
Labels are printed directly from the web interface, from the pages where the target items are displayed. To print labels against one or more items:
|
||||
|
||||
1. Select the items to print - either from a table (using the row checkboxes), or by viewing the detail page of a single item
|
||||
2. Select the *Print* action, and choose the *Print Label* option
|
||||
3. Select the desired label template - only *enabled* templates which match the selected model type (and pass any template filters) are available for selection
|
||||
4. Select the *printer* (plugin) to use for printing the labels
|
||||
|
||||
### Label Printing Plugins
|
||||
|
||||
The actual printing of labels is handled by a [label printing plugin](../plugins/mixins/label.md). InvenTree provides a number of built-in printing plugins:
|
||||
|
||||
- The default [InvenTree Label Printer](../plugins/builtin/inventree_label.md) plugin generates a PDF file, which is then made available for download.
|
||||
- The [Label Sheet](../plugins/builtin/inventree_label_sheet.md) plugin arranges multiple labels onto a single sheet for printing.
|
||||
- The [Label Machine](../plugins/builtin/inventree_label_machine.md) plugin sends the label to an external [label printer machine](../plugins/machines/label_printer.md).
|
||||
|
||||
Custom label printing plugins (e.g. for driving a specific hardware printer) can be installed to extend this list - refer to the [label mixin documentation](../plugins/mixins/label.md) for further information.
|
||||
|
||||
## Built-In Templates
|
||||
|
||||
The InvenTree installation provides a number of simple *default* templates which can be used as a starting point for creating custom labels. These built-in templates can be disabled if they are not required.
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Model Context
|
||||
---
|
||||
|
||||
## Model Context Variables
|
||||
|
||||
Each [report context](./context_variables.md) exposes one or more underlying model instances to the template (e.g. `order`, `part`, `item`). In addition to the explicit context variables documented on that page, templates can access any field or property of these model instances directly.
|
||||
|
||||
This page documents, for each reportable model type, the available:
|
||||
|
||||
- **Fields**: Database fields defined on the model (including those inherited from mixins / abstract base classes)
|
||||
- **Properties**: `@property` attributes which have been explicitly marked with the `@report_attribute` decorator, making them discoverable here
|
||||
|
||||
Not every attribute or method available on a model instance is listed here - only database fields, and properties explicitly marked for discovery. For a full list of attributes and methods, refer to the source code for the particular model type.
|
||||
|
||||
{{ reportable_model_context() }}
|
||||
|
||||
## Related Model Types
|
||||
|
||||
Some *related* model types are not themselves directly reportable, but are referenced by a field or `@report_attribute` property on a reportable model (e.g. `PartCategory` via `part.category`, `SupplierPart` via `part.default_supplier` or `stockitem.supplier_part`).
|
||||
|
||||
These are discovered automatically - there is no manually-maintained list of related models here. If a reportable model gains a new field or `@report_attribute` property pointing at another model, that model will automatically appear in this section.
|
||||
|
||||
{{ related_model_context() }}
|
||||
+26
-28
@@ -1,53 +1,51 @@
|
||||
---
|
||||
title: Report and LabelGeneration
|
||||
title: Report Templates
|
||||
---
|
||||
|
||||
## Custom Reports
|
||||
## Report Templates
|
||||
|
||||
InvenTree supports a customizable reporting ecosystem, allowing the user to develop document templates that meet their particular needs.
|
||||
Report templates are used to generate formal PDF documents - such as order reports, packing lists, or test reports - rendered against a particular database item (or list of items).
|
||||
|
||||
PDF files are generated from custom HTML template files which are written by the user.
|
||||
Like all InvenTree templates, report templates are written using a mixture of HTML / CSS and the django template language, and are rendered to a PDF file using the WeasyPrint engine:
|
||||
|
||||
Templates can be used to generate *reports* or *labels* which can be used in a variety of situations to format data in a friendly format for printing, distribution, conformance and testing.
|
||||
- Refer to the [template overview](./index.md) for information on creating and managing templates.
|
||||
- Refer to the [template rendering documentation](./weasyprint.md) for information on the WeasyPrint engine and the django template language.
|
||||
- Refer to the [context variables documentation](./context_variables.md) for the variables available when rendering a template.
|
||||
|
||||
In addition to providing the ability for end-users to provide their own reporting templates, some report types offer "built-in" report templates ready for use.
|
||||
## Report Options
|
||||
|
||||
### WeasyPrint Templates
|
||||
In addition to the [options common to all templates](./index.md#creating-templates), each report template provides the following options:
|
||||
|
||||
InvenTree report templates utilize the powerful [WeasyPrint](https://weasyprint.org/) PDF generation engine.
|
||||
### Page Size
|
||||
|
||||
!!! info "WeasyPrint"
|
||||
WeasyPrint is an extremely powerful and flexible reporting library. Refer to the [WeasyPrint docs](https://doc.courtbouillon.org/weasyprint/stable/) for further information.
|
||||
The page size (e.g. `A4` or `Letter`) used when rendering the report to a PDF file. When a new report template is created, this value defaults to the [default page size](./index.md#default-page-size) specified in the global settings.
|
||||
|
||||
### Stylesheets
|
||||
### Landscape
|
||||
|
||||
Templates are rendered using standard HTML / CSS - if you are familiar with web page layout, you're ready to go!
|
||||
If enabled, the report is rendered in landscape orientation, rather than the default portrait orientation.
|
||||
|
||||
### Template Language
|
||||
### Merge
|
||||
|
||||
Uploaded report template files are passed through the [django template rendering framework]({% include "django.html" %}/topics/templates/), and as such accept the same variable template strings as any other django template file. Different variables are passed to the report template (based on the context of the report) and can be used to customize the contents of the generated PDF.
|
||||
If enabled, a single report document is generated for all selected items, rather than a separate document for each item. Refer to the [merging reports](#merging-reports) section below for further information.
|
||||
|
||||
### Variables
|
||||
!!! info "Context Variables"
|
||||
The `page_size`, `landscape` and `merge` values are also made available to the template as [context variables](./context_variables.md#report-context).
|
||||
|
||||
Each report template is provided a set of *context variables* which can be used when rendering the template.
|
||||
## Generating Reports
|
||||
|
||||
For example, rendering the name of a part (which is available in the particular template context as `part`) is as follows:
|
||||
Reports are generated directly from the web interface, from the pages where the target items are displayed. To generate a report against one or more items:
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
1. Select the items to print - either from a table (using the row checkboxes), or by viewing the detail page of a single item
|
||||
2. Select the *Print* action, and choose the *Print Report* option
|
||||
3. Select the desired report template - only *enabled* templates which match the selected model type (and pass any [template filters](./index.md#template-filters)) are available for selection
|
||||
4. The report is generated by the server, and the resulting PDF file is made available for download
|
||||
|
||||
<!-- Template variables use {{ double_curly_braces }} -->
|
||||
<h2>Part: {{ part.name }}</h3>
|
||||
<p><i>
|
||||
Description:<br>
|
||||
{{ part.description }}
|
||||
</p></i>
|
||||
{% endraw %}
|
||||
```
|
||||
!!! info "Enable Reports"
|
||||
Report generation must be [enabled in the global settings](./index.md#enable-reports) before reports can be generated.
|
||||
|
||||
## Merging Reports
|
||||
|
||||
When rendering reports for multiple items, the default behaviour is that each item is rendered as a separate report. The chosen templeate is rendered multiple times, once for each item selected, and expects a single item in the context variable.
|
||||
When rendering reports for multiple items, the default behaviour is that each item is rendered as a separate report. The chosen template is rendered multiple times, once for each item selected, and expects a single item in the context variable.
|
||||
|
||||
However, it is possible to merge multiple items into a single report document. This is achieved by enabling the `merge` attribute of the report template:
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ The following report templates are provided "out of the box" and can be used as
|
||||
| [Sales Order Shipment](#sales-order-shipment) | [SalesOrderShipment](../sales/sales_order.md) | Sales Order Shipment report |
|
||||
| [Stock Location](#stock-location) | [StockLocation](../stock/index.md#stock-location) | Stock Location report |
|
||||
| [Test Report](#test-report) | [StockItem](../stock/index.md#stock-item) | Test Report |
|
||||
| [Transfer Order](#transfer-order) | [TransferOrder](../stock/transfer_order.md) | Transfer Order report |
|
||||
| [Selected Stock Items Report](#selected-stock-items-report) | [StockItem](../stock/index.md#stock-item) | Selected Stock Items report |
|
||||
|
||||
|
||||
@@ -57,6 +58,10 @@ The following report templates are provided "out of the box" and can be used as
|
||||
|
||||
{{ templatefile("report/inventree_test_report.html") }}
|
||||
|
||||
### Transfer Order
|
||||
|
||||
{{ templatefile("report/inventree_transfer_order_report.html") }}
|
||||
|
||||
### Selected Stock Items Report
|
||||
|
||||
{{ templatefile("report/inventree_stock_report_merge.html") }}
|
||||
@@ -68,9 +73,11 @@ The following label templates are provided "out of the box" and can be used as a
|
||||
| Template | Model Type | Description |
|
||||
| --- | --- | --- |
|
||||
| [Build Line](#build-line-label) | [Build line item](../manufacturing/build.md) | Build Line label |
|
||||
| [Part](#part-label) | [Part](../part/index.md) | Part label |
|
||||
| [Part](#part-label) | [Part](../part/index.md) | Part label (QR code and part name) |
|
||||
| [Part (Code128)](#part-label-code128) | [Part](../part/index.md) | Part label (Code128 barcode) |
|
||||
| [Stock Item](#stock-item-label) | [StockItem](../stock/index.md#stock-item) | Stock Item label |
|
||||
| [Stock Location](#stock-location-label) | [StockLocation](../stock/index.md#stock-location) | Stock Location label |
|
||||
| [Stock Location](#stock-location-label) | [StockLocation](../stock/index.md#stock-location) | Stock Location label (QR code) |
|
||||
| [Stock Location (with text)](#stock-location-label-with-text) | [StockLocation](../stock/index.md#stock-location) | Stock Location label (QR code and location details) |
|
||||
|
||||
### Build Line Label
|
||||
|
||||
@@ -78,6 +85,10 @@ The following label templates are provided "out of the box" and can be used as a
|
||||
|
||||
### Part Label
|
||||
|
||||
{{ templatefile("label/part_label.html") }}
|
||||
|
||||
### Part Label (Code128)
|
||||
|
||||
{{ templatefile("label/part_label_code128.html") }}
|
||||
|
||||
### Stock Item Label
|
||||
@@ -86,4 +97,8 @@ The following label templates are provided "out of the box" and can be used as a
|
||||
|
||||
### Stock Location Label
|
||||
|
||||
{{ templatefile("label/stocklocation_qr.html") }}
|
||||
|
||||
### Stock Location Label (with text)
|
||||
|
||||
{{ templatefile("label/stocklocation_qr_and_text.html") }}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Report Snippets
|
||||
---
|
||||
|
||||
## Report Snippets
|
||||
|
||||
A powerful feature provided by the django / WeasyPrint templating framework is the ability to include external template files. This allows commonly used template features to be broken out into separate files and reused across multiple templates.
|
||||
|
||||
To support this, InvenTree provides report "snippets" - short (or not so short) template files which cannot be rendered by themselves, but can be called from other templates.
|
||||
|
||||
Snippet files are managed from the [Admin Center](../settings/admin.md#admin-center), via the *Report Snippets* panel. Staff users can upload new snippet files, and edit or remove existing snippets.
|
||||
|
||||
Additionally, the content of an existing snippet can be modified directly within the browser - simply select a snippet from the table to open it in the built-in [template editor](./template_editor.md#editing-snippets).
|
||||
|
||||
Snippets are included in a template as follows:
|
||||
|
||||
```
|
||||
{% raw %}{% include 'snippets/<snippet_name.html>' %}{% endraw %}
|
||||
```
|
||||
|
||||
For example, consider a custom stocktake report for a particular stock location, where we wish to render a table with a row for each item in that location.
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
|
||||
<table class='stock-table'>
|
||||
<thead>
|
||||
<!-- table header data -->
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in location.stock_items %}
|
||||
{% include 'snippets/stock_row.html' with item=item %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
{% endraw %}
|
||||
```
|
||||
|
||||
!!! info "Snippet Arguments"
|
||||
Note above that named argument variables can be passed through to the snippet!
|
||||
|
||||
And the snippet file `stock_row.html` may be written as follows:
|
||||
|
||||
```html
|
||||
{% raw %}
|
||||
<!-- stock_row snippet -->
|
||||
<tr>
|
||||
<td>{{ item.part.full_name }}</td>
|
||||
<td>{{ item.quantity }}</td>
|
||||
</tr>
|
||||
{% endraw %}
|
||||
```
|
||||
@@ -4,11 +4,11 @@ title: Template editor
|
||||
|
||||
## Template editor
|
||||
|
||||
The Template Editor is integrated into the [Admin Center](../settings//admin.md#admin-center) of the Web UI. It allows users to create and edit label and report templates directly with a side by side preview for a more productive workflow.
|
||||
The Template Editor is integrated into the [Admin Center](../settings/admin.md#admin-center) of the Web UI. It allows users to create and edit label and report templates directly with a side by side preview for a more productive workflow.
|
||||
|
||||

|
||||
|
||||
On the left side (1) are all possible possible template types for labels and reports listed. With the "+" button (2), above the template table (3), new templates for the selected type can be created. To switch to the template editor click on a template.
|
||||
On the left side (1) are all possible template types for labels and reports listed. With the "+" button (2), above the template table (3), new templates for the selected type can be created. To switch to the template editor click on a template.
|
||||
|
||||
### Editing Templates
|
||||
|
||||
@@ -31,3 +31,10 @@ If you don't want to override the template, but just render a preview for a temp
|
||||
#### Edit template metadata
|
||||
|
||||
Editing metadata such as name, description, filters and even width/height for labels and orientation/page size for reports can be done from the edit modal accessible when clicking on the three dots (4) and select "Edit" in the dropdown menu.
|
||||
|
||||
### Editing Snippets
|
||||
|
||||
[Report snippets](./index.md#report-snippets) can also be edited directly within the browser, from the *Report Snippets* panel in the Admin Center. Selecting a snippet from the table opens it in the same code editor as used for report and label templates.
|
||||
|
||||
!!! info "No Preview"
|
||||
As snippets cannot be rendered by themselves (they must be included in a report or label template), no preview area is available when editing a snippet.
|
||||
|
||||
@@ -117,9 +117,88 @@ Return Order line items can be added while the [status](#return-order-status-cod
|
||||
!!! info "Serialized Stock Only"
|
||||
Only stock items which are serialized can be selected for return from the customer
|
||||
|
||||
!!! info "Discount"
|
||||
An optional [discount](../concepts/pricing.md#line-item-discount) percentage can be applied to each line item.
|
||||
|
||||
Each line item tracks a *Cost* (the cost associated with the return, repair, or replacement of the item) in addition to the quantity, [target date](#order-scheduling) and notes fields common to other order types. This cost is purely informational - it is not linked to any accounting or invoicing system.
|
||||
|
||||
#### Line Item Outcome
|
||||
|
||||
Each line item has an *Outcome*, which records the disposition decided for the returned item:
|
||||
|
||||
| Outcome | Description |
|
||||
| --- | --- |
|
||||
| Pending | No outcome has been decided yet (default value for a new line item) |
|
||||
| Return | The item is to be returned to the customer, with no further action |
|
||||
| Repair | The item is to be repaired, and returned to the customer |
|
||||
| Replace | The item is to be replaced with a new item |
|
||||
| Refund | The item cannot be repaired, and a refund is to be issued |
|
||||
| Reject | The return is rejected |
|
||||
|
||||
The *Outcome* is not available when a line item is first created - it can only be set afterwards, by editing the line item. Selecting an outcome is a manual, record-keeping step only: InvenTree does not automatically create a replacement order, issue a refund, or link to a [repair](../manufacturing/index.md) process based on the selected outcome. Any follow-up action (raising a new [Sales Order](./sales_order.md) for a replacement, processing a refund, or tracking a repair) must currently be actioned separately.
|
||||
|
||||
Return Order Line Item outcome supports [custom states](../concepts/custom_states.md).
|
||||
|
||||
### Extra Line Items
|
||||
|
||||
While [line items](#line-items) must reference a particular stock item, extra line items are available for any other itemized information that needs to be conveyed with the order.
|
||||
While [line items](#line-items) must reference a particular stock item, extra line items are available for any other itemized information that needs to be conveyed with the order - for example freight charges or service fees. Extra line items support an optional [discount](../concepts/pricing.md#line-item-discount) percentage, the same as regular line items.
|
||||
|
||||
## Issue Order
|
||||
|
||||
Once all line items have been added, click on the {{ icon("send", title="Issue") }} button on the main return order detail panel and confirm the order has been issued to the customer. This moves the order into the *In Progress* state, and allows [line items to be received](#receive-line-items).
|
||||
|
||||
## Receive Line Items
|
||||
|
||||
As returned items arrive from the customer, they can be marked as "received" against the return order. This is the point at which the return order actually affects stock.
|
||||
|
||||
To receive one or more line items:
|
||||
|
||||
* either individually: click on the {{ icon("square-arrow-right") }} *Receive Item* button on the row for a specific line item
|
||||
* or in bulk: select multiple unreceived rows in the line item table, then click on the {{ icon("square-arrow-right") }} *Receive selected items* button above the table
|
||||
|
||||
!!! note "Permissions"
|
||||
Marking line items as received requires the "Return order" ADD permission.
|
||||
|
||||
!!! note "Order Status"
|
||||
Line items can only be received while the order [status](#return-order-status-codes) is *In Progress*.
|
||||
|
||||
In the "Receive Items" form, a destination *Location* must be selected - this is where the returned stock will be placed. An optional per-item *Status* can also be set for each item being received (for example, to mark an item as damaged or destroyed on arrival); if left unset, received items default to a *Quarantined* stock status, since they have not yet been inspected.
|
||||
|
||||
Receiving a line item performs the following actions on the underlying stock item:
|
||||
|
||||
* Transfers the stock item to the selected destination location
|
||||
* Sets the stock item status (defaulting to *Quarantined*)
|
||||
* Removes the *Customer* reference from the stock item
|
||||
* Clears any outstanding sales order allocations against the stock item
|
||||
* Adds a tracking entry recording the return
|
||||
|
||||
!!! info "Partial Returns"
|
||||
If a customer returns less than the full quantity of a non-serialized stock item, InvenTree automatically splits the returned quantity into a new stock item, leaving the remainder of the original stock item untouched (e.g. still recorded as sold to the customer).
|
||||
|
||||
Once received, a line item's *Outcome* can be set - see [Line Item Outcome](#line-item-outcome) above.
|
||||
|
||||
## Complete Order
|
||||
|
||||
Once all returned items have been received and any outcomes have been actioned, click on the {{ icon("circle-check", color="green") }} button on the main return order detail panel and confirm the order as complete.
|
||||
|
||||
It is not necessary for every line item to be marked as *received* before an order can be completed - this allows an order to be closed out even if some items were never returned by the customer.
|
||||
|
||||
## Cancel Order
|
||||
|
||||
If the return will not be processed, the order can be cancelled instead. Click on the {{ icon("circle-x", color="red") }} *Cancel order* option under the {{ icon("tools") }} order actions menu, and confirm the return order has been cancelled.
|
||||
|
||||
## Hold Order
|
||||
|
||||
An open order (*Pending* or *In Progress*) can be placed *On Hold*, to indicate that it is temporarily paused without being cancelled. Click on the {{ icon("hand-stop", title="Hold") }} *Hold order* option under the {{ icon("tools") }} order actions menu to place the order on hold. A held order can subsequently be [issued](#issue-order) again to resume progress.
|
||||
|
||||
## Duplicate Return Order
|
||||
|
||||
Duplicating a Return Order allows the user to quickly create a new *copy* of an existing order, using the same customer information.
|
||||
|
||||
To duplicate an existing order, select the *Duplicate order* action from the menu in the top-right of the screen.
|
||||
|
||||
!!! info "Line Items Not Copied"
|
||||
Unlike Purchase Orders and Sales Orders, Return Order line items are *not* copied when duplicating an order - each line item is tied to a specific physical stock item being returned, so this information cannot be sensibly duplicated. Extra line items and parameters can optionally be copied.
|
||||
|
||||
## Return Order Reports
|
||||
|
||||
|
||||
@@ -90,6 +90,13 @@ Once the "Add Line Item" form opens, select a part in the list.
|
||||
|
||||
Fill out the rest of the form then click on <span class="badge inventree confirm">Submit</span>
|
||||
|
||||
!!! info "Discount"
|
||||
An optional [discount](../concepts/pricing.md#line-item-discount) percentage can be applied to each line item.
|
||||
|
||||
### Extra Line Items
|
||||
|
||||
While [line items](#add-line-items) must reference a particular part, extra line items are available for any other itemized information that needs to be conveyed with the order - for example freight charges or service fees. Extra line items support an optional [discount](../concepts/pricing.md#line-item-discount) percentage, the same as regular line items.
|
||||
|
||||
## Shipments
|
||||
|
||||
After all line items were added to the sales order, user needs to create one or more [shipments](#sales-order-shipments) in order to allocate stock for those parts.
|
||||
@@ -110,6 +117,79 @@ After shipments were created, user can either:
|
||||
|
||||
During the allocation process, user is required to select the desired shipment that will contain the stock items.
|
||||
|
||||
### Auto Allocate Stock
|
||||
|
||||
To speed up the allocation process, use the *Auto Allocate Stock* button ({{ icon("wand") }}) available in the *Line Items* tab. This automatically finds available stock and creates the required allocations with minimal user interaction.
|
||||
|
||||
!!! info "Background Task"
|
||||
Auto-allocation runs as a background task. The UI will display a progress indicator while the task is running.
|
||||
|
||||
#### Selecting Lines to Allocate
|
||||
|
||||
By default, auto-allocation processes **all unallocated line items** on the order. To restrict allocation to a subset of lines, select the desired rows in the *Line Items* table before pressing the button — the dialog will indicate how many lines are selected.
|
||||
|
||||
#### Auto Allocation Options
|
||||
|
||||
The auto-allocation dialog provides the following options:
|
||||
|
||||
**Source Location**
|
||||
|
||||
Restrict stock to a specific location (and all of its sub-locations). Leave blank to consider stock from any location.
|
||||
|
||||
**Exclude Location**
|
||||
|
||||
Exclude stock from a specific location (and all of its sub-locations). Useful for reserving stock in a particular area.
|
||||
|
||||
**Shipment**
|
||||
|
||||
Optionally assign all new allocations to a specific pending shipment. Only shipments that have not yet been completed are shown.
|
||||
|
||||
**Interchangeable Stock**
|
||||
|
||||
When enabled (default), stock may be drawn from multiple stock items or locations to fulfil a single line item. When disabled, a line item is only allocated if a single stock item can cover the entire remaining quantity.
|
||||
|
||||
!!! warning "Take Care"
|
||||
Enabling *Interchangeable Stock* means the auto-allocation routine will combine stock from different batches or locations. Review the resulting allocations if traceability is important.
|
||||
|
||||
**Stock Priority**
|
||||
|
||||
Controls the order in which matching stock items are consumed:
|
||||
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| Oldest stock first (FIFO) | Stock items updated least recently are consumed first *(default)* |
|
||||
| Newest stock first (LIFO) | Stock items updated most recently are consumed first |
|
||||
| Smallest quantity first | Stock items with the lowest available quantity are consumed first |
|
||||
| Largest quantity first | Stock items with the highest available quantity are consumed first |
|
||||
| Soonest expiry date first | Stock items expiring earliest are consumed first; items with no expiry date are used last |
|
||||
|
||||
**Serialized Stock**
|
||||
|
||||
Controls whether serialized stock items are included in the auto-allocation:
|
||||
|
||||
| Option | Description |
|
||||
| --- | --- |
|
||||
| Allow any stock | Both serialized and unserialized stock items are considered *(default)* |
|
||||
| Serialized stock only | Only stock items that carry a serial number are allocated |
|
||||
| Unserialized stock only | Only stock items without a serial number are allocated |
|
||||
|
||||
#### Allocation Behaviour
|
||||
|
||||
The auto-allocation routine performs the following steps for each eligible line item:
|
||||
|
||||
1. Skips line items for *virtual* parts.
|
||||
2. Skips line items that are already fully allocated.
|
||||
3. Queries available stock for the line's part, applying any location and serialized-stock filters.
|
||||
4. Sorts the candidates according to the chosen *Stock Priority*.
|
||||
5. Greedily allocates from each stock item in turn until the remaining quantity for the line is satisfied.
|
||||
|
||||
#### Removing Allocations
|
||||
|
||||
Individual or multiple allocations can be removed from the *Allocated Stock* tab. Select the allocations to remove and use the *Delete* action.
|
||||
|
||||
!!! warning "Shipped Allocations Protected"
|
||||
Allocations that belong to a completed (shipped) shipment cannot be deleted.
|
||||
|
||||
### Check Shipment
|
||||
|
||||
Shipments can be marked as "checked" to indicate that the items in the shipment has been verified. To mark a shipment as "checked", open the shipment actions menu, and select the "Check" action:
|
||||
|
||||
+10
-10
@@ -6,24 +6,24 @@ The InvenTree project is committed to providing a secure and safe environment fo
|
||||
|
||||
To that end, we have implemented a number of security measures over the years, which we will outline in this document.
|
||||
|
||||
## Organisational measures
|
||||
## Organizational Measures
|
||||
|
||||
The InvenTree project is managed by a small team of developers, who are responsible for the ongoing development and maintenance of the software. Two geographically distributed users have administrative access to the InvenTree codebase. Merges are only done by one of these two users, the maintainer Oliver.
|
||||
Read the Project [Governance](./project/governance.md) document for more information.
|
||||
|
||||
InvenTree is open-source, and we welcome contributions from the community. However, all contributions are reviewed and scrutinised before being merged into the codebase.
|
||||
InvenTree is open-source, and we welcome contributions from the community. However, all contributions are reviewed and scrutinized before being merged into the codebase.
|
||||
|
||||
### Security Policy
|
||||
|
||||
The official [Security Policy]({{ sourcefile("SECURITY.md") }}) is available in the code repository.
|
||||
We provide this document in our main repo to increase discoverabiltity to ensure that all security issues are handled in a timely manner.
|
||||
We provide this document in our main repo to increase discoverability to ensure that all security issues are handled in a timely manner.
|
||||
|
||||
### Past Reports
|
||||
If we become aware of a security issue, we will take immediate action to address the issue, and will provide a public disclosure of the issue once it has been resolved. We support assigning CVEs to security issues where appropriate. Our [past security advisories can be found here](https://github.com/inventree/InvenTree/security/advisories).
|
||||
|
||||
## Technical measures
|
||||
## Technical Measures
|
||||
|
||||
### Code hosting
|
||||
### Code Hosting
|
||||
|
||||
The InvenTree project is hosted on GitHub, and we rely on the security measures provided by GitHub to help protect the integrity of the codebase.
|
||||
|
||||
@@ -35,24 +35,24 @@ Among those are:
|
||||
- (Optional but encouraged) Two-factor authentication for user accounts
|
||||
- (Optional but encouraged) Signed commits / actions
|
||||
|
||||
### Code style
|
||||
### Code Style
|
||||
|
||||
We enforce style and security checks in our CI/CD pipeline, and we have several automated tests to ensure that the codebase is secure and functional.
|
||||
Checks are run on every pull request, and we require that all checks pass before a pull request can be merged.
|
||||
|
||||
### Current versions
|
||||
### Current Versions
|
||||
|
||||
InvenTree is built using the Django framework, which has a strong focus on security. We follow best practices for Django development, and we are committed to keeping the codebase up-to-date with the latest security patches and within supported versions.
|
||||
|
||||
### Test coverage
|
||||
### Test Coverage
|
||||
|
||||
We run coverage tests on our codebase to ensure that we have a high level of test coverage above 90%. This is public and can be found [here](https://app.codecov.io/gh/inventree/InvenTree).
|
||||
|
||||
### Pinning dependencies
|
||||
### Pinning Dependencies
|
||||
|
||||
We are pinning dependencies to specific versions - aiming for complete reproducibility of builds - wherever possible. Combined with continuous OSV checks, we are able to react quickly to security issues in our dependencies.
|
||||
|
||||
## Best practices
|
||||
## Best Practices
|
||||
|
||||
We follow most of GitHubs community best practices, check our compliance [here](https://github.com/inventree/InvenTree/community).
|
||||
|
||||
|
||||
@@ -16,4 +16,4 @@ To make MFA mandatory for all users:
|
||||
|
||||
### Security Consideration
|
||||
|
||||
A user can lock themselves out if they lose access to both the device with their TOTP app and their backup tokens. An admin can delete their tokens from the admin pages (they exist under the 'TOTP devices' / 'static devices' models) . This should be a last resort and only done by people knowledgeable about the [admin pages](../settings/admin.md) as changes there might circumvent InvenTree's business and security logic.
|
||||
A user can lock themselves out if they lose access to both the device with their TOTP app and their backup tokens. An admin can delete their tokens from the Database Admin interface (they exist under the 'TOTP devices' / 'static devices' models). This should be a last resort and only done by people knowledgeable about the [Database Admin interface](../settings/db_admin.md), as changes there might circumvent InvenTree's business and security logic.
|
||||
|
||||
@@ -18,7 +18,7 @@ The basic requirements for configuring SSO are outlined below:
|
||||
|
||||
1. Enable backend for each required SSO provider(s) in the [config file or environment variables](../start/config.md#single-sign-on).
|
||||
1. Create an external *app* with your provider of choice
|
||||
1. Add the required client configurations in the `SocialApp` app in the [admin interface](../settings/admin.md).
|
||||
1. Add the required client configurations in the `SocialApp` app in the [Database Admin interface](../settings/db_admin.md).
|
||||
1. Configure the *callback* URL for the external app.
|
||||
1. Enable SSO for the users in the [global settings](../settings/global.md).
|
||||
1. Configure [e-mail](../settings/email.md).
|
||||
@@ -161,4 +161,4 @@ Make sure all users with admin privileges have sufficient passwords - they can r
|
||||
|
||||
## Error Handling
|
||||
|
||||
If you encounter an error during the SSO process, the error should be logged in the InvenTree database. You can view the [error log](./logs.md) in the [admin interface](./admin.md) to see the details of the error.
|
||||
If you encounter an error during the SSO process, the error should be logged in the InvenTree database. You can view the [error log](./logs.md) in the [Admin Center](./admin.md#admin-center) to see the details of the error.
|
||||
|
||||
+18
-47
@@ -4,24 +4,23 @@ title: InvenTree Admin Interfaces
|
||||
|
||||
## InvenTree Admin Interfaces
|
||||
|
||||
There are multiple administration interfaces available in InvenTree, which provide different levels of access to the underlying resources and different operational safety.
|
||||
InvenTree provides multiple administration interfaces with different safety levels and intended use cases.
|
||||
|
||||
[**Admin Center**](#admin-center):
|
||||
|
||||
- Main interface for managing InvenTree
|
||||
- Robust verification and safety checks
|
||||
- Main administration interface for day-to-day operations
|
||||
- Uses API-backed flows with validation and safety checks
|
||||
|
||||
[**System Settings**](#system-settings):
|
||||
|
||||
- Access to all settings
|
||||
- Robust verification, requires reading the documentation
|
||||
- Access to global runtime settings
|
||||
- Available to staff users (or users with equivalent API scope)
|
||||
|
||||
[**Backend Admin Interface**](#backend-admin-interface):
|
||||
[**Database Admin Interface**](./db_admin.md):
|
||||
|
||||
- Low level access to the database
|
||||
- Few verification or safety checks
|
||||
- Requires knowledge of InvenTree internals
|
||||
- Recommended for advanced users only
|
||||
- Low-level database administration
|
||||
- Fewer safeguards than the Admin Center
|
||||
- Intended for advanced users and troubleshooting scenarios
|
||||
|
||||
### Admin Center
|
||||
|
||||
@@ -34,7 +33,13 @@ The Admin Center is the main interface for managing InvenTree. It provides a use
|
||||
- Integration with external services (via machines and plugins)
|
||||
- Reporting and statistics
|
||||
|
||||
It can be access via the *Admin Center* link in the top right user menu, the *Admin Center* quick-link in the command palette, or via the navigation menu.
|
||||
#### Access Admin Center
|
||||
|
||||
The Admin Center can be accessed in any of the following ways:
|
||||
|
||||
- User menu in the top-right corner: *Admin Center*
|
||||
- Command palette quick action: *Admin Center*
|
||||
- Direct URL: `/web/settings/admin`
|
||||
|
||||
#### Permissions
|
||||
|
||||
@@ -44,40 +49,6 @@ Some panes can only be accessed by users with specific permissions. For example,
|
||||
|
||||
The System Settings interface provides ordered access to all global settings in InvenTree. Users need to have _staff_ privileges enabled or the _a:staff_ scope.
|
||||
|
||||
### Backend Admin Interface
|
||||
### Database Admin Interface
|
||||
|
||||
Users which have *staff* privileges have access to an Admin interface which provides extremely low level control of the database. Every item in the database is available and this interface provides a unrestricted option for directly viewing and modifying database objects.
|
||||
|
||||
!!! warning "Caution"
|
||||
Admin users should exercise extreme care when modifying data via the admin interface, as performing the wrong action may have unintended consequences!
|
||||
|
||||
The admin interface allows *staff* users the ability to directly view / add / edit / delete database entries according to their [user permissions](./permissions.md).
|
||||
|
||||
#### Access Backend Admin Interface
|
||||
|
||||
To directly access the admin interface, append /admin/ to the InvenTree site URL - e.g. http://localhost:8000/admin/.
|
||||
|
||||
An administration panel will be presented as shown below:
|
||||
|
||||
{{ image("admin/admin.png", "Admin panel") }}
|
||||
|
||||
#### View Database Objects
|
||||
|
||||
Database objects can be listed and filtered directly. The image below shows an example of displaying existing part categories.
|
||||
|
||||
{{ image("admin/part_cats.png", "Part categories") }}
|
||||
|
||||
!!! info "Permissions"
|
||||
A "staff" account does not necessarily provide access to all administration options, depending on the roles assigned to the user.
|
||||
|
||||
##### Filtering
|
||||
|
||||
Some admin views support filtering of results against specified criteria. For example, the list of Part objects can be filtered as follows:
|
||||
|
||||
{{ image("admin/filter.png", "Filter part list") }}
|
||||
|
||||
#### Edit Database Objects
|
||||
|
||||
Individual database objects can be edited directly in the admin interface. The image below shows an example of editing a Part object:
|
||||
|
||||
{{ image("admin/edit_part.png", "Edit part") }}
|
||||
For low-level administration tasks, use the [Database Admin Interface](./db_admin.md).
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: InvenTree Database Admin Interface
|
||||
---
|
||||
|
||||
## Database Admin Interface
|
||||
|
||||
The Database Admin interface provides low-level access to InvenTree database objects.
|
||||
|
||||
!!! danger "Low-Level Interface"
|
||||
The Database Admin bypasses many of the application-level safety checks used in the Admin Center.
|
||||
Incorrect edits can create inconsistent data, break workflows, or expose security issues.
|
||||
Use this interface only if you understand the data model and operational impact.
|
||||
|
||||
!!! warning "Recommended Usage"
|
||||
Prefer the [Admin Center](./admin.md#admin-center) for routine administration.
|
||||
Use the Database Admin only for advanced administration and troubleshooting.
|
||||
|
||||
### Access Database Admin Interface
|
||||
|
||||
Access to the Database Admin requires a user account with *staff* privileges.
|
||||
|
||||
Use one of the following methods:
|
||||
|
||||
- Append `/admin/` to the base InvenTree URL (for example: `http://localhost:8000/admin/`)
|
||||
- Use the configured administrator URL from `INVENTREE_ADMIN_URL`
|
||||
|
||||
{{ image("admin/admin.png", "Database Admin panel") }}
|
||||
|
||||
### Permissions
|
||||
|
||||
A "staff" account does not necessarily provide access to all administration options, depending on the roles assigned to the user.
|
||||
|
||||
### View Database Objects
|
||||
|
||||
Database objects can be listed and filtered directly. The image below shows an example of displaying existing part categories.
|
||||
|
||||
{{ image("admin/part_cats.png", "Part categories") }}
|
||||
|
||||
#### Filtering
|
||||
|
||||
Some admin views support filtering of results against specified criteria. For example, the list of Part objects can be filtered as follows:
|
||||
|
||||
{{ image("admin/filter.png", "Filter part list") }}
|
||||
|
||||
### Edit Database Objects
|
||||
|
||||
Individual database objects can be edited directly in the Database Admin interface. The image below shows an example of editing a Part object:
|
||||
|
||||
{{ image("admin/edit_part.png", "Edit part") }}
|
||||
|
||||
!!! danger "Before You Save Changes"
|
||||
Verify your changes carefully before saving.
|
||||
If possible, test changes in a non-production environment first.
|
||||
Record what you changed so it can be reviewed and reverted if needed.
|
||||
@@ -33,6 +33,7 @@ Configuration of basic server settings:
|
||||
{{ globalsetting("DISPLAY_FULL_NAMES") }}
|
||||
{{ globalsetting("DISPLAY_PROFILE_INFO") }}
|
||||
{{ globalsetting("WEEK_STARTS_ON") }}
|
||||
{{ globalsetting("CALENDAR_HORIZON_MONTHS") }}
|
||||
{{ globalsetting("INVENTREE_UPLOAD_MAX_SIZE") }}
|
||||
{{ globalsetting("INVENTREE_STRICT_URLS") }}
|
||||
|
||||
@@ -143,6 +144,7 @@ Configuration of report generation:
|
||||
{{ globalsetting("REPORT_ENABLE") }}
|
||||
{{ globalsetting("REPORT_DEFAULT_PAGE_SIZE") }}
|
||||
{{ globalsetting("REPORT_DEBUG_MODE") }}
|
||||
{{ globalsetting("REPORT_FETCH_URLS") }}
|
||||
{{ globalsetting("REPORT_LOG_ERRORS") }}
|
||||
|
||||
### Label Printing
|
||||
@@ -224,6 +226,7 @@ Configuration of stock item options
|
||||
{{ globalsetting("STOCK_SHOW_INSTALLED_ITEMS") }}
|
||||
{{ globalsetting("STOCK_ENFORCE_BOM_INSTALLATION") }}
|
||||
{{ globalsetting("STOCK_ALLOW_OUT_OF_STOCK_TRANSFER") }}
|
||||
{{ globalsetting("STOCK_MERGE_ON_TRANSFER") }}
|
||||
{{ globalsetting("TEST_STATION_DATA") }}
|
||||
|
||||
### Build Orders
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
---
|
||||
title: Admin Shell
|
||||
title: Error Logs
|
||||
---
|
||||
|
||||
## Error Logs
|
||||
|
||||
Any critical server error logs are recorded to the database, and can be viewed by staff users using the admin interface.
|
||||
Any critical server error logs are recorded to the database, and can be viewed by staff users in the [Admin Center](./admin.md#admin-center), under the *Error Reports* section:
|
||||
|
||||
In the admin interface, select the "Errors" view:
|
||||
{{ image("admin/admin_errors_link.png", "Error Reports in the Admin Center") }}
|
||||
|
||||
{{ image("admin/admin_errors_link.png", "Admin errors") }}
|
||||
|
||||
!!! info "URL"
|
||||
Alternatively, navigate to the error list view at /admin/error_report/error/
|
||||
|
||||
A list of error logs is presented.
|
||||
A list of error logs is presented. Select an entry to view the full error details, including the traceback.
|
||||
|
||||
{{ image("admin/admin_errors.png", "Error logs") }}
|
||||
|
||||
!!! info "Database Admin Interface"
|
||||
Error logs can also be viewed via the [Database Admin interface](./db_admin.md), at the URL `/admin/error_report/error/`
|
||||
|
||||
!!! info "Deleting Logs"
|
||||
Error logs should be deleted periodically
|
||||
|
||||
@@ -7,7 +7,7 @@ title: User Permissions
|
||||
InvenTree provides access control to various features and data, by assigning each *user* to one (or more) *groups* which have multiple *roles* assigned.
|
||||
|
||||
!!! info "Superuser"
|
||||
The superuser account is afforded *all* permissions across an InvenTree installation. This includes the admin interface, web interface, and API.
|
||||
The superuser account is afforded *all* permissions across an InvenTree installation. This includes the [Database Admin interface](./db_admin.md), web interface, and API.
|
||||
|
||||
### User
|
||||
|
||||
@@ -54,7 +54,7 @@ Within each role, there are four levels of available permissions:
|
||||
## Dangerous User Flags
|
||||
|
||||
In addition to the above permissions, there are two special flags that can be assigned to a user:
|
||||
- **Staff** - A user with the *staff* flag is able to access the admin interface, and can trigger dangerous actions that might have a security impact such as changing parsable files on the server (templates / reports / plugins). Some of these actions require the *admin* role to be assigned as well.
|
||||
- **Staff** - A user with the *staff* flag is able to access the [Database Admin interface](./db_admin.md), and can trigger dangerous actions that might have a security impact such as changing parsable files on the server (templates / reports / plugins). Some of these actions require the *admin* role to be assigned as well.
|
||||
- **Superuser** - A user with the *superuser* flag is able to access and change all data and functions of InvenTree. A superuser can modify and access all data that the InvenTree installation / server has access to - including shell access on the server OS itself. This is a very powerful flag, and should be used with caution.
|
||||
|
||||
It is strongly recommended to register any users with staff / superuser flags with strong MFA methods to reduce the risk of unauthorized access. These accounts should be used with caution, and should not be used for day-to-day operations.
|
||||
@@ -62,11 +62,11 @@ It is strongly recommended to register any users with staff / superuser flags wi
|
||||
Practicing account tiering is strongly recommended.
|
||||
|
||||
|
||||
## Admin Interface Permissions
|
||||
## Database Admin Permissions
|
||||
|
||||
If a user does not have the required permissions to perform a certain action in the admin interface, those options not be displayed.
|
||||
If a user does not have the required permissions to perform a certain action in the [Database Admin interface](./db_admin.md), those options will not be displayed.
|
||||
|
||||
If a user is expecting a certain option to be available in the admin interface, but it is not present, it is most likely the case that the user does not have those permissions assigned.
|
||||
If a user is expecting a certain option to be available in the Database Admin interface, but it is not present, it is most likely the case that the user does not have those permissions assigned.
|
||||
|
||||
## Web Interface Permissions
|
||||
|
||||
|
||||
@@ -24,6 +24,6 @@ The Django Q work must run separately to the web server. This is started as a se
|
||||
|
||||
If the worker is not running, a warning indicator is displayed in the InvenTree menu bar.
|
||||
|
||||
## Admin Interface
|
||||
## Admin Center
|
||||
|
||||
Scheduled tasks can be viewed in the InvenTree admin interface.
|
||||
Scheduled, pending and failed tasks can be viewed in the [Admin Center](./admin.md#admin-center), under the *Background Tasks* section.
|
||||
|
||||
@@ -25,10 +25,12 @@ The *Display Settings* screen shows general display configuration options:
|
||||
{{ usersetting("BARCODE_IN_FORM_FIELDS") }}
|
||||
{{ usersetting("DATE_DISPLAY_FORMAT") }}
|
||||
{{ usersetting("FORMS_CLOSE_USING_ESCAPE") }}
|
||||
{{ usersetting("ENABLE_PREVIEW_PANEL") }}
|
||||
{{ usersetting("DISPLAY_STOCKTAKE_TAB") }}
|
||||
{{ usersetting("SHOW_FULL_CATEGORY_IN_TABLES")}}
|
||||
{{ usersetting("SHOW_BOM_SUBASSEMBLY_LEVELS")}}
|
||||
{{ usersetting("ENABLE_LAST_BREADCRUMB") }}
|
||||
{{ usersetting("SHOW_EXTRA_MODEL_INFO") }}
|
||||
{{ usersetting("SHOW_FULL_LOCATION_IN_TABLES") }}
|
||||
{{ usersetting("DISPLAY_ITEMS_FINAL_LEVEL") }}
|
||||
|
||||
@@ -41,6 +43,7 @@ Customize settings for search results:
|
||||
{{ usersetting("SEARCH_WHOLE") }}
|
||||
{{ usersetting("SEARCH_REGEX") }}
|
||||
{{ usersetting("SEARCH_NOTES") }}
|
||||
{{ usersetting("SEARCH_RESULTS_PREVIEW_PANEL") }}
|
||||
{{ usersetting("SEARCH_PREVIEW_RESULTS") }}
|
||||
{{ usersetting("SEARCH_PREVIEW_SHOW_PARTS") }}
|
||||
{{ usersetting("SEARCH_HIDE_INACTIVE_PARTS") }}
|
||||
|
||||
@@ -65,7 +65,7 @@ The following basic options are available:
|
||||
{{ configsetting("INVENTREE_SITE_URL") }} Specify a fixed site URL |
|
||||
{{ configsetting("INVENTREE_TIMEZONE") }} Server timezone |
|
||||
{{ configsetting("INVENTREE_ADMIN_ENABLED") }} Enable the [django administrator interface]({% include "django.html" %}/ref/contrib/admin/) |
|
||||
{{ configsetting("INVENTREE_ADMIN_URL") }} URL for accessing [admin interface](../settings/admin.md) |
|
||||
{{ configsetting("INVENTREE_ADMIN_URL") }} URL for accessing the [Database Admin interface](../settings/db_admin.md) |
|
||||
{{ configsetting("INVENTREE_LANGUAGE") }} Default language |
|
||||
{{ configsetting("INVENTREE_AUTO_UPDATE") }} Database migrations will be run automatically |
|
||||
|
||||
@@ -122,6 +122,9 @@ Depending on how your InvenTree installation is configured, you will need to pay
|
||||
!!! success "INVENTREE_SITE_URL"
|
||||
If you have specified the `INVENTREE_SITE_URL`, this will automatically be used as a trusted CSRF and CORS host (see below).
|
||||
|
||||
!!! tip "Running Behind a Reverse Proxy"
|
||||
If InvenTree is served behind an existing reverse proxy (e.g. NGINX, Traefik) with SSL termination happening upstream, refer to the [worked example](./processes.md#integrating-with-existing-proxy) for the combination of `INVENTREE_TRUSTED_ORIGINS` and `INVENTREE_USE_X_FORWARDED_*` settings that setup requires.
|
||||
|
||||
{{ configtable() }}
|
||||
{{ configsetting("INVENTREE_ALLOWED_HOSTS") }} List of allowed hosts |
|
||||
{{ configsetting("INVENTREE_TRUSTED_ORIGINS", default="Uses the *INVENTREE_SITE_URL* parameter, if set. Otherwise, an empty list.") }} List of trusted origins. Refer to the [django documentation]({% include "django.html" %}/ref/settings/#csrf-trusted-origins) |
|
||||
@@ -136,7 +139,8 @@ Depending on how your InvenTree installation is configured, you will need to pay
|
||||
| `INVENTREE_X_FORWARDED_PROTO_NAME` | `x_forwarded_proto_name` | `HTTP_X_FORWARDED_PROTO` | Name of the header to use for forwarded protocol information |
|
||||
{{ configsetting("INVENTREE_SESSION_COOKIE_SECURE") }} Enforce secure session cookies |
|
||||
{{ configsetting("INVENTREE_COOKIE_SAMESITE") }} Session cookie mode. Must be one of `Strict | Lax | None | False`. Refer to the [mozilla developer docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) and the [django documentation]({% include "django.html" %}/ref/settings/#std-setting-SESSION_COOKIE_SAMESITE) for more information. |
|
||||
|
||||
{{ configsetting("INVENTREE_THROTTLE_ANON") }} Throttle rate for anonymous users (e.g. '20/minute') |
|
||||
{{ configsetting("INVENTREE_THROTTLE_USER") }} Throttle rate for authenticated users (e.g. '5/second') |
|
||||
|
||||
### Debug Mode
|
||||
|
||||
@@ -256,6 +260,9 @@ The following database options can be configured:
|
||||
{{ configsetting("INVENTREE_DB_PASSWORD") }} Database password (if required) |
|
||||
{{ configsetting("INVENTREE_DB_HOST") }} Database host address (if required) |
|
||||
{{ configsetting("INVENTREE_DB_PORT") }} Database host port (if required) |
|
||||
{{ configsetting("INVENTREE_DB_CONN_MAX_AGE") }} Database connection max age (s) |
|
||||
{{ configsetting("INVENTREE_DB_CONN_HEALTH_CHECKS") }} Enable database connection health checks |
|
||||
|
||||
{{ configsetting("INVENTREE_DB_OPTIONS") }} Additional database options (as a JSON object) |
|
||||
|
||||
!!! tip "Database Password"
|
||||
@@ -266,11 +273,12 @@ The following database options can be configured:
|
||||
If running with a PostgreSQL database backend, the following additional options are available:
|
||||
|
||||
{{ configtable() }}
|
||||
{{ configsetting("INVENTREE_DB_TIMEOUT", default="2") }} Database connection timeout (s) |
|
||||
{{ configsetting("INVENTREE_DB_TIMEOUT", default="10") }} Database connection timeout (s) |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES` | database.tcp_keepalives | 1 | TCP keepalive |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES_IDLE` | database.tcp_keepalives_idle | 1 | Idle TCP keepalive |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES_INTERVAL` | database.tcp_keepalives_interval | 1| TCP keepalive interval |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES_IDLE` | database.tcp_keepalives_idle | 5 | Idle TCP keepalive |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES_INTERVAL` | database.tcp_keepalives_interval | 5 | TCP keepalive interval |
|
||||
| `INVENTREE_DB_TCP_KEEPALIVES_COUNT` | database.tcp_keepalives_count | 5 | TCP keepalive count |
|
||||
| `INVENTREE_DB_TCP_USER_TIMEOUT` | database.tcp_user_timeout | 2000 | TCP user timeout (ms) |
|
||||
| `INVENTREE_DB_ISOLATION_SERIALIZABLE` | database.serializable | False | Database isolation level configured to "serializable" |
|
||||
|
||||
### MySQL Settings
|
||||
@@ -278,6 +286,7 @@ If running with a PostgreSQL database backend, the following additional options
|
||||
If running with a MySQL database backend, the following additional options are available:
|
||||
|
||||
{{ configtable() }}
|
||||
{{ configsetting("INVENTREE_DB_TIMEOUT", default="10") }} Database connection timeout (s) |
|
||||
| `INVENTREE_DB_ISOLATION_SERIALIZABLE` | database.serializable | False | Database isolation level configured to "serializable" |
|
||||
|
||||
### SQLite Settings
|
||||
@@ -549,6 +558,15 @@ To override global settings, provide a "dictionary" of settings overrides in the
|
||||
{{ configtable() }}
|
||||
{{ configsetting("INVENTREE_GLOBAL_SETTINGS") }} JSON object containing global settings overrides |
|
||||
|
||||
## Override Plugin Settings
|
||||
|
||||
If you have plugins installed which require configuration, you can provide plugin settings overrides in the configuration file, or via an environment variable.
|
||||
|
||||
{{ configtable() }}
|
||||
{{ configsetting("INVENTREE_PLUGIN_SETTINGS") }} JSON object containing plugin settings overrides |
|
||||
|
||||
Note that plugin settings overrides require knowledge of the plugin "slug" and the particular settings which are being overridden. You should refer to the plugin documentation for more information on available settings. If plugin overrides are specified, but no matching plugin is found, the overrides will be ignored.
|
||||
|
||||
## Other Settings
|
||||
|
||||
Other available settings, not categorized above, are detailed in the table below:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user