{"plugins":{ "/melektron/inventree-adv-sheet-label": { "name": "InvenTree Advanced Sheet Label", "author": "melektron", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-adv-sheet-label", "links":{ "website": "https://elektron.work", "issue_tracker": "https://github.com/melektron/inventree-adv-sheet-label/issues", "github": "https://github.com/melektron/inventree-adv-sheet-label/", "gitlab": null, "source": null }, "categories": ["Label","Settings"], "tags": ["Sheet layout","Office","Printing","Label"], "content_txt" : "A label printing plugin for InvenTree which provides support for printing labels on off-the-shelf label sheet layouts and adds some more useful features compared to the sheet label plugin included with InvenTree.\n\nIndex\n\n\n Installation\n Usage and Features\n \n Sheet layout\n Number of labels\n Skip label positions\n Ignore label size mismatch\n Print border\n Label fill color\n \n \n Errors\n Settings\n \n Default sheet layout\n \n \n Contribution\n \n Reporting and fixing bugs\n Adding new layouts\n \n \n Plugin development setup\n\n\nInstallation\n\n\n Note:\nThis plugin currently supports InvenTree versions 0.15.x. As of writing, version 0.16.x is under development and its new API is partially supported. However, since that might still change at any time, compatibility is not yet guaranteed.\n\n\nThe simplest way of installing is by using the Install Plugin button on the InvenTree Plugin Settings page and then entering the package name:\n\n\n\nAlternatively, you can install this plugin manually in the InvenTree container as follows:\n\npip install inventree-adv-sheet-label\n\n\nOr, add the package name to your plugins.txt file (this is automatically done when using the UI method) to install automatically when using the invoke install command:\n\ninventree-adv-sheet-label\n\n\nIn any case, after installation, the plugin needs to be enabled in the above mentioned plugin settings page:\n\n\n\nUsage and Features\n\nThis plugin adds the “AdvancedLabelSheet” printing option to the label printing dialog:\n\n\n\nSheet layout\n\nUnlike the builtin sheet label printing plugin of InvenTree, this plugin presents a selection of preconfigured sheet label layout options corresponding to various kinds of off-the-shelf label printing paper that can be purchased from most office supply shops and easily printed on any standard 2D printer.\n\nYou can select the layout corresponding your paper in the Sheet layout dropdown:\n\n\n\nThese layouts are identified by a several digit number written on the paper packaging, which (as far as I can tell) is unique to the layout independent of the manufacturer (at least where I live). The identifier is however just a string, so any other scheme can also be used in the future.\n\nThe dropdown list also shows some additional information about the layout for orientation:\n\n\n Paper size (e.g. A4)\n Dimensions of the individual labels\n How many rows and columns are on one page\n Whether the labels have rounded corners\n\n\nCurrently supported layouts:\n\n\n \n \n Layout Identifier\n Paper size\n Label dimensions\n Label layout\n Corner style\n \n \n \n \n 4780\n A4\n 48.5mm x 25.4mm\n 4 columns x 10 rows\n sharp\n \n \n 4737\n A4\n 63.5mm x 29.6mm\n 3 columns x 9 rows\n round\n \n \n 4201\n A4\n 45.7mm x 16.9mm\n 4 columns x 16 rows\n round\n \n \n 7160-10\n A4\n 63.5mm x 38.1mm\n 3 columns x 7 rows\n round\n \n \n 4360\n A4\n 70.0mm x 36.0mm\n 3 columns x 8 rows\n sharp\n \n \n\n\nAs of right now, this selection is limited to whatever layouts I personally own and use. If the paper layout you need is not included, please file an Issue with the “Sheet Layout” template. See the Adding new layouts for details.\n\nYou can also select one of the two Auto sheet layout presets. These will automatically select the correct sheet layout for the label template you are printing. This is done in one of three ways:\n\n If you have a specific layout that’s always used for a specific template, you can add the {\"sheet_layout\": \"...\"} metadata key to your label template configuration (replace … with the identifier of the layout. This might not be the same as the display name, see here what the identifier is). This is the cleanest way configure the correct layout for your templates.\n If the selected template template has no such metadata, the plugin will attempt to find a layout with exactly the required label size and use that one. If multiple matches are found, the first one is selected while preferring ones with round or sharp corners depending on your selection.\n If no exact matches are found, the closest layout that can fit your label template will be selected and shown to the user in an error message. The user can then decide to use this option by selecting the ‘Ignore label size mismatch’ switch.\n\n\nNumber of labels\n\nThe Number of labels field lets you print multiple of the same label in one go. By default, the number of labels printed is 1, resulting in an output like this:\n\n\n(The label template is only an example and this is only part of a page)\n\nLet’s say you want to print two of the same label. By entering the desired amount in the field, multiple of the same label will be printed at once, of course arranged according to the selected layout:\n\n\n\nIf you are printing labels for multiple items at once, such as for an entire selection of parts, this amount is applied to all items. For example, lets print two labels for each of those four capacitors:\n\n\n\n\nThis results in a printout looking like this:\n\n\n\nYou can also specify to print zero labels. This is useful in combination with the “Skip label positions” and “Debug: Print border” options to print an empty grid of cells for testing.\n\nSkip label positions\n\nWhen printing on label sheets, it is likely that you don’t use up the entire sheet of labels at once. Maybe you only want to print a single label and then another one later. To do so, you can enter the number of labels on a sheet that are already used up in the Skip label positions fields (counting from top left to bottom right). These positions are then skipped and labels will start to print at the next unused position. This also works when printing multiple labels.\n\nFor example, let’s assume the first two labels are already used up and we want to start printing at the third one:\n\n\n\nThis results in the following output:\n\n\n\nWhen printing small labels with many of them on a single sheet, it can be confusing and annoying to keep track of the amount of labels skipped. Since this is such a common task, the plugin automatically remembers how many labels have been used up already and populates the Skip label positions field with the correct number of labels to skip after the previous printing operations. For example, after the above shown printing operation, the plugin automatically remembers that next time, it needs to skip four labels and pre-populates the field with that value:\n\n\n\nWhen an entire page or more is used up, this counter automatically wraps around to the correct value for the next page.\n\nOf course, this feature only makes sense when printing a lot of labels on the same label sheet (and therefore label sheet layout) back-to-back. Since this value is stored only once globally, when switching between different label sheets (for example because multiple users are printing on different sheets at once) the value is probably not accurate and needs to be manually checked and possibly adjusted each time.\n\nIgnore label size mismatch\n\nTo ensure the desired result, the plugin automatically check whether the size of the label according to the selected template matches the size of the labels on the selected sheet layout.\n\nIf that is not the case, the user is presented with an error message. This can happen in a few different scenarios:\n\n Manually selecting a sheet layout that doesn’t match the label template: \n When automatic layout selection is enabled and the label template specifies a sheet layout but its label size does not match that of the template: \n When automatic layout selection is enabled but the label template doesn’t specify any layout in the metadata and no exact size match was found: \n\n\nIn any of these cases, you might want to continue anyway, e.g. because you may not have the correct sheet at hand. To do so, you can enable the Ignore label size mismatch switch to override these safety checks and print anyway. If the label template doesn’t fit exactly, it is aligned at the top left corner of the physical label. The result might look something like this:\n\n\n\nPrint border\n\nWhen debugging or testing your sheet layouts and templates, it might be useful to see the shape of the physical label (e.g. for the previous image). For this purpose, you can enable the Debug: Print border switch, to print a 0.25mm border around the label. This border is aligned on the INSIDE of the label, so it doesn’t overlap other labels but will cover up a tiny bit of area on the edge of your label. The scale and position of the label content are not affected by the border.\n\nWhen skipping labels, the skipped positions also have a border.\n\nThe result looks something like this:\n\n\n\nLabel fill color\n\nSimilarly to the border, you might want to fill the background of the labels with a color to debug your template and see what is covered. This can be achieved by entering the desired color in the Debug: Label fill color field. Any CSS color string is valid. To have no fill color, use the value “unset”, which is also the default. Leaving the field empty doesn’t work unfortunately since I wasn’t able to get the form to accept an empty field.\n\nThe result might look something like this with color “lightgreen”:\n\n\n(White lines between rows are just rendering defects of my browser)\n\nYou can also combine this option with the border.\n\nErrors\n\nIn addition to the errors covered in section Ignore label size mismatch you might encounter the following error messages when printing:\n\n\n Sheet layout ‘[sheet_layout_code]’ does not exist.: This means that an API request was received with an invalid sheet layout in the selection. During normal operation, this should never happen because the dropdown list is automatically populated with all valid options. If you are using the API from a 3rd party application, this could mean that the application has requested to print using a sheet layout which is either not supported by this plugin or the application has a typo in the sheet layout code.\n No labels were generated: This means that you are not printing any labels (Number of labels = 0) and are not generating any empty fields either (Skip label positions = 0). This would result in a blank page and is likely not what you want.\n Error printing label: This error along with another error box containing a Python exception string means that something has gone wrong in the plugin code that is not an intentional error message. Example: If you see this, feel free to file a bug report. See Reporting and fixing bugs on how to do so.\n\n\nSettings\n\nThis section describes the settings available in the plugins settings page.\n\nDefault sheet layout\n\nThis setting allows you to specify which sheet layout is selected by default when opening the printing dialog. It makes sense to set this either to some Auto option or to the layout you are using the most. The default is Auto (round), which is probably fine for most use-cases.\n\nContribution\n\nIf you have ideas for new features, found typos, have encountered a bug or want to add more sheet layouts, feel free to contribute to this plugin by filing an Issue or creating a Pull Request. See Plugin development setup to learn how you can set up your development environment to test your modifications.\n\nSee the below information and instructions for common contribution types.\n\nReporting and fixing bugs\n\nIf you have encountered a problem or a bug with the plugin, please file an Issue with the Bug Report template.\n\nThe template requires you to provide a screenshot of your label template configuration. You can get this by going to https://your.inventree.url/admin/label/ for InvenTree 0.15.x or https://your.inventree.url/admin/report/labeltemplate/ for InvenTree 0.16.x and selecting the template you were trying to print when the problem ocurred. You need administrator privileges to do this. If you don’t have them, ask your administrator. This page might look something like this:\n\n\n\nIn addition to this screenshot, you will be asked to attach the label template file which can be downloaded by clicking on the link next to “Currently:” in the above shown page. Please make sure this file doesn’t contain any confidential data and remove it if it does.\n\nYou will also be asked to provide some other information about when and how the bug ocurred which is described in the template.\n\nPRs\n\nIf you know how to fix a bug, feel free to create a Pull Request with the solution.\n\nAdding new layouts\n\nIf you have a label paper layout that is not yet supported by this plugin, please file an Issue with the Sheet Layout template\n\nIn the template you will be asked to provide some basic information about the sheet layout such as possible manufacturers/suppliers and where the product can be purchased.\n\nThen, you will be presented with a code template of a layout configuration which you must fill out with your values. The options are commented and mostly self-explanatory.\n\nIf your layout uses a page size that has never been used before, you will also be asked to define the paper format with a name and its dimensions. Otherwise you can simply reference an existing format and omit that part of the issue template.\n\nAdding sheet layouts yourself\n\nWe will review your layout and add it to the main plugin distribution as soon as possible. However, if you need the layout immediately and cannot wait for it to be added officially, you can fork the repository and include it yourself.\n\nTo do so, you can edit the advanced_sheet_label/layouts.py file. In there you will find a dictionary of all defined paper sizes and a dictionary of all defined sheet layouts. After filling out the code in the Issue template, you can simply append the new definitions at the end of the dictionaries.\n\n# ... more file content\n\nPAPER_SIZES = {\n \"A4\": PaperSize(\"A4\", 210, 297)\n # ... possibly more paper sizes\n # add your new paper size here if required\n}\n\nLAYOUTS = {\n \"4780\": SheetLayout(\n display_name=\"4780\",\n page_size=PAPER_SIZES[\"A4\"],\n label_width=48.5,\n label_height=25.4,\n columns=4,\n rows=10,\n column_spacing=0,\n row_spacing=0,\n corner_radius=0\n ),\n # ... more sheet layouts\n # add your new sheet layout here\n}\n\n# ... more file content\n\n\nMake sure that the layout codes (the strings before the colon) are UNIQUE, otherwise the plugin will not work.\n\nTo install the modified plugin in your InvenTree instance, simply enter YOUR repository link instead of the package name in the installation modal. Example with this repository:\n\n\n\n\n Make sure to uninstall the official plugin before you install your fork, otherwise they will conflict!\n\n\n\n It appears that this doesn’t work. It also didn’t seem to work when placing the “git+…” URL in package field in the UI. For me, I have been able to install the plugin directly from GitHub by stopping the InvenTree server and then installing directly using pip:\n pip uninstall inventree-adv-sheet-label # uninstall normal package\npip install git+https://github.com/melektron/inventree-adv-sheet-label.git\n \n You have to adjust the link to your repo.\n\n\nIf you have added a sheet layout yourself, you are still encouraged to create a Pull Request with your changes so the changes can be added to the mainline plugin for everyone to benefit.\n\nPlugin development setup\n\nWhen making bigger changes than just adding layouts, it is recommended to set up a proper development environment.\n\nTo develop the plugin, setup an InvenTree development instance using devcontainers according to this this official documentation. It is also recommended to setup the example dataset for experimenting.\n\nThen clone this repo (or your fork) separately on your host computer and link it to the devserver according to the documentation.\n\nIt is also recommended to save the workspace as a file (maybe somewhere in inventree repo but don’t commit it) and include the intellisenseconfig as well as editor layout there.\n\nThe InvenTree intellisense path might be something like /home/inventree/src/backend/InvenTree instead of the path from the documentation.\n\nAfter that, start the InvenTree server with the debugger and the plugin should now be usable and debugable.\n", "content": "
A label printing plugin for InvenTree which provides support for printing labels on off-the-shelf label sheet layouts and adds some more useful features compared to the sheet label plugin included with InvenTree.
\n\n\n\n\nNote:\nThis plugin currently supports InvenTree versions 0.15.x. As of writing, version 0.16.x is under development and its new API is partially supported. However, since that might still change at any time, compatibility is not yet guaranteed.
\n
The simplest way of installing is by using the Install Plugin
button on the InvenTree Plugin Settings
page and then entering the package name:
Alternatively, you can install this plugin manually in the InvenTree container as follows:
\n\npip install inventree-adv-sheet-label\n
Or, add the package name to your plugins.txt file (this is automatically done when using the UI method) to install automatically when using the invoke install
command:
inventree-adv-sheet-label\n
In any case, after installation, the plugin needs to be enabled in the above mentioned plugin settings page:
\n\nThis plugin adds the “AdvancedLabelSheet” printing option to the label printing dialog:
\n\nUnlike the builtin sheet label printing plugin of InvenTree, this plugin presents a selection of preconfigured sheet label layout options corresponding to various kinds of off-the-shelf label printing paper that can be purchased from most office supply shops and easily printed on any standard 2D printer.
\n\nYou can select the layout corresponding your paper in the Sheet layout
dropdown:
These layouts are identified by a several digit number written on the paper packaging, which (as far as I can tell) is unique to the layout independent of the manufacturer (at least where I live). The identifier is however just a string, so any other scheme can also be used in the future.
\n\nThe dropdown list also shows some additional information about the layout for orientation:
\n\nCurrently supported layouts:
\n\nLayout Identifier | \nPaper size | \nLabel dimensions | \nLabel layout | \nCorner style | \n
---|---|---|---|---|
4780 | \nA4 | \n48.5mm x 25.4mm | \n4 columns x 10 rows | \nsharp | \n
4737 | \nA4 | \n63.5mm x 29.6mm | \n3 columns x 9 rows | \nround | \n
4201 | \nA4 | \n45.7mm x 16.9mm | \n4 columns x 16 rows | \nround | \n
7160-10 | \nA4 | \n63.5mm x 38.1mm | \n3 columns x 7 rows | \nround | \n
4360 | \nA4 | \n70.0mm x 36.0mm | \n3 columns x 8 rows | \nsharp | \n
As of right now, this selection is limited to whatever layouts I personally own and use. If the paper layout you need is not included, please file an Issue with the “Sheet Layout” template. See the Adding new layouts for details.
\n\nYou can also select one of the two Auto
sheet layout presets. These will automatically select the correct sheet layout for the label template you are printing. This is done in one of three ways:
{\"sheet_layout\": \"...\"}
metadata key to your label template configuration (replace … with the identifier of the layout. This might not be the same as the display name, see here what the identifier is). This is the cleanest way configure the correct layout for your templates.The Number of labels
field lets you print multiple of the same label in one go. By default, the number of labels printed is 1, resulting in an output like this:
\n(The label template is only an example and this is only part of a page)
Let’s say you want to print two of the same label. By entering the desired amount in the field, multiple of the same label will be printed at once, of course arranged according to the selected layout:
\n\nIf you are printing labels for multiple items at once, such as for an entire selection of parts, this amount is applied to all items. For example, lets print two labels for each of those four capacitors:
\n\n\n
This results in a printout looking like this:
\n\nYou can also specify to print zero labels. This is useful in combination with the “Skip label positions” and “Debug: Print border” options to print an empty grid of cells for testing.
\n\nWhen printing on label sheets, it is likely that you don’t use up the entire sheet of labels at once. Maybe you only want to print a single label and then another one later. To do so, you can enter the number of labels on a sheet that are already used up in the Skip label positions
fields (counting from top left to bottom right). These positions are then skipped and labels will start to print at the next unused position. This also works when printing multiple labels.
For example, let’s assume the first two labels are already used up and we want to start printing at the third one:
\n\nThis results in the following output:
\n\nWhen printing small labels with many of them on a single sheet, it can be confusing and annoying to keep track of the amount of labels skipped. Since this is such a common task, the plugin automatically remembers how many labels have been used up already and populates the Skip label positions
field with the correct number of labels to skip after the previous printing operations. For example, after the above shown printing operation, the plugin automatically remembers that next time, it needs to skip four labels and pre-populates the field with that value:
When an entire page or more is used up, this counter automatically wraps around to the correct value for the next page.
\n\nOf course, this feature only makes sense when printing a lot of labels on the same label sheet (and therefore label sheet layout) back-to-back. Since this value is stored only once globally, when switching between different label sheets (for example because multiple users are printing on different sheets at once) the value is probably not accurate and needs to be manually checked and possibly adjusted each time.
\n\nTo ensure the desired result, the plugin automatically check whether the size of the label according to the selected template matches the size of the labels on the selected sheet layout.
\n\nIf that is not the case, the user is presented with an error message. This can happen in a few different scenarios:
\nIn any of these cases, you might want to continue anyway, e.g. because you may not have the correct sheet at hand. To do so, you can enable the Ignore label size mismatch
switch to override these safety checks and print anyway. If the label template doesn’t fit exactly, it is aligned at the top left corner of the physical label. The result might look something like this:
When debugging or testing your sheet layouts and templates, it might be useful to see the shape of the physical label (e.g. for the previous image). For this purpose, you can enable the Debug: Print border
switch, to print a 0.25mm border around the label. This border is aligned on the INSIDE of the label, so it doesn’t overlap other labels but will cover up a tiny bit of area on the edge of your label. The scale and position of the label content are not affected by the border.
When skipping labels, the skipped positions also have a border.
\n\nThe result looks something like this:
\n\nSimilarly to the border, you might want to fill the background of the labels with a color to debug your template and see what is covered. This can be achieved by entering the desired color in the Debug: Label fill color
field. Any CSS color string is valid. To have no fill color, use the value “unset”, which is also the default. Leaving the field empty doesn’t work unfortunately since I wasn’t able to get the form to accept an empty field.
The result might look something like this with color “lightgreen”:
\n\n\n(White lines between rows are just rendering defects of my browser)
You can also combine this option with the border.
\n\nIn addition to the errors covered in section Ignore label size mismatch you might encounter the following error messages when printing:
\n\nThis section describes the settings available in the plugins settings page.
\n\nThis setting allows you to specify which sheet layout is selected by default when opening the printing dialog. It makes sense to set this either to some Auto option or to the layout you are using the most. The default is Auto (round)
, which is probably fine for most use-cases.
If you have ideas for new features, found typos, have encountered a bug or want to add more sheet layouts, feel free to contribute to this plugin by filing an Issue or creating a Pull Request. See Plugin development setup to learn how you can set up your development environment to test your modifications.
\n\nSee the below information and instructions for common contribution types.
\n\nIf you have encountered a problem or a bug with the plugin, please file an Issue with the Bug Report template.
\n\nThe template requires you to provide a screenshot of your label template configuration. You can get this by going to https://your.inventree.url/admin/label/ for InvenTree 0.15.x or https://your.inventree.url/admin/report/labeltemplate/ for InvenTree 0.16.x and selecting the template you were trying to print when the problem ocurred. You need administrator privileges to do this. If you don’t have them, ask your administrator. This page might look something like this:
\n\nIn addition to this screenshot, you will be asked to attach the label template file which can be downloaded by clicking on the link next to “Currently:” in the above shown page. Please make sure this file doesn’t contain any confidential data and remove it if it does.
\n\nYou will also be asked to provide some other information about when and how the bug ocurred which is described in the template.
\n\nIf you know how to fix a bug, feel free to create a Pull Request with the solution.
\n\nIf you have a label paper layout that is not yet supported by this plugin, please file an Issue with the Sheet Layout template
\n\nIn the template you will be asked to provide some basic information about the sheet layout such as possible manufacturers/suppliers and where the product can be purchased.
\n\nThen, you will be presented with a code template of a layout configuration which you must fill out with your values. The options are commented and mostly self-explanatory.
\n\nIf your layout uses a page size that has never been used before, you will also be asked to define the paper format with a name and its dimensions. Otherwise you can simply reference an existing format and omit that part of the issue template.
\n\nWe will review your layout and add it to the main plugin distribution as soon as possible. However, if you need the layout immediately and cannot wait for it to be added officially, you can fork the repository and include it yourself.
\n\nTo do so, you can edit the advanced_sheet_label/layouts.py file. In there you will find a dictionary of all defined paper sizes and a dictionary of all defined sheet layouts. After filling out the code in the Issue template, you can simply append the new definitions at the end of the dictionaries.
\n\n# ... more file content\n\nPAPER_SIZES = {\n \"A4\": PaperSize(\"A4\", 210, 297)\n # ... possibly more paper sizes\n # add your new paper size here if required\n}\n\nLAYOUTS = {\n \"4780\": SheetLayout(\n display_name=\"4780\",\n page_size=PAPER_SIZES[\"A4\"],\n label_width=48.5,\n label_height=25.4,\n columns=4,\n rows=10,\n column_spacing=0,\n row_spacing=0,\n corner_radius=0\n ),\n # ... more sheet layouts\n # add your new sheet layout here\n}\n\n# ... more file content\n
Make sure that the layout codes (the strings before the colon) are UNIQUE, otherwise the plugin will not work.
\n\nTo install the modified plugin in your InvenTree instance, simply enter YOUR repository link instead of the package name in the installation modal. Example with this repository:
\n\n\n\n\nMake sure to uninstall the official plugin before you install your fork, otherwise they will conflict!
\n
\n\n\nIt appears that this doesn’t work. It also didn’t seem to work when placing the “git+…” URL in package field in the UI. For me, I have been able to install the plugin directly from GitHub by stopping the InvenTree server and then installing directly using pip:
\n\npip uninstall inventree-adv-sheet-label # uninstall normal package\npip install git+https://github.com/melektron/inventree-adv-sheet-label.git\n
You have to adjust the link to your repo.
\n
If you have added a sheet layout yourself, you are still encouraged to create a Pull Request with your changes so the changes can be added to the mainline plugin for everyone to benefit.
\n\nWhen making bigger changes than just adding layouts, it is recommended to set up a proper development environment.
\n\nTo develop the plugin, setup an InvenTree development instance using devcontainers according to this this official documentation. It is also recommended to setup the example dataset for experimenting.
\n\nThen clone this repo (or your fork) separately on your host computer and link it to the devserver according to the documentation.
\n\nIt is also recommended to save the workspace as a file (maybe somewhere in inventree repo but don’t commit it) and include the intellisenseconfig as well as editor layout there.
\n\nThe InvenTree intellisense path might be something like /home/inventree/src/backend/InvenTree
instead of the path from the documentation.
After that, start the InvenTree server with the debugger and the plugin should now be usable and debugable.
\n" }, "/matmair/inventree-apprise": { "name": "InvenTree Apprise", "author": "matmair", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-apprise", "links":{ "website": "https://mjmair.com", "issue_tracker": "https://github.com/matmair/inventree-apprise/issues", "github": "https://github.com/matmair/inventree-apprise", "gitlab": null, "source": null }, "categories": ["Notifications"], "tags": ["Apprise","3rd party integration","Discord","IFTTT","Matrix","Microsoft Teams","Slack","Twilio"], "content_txt" : "Send notifications from InvenTree via Apprise\n\nSetup\n\n\n \n Install this plugin in the webinterface with the packagename inventree-apprise\n \n \n Enable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will restart if you enable the plugin\n \n \n Add all endpoints you want to use in the plugin settings. You can use the Apprise URL Syntax.\n \n\n\nLicense\nThis project is licensed as MIT. Copy and do what you want - maybe tag your new plugin so others can find it. The more the merrier.\n", "content": "Send notifications from InvenTree via Apprise
\n\nInstall this plugin in the webinterface with the packagename inventree-apprise
Enable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will restart if you enable the plugin
\nAdd all endpoints you want to use in the plugin settings. You can use the Apprise URL Syntax.
\nThis project is licensed as MIT. Copy and do what you want - maybe tag your new plugin so others can find it. The more the merrier.
\n" }, "/SchrodingersGat/inventree-brother-plugin": { "name": "inventree-brother-plugin", "author": "SchrodingersGat", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": false, "maintained": true, "pypi": true, "package_name": "inventree-brother-plugin", "links":{ "website": "https://inventree.org", "issue_tracker": "https://github.com/inventree/inventree-brother-plugin/issues", "github": "https://github.com/inventree/inventree-brother-plugin", "gitlab": null, "source": null }, "categories": ["Printer"], "tags": ["Label","Printer","Brother"], "content_txt" : "Brother label printer plugin for InvenTree\n\nA label printing plugin for InvenTree, which provides support for the Brother label printers.\n\nThis plugin supports printing to some Brother label printers with network (wired or WiFi) support. Refer to the brother_ql docs for a list of label printers which are directly supported.\n\nInstallation\n\nInstall this plugin manually as follows:\n\npip install inventree-brother-plugin\n\n\nOr, add to your plugins.txt file to install automatically using the invoke install command:\n\ninventree-brother-plugin\n\n", "content": "Brother label printer plugin for InvenTree
\n\nA label printing plugin for InvenTree, which provides support for the Brother label printers.
\n\nThis plugin supports printing to some Brother label printers with network (wired or WiFi) support. Refer to the brother_ql docs for a list of label printers which are directly supported.
\n\nInstall this plugin manually as follows:
\n\npip install inventree-brother-plugin\n
Or, add to your plugins.txt
file to install automatically using the invoke install
command:
inventree-brother-plugin\n
Bulk creation plugin for InvenTree
\n\nThis plugin helps you bulk create storage locations and part categories in InvenTree by using customized naming strategies. That means you not only have the option to generate multidimensional* names for stock locations or part categories, but also have the option to save the templates for later usage if your storage room uses e.g. drawer towers, saved templates help to ensure naming consistency for all later added towers.
\n\n\n\n\nℹ️ * multidimensional means that you are not limited to namings like
\nD1
,D2
, .. but also something likeD1.A
,D1.B
,D2.A
,D2.B
, …
This will generate the previous mentioned example:
\n\nIf you want to try out the templates on you’re own, you can just copy the below json to your clipboard and use the “New untitled schema from clipboard” button to import them (see import/export). For more examples refer to the plugin documentation.
\n\n{\"name\":\"Example\",\"template_type\":\"STOCK_LOCATION\",\"template\":{\"version\":\"1.0.0\",\"input\":{},\"templates\":[],\"output\":{\"parent_name_match\":\"true\",\"dimensions\":[\"*NUMERIC\",\"*ALPHA\"],\"count\":[\"3\",\"2\"],\"generate\":{\"name\":\"D.\"},\"childs\":[]}}}\n
Install this plugin as follows:
\n\ninventree-bulk-plugin
as package name. Enable the confirm switch and click submit.invoke update
(for docker installs it is docker-compose inventree-server invoke update
). This ensures that all migrations run and the static files get collected. You can now start your server again and start using the plugin.\n\n\n❗At least InvenTree v0.12.7 is required to use this plugin.
\n
Refer to the plugin documentation for further examples, instructions and information.
\n" }, "/wolflu05/inventree-cups-plugin": { "name": "inventree-cups-plugin", "author": "wolflu05", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": false, "package_name": null, "links":{ "website": null, "issue_tracker": "https://github.com/wolflu05/inventree-cups-plugin/issues", "github": "https://github.com/wolflu05/inventree-cups-plugin", "gitlab": null, "source": null }, "categories": ["Printer"], "tags": ["Label","Printer","CUPS","DYMO"], "content_txt" : "Label printing plugin for generic cups printers\n\nA label printing plugin for InvenTree, which provides support for Cups label printing servers. If your printer is not cups compatible, you can setup a cups printing server. This article describes how to setup a cups printing server for the DYMO LabelWriter 450 Duo.\n\nInstallation\n\n\n :warning: This plugin needs cups-devel installed to install its dependencies. You can read more about the requirements at pycups. If you’re using apt as a package manager run apt install libcups2-dev before.\n\n\nInstall this plugin as follows:\n\npip install git+https://github.com/wolflu05/inventree-cups-plugin\n\n\nOr, add to your plugins.txt file:\n\ngit+https://github.com/wolflu05/inventree-cups-plugin\n\n\nConfiguration Options\n\n\n \n \n Name\n Description\n Example\n \n \n \n \n Server\n IP/Hostname to connect to the cups server\n 192.168.1.5\n \n \n Port\n Port to connect to the cups server\n 631\n \n \n Benutzer\n User to connect to the cups server\n can also be empty\n \n \n Passwort\n Password to connect to the cups server\n can also be empty\n \n \n Printer\n Printer from cups server, can be selected if valid connection options are saved in\n myprinter\n \n \n\n", "content": "Label printing plugin for generic cups printers
\n\nA label printing plugin for InvenTree, which provides support for Cups label printing servers. If your printer is not cups compatible, you can setup a cups printing server. This article describes how to setup a cups printing server for the DYMO LabelWriter 450 Duo.
\n\n\n\n\n:warning: This plugin needs
\ncups-devel
installed to install its dependencies. You can read more about the requirements atpycups
. If you’re usingapt
as a package manager runapt install libcups2-dev
before.
Install this plugin as follows:
\n\npip install git+https://github.com/wolflu05/inventree-cups-plugin\n
Or, add to your plugins.txt
file:
git+https://github.com/wolflu05/inventree-cups-plugin\n
\n\nName | \nDescription | \nExample | \n
---|---|---|
Server | \nIP/Hostname to connect to the cups server | \n192.168.1.5 | \n
Port | \nPort to connect to the cups server | \n631 | \n
Benutzer | \nUser to connect to the cups server | \ncan also be empty | \n
Passwort | \nPassword to connect to the cups server | \ncan also be empty | \n
Printer | \nPrinter from cups server, can be selected if valid connection options are saved in | \nmyprinter | \n
Add default parts (configurable) to every newly created sales order automatically.
\n" }, "/wolflu05/inventree-dymo-plugin": { "name": "inventree-dymo-plugin", "author": "wolflu05", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "GPL-3.0+", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-dymo-plugin", "links":{ "website": null, "issue_tracker": "https://github.com/wolflu05/inventree-dymo-plugin/issues", "github": "https://github.com/wolflu05/inventree-dymo-plugin", "gitlab": null, "source": null }, "categories": ["Printer"], "tags": ["Label","Printer","Dymo"], "content_txt" : "Dymo label printer driver plugin for InvenTree\n\ninventree-dymo-plugin\n\n\n\n\nA label printer driver plugin for InvenTree, which provides support for Dymo Label Writer® printers.\n\nCompatibility\n\nThe following printers are already supported by the driver:\n\n\n DYMO Label Writer 450\n DYMO Label Writer 450 Duo (Tape is not supported currently)\n DYMO Label Writer 450 Turbo\n DYMO Label Writer 450 Twin Turbo\n\n\nRequirements\n\nCurrently only printing over network is supported, so an RAW network socket server needs to be connected to the printer. A raspberry pi zero w is just enough for that job.\n\nThe easiest way to set this up, is using cups and configure a RAW printer device in combination with xinetd like described in this blog post.\n\nInstallation\n\n\n :warning: This plugin is only compatible with InvenTree>=0.16 because this uses the new label printer driver interface introduced with inventree/InvenTree#4824 and was fixed with 0.16 to work inside of workers.\n\n\nGoto “Admin Center > Plugins > Install Plugin” and enter inventree-dymo-plugin as package name.\n\nThen goto “Admin Center > Machines” and create a new machine using this driver.\n\nTechnical working\n\nThis driver implements the RAW Dymo LabelWriter® 450 Series commands like described in the technical reference manual to send the label data to the printer.\n", "content": "Dymo label printer driver plugin for InvenTree
\n\nA label printer driver plugin for InvenTree, which provides support for Dymo Label Writer® printers.
\n\nThe following printers are already supported by the driver:
\n\nCurrently only printing over network is supported, so an RAW network socket server needs to be connected to the printer. A raspberry pi zero w is just enough for that job.
\n\nThe easiest way to set this up, is using cups and configure a RAW printer device in combination with xinetd
like described in this blog post.
\n\n\n:warning: This plugin is only compatible with InvenTree>=0.16 because this uses the new label printer driver interface introduced with inventree/InvenTree#4824 and was fixed with 0.16 to work inside of workers.
\n
Goto “Admin Center > Plugins > Install Plugin” and enter inventree-dymo-plugin
as package name.
Then goto “Admin Center > Machines” and create a new machine using this driver.
\n\nThis driver implements the RAW Dymo LabelWriter® 450 Series commands like described in the technical reference manual to send the label data to the printer.
\n" }, "/LavissaWoW/inventree-ipn-generator": { "name": "inventree-ipn-generator", "author": "LavissaWoW", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-ipn-generator", "links":{ "website": null, "issue_tracker": "https://github.com/LavissaWoW/inventree-ipn-generator/issues", "github": "https://github.com/LavissaWoW/inventree-ipn-generator", "gitlab": null, "source": null }, "categories": ["Event"], "tags": ["Part","IPN","Generator"], "content_txt" : "Introduction\nInstalling this plugin enables the automatic generation if Internal Part Numbers (IPN) for parts.\n\nInstallation\nTo automatically install the plugin when running invoke install:\nAdd inventree-ipn-generator to your plugins.txt file.\n\nOr, install the plugin manually:\n\npip install inventree-ipn-generator\n\n\nFor the plugin to be listed as available, you need to enable “Event Integration” in your plugin settings.\nThis setting is located with the Plugin Settings on the settings page.\n\nSettings\n\n\n Active - Enables toggling of plugin without having to disable it\n On Create - If on, the plugin will assign IPNs to newly created parts\n On Change - If on, the plugin will assign IPNs to parts after a change has been made.\nEnabling this setting will remove the ability to have parts without IPNs.\n\n\nPattern\nPart Number patterns follow three basic groups. Literals, Numerics, and characters.\nWhen incrementing a part number, the rightmost group that is mutable will be incremented.\nAll groups can be combined in any order.\n\nA pattern cannot consist of only Literals.\n\nFor any pattern, only the rightmost non-literal group will be incremented.\nWhen this group rolls over its max, the next non-literal group to the left will be incremented.\nExample: Given the groups (named for demo): L1C1N1C2L2\nIncrementing follows this order: C2, N1, C1.\n\n\n NOTE: When C1 in the above example rolls over, the plugin will loop back to the first IPN.\nThis will cause duplicate IPNs if your InvenTree allows duplicate IPNs.\nIf your InvenTree does not allow duplicate IPNs, this will cause an error at the moment!\nThis will be addressed in an upcoming update.\n\n\nLiterals (Immutable)\nAnything encased in () will be rendered as-is. no change will be made to anything within.\n\nExample: (A6C) will always render as “A6C”, regardless of other groups\n\nNumeric\nNumbers that should change over time should be encased in {}\n\n {5} respresents a number with max 5 digits\n {25+} represents a number 25-99\n\n\nExample: {5+}{3} will result in this range: 5000-9999\n\nCharacters\nCharacters that change should be encased in []\n\n [abc] represents looping through the letters a, b, c in order.\n [a-f] represents looping through the letters from a to f alphabetaically\n\n\nThese two directives can be combined.\n\n [aQc-f] represents:\n \n \n a, Q, c-f\n \n \n\n\nExamples\n\n (AB){3}[ab] -> AB001a, AB001b, AB002a, AB021b, AB032a, etc\n {2}[Aq](BD) -> 01ABD, 01qBD, 02ABD, 02qBD, etc\n {1}[a-d]{8+} -> 1a8, 1a9, 1b8, 1b9, 1c8, 1c9, 1d8, 1d9, 2a8, etc\n\n", "content": "Installing this plugin enables the automatic generation if Internal Part Numbers (IPN) for parts.
\n\nTo automatically install the plugin when running invoke install
:\nAdd inventree-ipn-generator
to your plugins.txt file.
Or, install the plugin manually:
\n\npip install inventree-ipn-generator\n
For the plugin to be listed as available, you need to enable “Event Integration” in your plugin settings.\nThis setting is located with the Plugin Settings on the settings page.
\n\nPart Number patterns follow three basic groups. Literals, Numerics, and characters.\nWhen incrementing a part number, the rightmost group that is mutable will be incremented.\nAll groups can be combined in any order.
\n\nA pattern cannot consist of only Literals.
\n\nFor any pattern, only the rightmost non-literal group will be incremented.\nWhen this group rolls over its max, the next non-literal group to the left will be incremented.\nExample: Given the groups (named for demo): L1C1N1C2L2\nIncrementing follows this order: C2, N1, C1.
\n\n\n\n\nNOTE: When C1 in the above example rolls over, the plugin will loop back to the first IPN.\nThis will cause duplicate IPNs if your InvenTree allows duplicate IPNs.\nIf your InvenTree does not allow duplicate IPNs, this will cause an error at the moment!\nThis will be addressed in an upcoming update.
\n
Anything encased in ()
will be rendered as-is. no change will be made to anything within.
Example: (A6C)
will always render as “A6C”, regardless of other groups
Numbers that should change over time should be encased in {}
{5}
respresents a number with max 5 digits{25+}
represents a number 25-99Example: {5+}{3}
will result in this range: 5000-9999
Characters that change should be encased in []
[abc]
represents looping through the letters a
, b
, c
in order.[a-f]
represents looping through the letters from a
to f
alphabetaicallyThese two directives can be combined.
\n[aQc-f]
represents:a
, Q
, c-f
(AB){3}[ab]
-> AB001a, AB001b, AB002a, AB021b, AB032a, etc{2}[Aq](BD)
-> 01ABD, 01qBD, 02ABD, 02qBD, etc{1}[a-d]{8+}
-> 1a8, 1a9, 1b8, 1b9, 1c8, 1c9, 1d8, 1d9, 2a8, etcKiCad Integration for InvenTree
\n\nA plugin which allows InvenTree to serve component data to KiCad via the HTTP library interface.
\n\nThis plugin provides an API wrapper which provides an API interface that conforms to the KiCad HTTP library interface specification. This allows KiCad to pull component data directly from your InvenTree database.
\n\nThe plugin can be installed via the InvenTree web interface, using the tag inventree-kicad-plugin
.
Alternatively, install the plugin manually as follows:
\n\npip install inventree-kicad-plugin\n
Or, add to your plugins.txt
file and run invoke install
.
Refer to the plugin documentation for further instructions and information.
\n" }, "/piramja/inventree-niimbot-plugin": { "name": "inventree-niimbot-plugin", "author": "piramja", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-niimbot-plugin", "links":{ "website": null, "issue_tracker": "https://github.com/piramja/inventree-niimbot-plugin/issues", "github": "https://github.com/piramja/inventree-niimbot-plugin", "gitlab": null, "source": null }, "categories": ["Label"], "tags": ["Niimbot","Printer","Label"], "content_txt" : "Introduction\nA label printing plugin for InvenTree, which provides support for the Niimbot Label Printers. This plugin is based on the amazing work from labbots/NiimPrintX and modifications from LorisPolenz/NiimPrintX.\n\nInstallation\n\nInstall this plugin manually as follows:\n\npip install inventree-niimbot-plugin\n\n\nOr, add to your plugins.txt file to install automatically using the invoke install command:\n\ninventree-niimbot-plugin\n\n\nConfiguration Options\nThe following list gives an overview of the available settings. You find them under the InvenTree plugin specific settings.\n\n\n \n Printer Model\nCurrently supported models are: \nb1, b18, b21, d11, d110 (but i was only able to test b1 because i don’t have other printer models. Please report back if you can test other models!!).\n \n \n Density\nThe print density. Different models seem to accept only certain values (b1 accepts 1-3).\n \n \n Rotation\nRotation angle, either 0, 90, 180 or 270 degrees.\n \n \n Scaling\nScaling factor, from 10% to 200%.\n \n \n Vertical Offset\nVertical offset, from 0 to 200px.\n \n \n Horizontal Offset\nHorizontal offset, from 0 to 200px.\n \n\n", "content": "A label printing plugin for InvenTree, which provides support for the Niimbot Label Printers. This plugin is based on the amazing work from labbots/NiimPrintX and modifications from LorisPolenz/NiimPrintX.
\n\nInstall this plugin manually as follows:
\n\npip install inventree-niimbot-plugin\n
Or, add to your plugins.txt
file to install automatically using the invoke install
command:
inventree-niimbot-plugin\n
The following list gives an overview of the available settings. You find them under the InvenTree plugin specific settings.
\n\nPrinter Model\nCurrently supported models are: \nb1, b18, b21, d11, d110 (but i was only able to test b1 because i don’t have other printer models. Please report back if you can test other models!!).
\nDensity\nThe print density. Different models seem to accept only certain values (b1 accepts 1-3).
\nRotation\nRotation angle, either 0, 90, 180 or 270 degrees.
\nScaling\nScaling factor, from 10% to 200%.
\nVertical Offset\nVertical offset, from 0 to 200px.
\nHorizontal Offset\nHorizontal offset, from 0 to 200px.
\nOrder History for InvenTree
\n\nA plugin which generates historical order data for parts in InvenTree
\n\nThe easiest way to install the plugin is via the InvenTree user interface.
\n\nAlternatively, you can install the plugin manually as follows:
\n\npip install inventree-order-history\n
Refer to the plugin documentation for further instructions and information.
\n" }, "/matmair/inventree-rapidoc": { "name": "Inventree RapiDoc", "author": "matmair", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT license", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-rapidoc", "links":{ "website": "https://mjmair.com/", "issue_tracker": "https://github.com/matmair/inventree-rapidoc/issues", "github": "https://github.com/matmair/inventree-rapidoc", "gitlab": null, "source": null }, "categories": ["API"], "tags": ["RapiDoc"], "content_txt" : "Use RapiDoc for Inventree API docs.\n\nSetup\n\n\n \n Install\nInstall this plugin in the webinterface with the packagename inventree-rapidoc\n \n \n Enable\nEnable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will restart if you enable the plugin\n \n \n Configure\nThere are no configuration options for this plugin. Your server needs to have URL and App mixins enabled.\n \n\n\nLicense\nThis project is licensed under the MIT license.\n\n", "content": "Use RapiDoc for Inventree API docs.
\n\nInstall\nInstall this plugin in the webinterface with the packagename inventree-rapidoc
Enable\nEnable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will restart if you enable the plugin
\nConfigure\nThere are no configuration options for this plugin. Your server needs to have URL
and App
mixins enabled.
This project is licensed under the MIT license.
\n\n" }, "/wolflu05/inventree-report-lsp-plugin": { "name": "inventree-report-lsp-plugin", "author": "wolflu05", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "GPL-3.0+", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-report-lsp-plugin", "links":{ "website": null, "issue_tracker": "https://github.com/wolflu05/inventree-report-lsp-plugin/issues", "github": "https://github.com/wolflu05/inventree-report-lsp-plugin", "gitlab": null, "source": null }, "categories": ["Label","Reporting"], "tags": ["Label","report","LSP"], "content_txt" : "A report editor with auto completion, diagnostic messages and many more capabilities to help with creating custom templates, powered by django-template-lsp.\n\n\n\n\n\n\nTo install this plugin, follow the guide on the Readme. Note, that at least InvenTree v0.18.0 is required to use this plugin.\n", "content": "A report editor with auto completion, diagnostic messages and many more capabilities to help with creating custom templates, powered by django-template-lsp.
\n\n\n\nTo install this plugin, follow the guide on the Readme. Note, that at least InvenTree v0.18.0 is required to use this plugin.
\n" }, "/SchrodingersGat/inventree-stock-forecasting": { "name": "inventree-stock-forecasting", "author": "SchrodingersGat", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-stock-forecasting", "links":{ "website": "https://inventree.org", "issue_tracker": null, "github": "https://github.com/inventree/inventree-stock-forecasting", "gitlab": null, "source": null }, "categories": ["Reporting"], "tags": ["stock","forecasting","data"], "content_txt" : "Stock Forecasting for InvenTree\n\nA plugin which generates stock forecasting data for parts in InvenTree\n\nInstallation\n\nThe easiest way to install the plugin is via the InvenTree user interface.\n\nAlternatively, you can install the plugin manually as follows:\n\npip install inventree-stock-forecasting\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", "content": "Stock Forecasting for InvenTree
\n\nA plugin which generates stock forecasting data for parts in InvenTree
\n\nThe easiest way to install the plugin is via the InvenTree user interface.
\n\nAlternatively, you can install the plugin manually as follows:
\n\npip install inventree-stock-forecasting\n
Refer to the plugin documentation for further instructions and information.
\n" }, "/SergeoLacruz/inventree-supplier-panel": { "name": "inventree-supplier-panel", "author": "SergeoLacruz", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-supplier-panel", "links":{ "website": null, "issue_tracker": "https://github.com/SergeoLacruz/inventree-supplier-panel/issues", "github": "https://github.com/sergeolacruz/inventree-supplier-panel", "gitlab": null, "source": null }, "categories": ["Supplier"], "tags": ["supplier","mouser","digikey"], "content_txt" : "The InvenTree-supplier-panel\n\nThis is a plugin for InvenTree, which uploads a purchase order\nto a supplier WEB page. After using this plugin you can directly order the parts on\nsupplier WEB page. You need to have a supplier account and a different kinds of API keys\ndepending on the supplier.\nThe data will be created in your supplier account. Each time you transfer your PO\na new data set cart will be created. So make sure that you delete them from time to time in\nthe supplier WEB interface.\nThe plugin also helps to create supplierparts based on the supplier part number..\nActually the plugin supports two suppliers: Mouser and Digikey.\n\nInstallation\nThe plugin is on pypi. You can install it by just calling:\n\npip install inventree-supplier-panel\n\n\nConfiguration\n\nMouser Supplier ID\nPlace here the primary key of the supplier Mouser in your system. You can select from a list of\nyour suppliers. If this is not set the panel will not be displayed and a error is raised.\n\nDigikey Supplier ID\nPlace here the primary key of the supplier Digikey in your system. You can select from a list of\nyour suppliers. If this is not set the panel will not be displayed and a error is raised.\n\nMouser API key\nPlace here your Mouser key for manipulating shopping carts. You find it in your Mouser account.\n\nDigikey ID and Digikey Secret\nThis is the client ID and the client secret that has been generated in the Digkey API admin WEB portal.\nCopy it from there to the InvenTree settings.\n\nDigikey token and Digikey refresh token\nThese fields are filled automatically. The Digikey API requires two tokens with different life times.\nPlease refer to the Digikey section for more information.\n\nProxy CON\nProtocol to proxy server e.g. https\n\nProxy URL\nIn case you need to authorise a proxy server between your InvenTree server and the internet\nput the required setting here. Example:\n\nhttps://user:password@ipaddress:port\n\n\nIf you do not need this just leave the fields empty.\nA proxy can also be set using the environment variables PROXY_CON and PROXY_URL. The\nvalues in the environment variables overwrite InvenTree settings.\n\nBase URL\nThe base URL for server instance is in the Server Settings category of InvenTree. The plugin\nuses this setting to build the OAuth callback for Digikey. Put the correct URL here.\n\nWhat the plugin does\n\nThe plugin creates a new panel which is visible on the purchase order details view.\nThis is called either Mouser actions or Digikey actions depending on the supplier of the\nactive PO. On the panel there are three things:\n\n\n a button that starts the transfer of your PO to the supplier\n a status bar that shows error messages\n a table that contains the created Mouser shopping cart.\n in case of Digikey a button that initiates the token generation.\n\n\n\n\nThe button “Transfer PO” initiates the transfer. It takes each element of your PO using the SKU of\nthe supplier part and transfers it to the suppliers WEB shop. When finished it downloads\nthe data from the WEB page and puts the data into the table. Here you see\nthe actual stock at the supplier and an OK bubble when the stock is large enough for you order.\nYou also find the actual price as well as the total amount of your order. If the supplier\ndetects an error with the part it is displayed in the very right column.\n\nThe plugin also transfers your IPNs (internal part numbers). Most suppliers reserve a field\nfor such numbers. They show up in your shopping cart as well as on the invoice and even\non the labels that they put onto the bags and reels.\n\nFinally the actual prices are copied back into your\nInvenTree purchase order line items. So you can always see what you payed for the part when\nyou ordered it. This does not modify the price breaks of the supplier part. These are stored\nwith the supplier part. Here we just modify the purchase order.\n\nWorking with Mouser\n\nSet up\n\nFor this plugin to work you need to have Mouser as a supplier in your InvenTree database.\nSupplierparts must be added to all the parts that you like to buy at Mouser. All Mouser supplier\nparts need to have the proper SKU. It needs to match the Mouser part number exactly.\n\nFor access to the Mouser API you need a Mouser account and a shopping cart API key.\nYou can get this in your Mouser WEB account. Do not mess up with the Mouser search API\nkey. This is a different one. If the key is properly set up you can find it on the Mouser\nWEB page here:\n\n\nUsage\nUsing Mouser is easy. Only the Mouser shopping cart key is required for authentication. Its lifetime\nis endless. Mouser has an API for the shopping cart. On pressing the button a shopping\ncart is crated and all items are put into this shopping cart. When you login to the\nMouser WEB shop you can use this shopping cart for your order.\n\nPlease be aware that the plugin creates a new cart with a new ID each time the button is pressed.\nIf you afterwards create a order in the WEB UI, be careful selecting the right one\nand delete all unused carts.\n\nCurrency support\nMouser needs a country code for currency support. The plugin selects a proper country based on\nthe InvenTree currency setting and transfers this to Mouser. Mouser sends back the sopping cart\nin the correct currency. The currency name is shown in last line of the table.\n\nWorking with Digikey\n\nSet up\n\nYou need a registration on the Digikey API products WEB page.\nThis is not your normal Digikey account for shopping. You have to apply separately. After\nregistration create an organisation and inside the organization a production app.\nThe most important thing to set is the OAuth Callback. This is an URL on your local server\nthat is called by Digikey for key generation. The plugin sets up an URL for this.\nJust add your local IP. The entry should look somehow like:\n\nhttps://192.168.1.40:8123/plugin/suppliercart/digikeytoken/\n\n\nIn this example 192.168.1.40:8123 is the local IP address and port where my\nInvenTree development server runs. Place here the appropriate address.\nIn Production products section make sure that Product information and MyLists is activated.\n\nIn the View tab of your app you find the Client-ID and the Client-Secret. Place those in\nthe plugin settings.\n\nDigikey Supplierparts have to by in your InvenTree Database as described already in\nthe Mouser section.\n\nUsage\nUsing Digikey is more complex. The authorisation system is token based and they do not\nhave a shopping cart API.\n\nAuthorization\nThe Digikey Client ID and the Client secret are the first things you need. With those\nyou call an API endpoint. You HAVE to go through an interactive browser window and\nenter your credentials. Afterwards Digikey opens a callback URL on your local machine\nand transfers a key. With this key the plugin calls another API endpoint to create\na token and a refresh token. The key gets bad after 60 seconds.\n\nThe token is used for each call to a Digikey API. It is good for 30 minutes. It has to\nbe refreshed using the refresh token. This one is valid for 90 days.\n\nThe plugin has a button in the panel that initiates the first step. It opens a browser\nwhere you enter your credentials. When the OAuth callback is properly set the URL\n…plugin/suppliercart/digikeytoken/ is called. This triggers a call to\nhttps://api.digikey.com/v1/oauth2/token from where the plugin get the tokens. The tokens\nare stored in the plugin setting area. Do not change them manually.\n\nEach time you transfer a PO the refresh token is called independently from the\ntokens live time. This also refreshes the refresh token. So you are save when\nyou use the plugin ate least once in 90 days. In case the token gets bad you need to\ncreate a fresh set using the token button again.\n\nIf you are confused now read the documentation on the Digikey WEB page for more details.\n\nMyLists\nDigikey does not have such a simple shopping cart API. The plugin uses the MyLists API.\nIt creates a list on the WEB shop that can easily be transferred to a shopping\ncart. When creating a list a list name has to be provided. The plugin creates a name\nbased on the PO name and adding a -xx that counts upwards each time you push the button.\nThe reason is that each name is allowed only once. Even when the list is deleted, the\nname stays blocked forever. If you are done with your order delete the lists from your\nDigikey WEB account.\n\nCurrency support\nDigikey requires a country code and a currency code. The plugin uses the same translation\nas mentioned in the Mouser section and transfers both to Digikey. Digikey sends back the\nlist in the correct currency. Unfortunately the currency code is not sent back. The only\nthing Digikey sends is a currency symbol but no info if $ is USD, AUD or whatever kind of Dollar.\nThe plugin shows the symbol in the table for control.\n\nAutomatically add supplierparts\nThe plugin can add supplierparts based on the supplier part number. For users with\nedit part permission a panel called “Automatic Supplier parts” is shown. Here\nyou can select the supplier and add the exact supplier part number. The plugin\nwill create a corresponding supplierpart. I can fill the following part fields automatically:\n\n\n Supplier part number\n URL\n Package when available\n Lifecycle status\n Minimum order\n Description\n\n\nIf the supplier does not provide information for a field it it left empty.\n\nHow it works\n\ndef get_custom_panels(self, view, request)\n\n\nThis defines the panel. The function must return a panels list. Here it returns just one\npanel. The panel is returned under three conditions: The view must be PurchaseOrderDetail,\nthe supplier must be Mouser or Digikey and the user must have edit permissions to purchase orders.\nThe content_template is an html file that defines how the panel content looks.\n\nre_path(r'transfercart/(?P<pk>\\d+)/', self.TransferCart, name='transfer-cart'),\n\nHere we define the url that controls the panel. Let’s look at the details here:\n\n\n \n name='transfer-cart': This is the name under which the url is called from the html file. We will\ncome to that later when we discuss the template.\n \n \n self.TransferCart is the function that is called. It is defined later in this plugin\n \n \n transfercart/(?P<pk>\\d+)/ The string that looks a bit like white noise defines the url. transfercart\nis the url which can be chosen freely. The ? is well known for parameters. In this case we get just one\nparameter, the orders primary key. \\d+ is a regular expression that limits the parameters to a digital\nnumber with n digits.\n \n\n\nMay be it is worth to leave a few more words on this. We define the url of the plugin. This is called by the Javascript\nfunction when we push the button. Let’s have a look on the names and how they belong together:\n\n\n\nIn the picture you see the relevant lines in the python and java code. The names in the coloured boxes need to match.\nIn case something does not fit the panel will not render and you will get an error message.\n\nIssues\n\nAPI keys are global\nThe API keys and especially the proxy password are user specific and shall not be given to\nothers. Up to now there are no user specific settings in InvenTree. So these keys are global\nand visible to, at least every admin. All users who use the plugin will have the same\nkeys. We use a team key to solve this.\n\nMissing DigiKey features\nDigikey allows more features like customer ID and list owners. These are not implemented so far.\nThe plugin supports just a single Digikey organization and user. Some APIs require a createdBy\nvalue to be set. xxxx works fine so far.\n\nhttps Callback\nThe OAuto callback setting in your Digikey WEB account allows only https. http is not allowed.\nThis is usually not a problem in production environments. However the development server\nusually runs http. But InvenTree has the required stuff for https on board. I just changed\nthe runserver to runsslserver in tasks.py.\n", "content": "This is a plugin for InvenTree, which uploads a purchase order\nto a supplier WEB page. After using this plugin you can directly order the parts on\nsupplier WEB page. You need to have a supplier account and a different kinds of API keys\ndepending on the supplier.\nThe data will be created in your supplier account. Each time you transfer your PO\na new data set cart will be created. So make sure that you delete them from time to time in\nthe supplier WEB interface.\nThe plugin also helps to create supplierparts based on the supplier part number..\nActually the plugin supports two suppliers: Mouser and Digikey.
\n\nThe plugin is on pypi. You can install it by just calling:
\n\npip install inventree-supplier-panel\n
Place here the primary key of the supplier Mouser in your system. You can select from a list of\nyour suppliers. If this is not set the panel will not be displayed and a error is raised.
\n\nPlace here the primary key of the supplier Digikey in your system. You can select from a list of\nyour suppliers. If this is not set the panel will not be displayed and a error is raised.
\n\nPlace here your Mouser key for manipulating shopping carts. You find it in your Mouser account.
\n\nThis is the client ID and the client secret that has been generated in the Digkey API admin WEB portal.\nCopy it from there to the InvenTree settings.
\n\nThese fields are filled automatically. The Digikey API requires two tokens with different life times.\nPlease refer to the Digikey section for more information.
\n\nProtocol to proxy server e.g. https
\n\nIn case you need to authorise a proxy server between your InvenTree server and the internet\nput the required setting here. Example:
\n\nhttps://user:password@ipaddress:port\n
If you do not need this just leave the fields empty.\nA proxy can also be set using the environment variables PROXY_CON and PROXY_URL. The\nvalues in the environment variables overwrite InvenTree settings.
\n\nThe base URL for server instance is in the Server Settings category of InvenTree. The plugin\nuses this setting to build the OAuth callback for Digikey. Put the correct URL here.
\n\nThe plugin creates a new panel which is visible on the purchase order details view.\nThis is called either Mouser actions or Digikey actions depending on the supplier of the\nactive PO. On the panel there are three things:
\n\nThe button “Transfer PO” initiates the transfer. It takes each element of your PO using the SKU of\nthe supplier part and transfers it to the suppliers WEB shop. When finished it downloads\nthe data from the WEB page and puts the data into the table. Here you see\nthe actual stock at the supplier and an OK bubble when the stock is large enough for you order.\nYou also find the actual price as well as the total amount of your order. If the supplier\ndetects an error with the part it is displayed in the very right column.
\n\nThe plugin also transfers your IPNs (internal part numbers). Most suppliers reserve a field\nfor such numbers. They show up in your shopping cart as well as on the invoice and even\non the labels that they put onto the bags and reels.
\n\nFinally the actual prices are copied back into your\nInvenTree purchase order line items. So you can always see what you payed for the part when\nyou ordered it. This does not modify the price breaks of the supplier part. These are stored\nwith the supplier part. Here we just modify the purchase order.
\n\nFor this plugin to work you need to have Mouser as a supplier in your InvenTree database.\nSupplierparts must be added to all the parts that you like to buy at Mouser. All Mouser supplier\nparts need to have the proper SKU. It needs to match the Mouser part number exactly.
\n\nFor access to the Mouser API you need a Mouser account and a shopping cart API key.\nYou can get this in your Mouser WEB account. Do not mess up with the Mouser search API\nkey. This is a different one. If the key is properly set up you can find it on the Mouser\nWEB page here:\n
Using Mouser is easy. Only the Mouser shopping cart key is required for authentication. Its lifetime\nis endless. Mouser has an API for the shopping cart. On pressing the button a shopping\ncart is crated and all items are put into this shopping cart. When you login to the\nMouser WEB shop you can use this shopping cart for your order.
\n\nPlease be aware that the plugin creates a new cart with a new ID each time the button is pressed.\nIf you afterwards create a order in the WEB UI, be careful selecting the right one\nand delete all unused carts.
\n\nMouser needs a country code for currency support. The plugin selects a proper country based on\nthe InvenTree currency setting and transfers this to Mouser. Mouser sends back the sopping cart\nin the correct currency. The currency name is shown in last line of the table.
\n\nYou need a registration on the Digikey API products WEB page.\nThis is not your normal Digikey account for shopping. You have to apply separately. After\nregistration create an organisation and inside the organization a production app.\nThe most important thing to set is the OAuth Callback. This is an URL on your local server\nthat is called by Digikey for key generation. The plugin sets up an URL for this.\nJust add your local IP. The entry should look somehow like:
\n\nhttps://192.168.1.40:8123/plugin/suppliercart/digikeytoken/\n
In this example 192.168.1.40:8123 is the local IP address and port where my\nInvenTree development server runs. Place here the appropriate address.\nIn Production products section make sure that Product information and MyLists is activated.
\n\nIn the View tab of your app you find the Client-ID and the Client-Secret. Place those in\nthe plugin settings.
\n\nDigikey Supplierparts have to by in your InvenTree Database as described already in\nthe Mouser section.
\n\nUsing Digikey is more complex. The authorisation system is token based and they do not\nhave a shopping cart API.
\n\nThe Digikey Client ID and the Client secret are the first things you need. With those\nyou call an API endpoint. You HAVE to go through an interactive browser window and\nenter your credentials. Afterwards Digikey opens a callback URL on your local machine\nand transfers a key. With this key the plugin calls another API endpoint to create\na token and a refresh token. The key gets bad after 60 seconds.
\n\nThe token is used for each call to a Digikey API. It is good for 30 minutes. It has to\nbe refreshed using the refresh token. This one is valid for 90 days.
\n\nThe plugin has a button in the panel that initiates the first step. It opens a browser\nwhere you enter your credentials. When the OAuth callback is properly set the URL\n…plugin/suppliercart/digikeytoken/ is called. This triggers a call to\nhttps://api.digikey.com/v1/oauth2/token from where the plugin get the tokens. The tokens\nare stored in the plugin setting area. Do not change them manually.
\n\nEach time you transfer a PO the refresh token is called independently from the\ntokens live time. This also refreshes the refresh token. So you are save when\nyou use the plugin ate least once in 90 days. In case the token gets bad you need to\ncreate a fresh set using the token button again.
\n\nIf you are confused now read the documentation on the Digikey WEB page for more details.
\n\nDigikey does not have such a simple shopping cart API. The plugin uses the MyLists API.\nIt creates a list on the WEB shop that can easily be transferred to a shopping\ncart. When creating a list a list name has to be provided. The plugin creates a name\nbased on the PO name and adding a -xx that counts upwards each time you push the button.\nThe reason is that each name is allowed only once. Even when the list is deleted, the\nname stays blocked forever. If you are done with your order delete the lists from your\nDigikey WEB account.
\n\nDigikey requires a country code and a currency code. The plugin uses the same translation\nas mentioned in the Mouser section and transfers both to Digikey. Digikey sends back the\nlist in the correct currency. Unfortunately the currency code is not sent back. The only\nthing Digikey sends is a currency symbol but no info if $ is USD, AUD or whatever kind of Dollar.\nThe plugin shows the symbol in the table for control.
\n\nThe plugin can add supplierparts based on the supplier part number. For users with\nedit part permission a panel called “Automatic Supplier parts” is shown. Here\nyou can select the supplier and add the exact supplier part number. The plugin\nwill create a corresponding supplierpart. I can fill the following part fields automatically:
\n\nIf the supplier does not provide information for a field it it left empty.
\n\ndef get_custom_panels(self, view, request)\n
This defines the panel. The function must return a panels list. Here it returns just one\npanel. The panel is returned under three conditions: The view must be PurchaseOrderDetail,\nthe supplier must be Mouser or Digikey and the user must have edit permissions to purchase orders.\nThe content_template is an html file that defines how the panel content looks.
\n\nre_path(r'transfercart/(?P<pk>\\d+)/', self.TransferCart, name='transfer-cart'),\n
Here we define the url that controls the panel. Let’s look at the details here:
\n\nname='transfer-cart'
: This is the name under which the url is called from the html file. We will\ncome to that later when we discuss the template.
self.TransferCart
is the function that is called. It is defined later in this plugin
transfercart/(?P<pk>\\d+)/
The string that looks a bit like white noise defines the url. transfercart\nis the url which can be chosen freely. The ? is well known for parameters. In this case we get just one\nparameter, the orders primary key. \\d+ is a regular expression that limits the parameters to a digital\nnumber with n digits.
May be it is worth to leave a few more words on this. We define the url of the plugin. This is called by the Javascript\nfunction when we push the button. Let’s have a look on the names and how they belong together:
\n\nIn the picture you see the relevant lines in the python and java code. The names in the coloured boxes need to match.\nIn case something does not fit the panel will not render and you will get an error message.
\n\nThe API keys and especially the proxy password are user specific and shall not be given to\nothers. Up to now there are no user specific settings in InvenTree. So these keys are global\nand visible to, at least every admin. All users who use the plugin will have the same\nkeys. We use a team key to solve this.
\n\nDigikey allows more features like customer ID and list owners. These are not implemented so far.\nThe plugin supports just a single Digikey organization and user. Some APIs require a createdBy\nvalue to be set. xxxx works fine so far.
\n\nThe OAuto callback setting in your Digikey WEB account allows only https. http is not allowed.\nThis is usually not a problem in production environments. However the development server\nusually runs http. But InvenTree has the required stuff for https on board. I just changed\nthe runserver to runsslserver in tasks.py.
\n" }, "/SchrodingersGat/inventree-test-statistics": { "name": "inventree-test-statistics", "author": "SchrodingersGat", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-test-statistics", "links":{ "website": "https://inventree.org", "issue_tracker": null, "github": "https://github.com/inventree/inventree-test-statistics", "gitlab": null, "source": null }, "categories": ["Reporting"], "tags": ["test","report","data"], "content_txt" : "Test Statistics for InvenTree\n\nA plugin which generates test statistics for parts in InvenTree\n\n\n\nInstallation\n\nThe easiest way to install the plugin is via the InvenTree user interface.\n\nAlternatively, you can install the plugin manually as follows:\n\npip install inventree-test-statistics\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", "content": "Test Statistics for InvenTree
\n\nA plugin which generates test statistics for parts in InvenTree
\n\nThe easiest way to install the plugin is via the InvenTree user interface.
\n\nAlternatively, you can install the plugin manually as follows:
\n\npip install inventree-test-statistics\n
Refer to the plugin documentation for further instructions and information.
\n" }, "/SchrodingersGat/inventree-wireviz": { "name": "inventree-wireviz-plugin", "author": "SchrodingersGat", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": "inventree-wireviz-plugin", "links":{ "website": "https://inventree.org", "issue_tracker": null, "github": "https://github.com/inventree/inventree-wireviz", "gitlab": null, "source": null }, "categories": ["Extension"], "tags": ["BOM","Build","Part"], "content_txt" : "Wireviz Extension for InvenTree\n\nA plugin which provides support for wireviz, a software tool for generating harness / wiring diagrams programmatically.\n\nThis plugin generates wireviz diagrams and integrates them natively into the InvenTree interface. Additionally, BOM data can be extracted directly from the wireviz file:\n\n\n\nInstallation\n\nInstall the plugin manually as follows:\n\npip install inventree-wireviz-plugin\n\n\nOr, add to your plugins.txt file to install automatically using the invoke install command:\n\ninventree-wireviz-plugin\n\n\nDocumentation\n\nRefer to the plugin documentation for further instructions and information.\n", "content": "Wireviz Extension for InvenTree
\n\nA plugin which provides support for wireviz, a software tool for generating harness / wiring diagrams programmatically.
\n\nThis plugin generates wireviz diagrams and integrates them natively into the InvenTree interface. Additionally, BOM data can be extracted directly from the wireviz file:
\n\nInstall the plugin manually as follows:
\n\npip install inventree-wireviz-plugin\n
Or, add to your plugins.txt
file to install automatically using the invoke install
command:
inventree-wireviz-plugin\n
Refer to the plugin documentation for further instructions and information.
\n" }, "/matmair/inventree-zapier": { "name": "inventree-zapier", "author": "matmair", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": false, "maintained": true, "pypi": true, "package_name": "inventree-zapier", "links":{ "website": "https://mjmair.com", "issue_tracker": "https://github.com/matmair/inventree-zapier/issues", "github": "https://github.com/matmair/inventree-zapier", "gitlab": null, "source": null }, "categories": ["Event"], "tags": ["Zapier"], "content_txt" : "Integrate Zapier into InvenTree\n\nSetup\n\n\n Install\nInstall this plugin as follows in the enviroment of your InvenTree instance:\n\n\npip install inventree-zapier\n\n\nOr, add to your plugins.txt file:\n\ninventree-zapier\n\n\n\n \n Enable\nEnable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will erstart if you enable the plugin\n \n \n Migrate\nAccess your instances python enviroment and run\n \n\n\ninv migrate\n\n\n\n Configure\nCreate an API-token in the admin interface and add set up the zapier integration in Zapier.com itself.\n\n\nLicense\nThis project is licensed as MIT. Copy and do what you want - maybe tag your new plugin so others can find it. The more the merrier.\n\nState of the Code\nThis is currently a PoC / ‘beta’ - at least till the Zapier App is published. Please feel free to file FRs, issues or just ideas.\n\n", "content": "Integrate Zapier into InvenTree
\n\npip install inventree-zapier\n
Or, add to your plugins.txt
file:
inventree-zapier\n
\n\nEnable\nEnable the plugin in the plugin settings. You need to be signed in as a superuser for this.\nThe server will erstart if you enable the plugin
\nMigrate\nAccess your instances python enviroment and run
\ninv migrate\n
This project is licensed as MIT. Copy and do what you want - maybe tag your new plugin so others can find it. The more the merrier.
\n\nThis is currently a PoC / ‘beta’ - at least till the Zapier App is published. Please feel free to file FRs, issues or just ideas.
\n\n" }, "/SergeoLacruz/inventree-zebra-plugin": { "name": "inventree-zebra-plugin", "author": "SergeoLacruz", "last_modified": "2025-09-13 01:07:28 +0000", "open_source": null, "license": "MIT", "stable": true, "maintained": true, "pypi": true, "package_name": null, "links":{ "website": null, "issue_tracker": "https://github.com/SergeoLacruz/inventree-zebra-plugin/issues", "github": "https://github.com/SergeoLacruz/inventree-zebra-plugin", "gitlab": null, "source": null }, "categories": ["Printer"], "tags": ["Label","Printer","Zebra","ZPL"], "content_txt" : "Zebra Label Printer Plugin for Inventree\n\nThis is a label printing plugin for InvenTree, which provides\nsupport for Zebra Label printers. It allows two modes of operation:\n\n\n Use the ZPL library to convert the png data provided by InvenTree to Zebra’s bitmap\nformat and send this to the printer.\n Write a ZPL template and let the printer do the rendering.\n\n\nIt can output the print data either to a local printer connected to the computer via\nUSB or to a network printer with an IP address. The output can be configured in the\nInvenTree plugin user interface.\n\nError handling is very basic.\n\nInstallation\n\nThe plugin is on pypi. Install this plugin using pip with the following command:\n\npip install inventree-zebra-plugin\n\n\nConfiguration Options\nPrinter Interface\nHere you can chose between local printer, network printer or the labelary.com API.\nThe last one is useful for preview of labels, especially when ZPL templates are used.\nDefault value is a local printer.\n\nIP address\nIn case you use an IP printer set the IPv4 address here.\n\nPort\nIn case you use an IP printer set the port number here. The default port number is 9100.\n\nLocal Device\nIn case of a local printer set the device here. The plugin actually puts the data directly to the\ndevice /dev/usb/lp0. No printer spooler is involved so far.\n\nThreshold\nThe image from pillow comes in greyscale. The plugin converts it ti pure BW because this gives a much\nbetter print result. The threshold between black and white can be adjusted here.\n\nDarkness\nThis is a value that influences the darkness of the print. Allowed values are 0 (white) to 30 (black).\nIt is directly converted to a SD command in ZPL. If your black areas tend to blur out reduce the\ndarkness.\n\nDots per mm\nThis sets the resolution of the printer. You can choose between 8, 12 and 24\ndpmm depending on your printer model.\n\nPrinter init\nThis string added to the printer output. It can be used to set special commands\ne.g. label rotation, mirror or white on black. Please refer to the ZPL manual\nfor more information.\n\nZebra printers store settings after printing. So if a rotated label has been\nprinted all following label will be rotated unless you change it. The default\nsets the printer to settings that have been useful for me. You might want to\nchange it according to your requirements. Please keep in mind that this string\nis passed directly to the printer without any checks. So be careful when editing\nhere.\n\nGet Printer info\nTurn this switch on to display a collection of all IP printers below on this page.\n\nLabel Template\nThe label needs a template described in html and css. The template should\nstart with a page definition that defines the label size as shown below:\n\n\n @page {\n {% localize off %}\n height: {{ height }}mm;\n width: {{ width }}mm;\n {% endlocalize %}\n padding: 0mm;\n margin: 0px 0px 0px 0px;\n background-color: white;\n }\n\n\n\nThe height and width parameters are defined in the InvenTree admin panel\nin the label section. These values have to fit the label size that is in\nthe printer. See the example templates for details on template definition.\n\nMulti printer hack\nWe have the requirement to print labels in different sizes. As we do not\nwant to change the reel for each print we set up a second printer loaded\nwith a different label size. InvenTree is not yet able to handle different\nprinters. So I added a multi printer hack. You can define a key with an IP\naddress in the label meta data:\n\n{\"ip_address\":\"xxx.yyy.zzz.eee\"}\n{\"darkness\":xx}\n\n\nIf the printer driver finds that key, the IP address from the printer settings\nis overwritten with the address from the meta data. So the print will end up\nin another printer.\n\nOnly the IP address and darkness can be overwritten so far. All other settings remain.\n\nQuality matters\nThe InvenTree printer system uses a graphical representation of the label. The label is described\nin HTML, converted to a pixel graphic and printed. The advantage is independency from printer\nmodels and systems. Disadvantage is larger data and quality problems with darkness and scaling.\nLet’s have a look at the following printout:\n\n\n\nBoth codes have been printed with the same printer on the same reel. The left one is\nhardly readable using my mobile. The right one reads easily even as it is smaller.\n\nSecret 1, Scale\nThe printer resolution is 8 dots per mm resulting in a dot size of 0.125mm. The QR code pixel\nand the printer pixel size should be integrally divisible. The code in the picture has 21\npixels plus one in the frame, so 23 pixel. The frame is set in the HTML description.\n\n{% qrcode qr_data border=1 %}\n\n\nI selected two dots per pixel. So 23 * 2 * 0.125 = 6.125mm. If the size is something different\nscaling takes place and the result might be worse. If you like a larger printout select more\ndots per pixel. From a certain size upwards the value does not matter any more because the code\ngets large enough to be readable in any quality.\n\nSecret 2: Darkness\nZebra printers allow to set the darkness of the print in values between 0 (white) and 30 (max)\nThe left code was printed with a value of 30. The black dots tend to blur out a bit resulting\nin smaller white areas. The right code was printed with a value of 25 resulting in larger white\npixels. The darkness values are just examples. Your values will differ based on printer model,\nmedia type and printer age. The printer head tends to wear out and the darkness value might\nneed an adjustment from time to time.\n\nIn printer rendering\nYou can also bypass the InvenTree print engine and render the label inside the printer.\nThe printer knows how to render the label for best quality. Inspired by the \ninventree-zpl-plugin inventree-zpl-plugin a similar\nfunction was aded to the zebra printer driver. You can write a ZPL template and upload\nit to the InvenTree Label templates as usual. Add a command to the template’s metadata:\n\n{\"zpl_template\": \"True\"}\n\n\nIn that case the printer driver ignores the picture rendered by WeasyPrint. Instead\nit calls the render_to_string function of the template and sends the\nresult to the printer. The result can look like:\n\n\n\nThe upper label was created using this template:\n\n\n{% autoescape off %}\n^FT30,25^A0N,18,22^FDIPN^FS\n^FT150,30^FB100,1,,C,,^A0N,24,32^FDACME^FS\n^FT320,25^A0N,18,22^FD{{ item.pk }}^FS\n^FT100,70^FB200,2,,C,,^A0N,18,22^FD{{ part.name }}^FS\n^FT100,100^FB200,1,,C,,^A0N,18,22^FD{{ part.manufacturer_parts.first.manufacturer.name }}^FS\n^FT30,150^FB340,1,,C,,^A0N,30,40^FD{{ part.IPN }}^FS\n^FT20,210^FB360,3,,L,,^A0N,18,22^FD{{ part.description }}^FS\n^FT15,110^BQ,2,3^FDQA,{{ part.IPN }}^FS\n^FT310,130^BQ,2,3^FDQA,{{ qr_data }}^FS\n{% endautoescape %}\n\n\n\nAutoescape must be off. We do not need " and similar escapes here.\nContext variables can be used as usual.\n\n!!! warning “Limitation”\n ZPL commands starting with backslash like \\& cannot be used so far.\n\nPreview\nThe printer driver allows an output device called “preview”. If this is selected\nthe ZPL code is sent to the API of labelary.com. The API sends back pdf data\nwhich is displayed in a new browser window. This is helpful while writing ZPL\ntemplates but works with HTML templates too. Please be careful and do not send\nconfidential information to the API.\n\nIn case you need to pass a proxy for the POST requests set the environment\nvariables PROXY_CON and PROXY_URL on the server. The plugin does not have\nsettings for this.\n\nGetting printer info\nWith the multi printer feature it can happen that you have several printers in\nyour setup. When the Get Printer Info switch is set ON, the driver calls each printer\nonce a minute and collects some info about it. It calls the printer configured\nin the settings as well as all printers it finds in the label templates.\nIn case a printer is unreachable, an error message is shown. If a printer is used\nin several templates it is listed only once.\n\nThe printer info feature works for local USB printers too.\n\n\n\nHow it works\nFirst import all the stuff you need. Here we use the translation mechanism from Django for multi language support.\nThe import the InvenTree libs and everything you need for plugin. Here we have ZPL for the Zebra bitmaps and socket\nfor the IP connection to the printer.\n\nThe next part is this:\n\nclass ZebraLabelPlugin(LabelPrintingMixin, SettingsMixin, IntegrationPluginBase):\n\n AUTHOR = \"Michael Buchmann\"\n DESCRIPTION = \"Label printing plugin for Zebra printers\"\n VERSION = ZEBRA_PLUGIN_VERSION\n NAME = \"Zebra labels\"\n SLUG = \"zebra\"\n TITLE = \"Zebra Label Printer\"\n\n\nThe name of the class can be freely chosen but should be different from SLUG. Otherwise it does not\nshow up. You reference to it in the entry_points section of the setup.py file.\nThe parameters need to be like in the example. Then there is the description block. The keywords are fixed and\nneed to be like that. The values are found in the UI as shown in the picture below.\n\n\n\nThen we add the configuration parameters.\nSETTINGS = {\n 'CONNECTION': {\n 'name': _('Printer Interface'),\n 'description': _('Select local or network printer'),\n 'choices': [('local','Local printer e.g. USB'),('network','Network printer with IP address')],\n 'default': 'local',\n },\n 'PORT': {\n 'name': _('Port'),\n 'description': _('Network port in case of network printer'),\n 'default': '9100',\n },\n }\n\n\n\nWe need to define a dict with the name SETTINGS. Please be aware the keys need to be in all CAPITAL letters like CONNECTION.\nSimple parameters are just text strings like the port. We can set a default. The name and description shows up in the UI.\nInstead of a simple text we can also use choices. The first string like “local” it the key you use in the code. The second\none is the description in the UI.\nAfter that we need to define a function:\n\ndef print_label(self, **kwargs){\n\n\nThe kwargs is a dict with the following keys:\n\n\n pdf_data\n user\n filename\n label_instance\n item_instance\n width\n height\n png_file\n\n\nThe item_instance is the part to be printed. This allows direct access to all part data. The arguments width and height\ncome from the settings of the label in the admin interface. NOT from the html template.\nFor the Zebra printer we use the png_file. This is a PIL (python Pillow) object with the graphic of the label in PNG format.\nThe PIL object is a greyscale image. Because the printer can just print pure BW we convert this to a BW picture.\n\nfn = lambda x : 255 if x > Threshold else 0\nlabel_image = label_image.convert('L').point(fn, mode='1')\n\n\nThe threshold can by modified by a plugin parameter. 200 is a good starting value. This trick gives much better prints.\nWe can put the result of this directly into the ZPL library.\n\nl = zpl.Label(Height, Width, dpmm)\nli.set_darkness(darkness)\n...\nl.write_graphic(label_image, Width)\nl.endorigin()\n\n\nWidth and Height define is the size of the label in millimeters as described above.\nThe third parameter is the resolution of the printer in dots per mm.\nwrite_graphic converts the pillow data to ZPL.\n\nThe plugin was tested with a labels of various sizes defined using css and html. The DPI scaling\ncan be chosen in the InvenTree settings. 800 is a good value because it gives high quality.\n\nThe rest of the code is just output to the printer on different interfaces.\n\nHappy printing.\n", "content": "Zebra Label Printer Plugin for Inventree
\n\nThis is a label printing plugin for InvenTree, which provides\nsupport for Zebra Label printers. It allows two modes of operation:
\n\nIt can output the print data either to a local printer connected to the computer via\nUSB or to a network printer with an IP address. The output can be configured in the\nInvenTree plugin user interface.
\n\nError handling is very basic.
\n\nThe plugin is on pypi. Install this plugin using pip with the following command:
\n\npip install inventree-zebra-plugin\n
Here you can chose between local printer, network printer or the labelary.com API.\nThe last one is useful for preview of labels, especially when ZPL templates are used.\nDefault value is a local printer.
\n\nIn case you use an IP printer set the IPv4 address here.
\n\nIn case you use an IP printer set the port number here. The default port number is 9100.
\n\nIn case of a local printer set the device here. The plugin actually puts the data directly to the\ndevice /dev/usb/lp0. No printer spooler is involved so far.
\n\nThe image from pillow comes in greyscale. The plugin converts it ti pure BW because this gives a much\nbetter print result. The threshold between black and white can be adjusted here.
\n\nThis is a value that influences the darkness of the print. Allowed values are 0 (white) to 30 (black).\nIt is directly converted to a SD command in ZPL. If your black areas tend to blur out reduce the\ndarkness.
\n\nThis sets the resolution of the printer. You can choose between 8, 12 and 24\ndpmm depending on your printer model.
\n\nThis string added to the printer output. It can be used to set special commands\ne.g. label rotation, mirror or white on black. Please refer to the ZPL manual\nfor more information.
\n\nZebra printers store settings after printing. So if a rotated label has been\nprinted all following label will be rotated unless you change it. The default\nsets the printer to settings that have been useful for me. You might want to\nchange it according to your requirements. Please keep in mind that this string\nis passed directly to the printer without any checks. So be careful when editing\nhere.
\n\nTurn this switch on to display a collection of all IP printers below on this page.
\n\nThe label needs a template described in html and css. The template should\nstart with a page definition that defines the label size as shown below:
\n\n\n @page {\n {% localize off %}\n height: {{ height }}mm;\n width: {{ width }}mm;\n {% endlocalize %}\n padding: 0mm;\n margin: 0px 0px 0px 0px;\n background-color: white;\n }\n\n
The height and width parameters are defined in the InvenTree admin panel\nin the label section. These values have to fit the label size that is in\nthe printer. See the example templates for details on template definition.
\n\nWe have the requirement to print labels in different sizes. As we do not\nwant to change the reel for each print we set up a second printer loaded\nwith a different label size. InvenTree is not yet able to handle different\nprinters. So I added a multi printer hack. You can define a key with an IP\naddress in the label meta data:
\n\n{\"ip_address\":\"xxx.yyy.zzz.eee\"}\n{\"darkness\":xx}\n
If the printer driver finds that key, the IP address from the printer settings\nis overwritten with the address from the meta data. So the print will end up\nin another printer.
\n\nOnly the IP address and darkness can be overwritten so far. All other settings remain.
\n\nThe InvenTree printer system uses a graphical representation of the label. The label is described\nin HTML, converted to a pixel graphic and printed. The advantage is independency from printer\nmodels and systems. Disadvantage is larger data and quality problems with darkness and scaling.\nLet’s have a look at the following printout:
\n\nBoth codes have been printed with the same printer on the same reel. The left one is\nhardly readable using my mobile. The right one reads easily even as it is smaller.
\n\nThe printer resolution is 8 dots per mm resulting in a dot size of 0.125mm. The QR code pixel\nand the printer pixel size should be integrally divisible. The code in the picture has 21\npixels plus one in the frame, so 23 pixel. The frame is set in the HTML description.
\n\n{% qrcode qr_data border=1 %}\n
I selected two dots per pixel. So 23 * 2 * 0.125 = 6.125mm. If the size is something different\nscaling takes place and the result might be worse. If you like a larger printout select more\ndots per pixel. From a certain size upwards the value does not matter any more because the code\ngets large enough to be readable in any quality.
\n\nZebra printers allow to set the darkness of the print in values between 0 (white) and 30 (max)\nThe left code was printed with a value of 30. The black dots tend to blur out a bit resulting\nin smaller white areas. The right code was printed with a value of 25 resulting in larger white\npixels. The darkness values are just examples. Your values will differ based on printer model,\nmedia type and printer age. The printer head tends to wear out and the darkness value might\nneed an adjustment from time to time.
\n\nYou can also bypass the InvenTree print engine and render the label inside the printer.\nThe printer knows how to render the label for best quality. Inspired by the \ninventree-zpl-plugin inventree-zpl-plugin a similar\nfunction was aded to the zebra printer driver. You can write a ZPL template and upload\nit to the InvenTree Label templates as usual. Add a command to the template’s metadata:
\n\n{\"zpl_template\": \"True\"}\n
In that case the printer driver ignores the picture rendered by WeasyPrint. Instead\nit calls the render_to_string function of the template and sends the\nresult to the printer. The result can look like:
\n\nThe upper label was created using this template:
\n\n\n{% autoescape off %}\n^FT30,25^A0N,18,22^FDIPN^FS\n^FT150,30^FB100,1,,C,,^A0N,24,32^FDACME^FS\n^FT320,25^A0N,18,22^FD{{ item.pk }}^FS\n^FT100,70^FB200,2,,C,,^A0N,18,22^FD{{ part.name }}^FS\n^FT100,100^FB200,1,,C,,^A0N,18,22^FD{{ part.manufacturer_parts.first.manufacturer.name }}^FS\n^FT30,150^FB340,1,,C,,^A0N,30,40^FD{{ part.IPN }}^FS\n^FT20,210^FB360,3,,L,,^A0N,18,22^FD{{ part.description }}^FS\n^FT15,110^BQ,2,3^FDQA,{{ part.IPN }}^FS\n^FT310,130^BQ,2,3^FDQA,{{ qr_data }}^FS\n{% endautoescape %}\n\n
Autoescape must be off. We do not need " and similar escapes here.\nContext variables can be used as usual.
\n\n!!! warning “Limitation”\n ZPL commands starting with backslash like \\& cannot be used so far.
\n\nThe printer driver allows an output device called “preview”. If this is selected\nthe ZPL code is sent to the API of labelary.com. The API sends back pdf data\nwhich is displayed in a new browser window. This is helpful while writing ZPL\ntemplates but works with HTML templates too. Please be careful and do not send\nconfidential information to the API.
\n\nIn case you need to pass a proxy for the POST requests set the environment\nvariables PROXY_CON and PROXY_URL on the server. The plugin does not have\nsettings for this.
\n\nWith the multi printer feature it can happen that you have several printers in\nyour setup. When the Get Printer Info switch is set ON, the driver calls each printer\nonce a minute and collects some info about it. It calls the printer configured\nin the settings as well as all printers it finds in the label templates.\nIn case a printer is unreachable, an error message is shown. If a printer is used\nin several templates it is listed only once.
\n\nThe printer info feature works for local USB printers too.
\n\nFirst import all the stuff you need. Here we use the translation mechanism from Django for multi language support.\nThe import the InvenTree libs and everything you need for plugin. Here we have ZPL for the Zebra bitmaps and socket\nfor the IP connection to the printer.
\n\nThe next part is this:
\n\nclass ZebraLabelPlugin(LabelPrintingMixin, SettingsMixin, IntegrationPluginBase):\n\n AUTHOR = \"Michael Buchmann\"\n DESCRIPTION = \"Label printing plugin for Zebra printers\"\n VERSION = ZEBRA_PLUGIN_VERSION\n NAME = \"Zebra labels\"\n SLUG = \"zebra\"\n TITLE = \"Zebra Label Printer\"\n
The name of the class can be freely chosen but should be different from SLUG. Otherwise it does not\nshow up. You reference to it in the entry_points section of the setup.py file.\nThe parameters need to be like in the example. Then there is the description block. The keywords are fixed and\nneed to be like that. The values are found in the UI as shown in the picture below.
\n\nThen we add the configuration parameters.
\nSETTINGS = {\n 'CONNECTION': {\n 'name': _('Printer Interface'),\n 'description': _('Select local or network printer'),\n 'choices': [('local','Local printer e.g. USB'),('network','Network printer with IP address')],\n 'default': 'local',\n },\n 'PORT': {\n 'name': _('Port'),\n 'description': _('Network port in case of network printer'),\n 'default': '9100',\n },\n }\n\n
We need to define a dict with the name SETTINGS. Please be aware the keys need to be in all CAPITAL letters like CONNECTION.\nSimple parameters are just text strings like the port. We can set a default. The name and description shows up in the UI.\nInstead of a simple text we can also use choices. The first string like “local” it the key you use in the code. The second\none is the description in the UI.\nAfter that we need to define a function:
\n\ndef print_label(self, **kwargs){\n
The kwargs is a dict with the following keys:
\n\nThe item_instance is the part to be printed. This allows direct access to all part data. The arguments width and height\ncome from the settings of the label in the admin interface. NOT from the html template.\nFor the Zebra printer we use the png_file. This is a PIL (python Pillow) object with the graphic of the label in PNG format.\nThe PIL object is a greyscale image. Because the printer can just print pure BW we convert this to a BW picture.
\n\nfn = lambda x : 255 if x > Threshold else 0\nlabel_image = label_image.convert('L').point(fn, mode='1')\n
The threshold can by modified by a plugin parameter. 200 is a good starting value. This trick gives much better prints.\nWe can put the result of this directly into the ZPL library.
\n\nl = zpl.Label(Height, Width, dpmm)\nli.set_darkness(darkness)\n...\nl.write_graphic(label_image, Width)\nl.endorigin()\n
Width and Height define is the size of the label in millimeters as described above.\nThe third parameter is the resolution of the printer in dots per mm.\nwrite_graphic converts the pillow data to ZPL.
\n\nThe plugin was tested with a labels of various sizes defined using css and html. The DPI scaling\ncan be chosen in the InvenTree settings. 800 is a good value because it gives high quality.
\n\nThe rest of the code is just output to the printer on different interfaces.
\n\nHappy printing.
\n" } }, "publishers":{ "/LavissaWoW": { "short_name": "LavissaWoW", "name": "Nichlas W.", "github": "LavissaWoW", "website": "https://www.linkedin.com/in/nfnw/", "content_txt" : "Yes, WoW is for World of Warcraft\n", "content": "Yes, WoW is for World of Warcraft
\n" }, "/SergeoLacruz": { "short_name": "SergeoLacruz", "name": "Michael", "github": "SergeoLacruz", "website": "http://www.buchmann.ruhr", "content_txt" : "Hardware engineer in Germany and vintage fan.\n", "content": "Hardware engineer in Germany and vintage fan.
\n" }, "/afwkiers": { "short_name": "afkiwers", "name": "Andre", "github": "afkiwers", "website": null, "content_txt" : "\n", "content": "\n" }, "/lippoliv": { "short_name": "lippoliv", "name": "Oliver Lippert", "github": "lippoliv", "website": "https://www.linkedin.com/in/oliver-lippert-730b9927/", "content_txt" : "With over 15 years of experience and big big passion I learned to take care about the details. They build up to the big picture we have in mind. I’m planning ahead & act early to prevent a big bang.\n", "content": "With over 15 years of experience and big big passion I learned to take care about the details. They build up to the big picture we have in mind. I’m planning ahead & act early to prevent a big bang.
\n" }, "/matmair": { "short_name": "matmair", "name": "Matthias Mair", "github": "matmair", "website": "https://mjmair.com", "content_txt" : "I try to build an ecosystem of reusable plugins and integrations for InvenTree. Code once and KISS!\n", "content": "I try to build an ecosystem of reusable plugins and integrations for InvenTree. Code once and KISS!
\n" }, "/melektron": { "short_name": "melektron", "name": "melektron", "github": "melektron", "website": "https://elektron.work/", "content_txt" : "Juggling with bits and bytes for fun and profit ;) (and also electrons if I feel like it)\n", "content": "Juggling with bits and bytes for fun and profit ;) (and also electrons if I feel like it)
\n" }, "/piramja": { "short_name": "piramja", "name": "Martin P.", "github": "piramja", "website": null, "content_txt" : "And in the end, we have no choice but to embrace the chaos and laugh about it.\n", "content": "And in the end, we have no choice but to embrace the chaos and laugh about it.
\n" }, "/schrodingersgat": { "short_name": "SchrodingersGat", "name": "Oliver", "github": "SchrodingersGat", "website": "https://inventree.org", "content_txt" : "Maintainer of InvenTree.\n", "content": "Maintainer of InvenTree.
\n" }, "/wolflu05": { "short_name": "wolflu05", "name": "Lukas", "github": "wolflu05", "website": null, "content_txt" : "\n", "content": "\n" } }}