2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-08-28 06:15:54 +00:00

Code structure refactor ()

* moved docker files to /contrib/container

* changed code owners to make more precise

* updated CI to use new subdirs

* added manual trigger for testing

* moved ci files

* moved assets into subdir

* moved deploy template file to contrib

* moved django files to src/backend

* updated paths in scripts etc

* updated reqs path

* fixed version file path

* fixed flake8 path

* fixed path to node ressources

* fixed task paths

* added dep path for node

* removed unused yarn lockfile

* removed unused ci script

* updated internal backend paths for tasks

* updated translation stats path

* fixed source path for coverage

* fixed main commit repo path

* fit in changes from testing

* gather packager improvements ()

* Matmair/issue5578 ()

* moved docker files to /contrib/container

* changed code owners to make more precise

* updated CI to use new subdirs

* added manual trigger for testing

* moved ci files

* moved assets into subdir

* moved deploy template file to contrib

* moved django files to src/backend

* updated paths in scripts etc

* updated reqs path

* fixed version file path

* fixed flake8 path

* fixed path to node ressources

* fixed task paths

* added dep path for node

* removed unused yarn lockfile

* removed unused ci script

* updated internal backend paths for tasks

* updated translation stats path

* fixed source path for coverage

* fixed main commit repo path

* fix docker path

* use project dir

* move project dir command

* fixed docker paths

* another fix?

* seperate tasks out

* remove tasks

* some debugging

* ci: add .deepsource.toml

* Update .deepsource.toml

* also ignore migrations

* more debugging

* fix path issues

* remove debug script

* fix style

* change locale path

* Fixed paths for requirements

* Added dummy requirements to fool packager

* fixed exec path

* remove deepsource

---------

Co-authored-by: deepsource-io[bot] <42547082+deepsource-io[bot]@users.noreply.github.com>

* Added docs for file structure

* Fixed style errors

* updated deepsource paths

* fix deepsource paths

* fixed reqs

* merge fixes

* move newly added dirs too

* fix reqs files

* another dep fix

* merge upstream/master

* revert removal of tags

* merge upstream

* enabled detection of old config files

* adapt coverage src

* also detect and support old location for plugins.txt

* style fix

* fix ~/init.sh location

* fix requirements path

* fix config to current master

* move new folders

* fix import order

* fix paths for qc_check

* fix docs build

* fix fix path

* set docker project dir

* just use a cd

* set image path?

* set file correct

* fix copy path

* fix tasks dir

* fix init path

* fix copy path

* set prject dir

* fix paths

* remove old prod files

* fix dev env path

* set docker file

* Fix devcontainer docker compose file

* fix login attempt values

* fix init.sh path

* Fix pathing for Docker

* Docker build fix

- Set INVENTREE_BACKEND_DIR separately

* Update init.sh

* Fix path

* Update requirements.txt

* merge

* fix rq merge

* fix docker compose usage

---------

Co-authored-by: deepsource-io[bot] <42547082+deepsource-io[bot]@users.noreply.github.com>
Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
This commit is contained in:
Matthias Mair
2024-04-03 02:16:59 +01:00
committed by GitHub
parent dd889e8eeb
commit 0bace3f3af
3317 changed files with 532 additions and 1194 deletions
.devcontainer
.github
.gitignore.pre-commit-config.yaml
.vscode
CONTRIBUTING.mdProcfileREADME.md
assets/images/logo
ci
contrib
crowdin.yml
docs
pyproject.tomlreadthedocs.ymlrequirements.txt
src
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.py
management
metadata.pymiddleware.py
migrations
mixins.pymodels.pypermissions.pyready.pysanitizer.pysentry.pyserializers.pysettings.pysocial_auth_urls.pysso.py
static
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
fixed-columns
group-by-v2
i18n-enhance
key-events
mobile
multiple-sort
page-jump-to
pipeline
print
reorder-columns
reorder-rows
resizable
sticky-header
toolbar
treegrid
themes
bootstrap
css
easymde
fontawesome
LICENSE.txt
css
js
less
metadata
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
fullcalendar
img
script
select2
treegrid
status.pystatus_codes.pytasks.pytemplate.py
templates
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
models.pyserializers.pytasks.py
templates
test_api.pytest_build.pytest_migrations.pytests.pyurls.pyvalidators.pyviews.py
common
company
__init__.pyadmin.pyapi.pyapps.py
fixtures
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.py
templates
test_api.pytest_migrations.pytest_supplier_parts.pytest_views.pytests.pyurls.pyviews.py
config_template.yaml
generic
gunicorn.conf.py
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
manage.py
order
__init__.pyadmin.pyapi.pyapps.py
fixtures
forms.py
migrations
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.py
templates
test_api.pytest_migrations.pytest_sales_order.pytest_views.pytests.pyurls.pyvalidators.pyviews.py
part
__init__.pyadmin.pyapi.pyapps.pybom.pyfilters.py
fixtures
forms.pyhelpers.py
migrations
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.py
templates
test_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
plugin
__init__.pyadmin.pyapi.pyapps.py
base
broken
builtin
events.pyhelpers.pyinstaller.py
machine
migrations
mixins
mock
models.pyplugin.pyregistry.py
samples
serializers.pytemplate.py
templatetags
test_api.pytest_helpers.pytest_plugin.pyurls.pyviews.py
plugins
report
script
stock
__init__.pyadmin.pyapi.pyapps.pyfilters.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.py
templates
test_api.pytest_migrations.pytest_views.pytests.pyurls.pyviews.py
templates
403.html403_csrf.html404.html500.html503.html
InvenTree
about.html
account
admin_button.html
allauth_2fa
attachment_button.htmlattachment_table.htmlbarcode_data.htmlbase.htmlclip.htmlclip_link.htmlcurrency_data.html
email
filter_list.htmlhover_image.html
js
mail.htmlmodal_csrf.htmlmodal_delete_form.htmlmodal_form.htmlmodals.htmlnavbar.htmlnotes_buttons.htmlnotifications.htmlpage_base.htmlpanel.html
patterns
plugin
price.htmlproject_code_data.htmlqr_button.htmlqr_code.html
registration
sample
search.htmlsearch_form.htmlsidebar_header.htmlsidebar_item.htmlsidebar_link.htmlsidebar_toggle.htmlskeleton.html
socialaccount
spacer.htmlstats.htmlstatus_codes.htmlstock_table.htmltel.htmlthird_party_js.htmlurl.htmlversion.htmlyesnolabel.html
users
web
package-lock.jsonpackage.jsonrequirements-dev.inrequirements-dev.txtrequirements.inrequirements.txt
frontend
tasks.pyyarn.lock

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

@@ -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

@@ -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

103
.github/scripts/check_js_templates.py vendored Normal file

@@ -0,0 +1,103 @@
"""Test that the "translated" javascript files to not contain template tags which need to be determined at "run time".
This is because the "translated" javascript files are compiled into the "static" directory.
They should only contain template tags that render static information.
"""
import os
import pathlib
import re
import sys
here = os.path.abspath(os.path.dirname(__file__))
template_dir = os.path.abspath(os.path.join(here, '..', 'InvenTree', 'templates'))
# We only care about the 'translated' files
js_i18n_dir = os.path.join(template_dir, 'js', 'translated')
js_dynamic_dir = os.path.join(template_dir, 'js', 'dynamic')
errors = 0
print('=================================')
print('Checking static javascript files:')
print('=================================')
def check_invalid_tag(data):
"""Check for invalid tags."""
pattern = r'{%(\w+)'
err_count = 0
for idx, line in enumerate(data):
results = re.findall(pattern, line)
for result in results:
err_count += 1
print(f' - Error on line {idx + 1}: %{{{result[0]}')
return err_count
def check_prohibited_tags(data):
"""Check for prohibited tags."""
allowed_tags = [
'if',
'elif',
'else',
'endif',
'for',
'endfor',
'trans',
'load',
'include',
'url',
]
pattern = r'{% (\w+)\s'
err_count = 0
for idx, line in enumerate(data):
for tag in re.findall(pattern, line):
if tag not in allowed_tags:
print(f" > Line {idx + 1} contains prohibited template tag '{tag}'")
err_count += 1
return err_count
for filename in pathlib.Path(js_i18n_dir).rglob('*.js'):
print(f"Checking file 'translated/{os.path.basename(filename)}':")
with open(filename, 'r') as js_file:
data = js_file.readlines()
errors += check_invalid_tag(data)
errors += check_prohibited_tags(data)
for filename in pathlib.Path(js_dynamic_dir).rglob('*.js'):
print(f"Checking file 'dynamic/{os.path.basename(filename)}':")
# Check that the 'dynamic' files do not contains any translated strings
with open(filename, 'r') as js_file:
data = js_file.readlines()
invalid_tags = ['blocktrans', 'blocktranslate', 'trans', 'translate']
err_count = 0
for idx, line in enumerate(data):
for tag in invalid_tags:
tag = '{% ' + tag
if tag in line:
err_count += 1
print(f" > Error on line {idx + 1}: Prohibited tag '{tag}' found")
if errors > 0:
print(f'Found {errors} incorrect template tags')
sys.exit(errors)

@@ -0,0 +1,28 @@
"""Check that there are no database migration files which have not been committed."""
import subprocess
import sys
print('Checking for unstaged migration files...')
cmd = ['git', 'ls-files', '--exclude-standard', '--others']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
migrations = []
for line in str(out.decode()).split('\n'):
if '/migrations/' in line:
migrations.append(line)
if len(migrations) == 0:
sys.exit(0)
print('There are {n} unstaged migration files:'.format(n=len(migrations)))
for m in migrations:
print(' - {m}'.format(m=m))
sys.exit(len(migrations))

196
.github/scripts/version_check.py vendored Normal file

@@ -0,0 +1,196 @@
"""Ensure that the release tag matches the InvenTree version number.
Behaviour:
master / main branch:
- version number must end with 'dev'
tagged branch:
- version number must match tag being built
- version number cannot already exist as a release tag
"""
import json
import os
import re
import sys
from pathlib import Path
import requests
def get_existing_release_tags():
"""Request information on existing releases via the GitHub API."""
# Check for github token
token = os.getenv('GITHUB_TOKEN', None)
headers = None
if token:
headers = {'Authorization': f'Bearer {token}'}
response = requests.get(
'https://api.github.com/repos/inventree/inventree/releases', headers=headers
)
if response.status_code != 200:
raise ValueError(
f'Unexpected status code from GitHub API: {response.status_code}'
)
data = json.loads(response.text)
# Return a list of all tags
tags = []
for release in data:
tag = release['tag_name'].strip()
match = re.match(r'^.*(\d+)\.(\d+)\.(\d+).*$', tag)
if len(match.groups()) != 3:
print(f"Version '{tag}' did not match expected pattern")
continue
tags.append([int(x) for x in match.groups()])
return tags
def check_version_number(version_string, allow_duplicate=False):
"""Check the provided version number.
Returns True if the provided version is the 'newest' InvenTree release
"""
print(f"Checking version '{version_string}'")
# Check that the version string matches the required format
match = re.match(r'^(\d+)\.(\d+)\.(\d+)(?: dev)?$', version_string)
if not match or len(match.groups()) != 3:
raise ValueError(
f"Version string '{version_string}' did not match required pattern"
)
version_tuple = [int(x) for x in match.groups()]
# Look through the existing releases
existing = get_existing_release_tags()
# Assume that this is the highest release, unless told otherwise
highest_release = True
for release in existing:
if release == version_tuple and not allow_duplicate:
raise ValueError(f"Duplicate release '{version_string}' exists!")
if release > version_tuple:
highest_release = False
print(f'Found newer release: {str(release)}')
return highest_release
if __name__ == '__main__':
if 'only_version' in sys.argv:
here = Path(__file__).parent.absolute()
version_file = here.joinpath('..', 'InvenTree', 'InvenTree', 'api_version.py')
text = version_file.read_text()
results = re.findall(r"""INVENTREE_API_VERSION = (.*)""", text)
print(results[0])
exit(0)
# GITHUB_REF_TYPE may be either 'branch' or 'tag'
GITHUB_REF_TYPE = os.environ['GITHUB_REF_TYPE']
# GITHUB_REF may be either 'refs/heads/<branch>' or 'refs/heads/<tag>'
GITHUB_REF = os.environ['GITHUB_REF']
GITHUB_REF_NAME = os.environ['GITHUB_REF_NAME']
GITHUB_BASE_REF = os.environ['GITHUB_BASE_REF']
# Print out version information, makes debugging actions *much* easier!
print(f'GITHUB_REF: {GITHUB_REF}')
print(f'GITHUB_REF_NAME: {GITHUB_REF_NAME}')
print(f'GITHUB_REF_TYPE: {GITHUB_REF_TYPE}')
print(f'GITHUB_BASE_REF: {GITHUB_BASE_REF}')
here = Path(__file__).parent.absolute()
version_file = here.joinpath(
'..', '..', 'src', 'backend', 'InvenTree', 'InvenTree', 'version.py'
)
version = None
with open(version_file, 'r') as f:
text = f.read()
# Extract the InvenTree software version
results = re.findall(r"""INVENTREE_SW_VERSION = '(.*)'""", text)
if len(results) != 1:
print(f'Could not find INVENTREE_SW_VERSION in {version_file}')
sys.exit(1)
version = results[0]
print(f"InvenTree Version: '{version}'")
# Check version number and look for existing versions
# If a release is found which matches the current tag, throw an error
allow_duplicate = False
# Note: on a 'tag' (release) we *must* allow duplicate versions, as this *is* the version that has just been released
if GITHUB_REF_TYPE == 'tag':
allow_duplicate = True
# Note: on a push to 'stable' branch we also allow duplicates
if GITHUB_BASE_REF == 'stable':
allow_duplicate = True
highest_release = check_version_number(version, allow_duplicate=allow_duplicate)
# Determine which docker tag we are going to use
docker_tags = None
if GITHUB_REF_TYPE == 'tag':
# GITHUB_REF should be of the form /refs/heads/<tag>
version_tag = GITHUB_REF.split('/')[-1]
print(f"Checking requirements for tagged release - '{version_tag}':")
if version_tag != version:
print(f"Version number '{version}' does not match tag '{version_tag}'")
sys.exit
if highest_release:
docker_tags = [version_tag, 'stable']
else:
docker_tags = [version_tag]
elif GITHUB_REF_TYPE == 'branch':
# Otherwise we know we are targeting the 'master' branch
docker_tags = ['latest']
else:
print('Unsupported branch / version combination:')
print(f'InvenTree Version: {version}')
print('GITHUB_REF_TYPE:', GITHUB_REF_TYPE)
print('GITHUB_BASE_REF:', GITHUB_BASE_REF)
print('GITHUB_REF:', GITHUB_REF)
sys.exit(1)
if docker_tags is None:
print('Docker tags could not be determined')
sys.exit(1)
print(f"Version check passed for '{version}'!")
print(f"Docker tags: '{docker_tags}'")
# Ref: https://getridbug.com/python/how-to-set-environment-variables-in-github-actions-using-python/
with open(os.getenv('GITHUB_ENV'), 'a') as env_file:
# Construct tag string
tags = ','.join([f'inventree/inventree:{tag}' for tag in docker_tags])
env_file.write(f'docker_tags={tags}\n')
if GITHUB_REF_TYPE == 'tag' and highest_release:
env_file.write('stable_release=true\n')

@@ -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

@@ -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

@@ -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,12 +147,12 @@ 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: |
@@ -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
@@ -273,7 +273,7 @@ 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
@@ -512,9 +512,9 @@ 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

@@ -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