mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-17 18:26:32 +00:00
Merge branch 'master' of https://github.com/inventree/InvenTree into matmair/issue6281
This commit is contained in:
.devcontainer
.git-blame-ignore-revs.github
.gitignore.pre-commit-config.yaml.vscode
CONTRIBUTING.mdProcfileREADME.mdassets/images/logo
ci
contrib
container
.envCaddyfileDockerfiledev-docker-compose.ymldocker-compose.ymldocker.dev.envgunicorn.conf.pyinit.shinstall_build_packages.shrequirements.txt
deploy
docs
pyproject.tomlreadthedocs.ymlrequirements.txtsrc
backend
InvenTree
InvenTree
__init__.pyadmin.pyapi.pyapi_version.pyapps.pybackends.pyci_render_js.pyconfig.pycontext.pyconversion.pyemail.pyexceptions.pyexchange.pyfields.pyfiles.pyfilters.pyformat.pyforms.pyhelpers.pyhelpers_mixin.pyhelpers_model.pylocales.pymagic_login.pymetadata.pymiddleware.pystatus.pystatus_codes.pytasks.pytemplate.py
management
commands
migrations
mixins.pymodels.pypermissions.pyready.pysanitizer.pysentry.pyserializers.pysettings.pysocial_auth_urls.pysso.pystatic
bootstrap-table
bootstrap-table.cssbootstrap-table.jsbootstrap-table.min.cssbootstrap-table.min.js
extensions
addrbar
auto-refresh
cookie
copy-rows
custom-view
defer-url
editable
export
filter-control
bootstrap-table-filter-control.cssbootstrap-table-filter-control.jsbootstrap-table-filter-control.min.cssbootstrap-table-filter-control.min.jsutils.jsutils.min.js
fixed-columns
bootstrap-table-fixed-columns.cssbootstrap-table-fixed-columns.jsbootstrap-table-fixed-columns.min.cssbootstrap-table-fixed-columns.min.js
group-by-v2
bootstrap-table-group-by.cssbootstrap-table-group-by.jsbootstrap-table-group-by.min.cssbootstrap-table-group-by.min.js
i18n-enhance
key-events
mobile
multiple-sort
page-jump-to
bootstrap-table-page-jump-to.cssbootstrap-table-page-jump-to.jsbootstrap-table-page-jump-to.min.cssbootstrap-table-page-jump-to.min.js
pipeline
print
reorder-columns
reorder-rows
bootstrap-table-reorder-rows.cssbootstrap-table-reorder-rows.jsbootstrap-table-reorder-rows.min.cssbootstrap-table-reorder-rows.min.js
resizable
sticky-header
bootstrap-table-sticky-header.cssbootstrap-table-sticky-header.jsbootstrap-table-sticky-header.min.cssbootstrap-table-sticky-header.min.js
toolbar
treegrid
themes
bootstrap-table
bulma
bootstrap-table-bulma.cssbootstrap-table-bulma.jsbootstrap-table-bulma.min.cssbootstrap-table-bulma.min.js
foundation
bootstrap-table-foundation.cssbootstrap-table-foundation.jsbootstrap-table-foundation.min.cssbootstrap-table-foundation.min.js
materialize
bootstrap-table-materialize.cssbootstrap-table-materialize.jsbootstrap-table-materialize.min.cssbootstrap-table-materialize.min.js
semantic
bootstrap
css
bootstrap-grid.cssbootstrap-grid.css.mapbootstrap-grid.min.cssbootstrap-grid.min.css.mapbootstrap-grid.rtl.cssbootstrap-grid.rtl.css.mapbootstrap-grid.rtl.min.cssbootstrap-grid.rtl.min.css.mapbootstrap-reboot.cssbootstrap-reboot.css.mapbootstrap-reboot.min.cssbootstrap-reboot.min.css.mapbootstrap-reboot.rtl.cssbootstrap-reboot.rtl.css.mapbootstrap-reboot.rtl.min.cssbootstrap-reboot.rtl.min.css.mapbootstrap-utilities.cssbootstrap-utilities.css.mapbootstrap-utilities.min.cssbootstrap-utilities.min.css.mapbootstrap-utilities.rtl.cssbootstrap-utilities.rtl.css.mapbootstrap-utilities.rtl.min.cssbootstrap-utilities.rtl.min.css.mapbootstrap.cssbootstrap.css.mapbootstrap.min.cssbootstrap.min.css.mapbootstrap.rtl.cssbootstrap.rtl.css.mapbootstrap.rtl.min.cssbootstrap.rtl.min.css.map
js
css
easymde
fontawesome
LICENSE.txt
css
all.cssall.min.cssbrands.cssbrands.min.cssfontawesome.cssfontawesome.min.cssregular.cssregular.min.csssolid.csssolid.min.csssvg-with-js.csssvg-with-js.min.cssv4-shims.cssv4-shims.min.css
js
all.jsall.min.jsbrands.jsbrands.min.jsconflict-detection.jsconflict-detection.min.jsfontawesome.jsfontawesome.min.jsregular.jsregular.min.jssolid.jssolid.min.jsv4-shims.jsv4-shims.min.js
less
_animated.less_bordered-pulled.less_core.less_fixed-width.less_icons.less_larger.less_list.less_mixins.less_rotated-flipped.less_screen-reader.less_shims.less_stacked.less_variables.lessbrands.lessfontawesome.lessregular.lesssolid.lessv4-shims.less
metadata
scss
_animated.scss_bordered-pulled.scss_core.scss_fixed-width.scss_icons.scss_larger.scss_list.scss_mixins.scss_rotated-flipped.scss_screen-reader.scss_shims.scss_stacked.scss_variables.scssbrands.scssfontawesome.scssregular.scsssolid.scssv4-shims.scss
sprites
svgs
brands
500px.svgaccessible-icon.svgaccusoft.svgacquisitions-incorporated.svgadn.svgadobe.svgadversal.svgaffiliatetheme.svgairbnb.svgalgolia.svgalipay.svgamazon-pay.svgamazon.svgamilia.svgandroid.svgangellist.svgangrycreative.svgangular.svgapp-store-ios.svgapp-store.svgapper.svgapple-pay.svgapple.svgartstation.svgasymmetrik.svgatlassian.svgaudible.svgautoprefixer.svgavianex.svgaviato.svgaws.svgbandcamp.svgbattle-net.svgbehance-square.svgbehance.svgbimobject.svgbitbucket.svgbitcoin.svgbity.svgblack-tie.svgblackberry.svgblogger-b.svgblogger.svgbluetooth-b.svgbluetooth.svgbootstrap.svgbtc.svgbuffer.svgburomobelexperte.svgbuy-n-large.svgbuysellads.svgcanadian-maple-leaf.svgcc-amazon-pay.svgcc-amex.svgcc-apple-pay.svgcc-diners-club.svgcc-discover.svgcc-jcb.svgcc-mastercard.svgcc-paypal.svgcc-stripe.svgcc-visa.svgcentercode.svgcentos.svgchrome.svgchromecast.svgcloudscale.svgcloudsmith.svgcloudversify.svgcodepen.svgcodiepie.svgconfluence.svgconnectdevelop.svgcontao.svgcotton-bureau.svgcpanel.svgcreative-commons-by.svgcreative-commons-nc-eu.svgcreative-commons-nc-jp.svgcreative-commons-nc.svgcreative-commons-nd.svgcreative-commons-pd-alt.svgcreative-commons-pd.svgcreative-commons-remix.svgcreative-commons-sa.svgcreative-commons-sampling-plus.svgcreative-commons-sampling.svgcreative-commons-share.svgcreative-commons-zero.svgcreative-commons.svgcritical-role.svgcss3-alt.svgcss3.svgcuttlefish.svgd-and-d-beyond.svgd-and-d.svgdailymotion.svgdashcube.svgdelicious.svgdeploydog.svgdeskpro.svgdev.svgdeviantart.svgdhl.svgdiaspora.svgdigg.svgdigital-ocean.svgdiscord.svgdiscourse.svgdochub.svgdocker.svgdraft2digital.svgdribbble-square.svgdribbble.svgdropbox.svgdrupal.svgdyalog.svgearlybirds.svgebay.svgedge.svgelementor.svgello.svgember.svgempire.svgenvira.svgerlang.svgethereum.svgetsy.svgevernote.svgexpeditedssl.svgfacebook-f.svgfacebook-messenger.svgfacebook-square.svgfacebook.svgfantasy-flight-games.svgfedex.svgfedora.svgfigma.svgfirefox-browser.svgfirefox.svgfirst-order-alt.svgfirst-order.svgfirstdraft.svgflickr.svgflipboard.svgfly.svgfont-awesome-alt.svgfont-awesome-flag.svgfont-awesome-logo-full.svgfont-awesome.svgfonticons-fi.svgfonticons.svgfort-awesome-alt.svgfort-awesome.svgforumbee.svgfoursquare.svgfree-code-camp.svgfreebsd.svgfulcrum.svggalactic-republic.svggalactic-senate.svgget-pocket.svggg-circle.svggg.svggit-alt.svggit-square.svggit.svggithub-alt.svggithub-square.svggithub.svggitkraken.svggitlab.svggitter.svgglide-g.svgglide.svggofore.svggoodreads-g.svggoodreads.svggoogle-drive.svggoogle-play.svggoogle-plus-g.svggoogle-plus-square.svggoogle-plus.svggoogle-wallet.svggoogle.svggratipay.svggrav.svggripfire.svggrunt.svggulp.svghacker-news-square.svghacker-news.svghackerrank.svghips.svghire-a-helper.svghooli.svghornbill.svghotjar.svghouzz.svghtml5.svghubspot.svgideal.svgimdb.svginstagram-square.svginstagram.svgintercom.svginternet-explorer.svginvision.svgioxhost.svgitch-io.svgitunes-note.svgitunes.svgjava.svgjedi-order.svgjenkins.svgjira.svgjoget.svgjoomla.svgjs-square.svgjs.svgjsfiddle.svgkaggle.svgkeybase.svgkeycdn.svgkickstarter-k.svgkickstarter.svgkorvue.svglaravel.svglastfm-square.svglastfm.svgleanpub.svgless.svgline.svglinkedin-in.svglinkedin.svglinode.svglinux.svglyft.svgmagento.svgmailchimp.svgmandalorian.svgmarkdown.svgmastodon.svgmaxcdn.svgmdb.svgmedapps.svgmedium-m.svgmedium.svgmedrt.svgmeetup.svgmegaport.svgmendeley.svgmicroblog.svgmicrosoft.svgmix.svgmixcloud.svgmixer.svgmizuni.svgmodx.svgmonero.svgnapster.svgneos.svgnimblr.svgnode-js.svgnode.svgnpm.svgns8.svgnutritionix.svgodnoklassniki-square.svgodnoklassniki.svgold-republic.svgopencart.svgopenid.svgopera.svgoptin-monster.svgorcid.svgosi.svgpage4.svgpagelines.svgpalfed.svgpatreon.svgpaypal.svgpenny-arcade.svgperiscope.svgphabricator.svgphoenix-framework.svgphoenix-squadron.svgphp.svgpied-piper-alt.svgpied-piper-hat.svgpied-piper-pp.svgpied-piper-square.svgpied-piper.svgpinterest-p.svgpinterest-square.svgpinterest.svgplaystation.svgproduct-hunt.svgpushed.svgpython.svgqq.svgquinscape.svgquora.svgr-project.svgraspberry-pi.svgravelry.svgreact.svgreacteurope.svgreadme.svgrebel.svgred-river.svgreddit-alien.svgreddit-square.svgreddit.svgredhat.svgrenren.svgreplyd.svgresearchgate.svgresolving.svgrev.svgrocketchat.svgrockrms.svgsafari.svgsalesforce.svgsass.svgschlix.svgscribd.svgsearchengin.svgsellcast.svgsellsy.svgservicestack.svgshirtsinbulk.svgshopify.svgshopware.svgsimplybuilt.svgsistrix.svgsith.svgsketch.svgskyatlas.svgskype.svgslack-hash.svgslack.svgslideshare.svgsnapchat-ghost.svgsnapchat-square.svgsnapchat.svgsoundcloud.svgsourcetree.svgspeakap.svgspeaker-deck.svgspotify.svgsquarespace.svgstack-exchange.svgstack-overflow.svgstackpath.svgstaylinked.svgsteam-square.svgsteam-symbol.svgsteam.svgsticker-mule.svgstrava.svgstripe-s.svgstripe.svgstudiovinari.svgstumbleupon-circle.svgstumbleupon.svgsuperpowers.svgsupple.svgsuse.svgswift.svgsymfony.svgteamspeak.svgtelegram-plane.svgtelegram.svgtencent-weibo.svgthe-red-yeti.svgthemeco.svgthemeisle.svgthink-peaks.svgtrade-federation.svgtrello.svgtripadvisor.svgtumblr-square.svgtumblr.svgtwitch.svgtwitter-square.svgtwitter.svgtypo3.svguber.svgubuntu.svguikit.svgumbraco.svguniregistry.svgunity.svguntappd.svgups.svgusb.svgusps.svgussunnah.svgvaadin.svgviacoin.svgviadeo-square.svgviadeo.svgviber.svgvimeo-square.svgvimeo-v.svgvimeo.svgvine.svgvk.svgvnv.svgvuejs.svgwaze.svgweebly.svgweibo.svgweixin.svgwhatsapp-square.svgwhatsapp.svgwhmcs.svgwikipedia-w.svgwindows.svgwix.svgwizards-of-the-coast.svgwolf-pack-battalion.svgwordpress-simple.svgwordpress.svgwpbeginner.svgwpexplorer.svgwpforms.svgwpressr.svgxbox.svgxing-square.svgxing.svgy-combinator.svgyahoo.svgyammer.svgyandex-international.svgyandex.svgyarn.svgyelp.svgyoast.svgyoutube-square.svgyoutube.svgzhihu.svg
regular
address-book.svgaddress-card.svgangry.svgarrow-alt-circle-down.svgarrow-alt-circle-left.svgarrow-alt-circle-right.svgarrow-alt-circle-up.svgbell-slash.svgbell.svgbookmark.svgbuilding.svgcalendar-alt.svgcalendar-check.svgcalendar-minus.svgcalendar-plus.svgcalendar-times.svgcalendar.svgcaret-square-down.svgcaret-square-left.svgcaret-square-right.svgcaret-square-up.svgchart-bar.svgcheck-circle.svgcheck-square.svgcircle.svgclipboard.svgclock.svgclone.svgclosed-captioning.svgcomment-alt.svgcomment-dots.svgcomment.svgcomments.svgcompass.svgcopy.svgcopyright.svgcredit-card.svgdizzy.svgdot-circle.svgedit.svgenvelope-open.svgenvelope.svgeye-slash.svgeye.svgfile-alt.svgfile-archive.svgfile-audio.svgfile-code.svgfile-excel.svgfile-image.svgfile-pdf.svgfile-powerpoint.svgfile-video.svgfile-word.svgfile.svgflag.svgflushed.svgfolder-open.svgfolder.svgfont-awesome-logo-full.svgfrown-open.svgfrown.svgfutbol.svggem.svggrimace.svggrin-alt.svggrin-beam-sweat.svggrin-beam.svggrin-hearts.svggrin-squint-tears.svggrin-squint.svggrin-stars.svggrin-tears.svggrin-tongue-squint.svggrin-tongue-wink.svggrin-tongue.svggrin-wink.svggrin.svghand-lizard.svghand-paper.svghand-peace.svghand-point-down.svghand-point-left.svghand-point-right.svghand-point-up.svghand-pointer.svghand-rock.svghand-scissors.svghand-spock.svghandshake.svghdd.svgheart.svghospital.svghourglass.svgid-badge.svgid-card.svgimage.svgimages.svgkeyboard.svgkiss-beam.svgkiss-wink-heart.svgkiss.svglaugh-beam.svglaugh-squint.svglaugh-wink.svglaugh.svglemon.svglife-ring.svglightbulb.svglist-alt.svgmap.svgmeh-blank.svgmeh-rolling-eyes.svgmeh.svgminus-square.svgmoney-bill-alt.svgmoon.svgnewspaper.svgobject-group.svgobject-ungroup.svgpaper-plane.svgpause-circle.svgplay-circle.svgplus-square.svgquestion-circle.svgregistered.svgsad-cry.svgsad-tear.svgsave.svgshare-square.svgsmile-beam.svgsmile-wink.svgsmile.svgsnowflake.svgsquare.svgstar-half.svgstar.svgsticky-note.svgstop-circle.svgsun.svgsurprise.svgthumbs-down.svgthumbs-up.svgtimes-circle.svgtired.svgtrash-alt.svguser-circle.svguser.svgwindow-close.svgwindow-maximize.svgwindow-minimize.svgwindow-restore.svg
solid
ad.svgaddress-book.svgaddress-card.svgadjust.svgair-freshener.svgalign-center.svgalign-justify.svgalign-left.svgalign-right.svgallergies.svgambulance.svgamerican-sign-language-interpreting.svganchor.svgangle-double-down.svgangle-double-left.svgangle-double-right.svgangle-double-up.svgangle-down.svgangle-left.svgangle-right.svgangle-up.svgangry.svgankh.svgapple-alt.svgarchive.svgarchway.svgarrow-alt-circle-down.svgarrow-alt-circle-left.svgarrow-alt-circle-right.svgarrow-alt-circle-up.svgarrow-circle-down.svgarrow-circle-left.svgarrow-circle-right.svgarrow-circle-up.svgarrow-down.svgarrow-left.svgarrow-right.svgarrow-up.svgarrows-alt-h.svgarrows-alt-v.svgarrows-alt.svgassistive-listening-systems.svgasterisk.svgat.svgatlas.svgatom.svgaudio-description.svgaward.svgbaby-carriage.svgbaby.svgbackspace.svgbackward.svgbacon.svgbahai.svgbalance-scale-left.svgbalance-scale-right.svgbalance-scale.svgban.svgband-aid.svgbarcode.svgbars.svgbaseball-ball.svgbasketball-ball.svgbath.svgbattery-empty.svgbattery-full.svgbattery-half.svgbattery-quarter.svgbattery-three-quarters.svgbed.svgbeer.svgbell-slash.svgbell.svgbezier-curve.svgbible.svgbicycle.svgbiking.svgbinoculars.svgbiohazard.svgbirthday-cake.svgblender-phone.svgblender.svgblind.svgblog.svgbold.svgbolt.svgbomb.svgbone.svgbong.svgbook-dead.svgbook-medical.svgbook-open.svgbook-reader.svgbook.svgbookmark.svgborder-all.svgborder-none.svgborder-style.svgbowling-ball.svgbox-open.svgbox-tissue.svgbox.svgboxes.svgbraille.svgbrain.svgbread-slice.svgbriefcase-medical.svgbriefcase.svgbroadcast-tower.svgbroom.svgbrush.svgbug.svgbuilding.svgbullhorn.svgbullseye.svgburn.svgbus-alt.svgbus.svgbusiness-time.svgcalculator.svgcalendar-alt.svgcalendar-check.svgcalendar-day.svgcalendar-minus.svgcalendar-plus.svgcalendar-times.svgcalendar-week.svgcalendar.svgcamera-retro.svgcamera.svgcampground.svgcandy-cane.svgcannabis.svgcapsules.svgcar-alt.svgcar-battery.svgcar-crash.svgcar-side.svgcar.svgcaravan.svgcaret-down.svgcaret-left.svgcaret-right.svgcaret-square-down.svgcaret-square-left.svgcaret-square-right.svgcaret-square-up.svgcaret-up.svgcarrot.svgcart-arrow-down.svgcart-plus.svgcash-register.svgcat.svgcertificate.svgchair.svgchalkboard-teacher.svgchalkboard.svgcharging-station.svgchart-area.svgchart-bar.svgchart-line.svgchart-pie.svgcheck-circle.svgcheck-double.svgcheck-square.svgcheck.svgcheese.svgchess-bishop.svgchess-board.svgchess-king.svgchess-knight.svgchess-pawn.svgchess-queen.svgchess-rook.svgchess.svgchevron-circle-down.svgchevron-circle-left.svgchevron-circle-right.svgchevron-circle-up.svgchevron-down.svgchevron-left.svgchevron-right.svgchevron-up.svgchild.svgchurch.svgcircle-notch.svgcircle.svgcity.svgclinic-medical.svgclipboard-check.svgclipboard-list.svgclipboard.svgclock.svgclone.svgclosed-captioning.svgcloud-download-alt.svgcloud-meatball.svgcloud-moon-rain.svgcloud-moon.svgcloud-rain.svgcloud-showers-heavy.svgcloud-sun-rain.svgcloud-sun.svgcloud-upload-alt.svgcloud.svgcocktail.svgcode-branch.svgcode.svgcoffee.svgcog.svgcogs.svgcoins.svgcolumns.svgcomment-alt.svgcomment-dollar.svgcomment-dots.svgcomment-medical.svgcomment-slash.svgcomment.svgcomments-dollar.svgcomments.svgcompact-disc.svgcompass.svgcompress-alt.svgcompress-arrows-alt.svgcompress.svgconcierge-bell.svgcookie-bite.svgcookie.svgcopy.svgcopyright.svgcouch.svgcredit-card.svgcrop-alt.svgcrop.svgcross.svgcrosshairs.svgcrow.svgcrown.svgcrutch.svgcube.svgcubes.svgcut.svgdatabase.svgdeaf.svgdemocrat.svgdesktop.svgdharmachakra.svgdiagnoses.svgdice-d20.svgdice-d6.svgdice-five.svgdice-four.svgdice-one.svgdice-six.svgdice-three.svgdice-two.svgdice.svgdigital-tachograph.svgdirections.svgdisease.svgdivide.svgdizzy.svgdna.svgdog.svgdollar-sign.svgdolly-flatbed.svgdolly.svgdonate.svgdoor-closed.svgdoor-open.svgdot-circle.svgdove.svgdownload.svgdrafting-compass.svgdragon.svgdraw-polygon.svgdrum-steelpan.svgdrum.svgdrumstick-bite.svgdumbbell.svgdumpster-fire.svgdumpster.svgdungeon.svgedit.svgegg.svgeject.svgellipsis-h.svgellipsis-v.svgenvelope-open-text.svgenvelope-open.svgenvelope-square.svgenvelope.svgequals.svgeraser.svgethernet.svgeuro-sign.svgexchange-alt.svgexclamation-circle.svgexclamation-triangle.svgexclamation.svgexpand-alt.svgexpand-arrows-alt.svgexpand.svgexternal-link-alt.svgexternal-link-square-alt.svgeye-dropper.svgeye-slash.svgeye.svgfan.svgfast-backward.svgfast-forward.svgfaucet.svgfax.svgfeather-alt.svgfeather.svgfemale.svgfighter-jet.svgfile-alt.svgfile-archive.svgfile-audio.svgfile-code.svgfile-contract.svgfile-csv.svgfile-download.svgfile-excel.svgfile-export.svgfile-image.svgfile-import.svgfile-invoice-dollar.svgfile-invoice.svgfile-medical-alt.svgfile-medical.svgfile-pdf.svgfile-powerpoint.svgfile-prescription.svgfile-signature.svgfile-upload.svgfile-video.svgfile-word.svgfile.svgfill-drip.svgfill.svgfilm.svgfilter.svgfingerprint.svgfire-alt.svgfire-extinguisher.svgfire.svgfirst-aid.svgfish.svgfist-raised.svgflag-checkered.svgflag-usa.svgflag.svgflask.svgflushed.svgfolder-minus.svgfolder-open.svgfolder-plus.svgfolder.svgfont-awesome-logo-full.svgfont.svgfootball-ball.svgforward.svgfrog.svgfrown-open.svgfrown.svgfunnel-dollar.svgfutbol.svggamepad.svggas-pump.svggavel.svggem.svggenderless.svgghost.svggift.svggifts.svgglass-cheers.svgglass-martini-alt.svgglass-martini.svgglass-whiskey.svgglasses.svgglobe-africa.svgglobe-americas.svgglobe-asia.svgglobe-europe.svgglobe.svggolf-ball.svggopuram.svggraduation-cap.svggreater-than-equal.svggreater-than.svggrimace.svggrin-alt.svggrin-beam-sweat.svggrin-beam.svggrin-hearts.svggrin-squint-tears.svggrin-squint.svggrin-stars.svggrin-tears.svggrin-tongue-squint.svggrin-tongue-wink.svggrin-tongue.svggrin-wink.svggrin.svggrip-horizontal.svggrip-lines-vertical.svggrip-lines.svggrip-vertical.svgguitar.svgh-square.svghamburger.svghammer.svghamsa.svghand-holding-heart.svghand-holding-medical.svghand-holding-usd.svghand-holding-water.svghand-holding.svghand-lizard.svghand-middle-finger.svghand-paper.svghand-peace.svghand-point-down.svghand-point-left.svghand-point-right.svghand-point-up.svghand-pointer.svghand-rock.svghand-scissors.svghand-sparkles.svghand-spock.svghands-helping.svghands-wash.svghands.svghandshake-alt-slash.svghandshake-slash.svghandshake.svghanukiah.svghard-hat.svghashtag.svghat-cowboy-side.svghat-cowboy.svghat-wizard.svghdd.svghead-side-cough-slash.svghead-side-cough.svghead-side-mask.svghead-side-virus.svgheading.svgheadphones-alt.svgheadphones.svgheadset.svgheart-broken.svgheart.svgheartbeat.svghelicopter.svghighlighter.svghiking.svghippo.svghistory.svghockey-puck.svgholly-berry.svghome.svghorse-head.svghorse.svghospital-alt.svghospital-symbol.svghospital-user.svghospital.svghot-tub.svghotdog.svghotel.svghourglass-end.svghourglass-half.svghourglass-start.svghourglass.svghouse-damage.svghouse-user.svghryvnia.svgi-cursor.svgice-cream.svgicicles.svgicons.svgid-badge.svgid-card-alt.svgid-card.svgigloo.svgimage.svgimages.svginbox.svgindent.svgindustry.svginfinity.svginfo-circle.svginfo.svgitalic.svgjedi.svgjoint.svgjournal-whills.svgkaaba.svgkey.svgkeyboard.svgkhanda.svgkiss-beam.svgkiss-wink-heart.svgkiss.svgkiwi-bird.svglandmark.svglanguage.svglaptop-code.svglaptop-house.svglaptop-medical.svglaptop.svglaugh-beam.svglaugh-squint.svglaugh-wink.svglaugh.svglayer-group.svgleaf.svglemon.svgless-than-equal.svgless-than.svglevel-down-alt.svglevel-up-alt.svglife-ring.svglightbulb.svglink.svglira-sign.svglist-alt.svglist-ol.svglist-ul.svglist.svglocation-arrow.svglock-open.svglock.svglong-arrow-alt-down.svglong-arrow-alt-left.svglong-arrow-alt-right.svglong-arrow-alt-up.svglow-vision.svgluggage-cart.svglungs-virus.svglungs.svgmagic.svgmagnet.svgmail-bulk.svgmale.svgmap-marked-alt.svgmap-marked.svgmap-marker-alt.svgmap-marker.svgmap-pin.svgmap-signs.svgmap.svgmarker.svgmars-double.svgmars-stroke-h.svgmars-stroke-v.svgmars-stroke.svgmars.svgmask.svgmedal.svgmedkit.svgmeh-blank.svgmeh-rolling-eyes.svgmeh.svgmemory.svgmenorah.svgmercury.svgmeteor.svgmicrochip.svgmicrophone-alt-slash.svgmicrophone-alt.svgmicrophone-slash.svgmicrophone.svgmicroscope.svgminus-circle.svgminus-square.svgminus.svgmitten.svgmobile-alt.svgmobile.svgmoney-bill-alt.svgmoney-bill-wave-alt.svgmoney-bill-wave.svgmoney-bill.svgmoney-check-alt.svgmoney-check.svgmonument.svgmoon.svgmortar-pestle.svgmosque.svgmotorcycle.svgmountain.svgmouse-pointer.svgmouse.svgmug-hot.svgmusic.svgnetwork-wired.svgneuter.svgnewspaper.svgnot-equal.svgnotes-medical.svgobject-group.svgobject-ungroup.svgoil-can.svgom.svgotter.svgoutdent.svgpager.svgpaint-brush.svgpaint-roller.svgpalette.svgpallet.svgpaper-plane.svgpaperclip.svgparachute-box.svgparagraph.svgparking.svgpassport.svgpastafarianism.svgpaste.svgpause-circle.svgpause.svgpaw.svgpeace.svgpen-alt.svgpen-fancy.svgpen-nib.svgpen-square.svgpen.svgpencil-alt.svgpencil-ruler.svgpeople-arrows.svgpeople-carry.svgpepper-hot.svgpercent.svgpercentage.svgperson-booth.svgphone-alt.svgphone-slash.svgphone-square-alt.svgphone-square.svgphone-volume.svgphone.svgphoto-video.svgpiggy-bank.svgpills.svgpizza-slice.svgplace-of-worship.svgplane-arrival.svgplane-departure.svgplane-slash.svgplane.svgplay-circle.svgplay.svgplug.svgplus-circle.svgplus-square.svgplus.svgpodcast.svgpoll-h.svgpoll.svgpoo-storm.svgpoo.svgpoop.svgportrait.svgpound-sign.svgpower-off.svgpray.svgpraying-hands.svgprescription-bottle-alt.svgprescription-bottle.svgprescription.svgprint.svgprocedures.svgproject-diagram.svgpump-medical.svgpump-soap.svgpuzzle-piece.svgqrcode.svgquestion-circle.svgquestion.svgquidditch.svgquote-left.svgquote-right.svgquran.svgradiation-alt.svgradiation.svgrainbow.svgrandom.svgreceipt.svgrecord-vinyl.svgrecycle.svgredo-alt.svgredo.svgregistered.svgremove-format.svgreply-all.svgreply.svgrepublican.svgrestroom.svgretweet.svgribbon.svgring.svgroad.svgrobot.svgrocket.svgroute.svgrss-square.svgrss.svgruble-sign.svgruler-combined.svgruler-horizontal.svgruler-vertical.svgruler.svgrunning.svgrupee-sign.svgsad-cry.svgsad-tear.svgsatellite-dish.svgsatellite.svgsave.svgschool.svgscrewdriver.svgscroll.svgsd-card.svgsearch-dollar.svgsearch-location.svgsearch-minus.svgsearch-plus.svgsearch.svgseedling.svgserver.svgshapes.svgshare-alt-square.svgshare-alt.svgshare-square.svgshare.svgshekel-sign.svgshield-alt.svgshield-virus.svgship.svgshipping-fast.svgshoe-prints.svgshopping-bag.svgshopping-basket.svgshopping-cart.svgshower.svgshuttle-van.svgsign-in-alt.svgsign-language.svgsign-out-alt.svgsign.svgsignal.svgsignature.svgsim-card.svgsitemap.svgskating.svgskiing-nordic.svgskiing.svgskull-crossbones.svgskull.svgslash.svgsleigh.svgsliders-h.svgsmile-beam.svgsmile-wink.svgsmile.svgsmog.svgsmoking-ban.svgsmoking.svgsms.svgsnowboarding.svgsnowflake.svgsnowman.svgsnowplow.svgsoap.svgsocks.svgsolar-panel.svgsort-alpha-down-alt.svgsort-alpha-down.svgsort-alpha-up-alt.svgsort-alpha-up.svgsort-amount-down-alt.svgsort-amount-down.svgsort-amount-up-alt.svgsort-amount-up.svgsort-down.svgsort-numeric-down-alt.svgsort-numeric-down.svgsort-numeric-up-alt.svgsort-numeric-up.svgsort-up.svgsort.svgspa.svgspace-shuttle.svgspell-check.svgspider.svgspinner.svgsplotch.svgspray-can.svgsquare-full.svgsquare-root-alt.svgsquare.svgstamp.svgstar-and-crescent.svgstar-half-alt.svgstar-half.svgstar-of-david.svgstar-of-life.svgstar.svgstep-backward.svgstep-forward.svgstethoscope.svgsticky-note.svgstop-circle.svgstop.svgstopwatch-20.svgstopwatch.svgstore-alt-slash.svgstore-alt.svgstore-slash.svgstore.svgstream.svgstreet-view.svgstrikethrough.svgstroopwafel.svgsubscript.svgsubway.svgsuitcase-rolling.svgsuitcase.svgsun.svgsuperscript.svgsurprise.svgswatchbook.svgswimmer.svgswimming-pool.svgsynagogue.svgsync-alt.svgsync.svgsyringe.svgtable-tennis.svgtable.svgtablet-alt.svgtablet.svgtablets.svgtachometer-alt.svgtag.svgtags.svgtape.svgtasks.svgtaxi.svgteeth-open.svgteeth.svgtemperature-high.svgtemperature-low.svgtenge.svgterminal.svgtext-height.svgtext-width.svgth-large.svgth-list.svgth.svgtheater-masks.svgthermometer-empty.svgthermometer-full.svgthermometer-half.svgthermometer-quarter.svgthermometer-three-quarters.svgthermometer.svgthumbs-down.svgthumbs-up.svgthumbtack.svgticket-alt.svgtimes-circle.svgtimes.svgtint-slash.svgtint.svgtired.svgtoggle-off.svgtoggle-on.svgtoilet-paper-slash.svgtoilet-paper.svgtoilet.svgtoolbox.svgtools.svgtooth.svgtorah.svgtorii-gate.svgtractor.svgtrademark.svgtraffic-light.svgtrailer.svgtrain.svgtram.svgtransgender-alt.svgtransgender.svgtrash-alt.svgtrash-restore-alt.svgtrash-restore.svgtrash.svgtree.svgtrophy.svgtruck-loading.svgtruck-monster.svgtruck-moving.svgtruck-pickup.svgtruck.svgtshirt.svgtty.svgtv.svgumbrella-beach.svgumbrella.svgunderline.svgundo-alt.svgundo.svguniversal-access.svguniversity.svgunlink.svgunlock-alt.svgunlock.svgupload.svguser-alt-slash.svguser-alt.svguser-astronaut.svguser-check.svguser-circle.svguser-clock.svguser-cog.svguser-edit.svguser-friends.svguser-graduate.svguser-injured.svguser-lock.svguser-md.svguser-minus.svguser-ninja.svguser-nurse.svguser-plus.svguser-secret.svguser-shield.svguser-slash.svguser-tag.svguser-tie.svguser-times.svguser.svgusers-cog.svgusers.svgutensil-spoon.svgutensils.svgvector-square.svgvenus-double.svgvenus-mars.svgvenus.svgvial.svgvials.svgvideo-slash.svgvideo.svgvihara.svgvirus-slash.svgvirus.svgviruses.svgvoicemail.svgvolleyball-ball.svgvolume-down.svgvolume-mute.svgvolume-off.svgvolume-up.svgvote-yea.svgvr-cardboard.svgwalking.svgwallet.svgwarehouse.svgwater.svgwave-square.svgweight-hanging.svgweight.svgwheelchair.svgwifi.svgwind.svgwindow-close.svgwindow-maximize.svgwindow-minimize.svgwindow-restore.svgwine-bottle.svgwine-glass-alt.svgwine-glass.svgwon-sign.svgwrench.svgx-ray.svgyen-sign.svgyin-yang.svg
webfonts
fonts
glyphicons-halflings-regular.eotglyphicons-halflings-regular.svgglyphicons-halflings-regular.ttfglyphicons-halflings-regular.woffglyphicons-halflings-regular.woff2
fullcalendar
locales-all.jslocales-all.min.js
locales
af.jsar-dz.jsar-kw.jsar-ly.jsar-ma.jsar-sa.jsar-tn.jsar.jsaz.jsbg.jsbn.jsbs.jsca.jscs.jscy.jsda.jsde-at.jsde.jsel.jsen-au.jsen-gb.jsen-nz.jseo.jses-us.jses.jset.jseu.jsfa.jsfi.jsfr-ca.jsfr-ch.jsfr.jsgl.jshe.jshi.jshr.jshu.jshy-am.jsid.jsis.jsit.jsja.jska.jskk.jskm.jsko.jsku.jslb.jslt.jslv.jsmk.jsms.jsnb.jsne.jsnl.jsnn.jspl.jspt-br.jspt.jsro.jsru.jssi-lk.jssk.jssl.jssm.jssq.jssr-cyrl.jssr.jssv.jsta-in.jsth.jstr.jsug.jsuk.jsuz.jsvi.jszh-cn.jszh-tw.js
main.cssmain.jsmain.min.cssmain.min.jsimg
blank_image.pngblank_image.thumbnail.png
favicon
android-icon-144x144.pngandroid-icon-192x192.pngandroid-icon-36x36.pngandroid-icon-48x48.pngandroid-icon-72x72.pngandroid-icon-96x96.pngapple-icon-114x114.pngapple-icon-120x120.pngapple-icon-144x144.pngapple-icon-152x152.pngapple-icon-180x180.pngapple-icon-57x57.pngapple-icon-60x60.pngapple-icon-72x72.pngapple-icon-76x76.pngapple-icon-precomposed.pngapple-icon.pngbrowserconfig.xmlfavicon-16x16.pngfavicon-32x32.pngfavicon-96x96.pngfavicon.icomanifest.jsonms-icon-144x144.pngms-icon-150x150.pngms-icon-310x310.pngms-icon-70x70.png
inventree.pnginventree_splash.jpgpaper_splash_large.jpgscript
bootstrap
chart.jschartjs-adapter-moment.jsclipboard.min.jshtml5-qrcode.min.jsinventree
jquery-ui
AUTHORS.txtLICENSE.txt
jquery.form.min.jsjquery_3.3.1_jquery.min.jsmoment.jsqrcode.min.jsrandomColor.min.jsexternal
jquery
images
ui-icons_444444_256x240.pngui-icons_555555_256x240.pngui-icons_777620_256x240.pngui-icons_777777_256x240.pngui-icons_cc0000_256x240.pngui-icons_ffffff_256x240.png
index.htmljquery-ui.cssjquery-ui.jsjquery-ui.min.cssjquery-ui.min.jsjquery-ui.structure.cssjquery-ui.structure.min.cssjquery-ui.theme.cssjquery-ui.theme.min.csspackage.jsonselect2
css
js
i18n
af.jsar.jsaz.jsbg.jsbn.jsbs.jsca.jscs.jsda.jsde.jsdsb.jsel.jsen.jses.jset.jseu.jsfa.jsfi.jsfr.jsgl.jshe.jshi.jshr.jshsb.jshu.jshy.jsid.jsis.jsit.jsja.jska.jskm.jsko.jslt.jslv.jsmk.jsms.jsnb.jsne.jsnl.jspl.jsps.jspt-BR.jspt.jsro.jsru.jssk.jssl.jssq.jssr-Cyrl.jssr.jssv.jsth.jstk.jstr.jsuk.jsvi.jszh-CN.jszh-TW.js
select2.full.jsselect2.full.min.jsselect2.jsselect2.min.jstreegrid
.gitignoreCHANGELOG.txtGruntfile.jsLICENSEREADME.mdbower.jsoncomposer.jsonexample-basic.htmlexample-bootstrap-2.htmlexample-bootstrap-3.htmlexample-bootstrap-resize.htmlexample-column.htmlexample-events.htmlexample-huge.htmlexample-save-state.html
css
examples
bootstrap-2.3.2
css
img
js
img
index.htmljs
jquery.cookie.jsjquery.treegrid.bootstrap2.jsjquery.treegrid.bootstrap3.jsjquery.treegrid.jsjquery.treegrid.min.js
package.jsonparams.jsonstyles.csstest.htmltests
treegrid.jquery.jsontemplates
InvenTree
templatetags
test_api.pytest_api_version.pytest_middleware.pytest_tasks.pytest_urls.pytest_views.pytests.pytracing.pytranslation.pyunit_test.pyurls.pyvalidators.pyversion.pyviews.pywsgi.py_testfolder
build
__init__.pyadmin.pyapi.pyapps.py
fixtures
migrations
0001_initial.py0002_auto_20190520_2204.py0003_auto_20190525_2355.py0004_auto_20190525_2356.py0005_auto_20190604_2217.py0006_auto_20190913_1407.py0007_auto_20191118_2321.py0008_auto_20200201_1247.py0009_auto_20200210_1032.py0010_auto_20200318_1027.py0011_auto_20200406_0123.py0012_build_sales_order.py0013_auto_20200425_0507.py0014_auto_20200425_1243.py0015_auto_20200425_1350.py0016_auto_20200426_0551.py0017_auto_20200426_0612.py0018_build_reference.py0019_auto_20201019_1302.py0020_auto_20201019_1325.py0021_auto_20201020_0908_squashed_0026_auto_20201023_1228.py0022_buildorderattachment.py0023_auto_20201110_0911.py0024_auto_20201201_1023.py0025_build_target_date.py0026_auto_20210216_1539.py0027_auto_20210404_2016.py0028_builditem_bom_item.py0029_auto_20210601_1525.py0030_alter_build_reference.py0031_build_reference_int.py0032_auto_20211014_0632.py0033_auto_20211128_0151.py0034_alter_build_reference_int.py0035_alter_build_notes.py0036_auto_20220707_1101.py0037_build_priority.py0038_alter_build_responsible.py0039_auto_20230317_0816.py0040_auto_20230404_1310.py0041_alter_build_title.py0042_alter_build_notes.py0043_buildline.py0044_auto_20230528_1410.py0045_builditem_build_line.py0046_auto_20230606_1033.py0047_auto_20230606_1058.py0048_build_project_code.py__init__.py
models.pyserializers.pytasks.pytemplates
test_api.pytest_build.pytest_migrations.pytests.pyurls.pyvalidators.pyviews.pycommon
__init__.pyadmin.pyapi.pyapps.pyfiles.py
fixtures
forms.pymigrations
0001_initial.py0002_auto_20190902_2304.py0003_auto_20190902_2310.py0004_inventreesetting.py0005_auto_20190915_1256.py0006_auto_20200203_0951.py0007_colortheme.py0008_remove_inventreesetting_description.py0009_delete_currency.py0010_migrate_currency_setting.py0011_auto_20210722_2114.py0012_notificationentry.py0013_webhookendpoint_webhookmessage.py0014_notificationmessage.py0015_newsfeedentry.py0016_alter_notificationentry_updated.py0017_notesimage.py0018_projectcode.py0019_projectcode_metadata.py0020_customunit.py0021_auto_20230805_1748.py0022_projectcode_responsible.py__init__.py
models.pynotifications.pyserializers.pysettings.pytasks.pytest_notifications.pytest_tasks.pytest_views.pytests.pyurls.pyviews.pycompany
__init__.pyadmin.pyapi.pyapps.pytest_api.pytest_migrations.pytest_supplier_parts.pytest_views.pytests.pyurls.pyviews.py
config_template.yamlfixtures
migrations
0001_initial.py0002_auto_20190520_2204.py0003_remove_supplierpart_minimum.py0004_auto_20190525_2354.py0005_auto_20190525_2356.py0006_supplierpricebreak_currency.py0007_remove_supplierpart_lead_time.py0008_auto_20190913_1407.py0009_auto_20191118_2323.py0010_auto_20200201_1231.py0011_auto_20200318_1114.py0012_auto_20200318_1114.py0013_auto_20200406_0131.py0014_auto_20200407_0116.py0015_company_is_manufacturer.py0016_auto_20200412_2330.py0017_auto_20200413_0320.py0018_supplierpart_manufacturer.py0019_auto_20200413_0642.py0020_auto_20200413_0839.py0021_remove_supplierpart_manufacturer_name.py0022_auto_20200613_1045.py0023_auto_20200808_0715.py0024_unique_name_email_constraint.py0025_auto_20201110_1001.py0026_auto_20201110_1011.py0027_remove_supplierpricebreak_currency.py0028_remove_supplierpricebreak_cost.py0029_company_currency.py0030_auto_20201112_1112.py0031_auto_20210103_2215.py0032_auto_20210403_1837.py0033_auto_20210410_1528.py0034_manufacturerpart.py0035_supplierpart_update_1.py0036_supplierpart_update_2.py0037_supplierpart_update_3.py0038_manufacturerpartparameter.py0039_auto_20210701_0509.py0040_alter_company_currency.py0041_alter_company_options.py0042_supplierpricebreak_updated.py0043_manufacturerpartattachment.py0044_auto_20220607_2204.py0045_alter_company_notes.py0046_alter_company_image.py0047_supplierpart_pack_size.py0048_auto_20220913_0312.py0049_company_metadata.py0050_alter_company_website.py0051_alter_supplierpricebreak_price.py0052_alter_supplierpricebreak_updated.py0053_supplierpart_updated.py0054_companyattachment.py0055_auto_20230317_0816.py0056_alter_company_notes.py0057_auto_20230427_2033.py0058_auto_20230515_0004.py0059_supplierpart_pack_units.py0060_auto_20230519_0344.py0061_remove_supplierpart_pack_size.py0062_contact_metadata.py0063_auto_20230502_1956.py0064_move_address_field_to_address_model.py0065_remove_company_address.py0066_auto_20230616_2059.py0067_alter_supplierpricebreak_price_currency.py0068_auto_20231120_1108.py__init__.py
models.pyserializers.pytemplates
company
generic
gunicorn.conf.pylabel
__init__.pyadmin.pyapi.pyapps.pytest_api.pytests.py
migrations
0001_initial.py0002_stockitemlabel_enabled.py0003_stocklocationlabel.py0004_auto_20210111_2302.py0005_auto_20210113_2302.py0006_auto_20210222_1535.py0007_auto_20210513_1327.py0008_auto_20210708_2106.py0009_auto_20230317_0816.py0010_buildlinelabel.py0011_auto_20230623_2158.py0012_labeloutput.py__init__.py
models.pyserializers.pytasks.pytemplates
label
locale
bg
LC_MESSAGES
cs
LC_MESSAGES
da
LC_MESSAGES
de
LC_MESSAGES
el
LC_MESSAGES
en
LC_MESSAGES
es
LC_MESSAGES
es_MX
LC_MESSAGES
fa
LC_MESSAGES
fi
LC_MESSAGES
fr
LC_MESSAGES
he
LC_MESSAGES
hi
LC_MESSAGES
hu
LC_MESSAGES
id
LC_MESSAGES
it
LC_MESSAGES
ja
LC_MESSAGES
ko
LC_MESSAGES
lv
LC_MESSAGES
nl
LC_MESSAGES
no
LC_MESSAGES
pl
LC_MESSAGES
pt
LC_MESSAGES
pt_br
LC_MESSAGES
ru
LC_MESSAGES
sk
LC_MESSAGES
sl
LC_MESSAGES
sr
LC_MESSAGES
sv
LC_MESSAGES
th
LC_MESSAGES
tr
LC_MESSAGES
vi
LC_MESSAGES
zh
LC_MESSAGES
zh_Hans
LC_MESSAGES
zh_hant
LC_MESSAGES
machine
__init__.pyadmin.pyapi.pyapps.pymachine_type.py
manage.pymachine_types
migrations
models.pyregistry.pyserializers.pytest_api.pytests.pyorder
__init__.pyadmin.pyapi.pyapps.pytest_api.pytest_migrations.pytest_sales_order.pytest_views.pytests.pyurls.pyvalidators.pyviews.py
fixtures
forms.pymigrations
0001_initial.py0002_auto_20190604_2224.py0003_auto_20190604_2226.py0004_purchaseorder_status.py0005_purchaseorderlineitem_part.py0006_auto_20190605_2056.py0007_auto_20190605_2138.py0008_auto_20190605_2140.py0009_auto_20190606_2133.py0010_purchaseorderlineitem_notes.py0011_auto_20190615_1928.py0012_auto_20190617_1943.py0013_auto_20191118_2323.py0014_auto_20191118_2328.py0015_auto_20200201_2346.py0016_purchaseorderattachment.py0017_auto_20200331_1000.py0018_auto_20200406_0151.py0019_purchaseorder_supplier_reference.py0020_auto_20200420_0940.py0021_auto_20200420_1010.py0022_salesorderlineitem_part.py0023_auto_20200420_2309.py0024_salesorderallocation.py0025_auto_20200422_0222.py0026_auto_20200422_0224.py0027_auto_20200422_0236.py0028_auto_20200423_0956.py0029_auto_20200423_1042.py0030_auto_20200426_0551.py0031_auto_20200426_0612.py0032_auto_20200427_0044.py0033_auto_20200512_1033.py0034_auto_20200512_1054.py0035_auto_20200513_0016.py0036_auto_20200831_0912.py0037_auto_20201110_0911.py0038_auto_20201112_1737.py0039_auto_20201112_2203.py0040_salesorder_target_date.py0041_auto_20210114_1728.py0042_auto_20210310_1619.py0043_auto_20210330_0013.py0044_auto_20210404_2016.py0045_auto_20210504_1946.py0046_purchaseorderlineitem_destination.py0047_auto_20210701_0509.py0048_auto_20210702_2321.py0049_alter_purchaseorderlineitem_unique_together.py0050_alter_purchaseorderlineitem_destination.py0051_auto_20211014_0623.py0052_auto_20211014_0631.py0053_auto_20211128_0151.py0053_salesordershipment.py0054_auto_20211201_2139.py0054_salesorderallocation_shipment.py0055_auto_20211025_0645.py0056_alter_salesorderallocation_shipment.py0057_salesorderlineitem_shipped.py0058_auto_20211126_1210.py0059_salesordershipment_tracking_number.py0060_auto_20211129_1339.py0061_merge_0054_auto_20211201_2139_0060_auto_20211129_1339.py0062_auto_20220228_0321.py0063_alter_purchaseorderlineitem_unique_together.py0064_purchaseorderextraline_salesorderextraline.py0065_alter_purchaseorderlineitem_part.py0066_alter_purchaseorder_supplier.py0067_auto_20220516_1120.py0068_alter_salesorderallocation_unique_together.py0069_auto_20220524_0508.py0070_auto_20220620_0728.py0071_auto_20220628_0133.py0072_alter_salesorder_reference.py0073_alter_purchaseorder_reference.py0074_auto_20220709_0108.py0075_auto_20221110_0108.py0076_auto_20221111_0153.py0077_auto_20230129_0154.py0078_auto_20230304_0721.py0079_auto_20230304_0904.py0080_auto_20230317_0816.py0081_auto_20230314_0725.py0082_auto_20230314_1259.py0083_returnorderextraline.py0084_auto_20230321_1111.py0085_auto_20230322_1056.py0086_auto_20230323_1108.py0087_alter_salesorder_status.py0088_auto_20230403_1402.py0089_auto_20230404_0030.py0090_auto_20230412_1752.py0091_auto_20230419_0037.py0092_auto_20230419_0250.py0093_auto_20230426_0248.py0094_auto_20230514_2331.py0095_salesordershipment_delivery_date.py0096_alter_returnorderlineitem_outcome.py0097_auto_20230529_0107.py0098_auto_20231024_1844.py__init__.py
models.pyserializers.pytasks.pytemplates
order
part
__init__.pyadmin.pyapi.pyapps.pybom.pyfilters.pytest_api.pytest_bom_export.pytest_bom_import.pytest_bom_item.pytest_category.pytest_migrations.pytest_param.pytest_part.pytest_pricing.pytest_views.pyurls.pyviews.py
fixtures
forms.pyhelpers.pymigrations
0001_initial.py0002_auto_20190520_2204.py0003_auto_20190525_2226.py0004_auto_20190525_2356.py0005_auto_20190526_1119.py0006_auto_20190526_1215.py0007_auto_20190602_1944.py0008_auto_20190618_0042.py0009_part_virtual.py0010_auto_20190620_2135.py0011_part_revision.py0012_auto_20190627_2144.py0013_auto_20190628_0951.py0014_partparameter.py0015_auto_20190820_0251.py0016_auto_20190820_0257.py0017_bomitem_checksum.py0018_auto_20190907_0941.py0019_auto_20190908_0404.py0020_auto_20190908_0404.py0021_auto_20190908_0916.py0022_auto_20190908_0918.py0023_auto_20190913_1401.py0024_auto_20191118_2139.py0025_auto_20191118_2316.py0026_auto_20200131_1022.py0027_auto_20200202_1024.py0028_auto_20200203_1007.py0029_auto_20200223_0901.py0030_auto_20200318_1027.py0031_auto_20200318_1044.py0032_auto_20200322_0453.py0033_auto_20200404_0445.py0034_auto_20200404_1238.py0035_auto_20200406_0045.py0036_partattachment_user.py0037_partattachment_upload_date.py0038_auto_20200513_0016.py0039_auto_20200515_1127.py0040_parttesttemplate.py0041_auto_20200517_0348.py0042_auto_20200518_0900.py0043_auto_20200527_0005.py0044_auto_20200605_0931.py0045_auto_20200605_0932.py0046_auto_20200804_0107.py0047_auto_20200808_0715.py0048_auto_20200902_1404.py0049_partsellpricebreak.py0050_auto_20200917_2315.py0051_bomitem_optional.py0052_partrelated.py0053_partcategoryparametertemplate.py0054_auto_20201109_1246.py0055_auto_20201110_1001.py0056_auto_20201110_1125.py0057_remove_partsellpricebreak_currency.py0058_remove_partsellpricebreak_cost.py0059_auto_20201112_1112.py0060_merge_20201112_1722.py0061_auto_20210103_2313.py0061_auto_20210104_2331.py0062_merge_20210105_0056.py0063_bomitem_inherited.py0064_auto_20210404_2016.py0065_auto_20210505_2144.py0066_bomitem_allow_variants.py0067_partinternalpricebreak.py0068_part_unique_part.py0069_auto_20210701_0509.py0070_alter_part_variant_of.py0071_alter_partparametertemplate_name.py0072_bomitemsubstitute.py0073_auto_20211013_1048.py0074_partcategorystar.py0075_auto_20211128_0151.py0076_auto_20220516_0819.py0077_alter_bomitem_unique_together.py0078_auto_20220606_0024.py0079_alter_part_notes.py0080_alter_part_image.py0081_alter_partcategory_name.py0082_partcategory_pathstring.py0083_auto_20220731_2357.py0084_partcategory_icon.py0085_partparametertemplate_description.py0086_auto_20220912_0007.py0087_bomitem_consumable.py0088_alter_partparametertemplate_name.py0089_auto_20221112_0128.py0090_auto_20221115_0816.py0091_partstocktake.py0092_part_last_stocktake.py0093_auto_20230115_1404.py0094_alter_part_units.py0095_alter_part_responsible.py0096_auto_20230211_0029.py0097_partstocktakereport.py0098_auto_20230214_1115.py0099_alter_bomitem_inherited.py0100_alter_bomitem_reference.py0101_bomitem_validated.py0102_auto_20230314_0112.py0103_auto_20230317_0816.py0104_alter_part_description.py0105_alter_part_notes.py0106_part_tags.py0107_alter_part_tags.py0108_auto_20230516_1334.py0109_auto_20230517_1048.py0110_alter_part_units.py0111_auto_20230521_1350.py0112_auto_20230525_1606.py0113_auto_20230531_1205.py0114_alter_part_minimum_stock.py0115_part_responsible_owner.py0116_auto_20231023_0332.py0117_remove_part_responsible.py0118_auto_20231024_1844.py0119_auto_20231120_0457.py0120_parttesttemplate_key.py0121_auto_20240207_0344.py0122_parttesttemplate_enabled.py__init__.py
models.pypart.pyserializers.pysettings.pystocktake.pytasks.pytemplates
part
bom.htmlcat_link.htmlcategory.htmlcategory_sidebar.htmlcopy_part.htmlcreate_part.htmldetail.html
import_wizard
ajax_match_fields.htmlajax_match_references.htmlajax_part_upload.htmlmatch_fields.htmlmatch_references.htmlpart_upload.html
part_app_base.htmlpart_base.htmlpart_pricing.htmlpart_scheduling.htmlpart_sidebar.htmlpart_stocktake.htmlpart_thumb.htmlpart_units.htmlprices.htmlpricing_javascript.htmlselect_image.htmlstock_count.htmlupload_bom.htmlvariant_part.htmlplugin
__init__.pyadmin.pyapi.pyapps.py
base
__init__.py
action
barcodes
event
integration
APICallMixin.pyAppMixin.pyCurrencyExchangeMixin.pyReportMixin.pyScheduleMixin.pySettingsMixin.pyUrlsMixin.pyValidationMixin.py__init__.pymixins.pytest_mixins.py
label
locate
broken
builtin
events.pyhelpers.pyinstaller.pymachine
migrations
0001_initial.py0002_alter_pluginconfig_options.py0003_pluginsetting.py0004_alter_pluginsetting_key.py0005_notificationusersetting.py0006_pluginconfig_metadata.py0007_auto_20230805_1748.py0008_pluginconfig_package_name.py__init__.py
mixins
mock
models.pyplugin.pyregistry.pysamples
__init__.py
serializers.pytemplate.pyevent
integration
__init__.pyanother_sample.pyapi_caller.pycustom_panel_sample.pylabel_sample.pyreport_plugin_sample.pysample.pysample_currency_exchange.pyscheduled_task.pysimpleactionplugin.pytest_api_caller.pytest_sample.pytest_scheduled_task.pytest_simpleactionplugin.pytest_validation_sample.pytransition.pyvalidation_sample.pyversion.py
templates
panel_demo
locate
templatetags
test_api.pytest_helpers.pytest_plugin.pyurls.pyviews.pyplugins
report
__init__.pyadmin.pyapi.pyapps.pyhelpers.py
migrations
0001_initial.py0002_delete_reporttemplate.py0003_testreport_enabled.py0004_auto_20200823_1104.py0005_auto_20210119_0815.py0006_reportsnippet.py0007_auto_20210204_1617.py0008_auto_20210204_2100.py0009_testreport_revision.py0010_auto_20210205_1201.py0011_auto_20210212_2024.py0012_buildreport.py0013_testreport_include_installed.py0014_purchaseorderreport_salesorderreport.py0015_auto_20210403_1837.py0016_auto_20210513_1303.py0017_auto_20230317_0816.py0018_returnorderreport.py0019_returnorderreport_metadata.py0020_stocklocationreport.py0021_auto_20231009_0144.py__init__.py
models.pyserializers.pytemplates
report
inventree_bill_of_materials_report.htmlinventree_build_order.htmlinventree_build_order_base.htmlinventree_order_report_base.htmlinventree_po_report.htmlinventree_po_report_base.htmlinventree_report_base.htmlinventree_return_order_report.htmlinventree_return_order_report_base.htmlinventree_slr_report.htmlinventree_so_report.htmlinventree_so_report_base.htmlinventree_test_report.htmlinventree_test_report_base.html
templatetags
tests.pyscript
stock
__init__.pyadmin.pyapi.pyapps.pyfilters.pytest_api.pytest_migrations.pytest_views.pytests.pyurls.pyviews.py
fixtures
migrations
0001_initial.py0002_auto_20190525_2226.py0003_auto_20190525_2303.py0004_auto_20190525_2356.py0005_auto_20190602_1944.py0006_stockitem_purchase_order.py0007_auto_20190618_0042.py0008_stockitemtracking_url.py0009_auto_20190715_2351.py0010_stockitem_build.py0011_auto_20190908_0404.py0012_auto_20190908_0405.py0013_auto_20190908_0916.py0014_auto_20190908_0918.py0015_auto_20190913_1407.py0016_auto_20191118_2146.py0017_auto_20191118_2311.py0018_auto_20200202_0103.py0019_auto_20200202_1024.py0020_auto_20200206_1213.py0021_auto_20200215_2232.py0022_auto_20200217_1109.py0023_auto_20200318_1027.py0024_auto_20200405_2239.py0025_auto_20200405_2243.py0026_stockitem_uid.py0027_stockitem_sales_order.py0028_auto_20200421_0724.py0029_auto_20200421_2359.py0030_auto_20200422_0015.py0031_auto_20200422_0209.py0032_stockitem_build_order.py0033_auto_20200426_0539.py0034_auto_20200426_0602.py0035_auto_20200502_2308.py0036_stockitemattachment.py0037_stockitemattachment_user.py0038_stockitemattachment_upload_date.py0039_auto_20200513_0016.py0040_stockitemtestresult.py0041_stockitemtestresult_notes.py0042_auto_20200523_0121.py0043_auto_20200525_0420.py0044_auto_20200528_1036.py0045_stockitem_customer.py0046_auto_20200605_0931.py0047_auto_20200605_0932.py0048_auto_20200807_2344.py0049_auto_20200820_0454.py0050_auto_20200821_1403.py0051_auto_20200928_0928.py0052_stockitem_is_building.py0053_auto_20201110_0513.py0054_remove_stockitem_build_order.py0055_auto_20201117_1453.py0056_stockitem_expiry_date.py0057_stock_location_item_owner.py0058_stockitem_packaging.py0059_auto_20210404_2016.py0060_auto_20210511_1713.py0061_auto_20210511_0911.py0062_auto_20210511_2151.py0063_auto_20210511_2343.py0064_auto_20210621_1724.py0065_auto_20210701_0509.py0066_stockitem_scheduled_for_deletion.py0067_alter_stockitem_part.py0068_stockitem_serial_int.py0069_auto_20211109_2347.py0070_auto_20211128_0151.py0071_auto_20211205_1733.py0072_remove_stockitem_scheduled_for_deletion.py0073_alter_stockitem_belongs_to.py0074_alter_stockitem_batch.py0075_auto_20220515_1440.py0076_alter_stockitem_status.py0077_alter_stockitem_notes.py0078_alter_stockitem_supplier_part.py0079_alter_stocklocation_name.py0080_stocklocation_pathstring.py0081_auto_20220801_0044.py0082_alter_stockitem_link.py0083_stocklocation_icon.py0084_auto_20220903_0154.py0085_auto_20220903_0225.py0086_remove_stockitem_uid.py0087_auto_20220912_2341.py0088_remove_stockitem_infinite.py0089_alter_stockitem_purchase_price.py0090_stocklocation_structural.py0091_alter_stockitem_delete_on_deplete.py0092_alter_stockitem_updated.py0093_auto_20230217_2140.py0094_auto_20230220_0025.py0095_stocklocation_external.py0096_auto_20230330_1121.py0097_alter_stockitem_notes.py0098_auto_20230427_2033.py0099_alter_stockitem_status.py0100_auto_20230515_0004.py0100_stockitem_consumed_by.py0101_stockitemtestresult_metadata.py0102_alter_stockitem_status.py0103_stock_location_types.py0104_alter_stockitem_purchase_price_currency.py0105_stockitemtestresult_template.py0106_auto_20240207_0353.py0107_remove_stockitemtestresult_test_and_more.py0108_auto_20240219_0252.py0109_add_additional_test_fields.py0110_alter_stockitemtestresult_finished_datetime_and_more.py__init__.py
models.pyserializers.pytemplates
stock
templates
403.html403_csrf.html404.html500.html503.htmlmail.htmlmodal_csrf.htmlmodal_delete_form.htmlmodal_form.htmlmodals.htmlnavbar.htmlnotes_buttons.htmlnotifications.htmlpage_base.htmlpanel.html
InvenTree
index.html
about.htmlnotifications
password.htmlsearch.htmlsettings
barcode.htmlbuild.htmlcategory.htmlglobal.htmllabel.htmllogin.html
mixins
notifications.htmlpart.htmlpart_parameters.htmlpart_stocktake.htmlphysical_units.htmlplugin.htmlplugin_settings.htmlpo.htmlpricing.htmlproject_codes.htmlreport.htmlreturns.htmlsetting.htmlsetting_boolean.htmlsettings.htmlsettings_js.htmlsettings_staff_js.htmlsidebar.htmlso.htmlstock.htmluser.htmluser_display.htmluser_homepage.htmluser_labels.htmluser_notifications.htmluser_reporting.htmluser_search.htmluser_settings.htmluser_sso.htmlaccount
base.htmlemail_confirm.htmllogin.htmllogout.htmlpassword_reset.htmlpassword_reset_from_key.htmlsignup.htmlsignup_closed.html
admin_button.htmlallauth_2fa
attachment_button.htmlattachment_table.htmlbarcode_data.htmlbase.htmlclip.htmlclip_link.htmlcurrency_data.htmlemail
build_order_completed.htmlbuild_order_required_stock.htmlcanceled_order_assigned.htmlemail.htmllow_stock_notification.htmlnew_order_assigned.htmloverdue_build_order.htmloverdue_purchase_order.htmloverdue_sales_order.htmlpurchase_order_received.htmlreturn_order_received.html
filter_list.htmlhover_image.htmljs
dynamic
translated
api.jsattachment.jsbarcode.jsbom.jsbuild.jscharts.jscompany.jsfilters.jsforms.jshelpers.jsindex.jslabel.jsmodals.jsmodel_renderers.jsnews.jsnotification.jsorder.jspart.jsplugin.jspricing.jspurchase_order.jsreport.jsreturn_order.jssales_order.jssearch.jsstatus_codes.jsstock.jstable_filters.jstables.js
patterns
plugin
price.htmlproject_code_data.htmlqr_button.htmlqr_code.htmlregistration
sample
search.htmlsearch_form.htmlsidebar_header.htmlsidebar_item.htmlsidebar_link.htmlsidebar_toggle.htmlskeleton.htmlsocialaccount
spacer.htmlstats.htmlstatus_codes.htmlstock_table.htmltel.htmlthird_party_js.htmlurl.htmlversion.htmlyesnolabel.htmlusers
__init__.pyadmin.pyapi.pyapps.pyauthentication.py
fixtures
migrations
0001_initial.py0002_auto_20201004_0158.py0003_auto_20201005_2227.py0004_auto_20210113_1909.py0005_owner_model.py0006_alter_ruleset_name.py0007_alter_ruleset_name.py0008_apitoken.py0009_auto_20231020_2356.py0010_alter_apitoken_key.py0011_auto_20240119_1659.py__init__.py
models.pyserializers.pytest_api.pytest_migrations.pytests.pyweb
frontend
@@ -16,6 +16,7 @@ services:
|
||||
inventree:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: ../InvenTree/contrib/container/Dockerfile
|
||||
target: dev
|
||||
args:
|
||||
base_image: "mcr.microsoft.com/vscode/devcontainers/base:alpine-3.18"
|
||||
|
3
.git-blame-ignore-revs
Normal file
3
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,3 @@
|
||||
# .git-blame-ignore-revs
|
||||
# Code Structure refactor https://github.com/inventree/InvenTree/pull/5582
|
||||
0bace3f3afaa213c63b5dcc70103f0d232637a9a
|
11
.github/CODEOWNERS
vendored
11
.github/CODEOWNERS
vendored
@@ -1,2 +1,13 @@
|
||||
# General owner is the maintainers team
|
||||
* @SchrodingersGat
|
||||
|
||||
# plugins are co-owned
|
||||
/src/backend/InvenTree/plugin/ @SchrodingersGat @matmair
|
||||
/src/backend/InvenTree/plugins/ @SchrodingersGat @matmair
|
||||
|
||||
# Installer functions
|
||||
.pkgr.yml @matmair
|
||||
Procfile @matmair
|
||||
runtime.txt @matmair
|
||||
/contrib/installer @matmair
|
||||
/contrib/packager.io @matmair
|
||||
|
2
.github/actions/migration/action.yaml
vendored
2
.github/actions/migration/action.yaml
vendored
@@ -11,7 +11,7 @@ runs:
|
||||
invoke migrate
|
||||
invoke import-fixtures
|
||||
invoke export-records -f data.json
|
||||
python3 ./InvenTree/manage.py flush --noinput
|
||||
python3 ./src/backend/InvenTree/manage.py flush --noinput
|
||||
invoke migrate
|
||||
invoke import-records -f data.json
|
||||
invoke import-records -f data.json
|
||||
|
6
.github/actions/setup/action.yaml
vendored
6
.github/actions/setup/action.yaml
vendored
@@ -65,10 +65,11 @@ runs:
|
||||
with:
|
||||
node-version: ${{ env.node_version }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: src/backend/package-lock.json
|
||||
- name: Install npm packages
|
||||
if: ${{ inputs.npm == 'true' }}
|
||||
shell: bash
|
||||
run: npm install
|
||||
run: cd src/backend && npm install
|
||||
|
||||
# OS installs
|
||||
- name: Install OS Dependencies
|
||||
@@ -77,12 +78,13 @@ runs:
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install ${{ inputs.apt-dependency }}
|
||||
sudo apt-get install ${{ inputs.apt-dependency }}
|
||||
|
||||
# Invoke commands
|
||||
- name: Install dev requirements
|
||||
if: ${{ inputs.dev-install == 'true' ||inputs.install == 'true' }}
|
||||
shell: bash
|
||||
run: uv pip install -r requirements-dev.txt
|
||||
run: uv pip install -r src/backend/requirements-dev.txt
|
||||
- name: Run invoke install
|
||||
if: ${{ inputs.install == 'true' }}
|
||||
shell: bash
|
||||
|
22
.github/dependabot.yml
vendored
22
.github/dependabot.yml
vendored
@@ -3,34 +3,34 @@ updates:
|
||||
- package-ecosystem: github-actions
|
||||
directory: /
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: docker
|
||||
directory: /
|
||||
directory: /contrib/container
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: pip
|
||||
directory: /docker
|
||||
directory: /contrib/container
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: pip
|
||||
directory: /docs
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: npm
|
||||
directory: /
|
||||
directory: /src/backend
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: pip
|
||||
directory: /
|
||||
directory: /src/backend
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: npm
|
||||
directory: /src/frontend
|
||||
schedule:
|
||||
interval: daily
|
||||
interval: weekly
|
||||
|
@@ -92,7 +92,9 @@ def check_version_number(version_string, allow_duplicate=False):
|
||||
if __name__ == '__main__':
|
||||
if 'only_version' in sys.argv:
|
||||
here = Path(__file__).parent.absolute()
|
||||
version_file = here.joinpath('..', 'InvenTree', 'InvenTree', 'api_version.py')
|
||||
version_file = here.joinpath(
|
||||
'..', '..', 'src', 'backend', 'InvenTree', 'InvenTree', 'api_version.py'
|
||||
)
|
||||
text = version_file.read_text()
|
||||
results = re.findall(r"""INVENTREE_API_VERSION = (.*)""", text)
|
||||
print(results[0])
|
||||
@@ -114,7 +116,9 @@ if __name__ == '__main__':
|
||||
print(f'GITHUB_BASE_REF: {GITHUB_BASE_REF}')
|
||||
|
||||
here = Path(__file__).parent.absolute()
|
||||
version_file = here.joinpath('..', 'InvenTree', 'InvenTree', 'version.py')
|
||||
version_file = here.joinpath(
|
||||
'..', '..', 'src', 'backend', 'InvenTree', 'InvenTree', 'version.py'
|
||||
)
|
||||
|
||||
version = None
|
||||
|
2
.github/workflows/check_translations.yaml
vendored
2
.github/workflows/check_translations.yaml
vendored
@@ -40,4 +40,4 @@ jobs:
|
||||
- name: Test Translations
|
||||
run: invoke translate
|
||||
- name: Check Migration Files
|
||||
run: python3 ci/check_migration_files.py
|
||||
run: python3 .github/scripts/check_migration_files.py
|
||||
|
23
.github/workflows/docker.yaml
vendored
23
.github/workflows/docker.yaml
vendored
@@ -78,26 +78,26 @@ jobs:
|
||||
run: |
|
||||
pip install requests==2.31.0
|
||||
pip install pyyaml==6.0.1
|
||||
python3 ci/version_check.py
|
||||
python3 .github/scripts/version_check.py
|
||||
echo "git_commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
||||
echo "git_commit_date=$(git show -s --format=%ci)" >> $GITHUB_ENV
|
||||
- name: Test Docker Image
|
||||
id: test-docker
|
||||
run: |
|
||||
docker build . --target production --tag inventree-test
|
||||
docker build . --target production --tag inventree-test -f contrib/container/Dockerfile
|
||||
docker run --rm inventree-test invoke --version
|
||||
docker run --rm inventree-test invoke --list
|
||||
docker run --rm inventree-test gunicorn --version
|
||||
docker run --rm inventree-test pg_dump --version
|
||||
- name: Build Docker Image
|
||||
# Build the development docker image (using docker-compose.yml)
|
||||
run: docker-compose build --no-cache
|
||||
run: docker compose --project-directory . -f contrib/container/dev-docker-compose.yml build --no-cache
|
||||
- name: Update Docker Image
|
||||
run: |
|
||||
docker-compose run inventree-dev-server invoke update
|
||||
docker-compose run inventree-dev-server invoke setup-dev
|
||||
docker-compose up -d
|
||||
docker-compose run inventree-dev-server invoke wait
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml run inventree-dev-server invoke update
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml run inventree-dev-server invoke setup-dev
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml up -d
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml run inventree-dev-server invoke wait
|
||||
- name: Check Data Directory
|
||||
# The following file structure should have been created by the docker image
|
||||
run: |
|
||||
@@ -112,10 +112,10 @@ jobs:
|
||||
test -f data/secret_key.txt
|
||||
- name: Run Unit Tests
|
||||
run: |
|
||||
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> docker.dev.env
|
||||
docker-compose run inventree-dev-server invoke test --disable-pty
|
||||
docker-compose run inventree-dev-server invoke test --migrations --disable-pty
|
||||
docker-compose down
|
||||
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> contrib/container/docker.dev.env
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml run inventree-dev-server invoke test --disable-pty
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml run inventree-dev-server invoke test --migrations --disable-pty
|
||||
docker compose --project-directory . -f contrib/container/dev-docker-compose.yml down
|
||||
- name: Clean up test folder
|
||||
run: |
|
||||
rm -rf InvenTree/_testfolder
|
||||
@@ -166,6 +166,7 @@ jobs:
|
||||
uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # pin@v5.3.0
|
||||
with:
|
||||
context: .
|
||||
file: ./contrib/container/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
sbom: true
|
||||
|
69
.github/workflows/qc_checks.yaml
vendored
69
.github/workflows/qc_checks.yaml
vendored
@@ -42,9 +42,9 @@ jobs:
|
||||
with:
|
||||
filters: |
|
||||
server:
|
||||
- 'InvenTree/**'
|
||||
- 'requirements.txt'
|
||||
- 'requirements-dev.txt'
|
||||
- 'src/backend/InvenTree/**'
|
||||
- 'src/backend/requirements.txt'
|
||||
- 'src/backend/requirements-dev.txt'
|
||||
migrations:
|
||||
- '**/migrations/**'
|
||||
- '.github/workflows**'
|
||||
@@ -68,12 +68,12 @@ jobs:
|
||||
install: true
|
||||
- name: Check Templated JS Files
|
||||
run: |
|
||||
cd ci
|
||||
cd .github/scripts
|
||||
python3 check_js_templates.py
|
||||
- name: Lint Javascript Files
|
||||
run: |
|
||||
python InvenTree/manage.py prerender
|
||||
npx eslint InvenTree/InvenTree/static_i18n/i18n/*.js
|
||||
python src/backend/InvenTree/manage.py prerender
|
||||
npx eslint src/backend/InvenTree/InvenTree/static_i18n/i18n/*.js
|
||||
|
||||
pre-commit:
|
||||
name: Style [pre-commit]
|
||||
@@ -93,7 +93,7 @@ jobs:
|
||||
- name: Check Version
|
||||
run: |
|
||||
pip install requests==2.31.0
|
||||
python3 ci/version_check.py
|
||||
python3 .github/scripts/version_check.py
|
||||
|
||||
mkdocs:
|
||||
name: Style [Documentation]
|
||||
@@ -147,17 +147,17 @@ jobs:
|
||||
dev-install: true
|
||||
update: true
|
||||
- name: Export API Documentation
|
||||
run: invoke schema --ignore-warnings --filename InvenTree/schema.yml
|
||||
run: invoke schema --ignore-warnings --filename src/backend/InvenTree/schema.yml
|
||||
- name: Upload schema
|
||||
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
|
||||
with:
|
||||
name: schema.yml
|
||||
path: InvenTree/schema.yml
|
||||
path: src/backend/InvenTree/schema.yml
|
||||
- name: Download public schema
|
||||
if: needs.paths-filter.outputs.api == 'false'
|
||||
run: |
|
||||
pip install requests==2.31.0 >/dev/null 2>&1
|
||||
version="$(python3 ci/version_check.py only_version 2>&1)"
|
||||
version="$(python3 .github/scripts/version_check.py only_version 2>&1)"
|
||||
echo "Version: $version"
|
||||
url="https://raw.githubusercontent.com/inventree/schema/main/export/${version}/api.yaml"
|
||||
echo "URL: $url"
|
||||
@@ -166,8 +166,8 @@ jobs:
|
||||
- name: Check for differences in API Schema
|
||||
if: needs.paths-filter.outputs.api == 'false'
|
||||
run: |
|
||||
diff --color -u InvenTree/schema.yml api.yaml
|
||||
diff -u InvenTree/schema.yml api.yaml && echo "no difference in API schema " || exit 2
|
||||
diff --color -u src/backend/InvenTree/schema.yml api.yaml
|
||||
diff -u src/backend/InvenTree/schema.yml api.yaml && echo "no difference in API schema " || exit 2
|
||||
- name: Check schema - including warnings
|
||||
run: invoke schema
|
||||
continue-on-error: true
|
||||
@@ -176,7 +176,7 @@ jobs:
|
||||
if: github.ref == 'refs/heads/master' && needs.paths-filter.outputs.api == 'true'
|
||||
run: |
|
||||
pip install requests==2.31.0 >/dev/null 2>&1
|
||||
version="$(python3 ci/version_check.py only_version 2>&1)"
|
||||
version="$(python3 .github/scripts/version_check.py only_version 2>&1)"
|
||||
echo "Version: $version"
|
||||
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||||
|
||||
@@ -273,13 +273,15 @@ jobs:
|
||||
- name: Test Translations
|
||||
run: invoke translate
|
||||
- name: Check Migration Files
|
||||
run: python3 ci/check_migration_files.py
|
||||
run: python3 .github/scripts/check_migration_files.py
|
||||
- name: Coverage Tests
|
||||
run: invoke test --coverage
|
||||
- name: Upload Coverage Report
|
||||
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
flag-name: backend
|
||||
parallel: true
|
||||
|
||||
postgres:
|
||||
name: Tests - DB [PostgreSQL]
|
||||
@@ -471,6 +473,7 @@ jobs:
|
||||
INVENTREE_DB_NAME: /home/runner/work/InvenTree/db.sqlite3
|
||||
INVENTREE_DEBUG: True
|
||||
INVENTREE_PLUGINS_ENABLED: false
|
||||
VITE_COVERAGE: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin@v4.1.1
|
||||
@@ -487,13 +490,31 @@ jobs:
|
||||
- name: Install Playwright Browsers
|
||||
run: cd src/frontend && npx playwright install --with-deps
|
||||
- name: Run Playwright tests
|
||||
run: cd src/frontend && npx playwright test
|
||||
run: cd src/frontend && npx nyc playwright test
|
||||
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
|
||||
name: Upload playwright report
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
path: src/frontend/playwright-report/
|
||||
retention-days: 30
|
||||
- name: Report coverage
|
||||
if: always()
|
||||
run: cd src/frontend && npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=lcov --exclude-after-remap false
|
||||
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
|
||||
name: Upload coverage report
|
||||
if: always()
|
||||
with:
|
||||
name: coverage
|
||||
path: src/frontend/coverage/
|
||||
retention-days: 30
|
||||
- name: Upload Coverage Report
|
||||
if: always()
|
||||
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
flag-name: pui
|
||||
parallel: true
|
||||
|
||||
platform_ui_build:
|
||||
name: Build - UI Platform
|
||||
@@ -512,9 +533,23 @@ jobs:
|
||||
run: cd src/frontend && npm run compile && npm run build
|
||||
- name: Zip frontend
|
||||
run: |
|
||||
cd InvenTree/web/static
|
||||
cd src/backend/InvenTree/web/static
|
||||
zip -r frontend-build.zip web/
|
||||
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
|
||||
with:
|
||||
name: frontend-build
|
||||
path: InvenTree/web/static/web
|
||||
path: src/backend/InvenTree/web/static/web
|
||||
|
||||
finish_coverage:
|
||||
name: Finish Coverage
|
||||
runs-on: ubuntu-20.04
|
||||
needs: ["platform_ui", "coverage", "paths-filter"]
|
||||
if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true'
|
||||
|
||||
steps:
|
||||
- name: Finish coverage reporting
|
||||
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
carryforward: "pui,backend"
|
||||
parallel-finished: true
|
||||
|
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
- name: Version Check
|
||||
run: |
|
||||
pip install requests==2.31.0
|
||||
python3 ci/version_check.py
|
||||
python3 .github/scripts/version_check.py
|
||||
- name: Push to Stable Branch
|
||||
uses: ad-m/github-push-action@d91a481090679876dfc4178fef17f286781251df # pin@v0.8.0
|
||||
if: env.stable_release == 'true'
|
||||
@@ -43,12 +43,12 @@ jobs:
|
||||
run: cd src/frontend && npm run compile && npm run build
|
||||
- name: Zip frontend
|
||||
run: |
|
||||
cd InvenTree/web/static/web
|
||||
cd src/backend/InvenTree/web/static/web
|
||||
zip -r ../frontend-build.zip *
|
||||
- uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # pin@2.9.0
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: InvenTree/web/static/frontend-build.zip
|
||||
file: src/backend/InvenTree/web/static/frontend-build.zip
|
||||
asset_name: frontend-build.zip
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -84,7 +84,7 @@ data/
|
||||
env/
|
||||
|
||||
# Locale stats file
|
||||
locale_stats.json
|
||||
src/backend/InvenTree/InvenTree/locale_stats.json
|
||||
|
||||
# node.js
|
||||
node_modules/
|
||||
@@ -93,7 +93,7 @@ node_modules/
|
||||
maintenance_mode_state.txt
|
||||
|
||||
# plugin dev directory
|
||||
InvenTree/plugins/
|
||||
src/backend/InvenTree/plugins/
|
||||
|
||||
# Compiled translation files
|
||||
*.mo
|
||||
@@ -103,6 +103,7 @@ messages.ts
|
||||
api.yaml
|
||||
|
||||
# web frontend (static files)
|
||||
src/backend/InvenTree/web/static
|
||||
InvenTree/web/static
|
||||
|
||||
# Generated docs files
|
||||
|
@@ -2,12 +2,11 @@
|
||||
# See https://pre-commit.com/hooks.html for more hooks
|
||||
exclude: |
|
||||
(?x)^(
|
||||
InvenTree/InvenTree/static/.*|
|
||||
InvenTree/locale/.*|
|
||||
src/backend/InvenTree/InvenTree/static/.*|
|
||||
src/backend/InvenTree/locale/.*|
|
||||
src/frontend/src/locales/.* |
|
||||
.*/migrations/.* |
|
||||
src/frontend/yarn.lock |
|
||||
yarn.lock
|
||||
src/frontend/yarn.lock
|
||||
)$
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
@@ -32,12 +31,12 @@ repos:
|
||||
hooks:
|
||||
- id: pip-compile
|
||||
name: pip-compile requirements-dev.in
|
||||
args: [requirements-dev.in, -o, requirements-dev.txt, --python-version=3.9, --no-strip-extras]
|
||||
files: ^requirements-dev\.(in|txt)$
|
||||
args: [src/backend/requirements-dev.in, -o, src/backend/requirements-dev.txt, --python-version=3.9, --no-strip-extras]
|
||||
files: src/backend/requirements-dev\.(in|txt)$
|
||||
- id: pip-compile
|
||||
name: pip-compile requirements.txt
|
||||
args: [requirements.in, -o, requirements.txt,--python-version=3.9, --no-strip-extras]
|
||||
files: ^requirements\.(in|txt)$
|
||||
args: [src/backend/requirements.in, -o, src/backend/requirements.txt,--python-version=3.9, --no-strip-extras]
|
||||
files: src/backend/requirements\.(in|txt)$
|
||||
- repo: https://github.com/Riverside-Healthcare/djLint
|
||||
rev: v1.34.1
|
||||
hooks:
|
||||
|
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@@ -8,7 +8,7 @@
|
||||
"name": "InvenTree Server",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/InvenTree/manage.py",
|
||||
"program": "${workspaceFolder}/src/backend/InvenTree/manage.py",
|
||||
"args": ["runserver"],
|
||||
"django": true,
|
||||
"justMyCode": true
|
||||
@@ -17,7 +17,7 @@
|
||||
"name": "InvenTree Server - 3rd party",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/InvenTree/manage.py",
|
||||
"program": "${workspaceFolder}/src/backend/InvenTree/manage.py",
|
||||
"args": ["runserver"],
|
||||
"django": true,
|
||||
"justMyCode": false
|
||||
|
@@ -3,4 +3,48 @@
|
||||
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
|
||||
|
||||
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
|
||||
│ ├─ workflows/ # CI/CD flows
|
||||
│ ├─ scripts/ # CI scripts
|
||||
├─ .vscode/ # Settings for Visual Code IDE
|
||||
├─ assets/ # General project assets
|
||||
├─ contrib/ # Files needed for deployments
|
||||
│ ├─ container/ # Files related to building container images
|
||||
│ ├─ installer/ # Files needed to build single-file installer
|
||||
│ ├─ packager.io/ # Files needed for Debian/Ubuntu packages
|
||||
├─ docs/ # Directory for documentation / General helper files
|
||||
│ ├─ ci/ # CI for documentation
|
||||
│ ├─ docs/ # Source for documentation
|
||||
├─ src/ # Source for application
|
||||
│ ├─ backend/ # Directory for backend parts
|
||||
│ │ ├─ InvenTree/ # Source for backend
|
||||
│ │ ├─ requirements.txt # Dependencies for backend
|
||||
│ │ ├─ package.json # Dependencies for backend HTML linting
|
||||
│ ├─ frontend/ # Directory for frontend parts
|
||||
│ │ ├─ src/ # Source for frontend
|
||||
│ │ │ ├─ main.tsx # Entry point for frontend
|
||||
│ │ ├─ tests/ # Tests for frontend
|
||||
│ │ ├─ netlify.toml # Settings for frontend previews (Netlify)
|
||||
│ │ ├─ package.json # Dependencies for frontend
|
||||
│ │ ├─ playwright.config.ts # Settings for frontend tests
|
||||
│ │ ├─ tsconfig.json # Settings for frontend compilation
|
||||
├─ .pkgr.yml # Build definition for Debian/Ubuntu packages
|
||||
├─ .pre-commit-config.yaml # Code formatter/linter configuration
|
||||
├─ CONTRIBUTING.md # Contirbution guidelines and overview
|
||||
├─ Procfile # Process definition for Debian/Ubuntu packages
|
||||
├─ README.md # General project information and overview
|
||||
├─ runtime.txt # Python runtime settings for Debian/Ubuntu packages build
|
||||
├─ SECURITY.md # Project security policy
|
||||
├─ tasks.py # Action definitions for development, testing and deployment
|
||||
```
|
||||
|
||||
Refer to our [contribution guidelines](https://docs.inventree.org/en/latest/develop/contributing/) for more information!
|
||||
|
4
Procfile
4
Procfile
@@ -1,7 +1,7 @@
|
||||
# Web process: gunicorn
|
||||
web: env/bin/gunicorn --chdir $APP_HOME/InvenTree -c InvenTree/gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:$PORT
|
||||
web: env/bin/gunicorn --chdir $APP_HOME/src/backend/InvenTree -c src/backend/InvenTree/gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:$PORT
|
||||
# Worker process: qcluster
|
||||
worker: env/bin/python InvenTree/manage.py qcluster
|
||||
worker: env/bin/python src/backendInvenTree/manage.py qcluster
|
||||
# Invoke commands
|
||||
invoke: echo "" | echo "" && . env/bin/activate && invoke
|
||||
# CLI: Provided for backwards compatibility
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<div align="center">
|
||||
<img src="images/logo/inventree.png" alt="InvenTree logo" width="200" height="auto" />
|
||||
<img src="assets/images/logo/inventree.png" alt="InvenTree logo" width="200" height="auto" />
|
||||
<h1>InvenTree</h1>
|
||||
<p>Open Source Inventory Management System </p>
|
||||
|
||||
|
Before ![]() (image error) Size: 198 KiB After ![]() (image error) Size: 198 KiB ![]() ![]() |
Before (image error) Size: 16 KiB After (image error) Size: 16 KiB |
Before ![]() (image error) Size: 341 KiB After ![]() (image error) Size: 341 KiB ![]() ![]() |
Before (image error) Size: 11 KiB After (image error) Size: 11 KiB |
@@ -1,31 +0,0 @@
|
||||
"""Test that the root API endpoint is available."""
|
||||
|
||||
import json
|
||||
|
||||
import requests
|
||||
|
||||
# We expect the server to be running on the local host
|
||||
url = 'http://localhost:8000/api/'
|
||||
|
||||
print('Testing InvenTree API endpoint')
|
||||
|
||||
response = requests.get(url)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
||||
print('- Response 200 OK')
|
||||
|
||||
data = json.loads(response.text)
|
||||
|
||||
required_keys = ['server', 'version', 'apiVersion', 'worker_running']
|
||||
|
||||
for key in required_keys:
|
||||
assert key in data
|
||||
print(f"- Found key '{key}'")
|
||||
|
||||
# Check that the worker is running
|
||||
assert data['worker_running']
|
||||
|
||||
print('- Background worker is operational')
|
||||
|
||||
print('API Endpoint Tests Passed OK')
|
@@ -1,27 +0,0 @@
|
||||
"""Check that there are no database migration files which have not been committed."""
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
print('Checking for uncommitted locale files...')
|
||||
|
||||
cmd = ['git', 'status']
|
||||
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
out, err = proc.communicate()
|
||||
|
||||
locales = []
|
||||
|
||||
for line in str(out.decode()).split('\n'):
|
||||
# Check for any compiled translation files that have not been committed
|
||||
if 'modified:' in line and '/locale/' in line and 'django.po' in line:
|
||||
locales.append(line)
|
||||
|
||||
if len(locales) > 0:
|
||||
print('There are {n} unstaged locale files:'.format(n=len(locales)))
|
||||
|
||||
for lang in locales:
|
||||
print(' - {l}'.format(l=lang))
|
||||
|
||||
sys.exit(len(locales))
|
@@ -27,7 +27,6 @@ ENV INVENTREE_DOCKER="true"
|
||||
|
||||
# InvenTree paths
|
||||
ENV INVENTREE_HOME="/home/inventree"
|
||||
ENV INVENTREE_MNG_DIR="${INVENTREE_HOME}/InvenTree"
|
||||
ENV INVENTREE_DATA_DIR="${INVENTREE_HOME}/${data_dir}"
|
||||
ENV INVENTREE_STATIC_ROOT="${INVENTREE_DATA_DIR}/static"
|
||||
ENV INVENTREE_MEDIA_ROOT="${INVENTREE_DATA_DIR}/media"
|
||||
@@ -75,9 +74,9 @@ EXPOSE 8000
|
||||
RUN mkdir -p ${INVENTREE_HOME}
|
||||
WORKDIR ${INVENTREE_HOME}
|
||||
|
||||
COPY ./docker/requirements.txt base_requirements.txt
|
||||
COPY ./requirements.txt ./
|
||||
COPY ./docker/install_build_packages.sh .
|
||||
COPY contrib/container/requirements.txt base_requirements.txt
|
||||
COPY src/backend/requirements.txt ./
|
||||
COPY contrib/container/install_build_packages.sh .
|
||||
RUN chmod +x install_build_packages.sh
|
||||
|
||||
# For ARMv7 architecture, add the piwheels repo (for cryptography library)
|
||||
@@ -87,7 +86,7 @@ RUN if [ `apk --print-arch` = "armv7" ]; then \
|
||||
printf "[global]\nextra-index-url=https://www.piwheels.org/simple\n" > /etc/pip.conf ; \
|
||||
fi
|
||||
|
||||
COPY tasks.py docker/gunicorn.conf.py docker/init.sh ./
|
||||
COPY tasks.py contrib/container/gunicorn.conf.py contrib/container/init.sh ./
|
||||
RUN chmod +x init.sh
|
||||
|
||||
ENTRYPOINT ["/bin/ash", "./init.sh"]
|
||||
@@ -102,12 +101,11 @@ RUN ./install_build_packages.sh --no-cache --virtual .build-deps && \
|
||||
# Frontend builder image:
|
||||
FROM prebuild AS frontend
|
||||
|
||||
RUN apk add --no-cache --update nodejs npm && npm install -g yarn@v1.22.22
|
||||
RUN apk add --no-cache --update nodejs npm && npm install -g yarn@v1.22.22 --ignore-scripts
|
||||
RUN yarn config set network-timeout 600000 -g
|
||||
COPY InvenTree ${INVENTREE_HOME}/InvenTree
|
||||
COPY src ${INVENTREE_HOME}/src
|
||||
COPY tasks.py ${INVENTREE_HOME}/tasks.py
|
||||
RUN cd ${INVENTREE_HOME}/InvenTree && inv frontend-compile
|
||||
RUN cd ${INVENTREE_HOME} && inv frontend-compile
|
||||
|
||||
# InvenTree production image:
|
||||
# - Copies required files from local directory
|
||||
@@ -124,15 +122,19 @@ ENV INVENTREE_COMMIT_DATE="${commit_date}"
|
||||
ENV PATH=/root/.local/bin:$PATH
|
||||
COPY --from=prebuild /root/.local /root/.local
|
||||
|
||||
ENV INVENTREE_BACKEND_DIR="${INVENTREE_HOME}"
|
||||
|
||||
# Copy source code
|
||||
COPY InvenTree ./InvenTree
|
||||
COPY --from=frontend ${INVENTREE_HOME}/InvenTree/web/static/web ./InvenTree/web/static/web
|
||||
COPY src/backend/InvenTree ./InvenTree
|
||||
COPY --from=frontend ${INVENTREE_HOME}/src/backend/InvenTree/web/static/web ./src/backend/InvenTree/web/static/web
|
||||
|
||||
# Launch the production server
|
||||
CMD gunicorn -c ./gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:8000 --chdir ./InvenTree
|
||||
|
||||
FROM inventree_base AS dev
|
||||
|
||||
ENV INVENTREE_BACKEND_DIR="${INVENTREE_HOME}/src/backend"
|
||||
|
||||
# Vite server (for local frontend development)
|
||||
EXPOSE 5173
|
||||
|
||||
@@ -143,7 +145,7 @@ RUN pip install uv==0.1.26 --no-cache-dir && pip install -r base_requirements.tx
|
||||
|
||||
# Install nodejs / npm / yarn
|
||||
|
||||
RUN apk add --no-cache --update nodejs npm && npm install -g yarn@v1.22.22
|
||||
RUN apk add --no-cache --update nodejs npm && npm install -g yarn@v1.22.22 --ignore-scripts
|
||||
RUN yarn config set network-timeout 600000 -g
|
||||
|
||||
# The development image requires the source code to be mounted to /home/inventree/
|
||||
@@ -158,7 +160,7 @@ ENV INVENTREE_PY_ENV="${INVENTREE_DATA_DIR}/env"
|
||||
WORKDIR ${INVENTREE_HOME}
|
||||
|
||||
# Entrypoint ensures that we are running in the python virtual environment
|
||||
ENTRYPOINT ["/bin/ash", "./docker/init.sh"]
|
||||
ENTRYPOINT ["/bin/ash", "./contrib/container/init.sh"]
|
||||
|
||||
# Launch the development server
|
||||
CMD ["invoke", "server", "-a", "${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT}"]
|
@@ -40,6 +40,7 @@ services:
|
||||
- inventree-dev-db
|
||||
build: &build_config
|
||||
context: .
|
||||
dockerfile: contrib/container/Dockerfile
|
||||
target: dev
|
||||
# Cache the built image to be used by the inventree-dev-worker process
|
||||
image: inventree-dev-image
|
||||
@@ -50,7 +51,7 @@ services:
|
||||
# Mount local source directory to /home/inventree
|
||||
- ./:/home/inventree:z
|
||||
env_file:
|
||||
- docker.dev.env
|
||||
- contrib/container/docker.dev.env
|
||||
restart: unless-stopped
|
||||
|
||||
# Background worker process handles long-running or periodic tasks
|
||||
@@ -64,5 +65,5 @@ services:
|
||||
# Mount local source directory to /home/inventree
|
||||
- ./:/home/inventree:z
|
||||
env_file:
|
||||
- docker.dev.env
|
||||
- contrib/container/docker.dev.env
|
||||
restart: unless-stopped
|
@@ -28,8 +28,8 @@ fi
|
||||
if test -f "$INVENTREE_CONFIG_FILE"; then
|
||||
echo "Loading config file : $INVENTREE_CONFIG_FILE"
|
||||
else
|
||||
echo "Copying config file to $INVENTREE_CONFIG_FILE"
|
||||
cp $INVENTREE_HOME/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE
|
||||
echo "Copying config file from $INVENTREE_BACKEND_DIR/InvenTree/config_template.yml to $INVENTREE_CONFIG_FILE"
|
||||
cp $INVENTREE_BACKEND_DIR/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE
|
||||
fi
|
||||
|
||||
# Setup a python virtual environment
|
@@ -2,7 +2,7 @@
|
||||
"append_commit_message": false
|
||||
|
||||
files:
|
||||
- source: /InvenTree/locale/en/LC_MESSAGES/django.po
|
||||
translation: /InvenTree/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%
|
||||
- source: /src/backend/InvenTree/locale/en/LC_MESSAGES/django.po
|
||||
translation: /src/backend/InvenTree/locale/%two_letters_code%/LC_MESSAGES/%original_file_name%
|
||||
- source: /src/frontend/src/locales/en/messages.po
|
||||
translation: /src/frontend/src/locales/%two_letters_code%/%original_file_name%
|
||||
|
@@ -9,8 +9,8 @@ The InvenTree server code supports an extensible plugin architecture, allowing c
|
||||
Plugins can be added from multiple sources:
|
||||
|
||||
- Plugins can be installed in InvenTrees venv via PIP (python package manager)
|
||||
- Custom plugins should be placed in the directory `./InvenTree/plugins`.
|
||||
- InvenTree built-in plugins are located in the directory `./InvenTree/plugin/builtin`.
|
||||
- Custom plugins should be placed in the directory `./src/backend/InvenTree/plugins`.
|
||||
- InvenTree built-in plugins are located in the directory `./src/backend/InvenTree/plugin/builtin`.
|
||||
|
||||
For further information, read more about [installing plugins](./plugins/install.md).
|
||||
|
||||
@@ -28,7 +28,7 @@ Please read all release notes and watch out for warnings - we generally provide
|
||||
|
||||
#### Plugins
|
||||
|
||||
General classes and mechanisms are provided under the `plugin` [namespaces](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/__init__.py). These include:
|
||||
General classes and mechanisms are provided under the `plugin` [namespaces](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/__init__.py). These include:
|
||||
|
||||
```python
|
||||
# Management objects
|
||||
@@ -44,7 +44,7 @@ MixinNotImplementedError # Is raised if a mixin was not implemented (core mec
|
||||
|
||||
#### Mixins
|
||||
|
||||
Mixins are split up internally to keep the source tree clean and enable better testing separation. All public APIs that should be used are exposed under `plugin.mixins`. These include all built-in mixins and notification methods. An up-to-date reference can be found in the source code (current master can be [found here](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/mixins/__init__.py)).
|
||||
Mixins are split up internally to keep the source tree clean and enable better testing separation. All public APIs that should be used are exposed under `plugin.mixins`. These include all built-in mixins and notification methods. An up-to-date reference can be found in the source code (current master can be [found here](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/mixins/__init__.py)).
|
||||
|
||||
#### Models and other internal InvenTree APIs
|
||||
|
||||
@@ -72,7 +72,7 @@ MIN_VERSION = None # Lowest InvenTree version number that is supported by the p
|
||||
MAX_VERSION = None # Highest InvenTree version number that is supported by the plugin
|
||||
```
|
||||
|
||||
Refer to the [sample plugins](https://github.com/inventree/InvenTree/tree/master/InvenTree/plugin/samples) for further examples.
|
||||
Refer to the [sample plugins](https://github.com/inventree/InvenTree/tree/master/src/backend/InvenTree/plugin/samples) for further examples.
|
||||
|
||||
### Plugin Config
|
||||
|
||||
|
@@ -15,4 +15,4 @@ POST {
|
||||
}
|
||||
```
|
||||
|
||||
For an example of a very simple action plugin, refer to `/InvenTree/plugin/samples/integratoni/simpleactionplugin.py`
|
||||
For an example of a very simple action plugin, refer to `/src/backend/InvenTree/plugin/samples/integratoni/simpleactionplugin.py`
|
||||
|
@@ -6,7 +6,7 @@ title: Barcode Mixin
|
||||
|
||||
InvenTree supports decoding of arbitrary barcode data via a **Barcode Plugin** interface. Barcode data POSTed to the `/api/barcode/` endpoint will be supplied to all loaded barcode plugins, and the first plugin to successfully interpret the barcode data will return a response to the client.
|
||||
|
||||
InvenTree can generate native QR codes to represent database objects (e.g. a single StockItem). This barcode can then be used to perform quick lookup of a stock item or location in the database. A client application (for example the InvenTree mobile app) scans a barcode, and sends the barcode data to the InvenTree server. The server then uses the **InvenTreeBarcodePlugin** (found at `/InvenTree/plugins/barcode/inventree.py`) to decode the supplied barcode data.
|
||||
InvenTree can generate native QR codes to represent database objects (e.g. a single StockItem). This barcode can then be used to perform quick lookup of a stock item or location in the database. A client application (for example the InvenTree mobile app) scans a barcode, and sends the barcode data to the InvenTree server. The server then uses the **InvenTreeBarcodePlugin** (found at `/src/backend/InvenTree/plugins/barcode/inventree.py`) to decode the supplied barcode data.
|
||||
|
||||
Any third-party barcodes can be decoded by writing a matching plugin to decode the barcode data. These plugins could then perform a server-side action or render a JSON response back to the client for further action.
|
||||
|
||||
|
@@ -34,7 +34,7 @@ In certain container environments (such as docker), plugins are installed into a
|
||||
|
||||
#### Builtin Plugins
|
||||
|
||||
Builtin plugins ship in `src/InvenTree/plugin/builtin`. To achieve full unit-testing for all mixins there are some sample implementations in `src/InvenTree/plugin/samples`.
|
||||
Builtin plugins ship in `src/backend/InvenTree/plugin/builtin`. To achieve full unit-testing for all mixins there are some sample implementations in `src/backend/InvenTree/plugin/samples`.
|
||||
|
||||
!!! success "Builtin Plugins"
|
||||
Builtin plugins are always enabled, as they are required for core InvenTree functionality
|
||||
@@ -77,7 +77,7 @@ Admin users can install plugins directly from the web interface, via the "Plugin
|
||||
Custom plugins can be placed in the `src/InvenTree/plugins/` directory, where they will be automatically discovered. This can be useful for developing and testing plugins, but can prove more difficult in production (e.g. when using Docker).
|
||||
|
||||
!!! info "Git Tracking"
|
||||
The `src/InvenTree/plugins/` directory is excluded from Git version tracking - any plugin files here will be hidden from Git
|
||||
The `src/backend/InvenTree/plugins/` directory is excluded from Git version tracking - any plugin files here will be hidden from Git
|
||||
|
||||
!!! warning "Not Recommended For Production"
|
||||
Loading plugins via the local *plugins* directory is not recommended for production. If you cannot use PIP installation (above), specify a custom plugin directory (below) or use a [VCS](https://pip.pypa.io/en/stable/topics/vcs-support/) as a plugin install source.
|
||||
|
@@ -28,4 +28,4 @@ If a locate plugin is installed and activated, the [InvenTree mobile app](../../
|
||||
|
||||
### Implementation
|
||||
|
||||
Refer to the [InvenTree source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/samples/locate/locate_sample.py) for a simple implementation example.
|
||||
Refer to the [InvenTree source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/samples/locate/locate_sample.py) for a simple implementation example.
|
||||
|
@@ -16,7 +16,7 @@ Additionally the `add_label_context` method, allowing custom context data to be
|
||||
|
||||
### Example
|
||||
|
||||
A sample plugin which provides additional context data to the report templates can be found [in the InvenTree source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/samples/integration/report_plugin_sample.py):
|
||||
A sample plugin which provides additional context data to the report templates can be found [in the InvenTree source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/samples/integration/report_plugin_sample.py):
|
||||
|
||||
```python
|
||||
"""Sample plugin for extending reporting functionality"""
|
||||
|
@@ -59,4 +59,4 @@ class ScheduledTaskPlugin(ScheduleMixin, SettingsMixin, InvenTreePlugin):
|
||||
```
|
||||
|
||||
!!! info "More Info"
|
||||
For more information on any of the methods described below, refer to the InvenTree source code. [A working example is available as a starting point](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/samples/integration/scheduled_task.py).
|
||||
For more information on any of the methods described below, refer to the InvenTree source code. [A working example is available as a starting point](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/samples/integration/scheduled_task.py).
|
||||
|
@@ -9,7 +9,7 @@ The `ValidationMixin` class enables plugins to perform custom validation of obje
|
||||
Any of the methods described below can be implemented in a custom plugin to provide functionality as required.
|
||||
|
||||
!!! info "More Info"
|
||||
For more information on any of the methods described below, refer to the InvenTree source code. [A working example is available as a starting point](https://github.com/inventree/InvenTree/blob/master/InvenTree/plugin/samples/integration/validation_sample.py).
|
||||
For more information on any of the methods described below, refer to the InvenTree source code. [A working example is available as a starting point](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/plugin/samples/integration/validation_sample.py).
|
||||
|
||||
!!! info "Multi Plugin Support"
|
||||
It is possible to have multiple plugins loaded simultaneously which support validation methods. For example when validating a field, if one plugin returns a null value (`None`) then the *next* plugin (if available) will be queried.
|
||||
|
@@ -183,4 +183,4 @@ Finally added a `{% raw %}|floatformat:0{% endraw %}` to the quantity that remov
|
||||
|
||||
A default *BOM Report* template is provided out of the box, which is useful for generating simple test reports. Furthermore, it may be used as a starting point for developing custom BOM reports:
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_bill_of_materials_report.html) for the default test report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_bill_of_materials_report.html) for the default test report template.
|
||||
|
@@ -321,4 +321,4 @@ This will result a report page like this:
|
||||
|
||||
A default *Build Report* template is provided out of the box, which is useful for generating simple test reports. Furthermore, it may be used as a starting point for developing custom BOM reports:
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_build_order_base.html) for the default build report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_build_order_base.html) for the default build report template.
|
||||
|
@@ -12,7 +12,7 @@ Some common functions are provided for use in custom report and label templates.
|
||||
```
|
||||
|
||||
!!! tip "Use the Source, Luke"
|
||||
To see the full range of available helper functions, refer to the source file [report.py](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templatetags/report.py) where these functions are defined!
|
||||
To see the full range of available helper functions, refer to the source file [report.py](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templatetags/report.py) where these functions are defined!
|
||||
|
||||
## Assigning Variables
|
||||
|
||||
|
@@ -62,4 +62,4 @@ Price: {% render_currency line.total_line_price %}
|
||||
|
||||
A default *Purchase Order Report* template is provided out of the box, which is useful for generating simple test reports. Furthermore, it may be used as a starting point for developing custom BOM reports:
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_po_report_base.html) for the default purchase order report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_po_report_base.html) for the default purchase order report template.
|
||||
|
@@ -159,7 +159,7 @@ InvenTree supports the following reporting functionality:
|
||||
InvenTree is supplied with a number of default templates "out of the box". These are generally quite simple, but serve as a starting point for building custom reports to suit a specific need.
|
||||
|
||||
!!! tip "Read the Source"
|
||||
The source code for the default reports is [available on GitHub](https://github.com/inventree/InvenTree/tree/master/InvenTree/report/templates/report). Use this as a guide for generating your own reports!
|
||||
The source code for the default reports is [available on GitHub](https://github.com/inventree/InvenTree/tree/master/src/backend/InvenTree/report/templates/report). Use this as a guide for generating your own reports!
|
||||
|
||||
## Creating Reports
|
||||
|
||||
|
@@ -23,4 +23,4 @@ In addition to the default report context variables, the following context varia
|
||||
|
||||
A default report template is provided out of the box, which can be used as a starting point for developing custom return order report templates.
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_return_order_report_base.html) for the default return order report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_return_order_report_base.html) for the default return order report template.
|
||||
|
@@ -28,4 +28,4 @@ In addition to the default report context variables, the following variables are
|
||||
|
||||
A default *Sales Order Report* template is provided out of the box, which is useful for generating simple test reports. Furthermore, it may be used as a starting point for developing custom BOM reports:
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_so_report_base.html) for the default sales order report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_so_report_base.html) for the default sales order report template.
|
||||
|
@@ -84,4 +84,4 @@ A default *Test Report* template is provided out of the box, which is useful for
|
||||
{% include "img.html" %}
|
||||
{% endwith %}
|
||||
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/InvenTree/report/templates/report/inventree_test_report_base.html) for the default test report template.
|
||||
View the [source code](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/report/templates/report/inventree_test_report_base.html) for the default test report template.
|
||||
|
@@ -72,7 +72,7 @@ sudo apt-get install supervisor
|
||||
Copy the supervisor configuration file:
|
||||
|
||||
```
|
||||
sudo cp /home/inventree/src/deploy/supervisord.conf /etc/supervisord.conf
|
||||
sudo cp /home/inventree/src/contrib/deploy/supervisord.conf /etc/supervisord.conf
|
||||
```
|
||||
|
||||
### Start Supervisor Daemon
|
||||
|
@@ -22,7 +22,7 @@ The InvenTree server tries to locate the `config.yaml` configuration file on sta
|
||||
!!! tip "Config File Location"
|
||||
When the InvenTree server boots, it will report the location where it expects to find the configuration file
|
||||
|
||||
The configuration file *template* can be found on [GitHub](https://github.com/inventree/InvenTree/blob/master/InvenTree/config_template.yaml)
|
||||
The configuration file *template* can be found on [GitHub](https://github.com/inventree/InvenTree/blob/master/src/backend/InvenTree/config_template.yaml)
|
||||
|
||||
!!! info "Template File"
|
||||
The default configuration file (as defined by the template linked above) will be copied to the specified configuration file location on first run, if a configuration file is not found in that location.
|
||||
|
@@ -125,8 +125,8 @@ def generate_index_file(version: str):
|
||||
f.write(output)
|
||||
|
||||
|
||||
def extract_refs(data: dict, components: dict) -> list:
|
||||
"""Extract a list of refs from the provided paths dict.
|
||||
def extract_refs(data: dict, components: dict) -> dict:
|
||||
"""Extract a dict of refs from the provided paths dict.
|
||||
|
||||
The refs are located like so:
|
||||
<path>:<method>:responses:<status>:content:application/json:schema:$ref
|
||||
|
@@ -246,7 +246,7 @@ plugins:
|
||||
handlers:
|
||||
python:
|
||||
paths:
|
||||
- ../InvenTree
|
||||
- ../src/backend/InvenTree
|
||||
options:
|
||||
show_symbol_type_heading: true
|
||||
show_symbol_type_toc: true
|
||||
@@ -273,7 +273,7 @@ markdown_extensions:
|
||||
|
||||
# Global Variables
|
||||
extra:
|
||||
static_folder_source: ./InvenTree/InvenTree/static/
|
||||
static_folder_source: ./src/backend/InvenTree/InvenTree/static/
|
||||
static_folder_local_default: ./inventree_static/
|
||||
|
||||
# Site Analytics
|
||||
|
@@ -11,8 +11,9 @@ exclude = [
|
||||
"env",
|
||||
".venv",
|
||||
".env",
|
||||
"src/backend/plugins/*",
|
||||
]
|
||||
src = ["InvenTree"]
|
||||
src = ["src/backend/InvenTree"]
|
||||
# line-length = 120
|
||||
|
||||
[tool.ruff.extend-per-file-ignores]
|
||||
@@ -69,13 +70,13 @@ skip-magic-trailing-comma = true
|
||||
line-ending = "auto"
|
||||
|
||||
[tool.coverage.run]
|
||||
source = ["InvenTree", ]
|
||||
source = ["src/backend/InvenTree", "InvenTree"]
|
||||
|
||||
[tool.djlint]
|
||||
ignore = "D018,H006,H008,H020,H021,H023,H025,H030,H031,T002"
|
||||
|
||||
[tool.isort]
|
||||
src_paths=["InvenTree", "../InvenTree"]
|
||||
src_paths=["src/backend/InvenTree", ]
|
||||
skip_glob ="*/migrations/*.py"
|
||||
known_django="django"
|
||||
sections=["FUTURE","STDLIB","DJANGO","THIRDPARTY","FIRSTPARTY","LOCALFOLDER"]
|
||||
|
@@ -6,7 +6,7 @@ mkdocs:
|
||||
python:
|
||||
install:
|
||||
- requirements: docs/requirements.txt
|
||||
- requirements: requirements.txt
|
||||
- requirements: src/backend/requirements.txt
|
||||
|
||||
build:
|
||||
os: "ubuntu-22.04"
|
||||
|
352
requirements.txt
352
requirements.txt
@@ -1,349 +1,3 @@
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile requirements.in -o requirements.txt --python-version=3.9 --no-strip-extras
|
||||
asgiref==3.8.0
|
||||
# via
|
||||
# django
|
||||
# django-cors-headers
|
||||
async-timeout==4.0.3
|
||||
# via redis
|
||||
attrs==23.2.0
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
babel==2.14.0
|
||||
# via py-moneyed
|
||||
bleach[css]==6.1.0
|
||||
# via django-markdownify
|
||||
brotli==1.1.0
|
||||
# via fonttools
|
||||
certifi==2024.2.2
|
||||
# via
|
||||
# requests
|
||||
# sentry-sdk
|
||||
cffi==1.16.0
|
||||
# via
|
||||
# cryptography
|
||||
# weasyprint
|
||||
charset-normalizer==3.3.2
|
||||
# via requests
|
||||
coreapi==2.3.3
|
||||
coreschema==0.0.4
|
||||
# via coreapi
|
||||
cryptography==42.0.5
|
||||
# via
|
||||
# djangorestframework-simplejwt
|
||||
# pyjwt
|
||||
cssselect2==0.7.0
|
||||
# via weasyprint
|
||||
defusedxml==0.7.1
|
||||
# via
|
||||
# odfpy
|
||||
# python3-openid
|
||||
deprecated==1.2.14
|
||||
# via
|
||||
# opentelemetry-api
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
diff-match-patch==20230430
|
||||
# via django-import-export
|
||||
dj-rest-auth==5.0.2
|
||||
django==4.2.11
|
||||
# via
|
||||
# dj-rest-auth
|
||||
# django-allauth
|
||||
# django-cors-headers
|
||||
# django-dbbackup
|
||||
# django-error-report-2
|
||||
# django-filter
|
||||
# django-flags
|
||||
# django-formtools
|
||||
# django-ical
|
||||
# django-import-export
|
||||
# django-js-asset
|
||||
# django-markdownify
|
||||
# django-money
|
||||
# django-otp
|
||||
# django-picklefield
|
||||
# django-q2
|
||||
# django-recurrence
|
||||
# django-redis
|
||||
# django-sesame
|
||||
# django-sql-utils
|
||||
# django-sslserver
|
||||
# django-stdimage
|
||||
# django-taggit
|
||||
# django-user-sessions
|
||||
# django-weasyprint
|
||||
# django-xforwardedfor-middleware
|
||||
# djangorestframework
|
||||
# djangorestframework-simplejwt
|
||||
# drf-spectacular
|
||||
django-allauth[mfa]==0.61.1
|
||||
django-cleanup==8.1.0
|
||||
django-cors-headers==4.3.1
|
||||
django-crispy-forms==1.14.0
|
||||
django-dbbackup==4.1.0
|
||||
django-error-report-2==0.4.2
|
||||
django-filter==24.1
|
||||
django-flags==5.0.13
|
||||
django-formtools==2.5.1
|
||||
django-ical==1.9.2
|
||||
django-import-export==3.3.7
|
||||
django-js-asset==2.2.0
|
||||
# via django-mptt
|
||||
django-maintenance-mode==0.21.1
|
||||
django-markdownify==0.9.3
|
||||
django-money==3.2.0
|
||||
django-mptt==0.16.0
|
||||
django-otp==1.3.0
|
||||
django-picklefield==3.1
|
||||
# via django-q2
|
||||
django-q-sentry==0.1.6
|
||||
django-q2==1.6.2
|
||||
django-recurrence==1.11.1
|
||||
# via django-ical
|
||||
django-redis==5.4.0
|
||||
django-sesame==3.2.2
|
||||
django-sql-utils==0.7.0
|
||||
django-sslserver==0.22
|
||||
django-stdimage==6.0.2
|
||||
django-taggit==5.0.1
|
||||
django-user-sessions==2.0.0
|
||||
django-weasyprint==2.3.0
|
||||
django-xforwardedfor-middleware==2.0
|
||||
djangorestframework==3.14.0
|
||||
# via
|
||||
# dj-rest-auth
|
||||
# djangorestframework-simplejwt
|
||||
# drf-spectacular
|
||||
djangorestframework-simplejwt[crypto]==5.3.1
|
||||
drf-spectacular==0.27.1
|
||||
dulwich==0.21.7
|
||||
et-xmlfile==1.1.0
|
||||
# via openpyxl
|
||||
feedparser==6.0.11
|
||||
fonttools[woff]==4.50.0
|
||||
# via weasyprint
|
||||
googleapis-common-protos==1.63.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
grpcio==1.62.1
|
||||
# via opentelemetry-exporter-otlp-proto-grpc
|
||||
gunicorn==21.2.0
|
||||
html5lib==1.1
|
||||
# via weasyprint
|
||||
icalendar==5.0.12
|
||||
# via django-ical
|
||||
idna==3.6
|
||||
# via requests
|
||||
importlib-metadata==6.11.0
|
||||
# via
|
||||
# django-q2
|
||||
# markdown
|
||||
# opentelemetry-api
|
||||
inflection==0.5.1
|
||||
# via drf-spectacular
|
||||
itypes==1.2.0
|
||||
# via coreapi
|
||||
jinja2==3.1.3
|
||||
# via coreschema
|
||||
jsonschema==4.21.1
|
||||
# via drf-spectacular
|
||||
jsonschema-specifications==2023.12.1
|
||||
# via jsonschema
|
||||
markdown==3.6
|
||||
# via django-markdownify
|
||||
markuppy==1.14
|
||||
# via tablib
|
||||
markupsafe==2.1.5
|
||||
# via jinja2
|
||||
oauthlib==3.2.2
|
||||
# via requests-oauthlib
|
||||
odfpy==1.4.1
|
||||
# via tablib
|
||||
openpyxl==3.1.2
|
||||
# via tablib
|
||||
opentelemetry-api==1.23.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
# opentelemetry-instrumentation
|
||||
# opentelemetry-instrumentation-django
|
||||
# opentelemetry-instrumentation-redis
|
||||
# opentelemetry-instrumentation-requests
|
||||
# opentelemetry-instrumentation-wsgi
|
||||
# opentelemetry-sdk
|
||||
opentelemetry-exporter-otlp==1.23.0
|
||||
opentelemetry-exporter-otlp-proto-common==1.23.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-exporter-otlp-proto-grpc==1.23.0
|
||||
# via opentelemetry-exporter-otlp
|
||||
opentelemetry-exporter-otlp-proto-http==1.23.0
|
||||
# via opentelemetry-exporter-otlp
|
||||
opentelemetry-instrumentation==0.44b0
|
||||
# via
|
||||
# opentelemetry-instrumentation-django
|
||||
# opentelemetry-instrumentation-redis
|
||||
# opentelemetry-instrumentation-requests
|
||||
# opentelemetry-instrumentation-wsgi
|
||||
opentelemetry-instrumentation-django==0.44b0
|
||||
opentelemetry-instrumentation-redis==0.44b0
|
||||
opentelemetry-instrumentation-requests==0.44b0
|
||||
opentelemetry-instrumentation-wsgi==0.44b0
|
||||
# via opentelemetry-instrumentation-django
|
||||
opentelemetry-proto==1.23.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-common
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-sdk==1.23.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-grpc
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-semantic-conventions==0.44b0
|
||||
# via
|
||||
# opentelemetry-instrumentation-django
|
||||
# opentelemetry-instrumentation-redis
|
||||
# opentelemetry-instrumentation-requests
|
||||
# opentelemetry-instrumentation-wsgi
|
||||
# opentelemetry-sdk
|
||||
opentelemetry-util-http==0.44b0
|
||||
# via
|
||||
# opentelemetry-instrumentation-django
|
||||
# opentelemetry-instrumentation-requests
|
||||
# opentelemetry-instrumentation-wsgi
|
||||
packaging==24.0
|
||||
# via gunicorn
|
||||
pdf2image==1.17.0
|
||||
pillow==10.2.0
|
||||
# via
|
||||
# django-stdimage
|
||||
# pdf2image
|
||||
# python-barcode
|
||||
# qrcode
|
||||
# weasyprint
|
||||
pint==0.21
|
||||
protobuf==4.25.3
|
||||
# via
|
||||
# googleapis-common-protos
|
||||
# opentelemetry-proto
|
||||
py-moneyed==3.0
|
||||
# via django-money
|
||||
pycparser==2.21
|
||||
# via cffi
|
||||
pydyf==0.9.0
|
||||
# via weasyprint
|
||||
pyjwt[crypto]==2.8.0
|
||||
# via
|
||||
# django-allauth
|
||||
# djangorestframework-simplejwt
|
||||
pyphen==0.14.0
|
||||
# via weasyprint
|
||||
pypng==0.20220715.0
|
||||
# via qrcode
|
||||
python-barcode[images]==0.15.1
|
||||
python-dateutil==2.9.0.post0
|
||||
# via
|
||||
# django-recurrence
|
||||
# icalendar
|
||||
python-dotenv==1.0.1
|
||||
python-fsutil==0.14.1
|
||||
# via django-maintenance-mode
|
||||
python3-openid==3.2.0
|
||||
# via django-allauth
|
||||
pytz==2024.1
|
||||
# via
|
||||
# django-dbbackup
|
||||
# djangorestframework
|
||||
# icalendar
|
||||
pyyaml==6.0.1
|
||||
# via
|
||||
# drf-spectacular
|
||||
# tablib
|
||||
qrcode[pil]==7.4.2
|
||||
# via django-allauth
|
||||
rapidfuzz==3.6.2
|
||||
redis==5.0.3
|
||||
# via django-redis
|
||||
referencing==0.34.0
|
||||
# via
|
||||
# jsonschema
|
||||
# jsonschema-specifications
|
||||
regex==2023.12.25
|
||||
requests==2.31.0
|
||||
# via
|
||||
# coreapi
|
||||
# django-allauth
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
# requests-oauthlib
|
||||
requests-oauthlib==1.4.0
|
||||
# via django-allauth
|
||||
rpds-py==0.18.0
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
sentry-sdk==1.43.0
|
||||
# via django-q-sentry
|
||||
setuptools==69.2.0
|
||||
# via
|
||||
# django-money
|
||||
# opentelemetry-instrumentation
|
||||
sgmllib3k==1.0.0
|
||||
# via feedparser
|
||||
six==1.16.0
|
||||
# via
|
||||
# bleach
|
||||
# html5lib
|
||||
# python-dateutil
|
||||
sqlparse==0.4.4
|
||||
# via
|
||||
# django
|
||||
# django-sql-utils
|
||||
tablib[html, ods, xls, xlsx, yaml]==3.5.0
|
||||
# via django-import-export
|
||||
tinycss2==1.2.1
|
||||
# via
|
||||
# bleach
|
||||
# cssselect2
|
||||
# weasyprint
|
||||
typing-extensions==4.10.0
|
||||
# via
|
||||
# asgiref
|
||||
# drf-spectacular
|
||||
# opentelemetry-sdk
|
||||
# py-moneyed
|
||||
# qrcode
|
||||
uritemplate==4.1.1
|
||||
# via
|
||||
# coreapi
|
||||
# drf-spectacular
|
||||
urllib3==2.2.1
|
||||
# via
|
||||
# dulwich
|
||||
# requests
|
||||
# sentry-sdk
|
||||
weasyprint==61.2
|
||||
# via django-weasyprint
|
||||
webencodings==0.5.1
|
||||
# via
|
||||
# bleach
|
||||
# cssselect2
|
||||
# html5lib
|
||||
# tinycss2
|
||||
whitenoise==6.6.0
|
||||
wrapt==1.16.0
|
||||
# via
|
||||
# deprecated
|
||||
# opentelemetry-instrumentation
|
||||
# opentelemetry-instrumentation-redis
|
||||
xlrd==2.0.1
|
||||
# via tablib
|
||||
xlwt==1.3.0
|
||||
# via tablib
|
||||
zipp==3.18.1
|
||||
# via importlib-metadata
|
||||
zopfli==0.2.3
|
||||
# via fonttools
|
||||
# Dummy requirements file to trigger the package pipeline
|
||||
# The new requirements file is located in src/backend/requirements.txt
|
||||
#
|
||||
|
@@ -91,9 +91,12 @@ class InvenTreeResource(ModelResource):
|
||||
"""
|
||||
# We can automatically determine which fields might need such a conversion
|
||||
for field in self.Meta.model._meta.fields:
|
||||
if isinstance(field, CharField):
|
||||
if field.blank and not field.null:
|
||||
if field.name not in self.CONVERT_NULL_FIELDS:
|
||||
if (
|
||||
isinstance(field, CharField)
|
||||
and field.blank
|
||||
and not field.null
|
||||
and field.name not in self.CONVERT_NULL_FIELDS
|
||||
):
|
||||
self.CONVERT_NULL_FIELDS.append(field.name)
|
||||
|
||||
for field in self.CONVERT_NULL_FIELDS:
|
@@ -443,10 +443,10 @@ def get_frontend_settings(debug=True):
|
||||
if 'environment' not in settings:
|
||||
settings['environment'] = 'development' if debug else 'production'
|
||||
|
||||
if debug and 'show_server_selector' not in settings:
|
||||
if (debug and 'show_server_selector' not in settings) or len(
|
||||
settings['server_list']
|
||||
) == 0:
|
||||
# In debug mode, show server selector by default
|
||||
settings['show_server_selector'] = True
|
||||
elif len(settings['server_list']) == 0:
|
||||
# If no servers are specified, show server selector
|
||||
settings['show_server_selector'] = True
|
||||
|
@@ -38,8 +38,7 @@ class InvenTreeRestURLField(RestURLField):
|
||||
'INVENTREE_STRICT_URLS', True, cache=False
|
||||
)
|
||||
|
||||
if not strict_urls and data is not empty:
|
||||
if '://' not in data:
|
||||
if not strict_urls and data is not empty and '://' not in data:
|
||||
# Validate as if there were a schema provided
|
||||
data = 'http://' + data
|
||||
|
0
InvenTree/InvenTree/migrations/__init__.py → src/backend/InvenTree/InvenTree/migrations/__init__.py
0
InvenTree/InvenTree/migrations/__init__.py → src/backend/InvenTree/InvenTree/migrations/__init__.py
@@ -458,8 +458,7 @@ class ReferenceIndexingMixin(models.Model):
|
||||
|
||||
reference_int = InvenTree.helpers.extract_int(reference)
|
||||
|
||||
if validate:
|
||||
if reference_int > models.BigIntegerField.MAX_BIGINT:
|
||||
if validate and reference_int > models.BigIntegerField.MAX_BIGINT:
|
||||
raise ValidationError({'reference': _('Reference number is too large')})
|
||||
|
||||
return reference_int
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user