From a776c5d61592d93a64a9a5dce70cdcfd5ce70a81 Mon Sep 17 00:00:00 2001
From: Matthias Mair
Date: Wed, 19 Aug 2026 22:25:54 +0200
Subject: [PATCH] Update next breaking (#12666)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 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
* 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]
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
* 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
* 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]
* Update checkout action version comment in workflow
* fix pins
* change pin
* fix pin
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* [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]
* 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]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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
* 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
* 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]
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]
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]
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
* [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 commit e7a101fe8798456c573bb6479c7f6b554a33eb78.
* 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 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
* 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 commit 8d9f2dce8cc4a150ffc614d0ace47c886ca43e06.
* 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]
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]
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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
* fix style
* lower drf-spectacular to remove api diff
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
Co-authored-by: Oliver
* 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]
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]
* fix style
* master bump
* api bump
* bump a bit further
---------
Signed-off-by: dependabot[bot]
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
* [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]
* fix style
* update pin
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
* fix tsconfig
* fix setup for build - lower typescript
* fix resolution
* lower fullcalendar
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
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
* 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]
* fix pin
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
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
Co-authored-by: Oliver
* 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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* [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]
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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
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]
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]
* Update qc_checks.yaml
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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
* [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
* Fix typo
* path fix
* More pathing fixes
---------
Co-authored-by: Matthias Mair
* [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
Co-authored-by: Oliver
* 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
* [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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* [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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Oliver
* 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]
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]
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
* [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
* 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
* 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]
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]
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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* 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]
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]
* fix style
---------
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Mair
* [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
Co-authored-by: Oliver
---------
Signed-off-by: dependabot[bot]
Co-authored-by: 开源斗士 <43269525+geekcj12@users.noreply.github.com>
Co-authored-by: Oliver
Co-authored-by: Andrey Lushnikov
Co-authored-by: Phil
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
Co-authored-by: suzunn
Co-authored-by: Miklós Márton
Co-authored-by: Petr Ledvina
Co-authored-by: gunstr <41468206+gunstr@users.noreply.github.com>
Co-authored-by: br413
Co-authored-by: Leonid Zaliubovskyi
Co-authored-by: Λamir <86316974+aamirasmal15@users.noreply.github.com>
Co-authored-by: Alex K
Co-authored-by: snipe
Co-authored-by: Bhumin Paladiya <139330832+bhumin18@users.noreply.github.com>
Co-authored-by: Dean
Co-authored-by: Hana Lee <47701469+hanielee@users.noreply.github.com>
Co-authored-by: Hana
Co-authored-by: Jayasree
Co-authored-by: jayasree723
Co-authored-by: siddhartha28 <31231363+siddhartha928@users.noreply.github.com>
Co-authored-by: Siddhartha Ravilla
Co-authored-by: FurinaDog
Co-authored-by: FurinaDog
Co-authored-by: ribsey
Co-authored-by: amanjain57-gif
Co-authored-by: Aman Jain
Co-authored-by: Alonso Lopez-Valdez
Co-authored-by: Jɤ KέϞϞψ
---
.devcontainer/Dockerfile | 10 +-
.devops/test_stats.yml | 79 -
.github/actions/setup/action.yaml | 8 +-
.github/workflows/backport.yaml | 2 +-
.github/workflows/check_translations.yaml | 8 +-
.github/workflows/docker.yaml | 47 +-
.github/workflows/frontend.yaml | 312 +
.github/workflows/import_export.yaml | 10 +-
.github/workflows/qc_checks.yaml | 186 +-
.github/workflows/release.yaml | 78 +-
.github/workflows/scorecard.yaml | 6 +-
.github/workflows/stale.yaml | 2 +-
.github/workflows/translations.yaml | 6 +-
.github/workflows/update.yml.disabled | 4 +-
.gitignore | 3 +-
.pkgr.yml | 10 +-
.pre-commit-config.yaml | 4 +-
.vscode/launch.json | 2 +-
AGENTS.md | 5 +
CHANGELOG.md | 63 +-
CLAUDE.md | 5 +
CONTRIBUTING.md | 219 +-
README.md | 2 +-
codecov.yml | 7 +-
contrib/container/.env | 20 +-
contrib/container/Dockerfile | 26 +-
contrib/container/docker-compose.yml | 3 +
contrib/container/gunicorn.conf.py | 10 +-
contrib/container/requirements.in | 14 +-
contrib/container/requirements.txt | 216 +-
contrib/dev_reqs/requirements.in | 4 +-
contrib/dev_reqs/requirements.txt | 248 +-
contrib/packager.io/functions.sh | 2 +-
contrib/packager.io/postinstall.sh | 2 +-
docs/docs/api/index.md | 2 +-
docs/docs/app/barcode.md | 4 +
.../images/concepts/ui_navigation_tree.png | Bin 25041 -> 41520 bytes
.../concepts/ui_preview_details_link.png | Bin 0 -> 76761 bytes
.../images/concepts/ui_preview_drawer.png | Bin 0 -> 155287 bytes
.../ui_table_column_filter_popover.png | Bin 0 -> 72592 bytes
.../images/concepts/ui_table_filter_group.png | Bin 0 -> 29037 bytes
docs/docs/barcodes/custom.md | 2 +-
docs/docs/barcodes/index.md | 2 +-
docs/docs/concepts/data_import.md | 4 +-
docs/docs/concepts/parameters.md | 42 +-
docs/docs/concepts/pricing.md | 36 +
docs/docs/concepts/tags.md | 82 +
docs/docs/concepts/terminology.md | 2 +-
docs/docs/concepts/ui/forms.md | 37 +
docs/docs/concepts/ui/global_search.md | 42 +
docs/docs/concepts/ui/index.md | 190 +
docs/docs/concepts/ui/preview_panels.md | 37 +
docs/docs/concepts/ui/tables.md | 149 +
docs/docs/develop/contributing.md | 20 +-
docs/docs/faq.md | 24 +-
docs/docs/hooks.py | 4 +-
docs/docs/manufacturing/allocate.md | 51 +-
docs/docs/manufacturing/bom.md | 43 +
docs/docs/manufacturing/external.md | 2 +
docs/docs/manufacturing/index.md | 6 +
docs/docs/manufacturing/output.md | 11 +-
docs/docs/part/consumable.md | 55 +
docs/docs/part/create.md | 2 +-
docs/docs/part/index.md | 5 +
docs/docs/part/notification.md | 2 +-
docs/docs/part/pricing.md | 2 +-
docs/docs/part/stocktake.md | 4 +-
docs/docs/part/trackable.md | 13 +-
docs/docs/part/views.md | 18 +-
docs/docs/plugins/creator.md | 4 +-
docs/docs/plugins/develop.md | 4 +-
docs/docs/plugins/mixins/barcode.md | 4 +-
docs/docs/plugins/mixins/report.md | 46 +-
docs/docs/plugins/walkthrough.md | 10 +-
.../{resources.md => sponsored_resources.md} | 5 +-
docs/docs/purchasing/purchase_order.md | 33 +
docs/docs/purchasing/supplier.md | 3 +
docs/docs/report/assets.md | 45 +
docs/docs/report/context_variables.md | 247 +-
docs/docs/report/helpers.md | 268 +-
docs/docs/report/index.md | 141 +-
docs/docs/report/labels.md | 19 +
docs/docs/report/model_context.md | 24 +
docs/docs/report/report.md | 54 +-
docs/docs/report/samples.md | 19 +-
docs/docs/report/snippets.md | 52 +
docs/docs/report/template_editor.md | 11 +-
docs/docs/sales/return_order.md | 81 +-
docs/docs/sales/sales_order.md | 80 +
docs/docs/security.md | 20 +-
docs/docs/settings/MFA.md | 2 +-
docs/docs/settings/SSO.md | 4 +-
docs/docs/settings/admin.md | 65 +-
docs/docs/settings/db_admin.md | 54 +
docs/docs/settings/global.md | 3 +
docs/docs/settings/logs.md | 15 +-
docs/docs/settings/permissions.md | 10 +-
docs/docs/settings/tasks.md | 4 +-
docs/docs/settings/user.md | 3 +
docs/docs/start/config.md | 28 +-
docs/docs/start/docker.md | 3 +
docs/docs/start/docker_install.md | 19 +-
docs/docs/start/processes.md | 12 +-
docs/docs/stock/adjust.md | 2 +
docs/docs/stock/disassemble.md | 90 +
docs/docs/stock/tracking.md | 25 +
docs/docs/stock/transfer_order.md | 1 +
docs/main.py | 69 +
docs/mkdocs.yml | 22 +-
docs/mlc_config.json | 3 -
docs/requirements.in | 6 +-
docs/requirements.txt | 389 +-
pyproject.toml | 21 +-
readthedocs.yml | 4 +-
src/backend/InvenTree/InvenTree/admin.py | 53 +
src/backend/InvenTree/InvenTree/api.py | 87 +-
.../InvenTree/InvenTree/api_version.py | 129 +-
src/backend/InvenTree/InvenTree/apps.py | 24 +-
.../InvenTree/InvenTree/auth_overrides.py | 9 +-
src/backend/InvenTree/InvenTree/conversion.py | 3 +
src/backend/InvenTree/InvenTree/exceptions.py | 47 +-
src/backend/InvenTree/InvenTree/fields.py | 70 +-
src/backend/InvenTree/InvenTree/format.py | 47 -
src/backend/InvenTree/InvenTree/helpers.py | 73 +-
src/backend/InvenTree/InvenTree/helpers_db.py | 72 +
.../InvenTree/InvenTree/helpers_email.py | 16 +-
.../InvenTree/InvenTree/helpers_model.py | 200 +-
.../InvenTree/InvenTree/magic_login.py | 3 +
.../commands/export_report_context.py | 161 +-
.../management/commands/rebuild_models.py | 10 -
src/backend/InvenTree/InvenTree/metadata.py | 56 +-
src/backend/InvenTree/InvenTree/middleware.py | 26 +
src/backend/InvenTree/InvenTree/models.py | 294 +-
.../InvenTree/InvenTree/permissions.py | 1 -
src/backend/InvenTree/InvenTree/schema.py | 27 +-
src/backend/InvenTree/InvenTree/sentry.py | 1 +
.../InvenTree/InvenTree/serializers.py | 364 +-
.../InvenTree/InvenTree/setting/db_backend.py | 54 +-
.../InvenTree/InvenTree/setting/ldap.py | 4 +-
src/backend/InvenTree/InvenTree/settings.py | 48 +-
src/backend/InvenTree/InvenTree/tasks.py | 273 +-
src/backend/InvenTree/InvenTree/test_api.py | 23 +
.../InvenTree/InvenTree/test_commands.py | 44 +
.../InvenTree/test_helpers/__init__.py | 0
.../InvenTree/test_helpers/sample_tasks.py | 6 +
.../InvenTree/InvenTree/test_helpers_db.py | 163 +
.../InvenTree/InvenTree/test_middleware.py | 66 +-
.../InvenTree/InvenTree/test_serializers.py | 107 +-
src/backend/InvenTree/InvenTree/test_tasks.py | 287 +-
src/backend/InvenTree/InvenTree/tests.py | 297 +-
src/backend/InvenTree/InvenTree/tracing.py | 28 +-
src/backend/InvenTree/InvenTree/unit_test.py | 25 +-
src/backend/InvenTree/InvenTree/validators.py | 15 +-
src/backend/InvenTree/InvenTree/version.py | 25 +-
src/backend/InvenTree/build/api.py | 85 +-
.../build/migrations/0059_build_tags.py | 29 +
src/backend/InvenTree/build/models.py | 961 +-
src/backend/InvenTree/build/serializers.py | 205 +-
src/backend/InvenTree/build/tasks.py | 155 +-
src/backend/InvenTree/build/test_api.py | 1244 +-
src/backend/InvenTree/build/test_build.py | 799 +-
src/backend/InvenTree/build/validators.py | 10 +
src/backend/InvenTree/common/admin.py | 77 +-
src/backend/InvenTree/common/api.py | 141 +-
src/backend/InvenTree/common/currency.py | 16 +-
src/backend/InvenTree/common/filters.py | 31 +
.../0044_notificationmessage_charfield_pk.py | 29 +
.../migrations/0045_projectcode_active.py | 22 +
...6_alter_emailmessage_global_id_and_more.py | 59 +
.../0047_parametertemplate_unique.py | 23 +
.../0048_notificationmessage_link.py | 24 +
.../0049_notificationentry_charfield_uid.py | 18 +
src/backend/InvenTree/common/models.py | 131 +-
src/backend/InvenTree/common/notifications.py | 4 +
src/backend/InvenTree/common/serializers.py | 125 +-
.../InvenTree/common/setting/system.py | 39 +
src/backend/InvenTree/common/setting/type.py | 14 +-
src/backend/InvenTree/common/setting/user.py | 20 +
src/backend/InvenTree/common/settings.py | 22 +-
src/backend/InvenTree/common/test_api.py | 555 +-
src/backend/InvenTree/common/tests.py | 129 +-
src/backend/InvenTree/common/validators.py | 15 +
src/backend/InvenTree/company/admin.py | 4 +-
src/backend/InvenTree/company/api.py | 25 +-
.../migrations/0019_auto_20200413_0642.py | 2 +-
.../company/migrations/0080_company_tags.py | 29 +
src/backend/InvenTree/company/models.py | 83 +-
src/backend/InvenTree/company/serializers.py | 72 +-
src/backend/InvenTree/company/test_api.py | 2 +-
src/backend/InvenTree/company/tests.py | 19 -
src/backend/InvenTree/config_template.yaml | 11 +
src/backend/InvenTree/data_exporter/mixins.py | 13 +
.../InvenTree/data_exporter/serializers.py | 14 +-
.../InvenTree/generic/states/__init__.py | 10 +-
.../InvenTree/generic/states/deprecations.py | 27 +
.../InvenTree/generic/states/fields.py | 93 +-
.../InvenTree/generic/states/states.py | 20 +-
.../generic/states/test_transition.py | 162 +-
.../InvenTree/generic/states/transition.py | 288 +-
src/backend/InvenTree/importer/api.py | 46 +-
.../0006_dataimportcolumnmap_lookup_field.py | 24 +
...on_completed_row_count_history_and_more.py | 23 +
...ata_alter_dataimportrow_errors_and_more.py | 88 +
src/backend/InvenTree/importer/mixins.py | 10 +
src/backend/InvenTree/importer/models.py | 327 +-
src/backend/InvenTree/importer/operations.py | 38 +-
src/backend/InvenTree/importer/serializers.py | 51 +-
src/backend/InvenTree/importer/tests.py | 706 +-
src/backend/InvenTree/importer/validators.py | 9 +-
.../InvenTree/locale/ar/LC_MESSAGES/django.po | 10419 ++++++-------
.../InvenTree/locale/bg/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/cs/LC_MESSAGES/django.po | 4987 ++++---
.../InvenTree/locale/da/LC_MESSAGES/django.po | 5293 ++++---
.../InvenTree/locale/de/LC_MESSAGES/django.po | 5081 ++++---
.../InvenTree/locale/el/LC_MESSAGES/django.po | 4979 ++++---
.../InvenTree/locale/en/LC_MESSAGES/django.po | 5293 ++++---
.../InvenTree/locale/es/LC_MESSAGES/django.po | 5109 ++++---
.../locale/es_MX/LC_MESSAGES/django.po | 5109 ++++---
.../InvenTree/locale/et/LC_MESSAGES/django.po | 5333 ++++---
.../InvenTree/locale/fa/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/fi/LC_MESSAGES/django.po | 5191 ++++---
.../InvenTree/locale/fr/LC_MESSAGES/django.po | 4977 ++++---
.../InvenTree/locale/he/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/hi/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/hu/LC_MESSAGES/django.po | 4979 ++++---
.../InvenTree/locale/id/LC_MESSAGES/django.po | 5301 ++++---
.../InvenTree/locale/it/LC_MESSAGES/django.po | 4977 ++++---
.../InvenTree/locale/ja/LC_MESSAGES/django.po | 5231 ++++---
.../InvenTree/locale/ko/LC_MESSAGES/django.po | 5128 ++++---
.../InvenTree/locale/lt/LC_MESSAGES/django.po | 5005 ++++---
.../InvenTree/locale/lv/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/nl/LC_MESSAGES/django.po | 4999 ++++---
.../InvenTree/locale/no/LC_MESSAGES/django.po | 5099 ++++---
.../InvenTree/locale/pl/LC_MESSAGES/django.po | 5181 ++++---
.../InvenTree/locale/pt/LC_MESSAGES/django.po | 5083 ++++---
.../locale/pt_BR/LC_MESSAGES/django.po | 8159 ++++++-----
.../InvenTree/locale/ro/LC_MESSAGES/django.po | 5279 ++++---
.../InvenTree/locale/ru/LC_MESSAGES/django.po | 5145 ++++---
.../InvenTree/locale/sk/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/sl/LC_MESSAGES/django.po | 5293 ++++---
.../InvenTree/locale/sr/LC_MESSAGES/django.po | 5001 ++++---
.../InvenTree/locale/sv/LC_MESSAGES/django.po | 5309 ++++---
.../InvenTree/locale/th/LC_MESSAGES/django.po | 5295 ++++---
.../InvenTree/locale/tr/LC_MESSAGES/django.po | 5439 +++----
.../InvenTree/locale/uk/LC_MESSAGES/django.po | 5297 ++++---
.../InvenTree/locale/vi/LC_MESSAGES/django.po | 5101 ++++---
.../locale/zh_Hans/LC_MESSAGES/django.po | 4973 ++++---
.../locale/zh_Hant/LC_MESSAGES/django.po | 4967 ++++---
src/backend/InvenTree/machine/api.py | 6 +-
.../machine/machine_types/label_printer.py | 6 +-
.../migrations/0002_alter_machineconfig_id.py | 28 +
src/backend/InvenTree/machine/models.py | 5 +-
src/backend/InvenTree/machine/test_api.py | 15 +-
src/backend/InvenTree/machine/tests.py | 110 +-
src/backend/InvenTree/order/admin.py | 9 +-
src/backend/InvenTree/order/api.py | 221 +-
src/backend/InvenTree/order/events.py | 4 +-
.../InvenTree/order/fixtures/sales_order.yaml | 8 +
...turnorder_tags_salesorder_tags_and_more.py | 73 +
.../migrations/0121_add_line_item_discount.py | 119 +
src/backend/InvenTree/order/models.py | 1495 +-
src/backend/InvenTree/order/serializers.py | 546 +-
src/backend/InvenTree/order/status_codes.py | 3 +-
src/backend/InvenTree/order/tasks.py | 65 +-
src/backend/InvenTree/order/test_api.py | 1781 ++-
.../InvenTree/order/test_sales_order.py | 730 +-
src/backend/InvenTree/order/tests.py | 12 +-
src/backend/InvenTree/part/api.py | 102 +-
.../migrations/0067_partinternalpricebreak.py | 1 +
.../part/migrations/0151_part_consumable.py | 22 +
.../0152_alter_partpricing_currency.py | 26 +
..._bomitem_piece_count_bomitem_piece_size.py | 30 +
src/backend/InvenTree/part/models.py | 551 +-
src/backend/InvenTree/part/serializers.py | 149 +-
src/backend/InvenTree/part/tasks.py | 61 +-
src/backend/InvenTree/part/test_api.py | 357 +-
src/backend/InvenTree/part/test_bom_item.py | 225 +-
src/backend/InvenTree/part/test_param.py | 2 +-
src/backend/InvenTree/part/test_part.py | 50 +-
src/backend/InvenTree/part/test_pricing.py | 34 +
src/backend/InvenTree/plugin/api.py | 31 +-
.../InvenTree/plugin/base/barcodes/api.py | 123 +-
.../InvenTree/plugin/base/barcodes/mixins.py | 59 +-
.../plugin/base/barcodes/test_barcode.py | 165 +-
.../InvenTree/plugin/base/event/events.py | 131 +-
.../plugin/base/event/test_events.py | 134 +
.../plugin/base/integration/AppMixin.py | 4 +-
.../plugin/base/integration/ScheduleMixin.py | 86 +-
src/backend/InvenTree/plugin/base/ui/tests.py | 21 +
.../InvenTree/plugin/broken/broken_file.py | 2 +-
.../builtin/barcodes/inventree_barcode.py | 14 +-
.../barcodes/test_inventree_barcode.py | 1 +
.../builtin/events/auto_create_builds.py | 4 +-
.../builtin/exporter/stocktake_exporter.py | 52 +-
.../plugin/builtin/exporter/test_exporter.py | 3 +-
.../builtin/integration/core_notifications.py | 8 +-
.../integration/test_core_notifications.py | 2 -
.../builtin/labels/inventree_machine.py | 5 +-
.../plugin/builtin/labels/label_sheet.py | 3 +-
.../suppliers/test_supplier_barcodes.py | 204 +
src/backend/InvenTree/plugin/events.py | 17 +-
src/backend/InvenTree/plugin/helpers.py | 16 +-
src/backend/InvenTree/plugin/installer.py | 94 +-
src/backend/InvenTree/plugin/models.py | 37 +
src/backend/InvenTree/plugin/plugin.py | 7 +-
src/backend/InvenTree/plugin/registry.py | 146 +-
.../integration/test_scheduled_task.py | 85 +-
.../plugin/samples/integration/transition.py | 9 +-
.../samples/supplier/supplier_sample.py | 2 +-
src/backend/InvenTree/plugin/serializers.py | 15 +-
src/backend/InvenTree/plugin/test_api.py | 200 +-
src/backend/InvenTree/plugin/test_plugin.py | 24 +
.../plugin/testing/label_machines.py | 48 +
src/backend/InvenTree/report/api.py | 59 +-
src/backend/InvenTree/report/apps.py | 6 +-
src/backend/InvenTree/report/fetcher.py | 69 +
src/backend/InvenTree/report/helpers.py | 28 +
src/backend/InvenTree/report/mixins.py | 36 +-
src/backend/InvenTree/report/models.py | 28 +-
src/backend/InvenTree/report/serializers.py | 22 +-
.../InvenTree/report/templatetags/barcode.py | 48 +-
.../InvenTree/report/templatetags/report.py | 303 +-
src/backend/InvenTree/report/test_tags.py | 306 +-
src/backend/InvenTree/report/tests.py | 448 +-
src/backend/InvenTree/script/update_icons.py | 2 +-
src/backend/InvenTree/stock/admin.py | 14 +-
src/backend/InvenTree/stock/api.py | 200 +-
src/backend/InvenTree/stock/events.py | 1 +
.../InvenTree/stock/fixtures/stock.yaml | 116 -
.../0120_stockitem_creation_date.py | 23 +
.../migrations/0121_auto_20260526_0849.py | 102 +
.../0122_alter_stockitem_creation_date.py | 23 +
.../0123_remove_stockitem_review_needed.py | 17 +
.../migrations/0124_alter_mptt_fields.py | 34 +
.../migrations/0125_remove_mptt_fields.py | 41 +
.../0126_serial_number_concurrency_guard.py | 34 +
.../0127_alter_stockitemtestresult_options.py | 25 +
src/backend/InvenTree/stock/models.py | 1351 +-
src/backend/InvenTree/stock/serializers.py | 479 +-
src/backend/InvenTree/stock/status_codes.py | 4 +
src/backend/InvenTree/stock/tasks.py | 61 +-
src/backend/InvenTree/stock/test_api.py | 1498 +-
.../InvenTree/stock/test_migrations.py | 257 +-
src/backend/InvenTree/stock/tests.py | 1136 +-
src/backend/InvenTree/users/admin.py | 16 +-
src/backend/InvenTree/users/api.py | 42 +-
src/backend/InvenTree/users/authentication.py | 4 +-
src/backend/InvenTree/users/models.py | 4 +-
src/backend/InvenTree/users/serializers.py | 97 +-
src/backend/InvenTree/users/test_api.py | 118 +
src/backend/InvenTree/web/tests.py | 2 +-
src/backend/requirements-3.14.txt | 2222 ++-
src/backend/requirements-dev-3.14.txt | 1111 +-
src/backend/requirements-dev.txt | 1031 +-
src/backend/requirements.in | 13 +-
src/backend/requirements.txt | 2220 ++-
src/frontend/CHANGELOG.md | 38 +
src/frontend/lib/components/Boundary.tsx | 49 +-
src/frontend/lib/components/RowActions.tsx | 16 +-
.../lib/components/TableColumnSelect.tsx | 2 +-
src/frontend/lib/components/TagsList.tsx | 27 +
src/frontend/lib/enums/ApiEndpoints.tsx | 3 +
src/frontend/lib/enums/ModelInformation.tsx | 70 +-
src/frontend/lib/enums/ModelType.tsx | 3 +-
src/frontend/lib/functions/Events.tsx | 38 +
src/frontend/lib/functions/Navigation.tsx | 2 +-
src/frontend/lib/hooks/UseFilterSet.tsx | 57 +-
src/frontend/lib/index.ts | 9 +
.../lib/plugin/InventreeHmrPlugin.tsx | 40 +
.../lib/plugin/LocalizedComponent.tsx | 113 +
src/frontend/lib/states/LocalLibState.tsx | 19 +
src/frontend/lib/types/Filters.tsx | 19 +
src/frontend/lib/types/Forms.tsx | 8 +-
src/frontend/lib/types/Panel.tsx | 1 +
src/frontend/lib/types/Plugins.tsx | 13 +
src/frontend/lib/types/Preview.tsx | 12 +
src/frontend/lib/types/Rendering.tsx | 1 +
src/frontend/lib/types/Settings.tsx | 1 +
src/frontend/lib/types/Tables.tsx | 18 +-
src/frontend/netlify.toml | 2 +-
src/frontend/package.json | 114 +-
src/frontend/playwright.config.ts | 40 +-
.../components/buttons/PrintingActions.tsx | 56 +-
.../components/buttons/RemoveRowButton.tsx | 3 +
.../src/components/buttons/ScanButton.tsx | 57 +-
.../components/buttons/SpotlightButton.tsx | 10 +-
.../src/components/calendar/Calendar.tsx | 140 +-
.../src/components/calendar/OrderCalendar.tsx | 45 +-
.../calendar/OrderCalendarToolTip.tsx | 30 +-
.../components/dashboard/DashboardLayout.tsx | 6 +-
.../components/dashboard/DashboardWidget.tsx | 2 +
.../dashboard/DashboardWidgetDrawer.tsx | 5 +-
.../dashboard/DashboardWidgetLibrary.tsx | 30 +-
.../dashboard/widgets/NewsWidget.tsx | 10 +-
.../widgets/QueryCountDashboardWidget.tsx | 3 +
.../widgets/StocktakeDashboardWidget.tsx | 1 +
.../src/components/details/Details.tsx | 41 +-
.../src/components/details/DetailsImage.tsx | 4 +
.../src/components/details/ItemDetails.tsx | 23 +-
.../details/ParameterDetailsGrid.tsx | 54 +
.../TemplateEditor/PdfPreview/PdfPreview.tsx | 10 +-
.../editors/TemplateEditor/TemplateEditor.tsx | 304 +-
src/frontend/src/components/forms/ApiForm.tsx | 112 +-
.../src/components/forms/DateTimeField.tsx | 6 +-
.../components/forms/fields/ApiFormField.tsx | 94 +-
.../components/forms/fields/BooleanField.tsx | 21 +-
.../components/forms/fields/ChoiceField.tsx | 10 +-
.../src/components/forms/fields/DateField.tsx | 6 +-
.../forms/fields/DependentField.tsx | 17 +-
.../src/components/forms/fields/IconField.tsx | 14 +-
.../forms/fields/NestedObjectField.tsx | 5 +-
.../components/forms/fields/NumberField.tsx | 25 +-
.../forms/fields/RelatedModelField.tsx | 19 +-
.../components/forms/fields/TableField.tsx | 339 +-
.../src/components/forms/fields/TagsField.tsx | 83 +
.../src/components/forms/fields/TextField.tsx | 8 +-
.../src/components/forms/fields/TreeField.tsx | 502 +
.../importer/GlobalImporterDrawer.tsx | 11 +-
.../importer/ImportDataSelector.tsx | 11 +-
.../importer/ImporterColumnSelector.tsx | 53 +
.../src/components/items/ActionDropdown.tsx | 14 +-
.../src/components/items/PartCreationMenu.tsx | 109 +
.../components/modals/AboutInvenTreeModal.tsx | 14 +-
.../src/components/modals/HotkeyModal.tsx | 67 +
.../src/components/nav/BreadcrumbList.tsx | 84 +-
.../src/components/nav/DetailNavigation.tsx | 68 +
src/frontend/src/components/nav/Header.tsx | 17 +-
src/frontend/src/components/nav/Layout.tsx | 6 +-
.../src/components/nav/NavigationDrawer.tsx | 13 +-
.../src/components/nav/NavigationTree.tsx | 315 +-
.../src/components/nav/PageDetail.tsx | 99 +-
.../nav/PageDetailNavigationBar.tsx | 40 +
.../src/components/nav/SearchDrawer.tsx | 16 +-
.../src/components/panels/AttachmentPanel.tsx | 1 +
.../src/components/panels/NotesPanel.tsx | 1 +
.../src/components/panels/PanelGroup.tsx | 34 +-
.../src/components/panels/ParametersPanel.tsx | 1 +
.../src/components/plugins/PluginContext.tsx | 36 +-
.../components/plugins/RemoteComponent.tsx | 157 +-
.../previews/GlobalPreviewDrawer.tsx | 28 +
.../components/previews/ModelPreviewShim.ts | 30 +
.../src/components/previews/PreviewDrawer.tsx | 195 +
.../previews/models/BuildOrderPreview.tsx | 25 +
.../previews/models/CompanyPreview.tsx | 18 +
.../components/previews/models/Fallback.tsx | 31 +
.../models/ManufacturerPartPreview.tsx | 26 +
.../previews/models/PartCategoryPreview.tsx | 18 +
.../previews/models/PartPreview.tsx | 15 +
.../previews/models/PurchaseOrderPreview.tsx | 25 +
.../previews/models/ReturnOrderPreview.tsx | 25 +
.../previews/models/SalesOrderPreview.tsx | 25 +
.../models/SalesOrderShipmentPreview.tsx | 25 +
.../previews/models/StockLocationPreview.tsx | 18 +
.../previews/models/StockPreview.tsx | 30 +
.../previews/models/SupplierPartPreview.tsx | 25 +
.../previews/models/TransferOrderPreview.tsx | 18 +
src/frontend/src/components/render/Build.tsx | 2 +-
.../src/components/render/Generic.tsx | 6 +
.../src/components/render/Instance.tsx | 200 +-
.../src/components/render/ModelHoverCard.tsx | 81 +
.../src/components/render/ModelRenderShim.ts | 80 +
src/frontend/src/components/render/Order.tsx | 8 +-
src/frontend/src/components/render/Part.tsx | 9 +-
.../src/components/render/StatusRenderer.tsx | 25 +
src/frontend/src/components/render/Stock.tsx | 19 +-
.../src/components/settings/QuickAction.tsx | 7 +-
.../src/components/settings/SettingList.tsx | 37 +-
.../src/components/tables/AppRowActions.tsx | 22 +
.../tables/ColumnRenderers.tsx | 77 +-
.../src/{ => components}/tables/Filter.tsx | 49 +-
.../components/tables/FilterSelectDrawer.tsx | 760 +
.../tables/InvenTreeTable.tsx | 362 +-
.../tables/InvenTreeTableHeader.tsx | 46 +-
.../src/components/tables/PartStockCell.tsx | 138 +
.../tables/RowExpansionIcon.tsx | 0
.../tables/TableHoverCard.tsx | 8 +-
.../components/wizards/OrderPartsWizard.tsx | 15 +-
src/frontend/src/contexts/LanguageContext.tsx | 9 +-
src/frontend/src/contexts/ThemeContext.tsx | 4 +-
src/frontend/src/contexts/colorSchema.tsx | 17 +-
src/frontend/src/defaults/actions.tsx | 103 +-
src/frontend/src/defaults/links.tsx | 39 +-
src/frontend/src/forms/BomForms.tsx | 8 +-
src/frontend/src/forms/BuildForms.tsx | 181 +-
src/frontend/src/forms/CommonFields.tsx | 51 +
src/frontend/src/forms/CommonForms.tsx | 274 +-
src/frontend/src/forms/CompanyForms.tsx | 70 +-
src/frontend/src/forms/PartForms.tsx | 17 +-
src/frontend/src/forms/PurchaseOrderForms.tsx | 116 +-
src/frontend/src/forms/ReturnOrderForms.tsx | 25 +-
src/frontend/src/forms/SalesOrderForms.tsx | 89 +-
src/frontend/src/forms/StockForms.tsx | 1058 +-
src/frontend/src/forms/TransferOrderForms.tsx | 81 +-
.../src/forms/selectionListFields.tsx | 118 -
.../src/functions/DetailNavigation.tsx | 298 +
src/frontend/src/functions/auth.tsx | 28 +-
src/frontend/src/functions/comparison.tsx | 94 +
src/frontend/src/functions/debug.tsx | 36 +
src/frontend/src/functions/icons.tsx | 13 +-
src/frontend/src/functions/loading.tsx | 61 +-
src/frontend/src/functions/localeReady.ts | 24 +
src/frontend/src/hooks/UseCalendar.tsx | 31 +-
.../src/hooks/UseDetailNavigation.tsx | 135 +
src/frontend/src/hooks/UseRemotePlugin.tsx | 157 +
src/frontend/src/locales/ar/messages.po | 12030 +++++++++-------
src/frontend/src/locales/bg/messages.po | 8221 ++++++-----
src/frontend/src/locales/cs/messages.po | 8307 ++++++-----
src/frontend/src/locales/da/messages.po | 8317 ++++++-----
src/frontend/src/locales/de/messages.po | 8303 ++++++-----
src/frontend/src/locales/el/messages.po | 8307 ++++++-----
src/frontend/src/locales/en/messages.po | 8307 ++++++-----
src/frontend/src/locales/es/messages.po | 8317 ++++++-----
src/frontend/src/locales/es_MX/messages.po | 8291 ++++++-----
src/frontend/src/locales/et/messages.po | 8300 ++++++-----
src/frontend/src/locales/fa/messages.po | 8221 ++++++-----
src/frontend/src/locales/fi/messages.po | 8221 ++++++-----
src/frontend/src/locales/fr/messages.po | 8339 ++++++-----
src/frontend/src/locales/he/messages.po | 8155 ++++++-----
src/frontend/src/locales/hi/messages.po | 8221 ++++++-----
src/frontend/src/locales/hu/messages.po | 8307 ++++++-----
src/frontend/src/locales/id/messages.po | 8257 ++++++-----
src/frontend/src/locales/it/messages.po | 8307 ++++++-----
src/frontend/src/locales/ja/messages.po | 8525 ++++++-----
src/frontend/src/locales/ko/messages.po | 8458 ++++++-----
src/frontend/src/locales/lt/messages.po | 8227 ++++++-----
src/frontend/src/locales/lv/messages.po | 8221 ++++++-----
src/frontend/src/locales/nl/messages.po | 8307 ++++++-----
src/frontend/src/locales/no/messages.po | 8290 ++++++-----
src/frontend/src/locales/pl/messages.po | 8171 ++++++-----
src/frontend/src/locales/pt/messages.po | 8362 ++++++-----
src/frontend/src/locales/pt_BR/messages.po | 10570 +++++++-------
src/frontend/src/locales/ro/messages.po | 8167 ++++++-----
src/frontend/src/locales/ru/messages.po | 8419 ++++++-----
src/frontend/src/locales/sk/messages.po | 8221 ++++++-----
src/frontend/src/locales/sl/messages.po | 8237 ++++++-----
src/frontend/src/locales/sr/messages.po | 8295 ++++++-----
src/frontend/src/locales/sv/messages.po | 8322 ++++++-----
src/frontend/src/locales/th/messages.po | 8221 ++++++-----
src/frontend/src/locales/tr/messages.po | 8759 ++++++-----
src/frontend/src/locales/uk/messages.po | 8213 ++++++-----
src/frontend/src/locales/vi/messages.po | 8263 ++++++-----
src/frontend/src/locales/zh_Hans/messages.po | 8307 ++++++-----
src/frontend/src/locales/zh_Hant/messages.po | 8317 ++++++-----
src/frontend/src/main.tsx | 21 +-
src/frontend/src/pages/Auth/LoggedIn.tsx | 4 +-
src/frontend/src/pages/Auth/Login.tsx | 16 +-
.../AccountSettings/SecurityContent.tsx | 7 +-
.../AdminCenter/CurrencyManagementPanel.tsx | 2 +-
.../Index/Settings/AdminCenter/Index.tsx | 45 +-
.../AdminCenter/LabelTemplatePanel.tsx | 8 +-
.../AdminCenter/ReportTemplatePanel.tsx | 20 +
.../AdminCenter/UnitManagementPanel.tsx | 4 +-
.../Index/Settings/PluginSettingsGroup.tsx | 17 +-
.../pages/Index/Settings/SystemSettings.tsx | 24 +-
.../src/pages/Index/Settings/UserSettings.tsx | 6 +-
src/frontend/src/pages/build/BuildDetail.tsx | 255 +-
src/frontend/src/pages/build/BuildIndex.tsx | 18 +-
.../pages/build/BuildOrderDetailsPanel.tsx | 262 +
.../src/pages/company/CompanyDetail.tsx | 137 +-
.../src/pages/company/CompanyDetailsPanel.tsx | 119 +
.../pages/company/ManufacturerPartDetail.tsx | 117 +-
.../company/ManufacturerPartDetailsPanel.tsx | 119 +
.../src/pages/company/SupplierPartDetail.tsx | 199 +-
.../company/SupplierPartDetailsPanel.tsx | 206 +
src/frontend/src/pages/core/GroupDetail.tsx | 10 +-
src/frontend/src/pages/core/UserDetail.tsx | 21 +-
.../src/pages/part/CategoryDetail.tsx | 135 +-
.../pages/part/PartCategoryDetailsPanel.tsx | 121 +
src/frontend/src/pages/part/PartDetail.tsx | 499 +-
.../src/pages/part/PartDetailsPanel.tsx | 370 +
.../src/pages/part/PartStockHistoryDetail.tsx | 7 +-
.../src/pages/part/bom/BomCompare.tsx | 2 +-
.../pages/part/pricing/BomPricingPanel.tsx | 11 +-
.../pages/part/pricing/PriceBreakPanel.tsx | 5 +-
.../part/pricing/PricingOverviewPanel.tsx | 74 +-
.../part/pricing/PurchaseHistoryPanel.tsx | 7 +-
.../pages/part/pricing/SaleHistoryPanel.tsx | 9 +-
.../part/pricing/SupplierPricingPanel.tsx | 5 +-
.../part/pricing/VariantPricingPanel.tsx | 7 +-
.../pages/purchasing/PurchaseOrderDetail.tsx | 240 +-
.../purchasing/PurchaseOrderDetailsPanel.tsx | 258 +
.../src/pages/purchasing/PurchasingIndex.tsx | 3 +-
.../src/pages/sales/ReturnOrderDetail.tsx | 242 +-
.../pages/sales/ReturnOrderDetailsPanel.tsx | 270 +
src/frontend/src/pages/sales/SalesIndex.tsx | 6 +-
.../src/pages/sales/SalesOrderDetail.tsx | 243 +-
.../pages/sales/SalesOrderDetailsPanel.tsx | 270 +
.../pages/sales/SalesOrderShipmentDetail.tsx | 198 +-
.../sales/SalesOrderShipmentDetailsPanel.tsx | 205 +
.../src/pages/stock/LocationDetail.tsx | 127 +-
src/frontend/src/pages/stock/StockDetail.tsx | 420 +-
.../src/pages/stock/StockDetailsPanel.tsx | 413 +
.../pages/stock/StockLocationDetailsPanel.tsx | 106 +
.../src/pages/stock/TransferOrderDetail.tsx | 192 +-
.../pages/stock/TransferOrderDetailsPanel.tsx | 181 +
src/frontend/src/router.tsx | 38 +-
src/frontend/src/states/LocalState.tsx | 27 +-
.../src/states/PreviewDrawerState.tsx | 98 +
src/frontend/src/states/ServerApiState.tsx | 26 +-
src/frontend/src/states/SettingsStates.tsx | 67 +-
src/frontend/src/states/UserState.tsx | 69 +-
src/frontend/src/states/states.tsx | 59 +-
src/frontend/src/styles/overrides.css | 21 +
.../src/tables/bom/BomSubassemblyTable.tsx | 8 +-
src/frontend/src/tables/bom/BomTable.tsx | 54 +-
src/frontend/src/tables/bom/UsedInTable.tsx | 22 +-
.../tables/build/BuildAllocatedStockTable.tsx | 26 +-
.../src/tables/build/BuildLineTable.tsx | 145 +-
.../src/tables/build/BuildOrderFilters.tsx | 10 +-
.../build/BuildOrderParametricTable.tsx | 4 +-
.../src/tables/build/BuildOrderTable.tsx | 22 +-
.../src/tables/build/BuildOutputTable.tsx | 51 +-
.../src/tables/company/AddressTable.tsx | 4 +-
.../src/tables/company/CompanyTable.tsx | 45 +-
.../src/tables/company/ContactTable.tsx | 2 +-
.../tables/company/ParametricCompanyTable.tsx | 5 +-
.../src/tables/general/AttachmentTable.tsx | 2 +-
.../src/tables/general/BarcodeScanTable.tsx | 8 +-
.../src/tables/general/ExtraLineItemTable.tsx | 32 +-
.../src/tables/general/ParameterTable.tsx | 25 +-
.../tables/general/ParameterTemplateTable.tsx | 15 +-
.../tables/general/ParametricDataTable.tsx | 81 +-
.../src/tables/machine/MachineListTable.tsx | 7 +-
.../src/tables/machine/MachineTypeTable.tsx | 7 +-
.../notifications/NotificationTable.tsx | 2 +-
.../src/tables/part/ParametricPartTable.tsx | 32 +-
.../tables/part/PartBuildAllocationsTable.tsx | 15 +-
.../src/tables/part/PartCategoryTable.tsx | 17 +-
.../tables/part/PartCategoryTemplateTable.tsx | 28 +-
.../tables/part/PartPurchaseOrdersTable.tsx | 17 +-
.../tables/part/PartSalesAllocationsTable.tsx | 17 +-
.../src/tables/part/PartSalesOrdersTable.tsx | 129 +
src/frontend/src/tables/part/PartTable.tsx | 279 +-
.../src/tables/part/PartTableFilters.tsx | 19 +-
.../src/tables/part/PartTestResultTable.tsx | 26 +-
.../src/tables/part/PartTestTemplateTable.tsx | 16 +-
.../src/tables/part/RelatedPartTable.tsx | 4 +-
.../src/tables/plugin/PluginErrorTable.tsx | 2 +-
.../src/tables/plugin/PluginListTable.tsx | 15 +-
.../ManufacturerPartParametricTable.tsx | 6 +-
.../purchasing/ManufacturerPartTable.tsx | 30 +-
.../purchasing/PurchaseOrderFilters.tsx | 6 +-
.../purchasing/PurchaseOrderLineItemTable.tsx | 49 +-
.../PurchaseOrderParametricTable.tsx | 2 +-
.../tables/purchasing/PurchaseOrderTable.tsx | 12 +-
.../SupplierPartParametricTable.tsx | 5 +-
.../tables/purchasing/SupplierPartTable.tsx | 39 +-
.../purchasing/SupplierPriceBreakTable.tsx | 4 +-
.../src/tables/sales/ReturnOrderFilters.tsx | 6 +-
.../tables/sales/ReturnOrderLineItemTable.tsx | 71 +-
.../sales/ReturnOrderParametricTable.tsx | 2 +-
.../src/tables/sales/ReturnOrderTable.tsx | 12 +-
.../sales/SalesOrderAllocationTable.tsx | 49 +-
.../src/tables/sales/SalesOrderFilters.tsx | 6 +-
.../tables/sales/SalesOrderLineItemTable.tsx | 133 +-
.../sales/SalesOrderParametricTable.tsx | 2 +-
.../tables/sales/SalesOrderShipmentTable.tsx | 31 +-
.../src/tables/sales/SalesOrderTable.tsx | 12 +-
.../src/tables/settings/ApiTokenTable.tsx | 9 +-
.../src/tables/settings/AssetTable.tsx | 124 +
.../settings/BarcodeScanHistoryTable.tsx | 39 +-
.../src/tables/settings/CustomStateTable.tsx | 2 +-
.../src/tables/settings/CustomUnitsTable.tsx | 2 +-
.../src/tables/settings/EmailTable.tsx | 4 +-
.../src/tables/settings/ErrorTable.tsx | 2 +-
.../tables/settings/ExportSessionTable.tsx | 6 +-
.../src/tables/settings/FailedTasksTable.tsx | 2 +-
.../src/tables/settings/GroupTable.tsx | 5 +-
.../tables/settings/ImportSessionTable.tsx | 37 +-
.../src/tables/settings/PendingTasksTable.tsx | 2 +-
.../src/tables/settings/ProjectCodeTable.tsx | 24 +-
.../tables/settings/ScheduledTasksTable.tsx | 2 +-
.../tables/settings/SelectionListDrawer.tsx | 217 +
.../{part => settings}/SelectionListTable.tsx | 42 +-
.../src/tables/settings/SnippetTable.tsx | 239 +
.../src/tables/settings/TemplateTable.tsx | 38 +-
.../src/tables/settings/UserTable.tsx | 7 +-
.../src/tables/stock/InstalledItemsTable.tsx | 10 +-
.../src/tables/stock/LocationTypesTable.tsx | 4 +-
.../src/tables/stock/StockItemTable.tsx | 102 +-
.../tables/stock/StockItemTestResultTable.tsx | 52 +-
.../stock/StockLocationParametricTable.tsx | 2 +-
.../src/tables/stock/StockLocationTable.tsx | 8 +-
.../src/tables/stock/StockTrackingTable.tsx | 6 +-
.../stock/TransferOrderAllocationTable.tsx | 22 +-
.../src/tables/stock/TransferOrderFilters.tsx | 79 +
.../stock/TransferOrderLineItemTable.tsx | 38 +-
.../stock/TransferOrderParametricTable.tsx | 7 +-
.../src/tables/stock/TransferOrderTable.tsx | 73 +-
src/frontend/src/views/MainView.tsx | 42 +-
src/frontend/tests/baseFixtures.ts | 94 +-
.../tests/customization/customization.spec.ts | 9 +-
src/frontend/tests/defaults.ts | 5 +
src/frontend/tests/helpers.ts | 20 +
src/frontend/tests/pages/pui_build.spec.ts | 146 +-
src/frontend/tests/pages/pui_company.spec.ts | 52 +-
.../tests/pages/pui_dashboard.spec.ts | 2 -
src/frontend/tests/pages/pui_part.spec.ts | 198 +-
.../tests/pages/pui_purchasing.spec.ts | 77 +-
src/frontend/tests/pages/pui_return.spec.ts | 7 +-
src/frontend/tests/pages/pui_sales.spec.ts | 59 +
src/frontend/tests/pages/pui_scan.spec.ts | 1 +
src/frontend/tests/pages/pui_stock.spec.ts | 311 +-
src/frontend/tests/pages/pui_transfer.spec.ts | 223 +
src/frontend/tests/pui_exporting.spec.ts | 13 +-
src/frontend/tests/pui_forms.spec.ts | 238 +-
src/frontend/tests/pui_importing.spec.ts | 2 +-
src/frontend/tests/pui_login.spec.ts | 369 +-
src/frontend/tests/pui_machines.spec.ts | 2 +-
src/frontend/tests/pui_permissions.spec.ts | 18 +-
src/frontend/tests/pui_plugins.spec.ts | 65 +-
src/frontend/tests/pui_printing.spec.ts | 90 +-
src/frontend/tests/pui_settings.spec.ts | 145 +-
src/frontend/tests/pui_tables.spec.ts | 219 +
src/frontend/tsconfig.json | 4 +-
src/frontend/vite.config.ts | 5 +-
src/frontend/vite.lib.config.ts | 6 +-
src/frontend/yarn.lock | 3310 ++---
tasks.py | 209 +-
719 files changed, 344813 insertions(+), 256901 deletions(-)
delete mode 100644 .devops/test_stats.yml
create mode 100644 .github/workflows/frontend.yaml
create mode 100644 AGENTS.md
create mode 100644 CLAUDE.md
create mode 100644 docs/docs/assets/images/concepts/ui_preview_details_link.png
create mode 100644 docs/docs/assets/images/concepts/ui_preview_drawer.png
create mode 100644 docs/docs/assets/images/concepts/ui_table_column_filter_popover.png
create mode 100644 docs/docs/assets/images/concepts/ui_table_filter_group.png
create mode 100644 docs/docs/concepts/tags.md
create mode 100644 docs/docs/concepts/ui/forms.md
create mode 100644 docs/docs/concepts/ui/global_search.md
create mode 100644 docs/docs/concepts/ui/index.md
create mode 100644 docs/docs/concepts/ui/preview_panels.md
create mode 100644 docs/docs/concepts/ui/tables.md
create mode 100644 docs/docs/part/consumable.md
rename docs/docs/project/{resources.md => sponsored_resources.md} (83%)
create mode 100644 docs/docs/report/assets.md
create mode 100644 docs/docs/report/model_context.md
create mode 100644 docs/docs/report/snippets.md
create mode 100644 docs/docs/settings/db_admin.md
create mode 100644 docs/docs/stock/disassemble.md
create mode 100644 src/backend/InvenTree/InvenTree/helpers_db.py
create mode 100644 src/backend/InvenTree/InvenTree/test_helpers/__init__.py
create mode 100644 src/backend/InvenTree/InvenTree/test_helpers/sample_tasks.py
create mode 100644 src/backend/InvenTree/InvenTree/test_helpers_db.py
create mode 100644 src/backend/InvenTree/build/migrations/0059_build_tags.py
create mode 100644 src/backend/InvenTree/common/migrations/0044_notificationmessage_charfield_pk.py
create mode 100644 src/backend/InvenTree/common/migrations/0045_projectcode_active.py
create mode 100644 src/backend/InvenTree/common/migrations/0046_alter_emailmessage_global_id_and_more.py
create mode 100644 src/backend/InvenTree/common/migrations/0047_parametertemplate_unique.py
create mode 100644 src/backend/InvenTree/common/migrations/0048_notificationmessage_link.py
create mode 100644 src/backend/InvenTree/common/migrations/0049_notificationentry_charfield_uid.py
create mode 100644 src/backend/InvenTree/company/migrations/0080_company_tags.py
create mode 100644 src/backend/InvenTree/generic/states/deprecations.py
create mode 100644 src/backend/InvenTree/importer/migrations/0006_dataimportcolumnmap_lookup_field.py
create mode 100644 src/backend/InvenTree/importer/migrations/0007_dataimportsession_completed_row_count_history_and_more.py
create mode 100644 src/backend/InvenTree/importer/migrations/0008_alter_dataimportrow_data_alter_dataimportrow_errors_and_more.py
create mode 100644 src/backend/InvenTree/machine/migrations/0002_alter_machineconfig_id.py
create mode 100644 src/backend/InvenTree/order/migrations/0120_purchaseorder_tags_returnorder_tags_salesorder_tags_and_more.py
create mode 100644 src/backend/InvenTree/order/migrations/0121_add_line_item_discount.py
create mode 100644 src/backend/InvenTree/part/migrations/0151_part_consumable.py
create mode 100644 src/backend/InvenTree/part/migrations/0152_alter_partpricing_currency.py
create mode 100644 src/backend/InvenTree/part/migrations/0153_bomitem_piece_count_bomitem_piece_size.py
create mode 100644 src/backend/InvenTree/plugin/base/event/test_events.py
create mode 100644 src/backend/InvenTree/report/fetcher.py
create mode 100644 src/backend/InvenTree/stock/migrations/0120_stockitem_creation_date.py
create mode 100644 src/backend/InvenTree/stock/migrations/0121_auto_20260526_0849.py
create mode 100644 src/backend/InvenTree/stock/migrations/0122_alter_stockitem_creation_date.py
create mode 100644 src/backend/InvenTree/stock/migrations/0123_remove_stockitem_review_needed.py
create mode 100644 src/backend/InvenTree/stock/migrations/0124_alter_mptt_fields.py
create mode 100644 src/backend/InvenTree/stock/migrations/0125_remove_mptt_fields.py
create mode 100644 src/backend/InvenTree/stock/migrations/0126_serial_number_concurrency_guard.py
create mode 100644 src/backend/InvenTree/stock/migrations/0127_alter_stockitemtestresult_options.py
create mode 100644 src/frontend/lib/components/TagsList.tsx
create mode 100644 src/frontend/lib/plugin/InventreeHmrPlugin.tsx
create mode 100644 src/frontend/lib/plugin/LocalizedComponent.tsx
create mode 100644 src/frontend/lib/types/Preview.tsx
create mode 100644 src/frontend/src/components/details/ParameterDetailsGrid.tsx
create mode 100644 src/frontend/src/components/forms/fields/TagsField.tsx
create mode 100644 src/frontend/src/components/forms/fields/TreeField.tsx
create mode 100644 src/frontend/src/components/items/PartCreationMenu.tsx
create mode 100644 src/frontend/src/components/modals/HotkeyModal.tsx
create mode 100644 src/frontend/src/components/nav/DetailNavigation.tsx
create mode 100644 src/frontend/src/components/nav/PageDetailNavigationBar.tsx
create mode 100644 src/frontend/src/components/previews/GlobalPreviewDrawer.tsx
create mode 100644 src/frontend/src/components/previews/ModelPreviewShim.ts
create mode 100644 src/frontend/src/components/previews/PreviewDrawer.tsx
create mode 100644 src/frontend/src/components/previews/models/BuildOrderPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/CompanyPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/Fallback.tsx
create mode 100644 src/frontend/src/components/previews/models/ManufacturerPartPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/PartCategoryPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/PartPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/PurchaseOrderPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/ReturnOrderPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/SalesOrderPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/SalesOrderShipmentPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/StockLocationPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/StockPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/SupplierPartPreview.tsx
create mode 100644 src/frontend/src/components/previews/models/TransferOrderPreview.tsx
create mode 100644 src/frontend/src/components/render/ModelHoverCard.tsx
create mode 100644 src/frontend/src/components/render/ModelRenderShim.ts
create mode 100644 src/frontend/src/components/tables/AppRowActions.tsx
rename src/frontend/src/{ => components}/tables/ColumnRenderers.tsx (90%)
rename src/frontend/src/{ => components}/tables/Filter.tsx (91%)
create mode 100644 src/frontend/src/components/tables/FilterSelectDrawer.tsx
rename src/frontend/src/{ => components}/tables/InvenTreeTable.tsx (72%)
rename src/frontend/src/{ => components}/tables/InvenTreeTableHeader.tsx (88%)
create mode 100644 src/frontend/src/components/tables/PartStockCell.tsx
rename src/frontend/src/{ => components}/tables/RowExpansionIcon.tsx (100%)
rename src/frontend/src/{ => components}/tables/TableHoverCard.tsx (91%)
create mode 100644 src/frontend/src/forms/CommonFields.tsx
delete mode 100644 src/frontend/src/forms/selectionListFields.tsx
create mode 100644 src/frontend/src/functions/DetailNavigation.tsx
create mode 100644 src/frontend/src/functions/comparison.tsx
create mode 100644 src/frontend/src/functions/debug.tsx
create mode 100644 src/frontend/src/functions/localeReady.ts
create mode 100644 src/frontend/src/hooks/UseDetailNavigation.tsx
create mode 100644 src/frontend/src/hooks/UseRemotePlugin.tsx
create mode 100644 src/frontend/src/pages/build/BuildOrderDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/company/CompanyDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/company/ManufacturerPartDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/company/SupplierPartDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/part/PartCategoryDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/part/PartDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/purchasing/PurchaseOrderDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/sales/ReturnOrderDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/sales/SalesOrderDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/sales/SalesOrderShipmentDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/stock/StockDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/stock/StockLocationDetailsPanel.tsx
create mode 100644 src/frontend/src/pages/stock/TransferOrderDetailsPanel.tsx
create mode 100644 src/frontend/src/states/PreviewDrawerState.tsx
create mode 100644 src/frontend/src/tables/part/PartSalesOrdersTable.tsx
create mode 100644 src/frontend/src/tables/settings/AssetTable.tsx
create mode 100644 src/frontend/src/tables/settings/SelectionListDrawer.tsx
rename src/frontend/src/tables/{part => settings}/SelectionListTable.tsx (76%)
create mode 100644 src/frontend/src/tables/settings/SnippetTable.tsx
create mode 100644 src/frontend/src/tables/stock/TransferOrderFilters.tsx
create mode 100644 src/frontend/tests/pages/pui_transfer.spec.ts
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 2c7fd1a0a9..440b246f13 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -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
diff --git a/.devops/test_stats.yml b/.devops/test_stats.yml
deleted file mode 100644
index a0bc7ed680..0000000000
--- a/.devops/test_stats.yml
+++ /dev/null
@@ -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'
diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml
index 3c7526de71..f3ffaebee8 100644
--- a/.github/actions/setup/action.yaml
+++ b/.github/actions/setup/action.yaml
@@ -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
diff --git a/.github/workflows/backport.yaml b/.github/workflows/backport.yaml
index 7ac4bb2d1b..1a8a77502c 100644
--- a/.github/workflows/backport.yaml
+++ b/.github/workflows/backport.yaml
@@ -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-
diff --git a/.github/workflows/check_translations.yaml b/.github/workflows/check_translations.yaml
index 5fabe38106..44381efddf 100644
--- a/.github/workflows/check_translations.yaml
+++ b/.github/workflows/check_translations.yaml
@@ -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
diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml
index db8dcd6785..678d924ff0 100644
--- a/.github/workflows/docker.yaml
+++ b/.github/workflows/docker.yaml
@@ -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: .
diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml
new file mode 100644
index 0000000000..b869ec0954
--- /dev/null
+++ b/.github/workflows/frontend.yaml
@@ -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
diff --git a/.github/workflows/import_export.yaml b/.github/workflows/import_export.yaml
index 6cf00b0408..18dfb0dc88 100644
--- a/.github/workflows/import_export.yaml
+++ b/.github/workflows/import_export.yaml
@@ -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
diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml
index b877b5aff4..df60dc289f 100644
--- a/.github/workflows/qc_checks.yaml
+++ b/.github/workflows/qc_checks.yaml
@@ -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
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 9cdf67065d..76394775f5 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -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 }}
diff --git a/.github/workflows/scorecard.yaml b/.github/workflows/scorecard.yaml
index 4d2d571f31..9bfe9496ec 100644
--- a/.github/workflows/scorecard.yaml
+++ b/.github/workflows/scorecard.yaml
@@ -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
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
index fc770c386e..958ab2c42d 100644
--- a/.github/workflows/stale.yaml
+++ b/.github/workflows/stale.yaml
@@ -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."
diff --git a/.github/workflows/translations.yaml b/.github/workflows/translations.yaml
index d619040b90..a13210d7e7 100644
--- a/.github/workflows/translations.yaml
+++ b/.github/workflows/translations.yaml
@@ -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
diff --git a/.github/workflows/update.yml.disabled b/.github/workflows/update.yml.disabled
index 900596bb09..fd97125053 100644
--- a/.github/workflows/update.yml.disabled
+++ b/.github/workflows/update.yml.disabled
@@ -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
diff --git a/.gitignore b/.gitignore
index b40ddc1f67..94afc63449 100644
--- a/.gitignore
+++ b/.gitignore
@@ -111,5 +111,6 @@ api.yaml
src/backend/InvenTree/web/static
InvenTree/web/static
-# performance test results
+# test results and logs
+_tests*.txt
.codspeed/
diff --git a/.pkgr.yml b/.pkgr.yml
index ac9dc06408..4be9b08a36 100644
--- a/.pkgr.yml
+++ b/.pkgr.yml
@@ -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
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b140056f45..bc7e618931 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -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
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 17186b6d37..6405c43bd5 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -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"
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000000..90afc6d2bc
--- /dev/null
+++ b/AGENTS.md
@@ -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.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b2a9bf5eb6..28ecbb109a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000000..90afc6d2bc
--- /dev/null
+++ b/CLAUDE.md
@@ -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.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c589902e9b..e9115615dc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -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 ` 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 `` 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!
diff --git a/README.md b/README.md
index 7803cf8ec5..26afd2f362 100644
--- a/README.md
+++ b/README.md
@@ -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
+
diff --git a/codecov.yml b/codecov.yml
index b49179c3ed..35e93ceb04 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -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%
diff --git a/contrib/container/.env b/contrib/container/.env
index 33ffc7e5ee..58bfbf4e97 100644
--- a/contrib/container/.env
+++ b/contrib/container/.env
@@ -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)
diff --git a/contrib/container/Dockerfile b/contrib/container/Dockerfile
index 2a8693f11d..5864a68627 100644
--- a/contrib/container/Dockerfile
+++ b/contrib/container/Dockerfile
@@ -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"]
diff --git a/contrib/container/docker-compose.yml b/contrib/container/docker-compose.yml
index 9b8abc5b05..ce8b958a09 100644
--- a/contrib/container/docker-compose.yml
+++ b/contrib/container/docker-compose.yml
@@ -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:
diff --git a/contrib/container/gunicorn.conf.py b/contrib/container/gunicorn.conf.py
index 682f75b50d..9f95c0e53a 100644
--- a/contrib/container/gunicorn.conf.py
+++ b/contrib/container/gunicorn.conf.py
@@ -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:
diff --git a/contrib/container/requirements.in b/contrib/container/requirements.in
index 932b942c3d..1e29f27b0d 100644
--- a/contrib/container/requirements.in
+++ b/contrib/container/requirements.in
@@ -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
diff --git a/contrib/container/requirements.txt b/contrib/container/requirements.txt
index 6e0559a9c2..eaf8d51a87 100644
--- a/contrib/container/requirements.txt
+++ b/contrib/container/requirements.txt
@@ -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 \
diff --git a/contrib/dev_reqs/requirements.in b/contrib/dev_reqs/requirements.in
index c148de0a40..115b23c47f 100644
--- a/contrib/dev_reqs/requirements.in
+++ b/contrib/dev_reqs/requirements.in
@@ -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
diff --git a/contrib/dev_reqs/requirements.txt b/contrib/dev_reqs/requirements.txt
index 0591b6d8a6..cf3d1a6d56 100644
--- a/contrib/dev_reqs/requirements.txt
+++ b/contrib/dev_reqs/requirements.txt
@@ -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
diff --git a/contrib/packager.io/functions.sh b/contrib/packager.io/functions.sh
index c4703d6eba..2705a369e8 100755
--- a/contrib/packager.io/functions.sh
+++ b/contrib/packager.io/functions.sh
@@ -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
diff --git a/contrib/packager.io/postinstall.sh b/contrib/packager.io/postinstall.sh
index a3ae0b0802..5660900b65 100755
--- a/contrib/packager.io/postinstall.sh
+++ b/contrib/packager.io/postinstall.sh
@@ -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
diff --git a/docs/docs/api/index.md b/docs/docs/api/index.md
index 256eddd9cf..fa05c6bc2d 100644
--- a/docs/docs/api/index.md
+++ b/docs/docs/api/index.md
@@ -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
diff --git a/docs/docs/app/barcode.md b/docs/docs/app/barcode.md
index 2645287f76..21eebb315f 100644
--- a/docs/docs/app/barcode.md
+++ b/docs/docs/app/barcode.md
@@ -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):
diff --git a/docs/docs/assets/images/concepts/ui_navigation_tree.png b/docs/docs/assets/images/concepts/ui_navigation_tree.png
index 5d274452ab8141e4bac90050a0e3631cc067519f..e124cd51bfa729103ee9ae47db7ca374c39ef765 100644
GIT binary patch
literal 41520
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