This project is a small parts inventory management system. It is thought out to be a flexible parts database which keeps all relevant information as well as datasheets, prices and a visual representation where you stored the part.
The idea is that the system may tell you in which compartment of which box in what area of your workshop you have to search for to find the part you currently need. It has been optimized to store information for electronics parts and small other hardware like screws, nuts and bolts.
As configured by default you will need the following:
- A postgres database named
inventory
with a postgres userinventory
that may connect without password or by default with the passwordinventory
You will need:
- Python > 3.10
- Poetry to install requirements and create a virtualenv
This is a standard Django 5.1 application, if you know how to deploy those the following might sound familiar:
- Checkout repository:
- Github
git clone https://github.com/dunkelstern/inventory.git
- ForgeJo:
git clone https://git.dunkelstern.de/dunkelstern/inventory.git
- Github
- Change to checkout:
cd inventory
- Install virtualenv and dependencies:
poetry install --no-root
- If you want to use the system in another language than the default english set it
up in the
inventory_project/settings.py
:see the settings file for defined languages.LANGUAGE_CODE = 'en-us' # or something like 'de-de'
- If you changed the language rebuild the translation files:
poetry run python manage.py compilemessages
- Migrate the Database:
poetry run python manage.py migrate
- Optionally create an admin user. If not done manually the application will prompt you on first run.
poetry run python manage.py createsuperuser
- Run the server
- Development server (not for deployment!):
poetry run python manage.py runserver
- Deployment via
gunicorn
on port 8000:poetry run gunicorn inventory_project.wsgi -b 0.0.0.0:8000
Then login on http://localhost:8000/admin/
for the Django admin interface or
go to http://localhost:8000
to enter the inventory management system directly
- Checkout repository:
- Github
git clone https://github.com/dunkelstern/inventory.git
- ForgeJo:
git clone https://git.dunkelstern.de/dunkelstern/inventory.git
- Github
- Change to checkout:
cd inventory
- Build Docker image:
docker build -t 'dunkelstern/inventory:latest' .
next steps below
- Pull Docker image:
docker pull 'dunkelstern/inventory:latest'
next steps below
- Install a PostgreSQL DB somewhere and create a user and DB.
- Setup environment (put everything in a
.env
file):INVENTORY_DB_HOST= INVENTORY_DB_NAME= INVENTORY_DB_USER= INVENTORY_DB_PASSWORD= INVENTORY_SECRET_KEY= INVENTORY_EXTERNAL_URL=http://localhost:8000 INVENTORY_DEBUG=FALSE INVENTORY_LANGUAGE=en-us INVENTORY_TIMEZONE=UTC INVENTORY_PAGE_SIZE=25
- Create a media directory for uploaded files:
mkdir -p media
- Run the container:
docker run \ --name inventory \ -d \ --restart=always \ --env-file=.env \ -p 8000:8000 \ --volume ./media:/media \ dunkelstern/inventory:latest
- The onboarding process will start on first call of the application and prompt to create an admin user.
- Checkout repository:
- Github
git clone https://github.com/dunkelstern/inventory.git
- ForgeJo:
git clone https://git.dunkelstern.de/dunkelstern/inventory.git
- Github
- Change to checkout:
cd inventory
- Copy
default.env
tooverride.env
and check settings. Use a long random string forINVENTORY_SECRET_KEY
! - Build the stack:
docker-compose up --build -d
- You can reach the application on port 8000
- The onboarding process will start on first call of the application and prompt to create an admin user.
The compose stack will create two volumes:
inventory_dbdata
which contains the PostgreSQL database directoryinventory_mediafiles
which will contain any uploaded file
- The initial DB migration pre-populates the database with some useful defaults and some pre-defined distributors and form-factors usable for electronics inventories as well as a "Default Workshop" to be able to navigate everything.
- For editing parts the Django admin interface is used, so edit-links will only
appear if the currently logged in user is a
staff
user (set the checkbox in the admin area). - If you want to change the default number of items on paginated views you can
set the page size in the settings by providing a parameter
PAGE_SIZE
- If you want to run this as a systemd service see the the service file in the root of this repository for an example.
- Part count can be configured to be available in settings
- Currency can be configured in settings
- Complete system is translateable (English and German are provided)
- Onboarding process so you do not have to create a superuser on the command line
- Docker and Docker-Compose files
To be able to list all parts you'll need to login. You basically have three levels of permissions:
- Normal Users
- Staff Users
- Admin Users
Normal users can view all parts and search, Staff users may edit in addition. Admin users can create Users and do everything (like adding new layouts, etc.).
here we have a layer of containers, you may nest multiple containers into each other, for example to define a cupboard which contains multiple boxes of parts, or multiple rooms in your workshop that contain cupboards, etc.
This is a container that contains parts. You may define your layouts (number of compartments, number of items per compartment and layout of compartments themselves) all by yourself in the admin backend, by default the database comes with an assortment of Ikea and Raaco sorter boxes.
The Overview and Box views are designed to be used on a touch-screen and the HTML, CSS and Javascript are designed to work on older Hardware (Apple iOS 9 has been tested at lowest, so this works from iPad 2 up to the newest pro).
This is the detail view of a part, this is useful to find all parts by manufacturer or distributor, or when a part has multiple datasheets.
Editing is done on the standard Django admin interface, so all users that have no staff privileges only can view all parts, all with staff privileges have access to the django admin backend and can edit parts too.
If you click on the loupe symbol on top you'll get a popup searchbox for a fulltext search through all parts.
The search results contain a link to the container the object is stored in and if you click that link the compartment will be hilighted so you can find the part faster:
You can also reach the first datasheet directly from the search results by clicking on the icon in front of the description text.
If you select the tag icon in the header bar you will get a dynamically searchable tag cloud if you do not know a search term exactly or if you need a group of parts (e.g. give me all transistors of any type).
The detail view of a tag will list all items with that tag, as well as all containers or footprints that have been assigned this tag:
Editing is in Django backend:
You can browse your parts inventory by distributor or part manufacturer if you want:
The distributor views have a convenient search box if a parametrized search link has been set up in the backend.
This link will be used to link to a part directly if a part has a distributor part number saved.