Mventory is an API-driven solution for Makerspaces, Tinkerers, and Hackers.

Overview

Mventory

An inventory solution for Makers

GitGuardian Security Checks Django Tests Container Builds

What is it?

Mventory is an API-driven inventory solution for Makers, Makerspaces, Hackspaces, and just about anyone else who needs to keep track of "stuff".

I've written it to scratch an itch because I couldn't find anything else out there that would give me a simple way to keep track of the various components and materials in my garage, and wanted something that could translate easily from my house to a Makerspace in future.

How does it work?

What does "API-Driven" mean?

Mventory is "API-driven". This means that apart from the very basic admin pages there is no "pretty" interface built in, but the ability to communicate with the platform from almost any other platform is there from day one.

Happy with using the built-in admin pages? Great! Go for it!

Want to write an app for your phone that you can use whilst walking around the Makerspace? Yup, you can do that too!

Feel like building your own ASRS for your workbench? No worries, we've got you covered!

In short by having the built-in admin but allowing anyone to write their own front-end for the platform, all we need to worry about is storing and presenting the raw data to whatever you choose to use to query it. This makes the code a lot easier to maintain for us, whilst keeping the options for future integration wide open!

OK, so what can I do with it?

Mventory has the concept of Buildings, Rooms, Storage Units, Bins, and Components (in descending size order).

A component is the smallest unit of measurement and could be anything from a bolt of cloth or a spool of 3D printer filament through to SMD resistors, LED's, or linear actuators.

Components live in "Bins". A "Bin" is a sub-division of a Storage Unit and could be a box, a drawer, or a specific location on a peg board.

Bins live inside "Storage Units" (chests of drawers, toolboxes, peg boards etc), and Storage Units live inside "Rooms".

Finally, Rooms live inside "Buildings".

This may feel like overkill for a small home setup, but if you're working in a Makerspace that has multiple units on a yard or similar then it could be incredibly useful!

Octopart Support

The platform now has very basic support for Octopart. If you fill in the mpn (Manufacturer's Part Number) on a component it will return the first datasheet it finds on Octopart as a URL to the PDF.

In future, I hope to add the ability to return images of the product and many more of the product details that are available, so if you'd like a specific field from the Octopart API returned, just file an issue!

How do I install it?

This is a standard Django Application, you can get up and running with the following commands after cloning this repo to your machine:

> .env $ echo "MVENTORY_OCTOPART_API_KEY= >> .env" $ source .env $ ./manage.py migrate $ ./manage.py createsuperuser # Create your initial user $ ./manage.py runserver ">
$ mkvirtualenv mventory
$ pip install -r requirements.txt
$ echo "MVENTORY_SECRET_KEY=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;)" >> .env
$ echo "MVENTORY_OCTOPART_API_KEY= >> .env"
$ source .env
$ ./manage.py migrate
$ ./manage.py createsuperuser # Create your initial user
$ ./manage.py runserver

You can then browse to http://localhost:8000/admin and log in to create your buildings, rooms, and other sections/components.

Database configuration

By default, the platform uses a SQLite3 database stored in the data directory. Once we get to a containerised version, we'll be able to mount this directory outside the container allowing for data persistence during a container upgrade, however for now it's just a simple file.

The database is configured via environment variables.

The simplest way to get up and running with the system is to add the following to the .env file created above and then source that file:

export MVENTORY_DB_ENGINE=<database engine>
export MVENTORY_DB_HOST=<database server>
export MVENTORY_DB_USER=<database user name>
export MVENTORY_DB_PASSWORD=<database password>

Once you've done this, restart the server using ./manage.py runserver and you should be connected to your database server instead.

NOTE: The MVENTORY_DB_ENGINE value should be one of the engines from https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-DATABASE-ENGINE without the django.db.backends. part, so mysql or postgresql.

Running via Docker

Containers are available for the following architectures:

  • AMD64
  • ARMv6
  • ARMv7
  • ARM64

This should allow you to easily deploy Mventory on all kinds of platforms from enterprise servers to Raspberry Pi-style devices.

The container is available from the packages page and you'll want to pass the following environment variables to your container in order to get up and running:

export MVENTORY_DB_ENGINE=<database engine>
export MVENTORY_DB_NAME=<database name>
export MVENTORY_DB_HOST=<database server>
export MVENTORY_DB_USER=<database user name>
export MVENTORY_DB_PASSWORD=<database password>
export MVENTORY_SECRET_KEY=<some random string>
export MVENTORY_OCTOPART_API_KEY=<your octopart.com API key>

NOTE: All the DB_ variables are required if you want to connect to MySQL, if you want to use the built-in SQLite3 database then you can omit these

The container exposes the service on port 8000, and once you've got the container up and running you'll need to run the migrations and create the admin user as follows:

$ docker ps | grep mventory # Get the Container ID from here
$ docker exec -ti <container id from above> /bin/bash
> ./manage.py migrate # Run this inside the container
> ./manage.py createsuperuser # Run this inside the container

Once you've done this, you should be able to visit the container in a web browser and log in with your superuser credentials.

What does it look like?

It's an API, so there isn't really a pretty interface for this (in fact, I'm hoping someone else will write one because it's really not where my skills lie!) however this is what you'll see in a browser if you visit the system once it's up and running:

The API Home Page The API Home Page

One of the API Detail pages (in this case, the one for components) The API Component Page

The Admin home page (available at http://deployment.url/admin) The Admin Home Page

The Admin page for a component The Admin Component Page

How does it work?

MVentory is API-driven, this means that there's no nice UI to look at, but it does "self-document".

If you go to your installation in a browser you'll see a fairly boring set of web-pages that allow you to list the various buildings, rooms, storage units, storage bins, and components and add new ones, but the power of this platform really comes alive when you write your own integration with it.

In the spirit of the Unix philosophy of "do one thing and do it well", all this system does is store information about how many things you have and where they're stored, along with some useful other information such as the unit of measurement for each component.

Front-ends can then be written in any language to talk to the API and retrieve that information in JSON format so it can be displayed to the user or integrated as part of a robotic retrieval system.

Here's a few example calls to the REST API from the command line:

curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/rest/components/ # list all components in the system

curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/rest/rooms/ # list all rooms in the system

curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/rest/components/?search=555 # return all components with the value "555" in their name or product id

More features will be added in future, so keep an eye on the issue tracker to see what's coming up!

How do I contribute?

More detail is needed here, but essentially just fork the repo, make your changes on a branch and submit a PR - we look forward to seeing your contributions!

Comments
  • misnamed .env var

    misnamed .env var

    docker manual in README.md states to set the env var export MVENTORY_SECRET=<some random string> it should state instead: export MVENTORY_SECRET_KEY=<some random string>

    EDIT: MVENTORY_DB_NAME needs to be set as well for connectiong to a mariadb instance via the mysql engine

    opened by prash3r 1
  • [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.8-slim-buster

    [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.8-slim-buster

    Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.

    Changes included in this PR

    • Dockerfile

    We recommend upgrading to python:3.8-slim-buster, as this image has only 68 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.

    Some of the most important vulnerabilities in your base image include:

    | Severity | Priority Score / 1000 | Issue | Exploit Maturity | | :------: | :-------------------- | :---- | :--------------- | | high severity | 500 | CVE-2019-19603
    SNYK-DEBIAN10-SQLITE3-537598 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit |


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    opened by snyk-bot 0
  • [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.8.11-slim-buster

    [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.8.11-slim-buster

    Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.

    Changes included in this PR

    • Dockerfile

    We recommend upgrading to python:3.8.11-slim-buster, as this image has only 68 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.

    Some of the most important vulnerabilities in your base image include:

    | Severity | Priority Score / 1000 | Issue | Exploit Maturity | | :------: | :-------------------- | :---- | :--------------- | | high severity | 500 | CVE-2019-19603
    SNYK-DEBIAN10-SQLITE3-537598 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit |


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    opened by snyk-bot 0
  • [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.9.6-slim-buster

    [Snyk] Security upgrade python from 3.8.10-slim-buster to 3.9.6-slim-buster

    Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.

    Changes included in this PR

    • Dockerfile

    We recommend upgrading to python:3.9.6-slim-buster, as this image has only 68 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.

    Some of the most important vulnerabilities in your base image include:

    | Severity | Priority Score / 1000 | Issue | Exploit Maturity | | :------: | :-------------------- | :---- | :--------------- | | high severity | 500 | CVE-2019-19603
    SNYK-DEBIAN10-SQLITE3-537598 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit |


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    opened by snyk-bot 0
  • Call measurement unit correctly, add depth to serializer for component

    Call measurement unit correctly, add depth to serializer for component

    This PR adds a "depth" to the component call for the API which returns all the data nested right up to building level instead of having to chase the API URL's back.

    This makes it much faster to act on the relevant data without having to do multiple calls to the API to locate a component.

    opened by proffalken 0
  • [Snyk] Security upgrade python from 3.8.8-slim-buster to 3.8.10-slim-buster

    [Snyk] Security upgrade python from 3.8.8-slim-buster to 3.8.10-slim-buster

    Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.

    Changes included in this PR

    • Dockerfile

    We recommend upgrading to python:3.8.10-slim-buster, as this image has only 63 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.

    Some of the most important vulnerabilities in your base image include:

    | Severity | Priority Score / 1000 | Issue | Exploit Maturity | | :------: | :-------------------- | :---- | :--------------- | | high severity | 714 | Information Exposure
    SNYK-DEBIAN10-LIBGCRYPT20-1297893 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Privilege Chaining
    SNYK-DEBIAN10-SYSTEMD-345386 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit | | high severity | 500 | Incorrect Privilege Assignment
    SNYK-DEBIAN10-SYSTEMD-345391 | No Known Exploit |


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    opened by snyk-bot 0
  • Update part id fields to reflect other platforms

    Update part id fields to reflect other platforms

    • SKU (Stock Keeping Unit) is the correct term for an internal part number, so we need to rename product_code to this name
    • MPN is the Manufacturer Part Number and identifies a specific part from a specific manufacturer, this should be optional
    • UPC is the Universal Product Code and is used across multiple platforms to keep track of an item for shipping etc. Again, this is optional
    opened by proffalken 0
  • [Snyk] Security upgrade python from 3 to 3.8.8-slim-buster

    [Snyk] Security upgrade python from 3 to 3.8.8-slim-buster

    Keeping your Docker base image up-to-date means you’ll benefit from security fixes in the latest version of your chosen image.

    Changes included in this PR

    • Dockerfile

    We recommend upgrading to python:3.8.8-slim-buster, as this image has only 70 known vulnerabilities. To do this, merge this pull request, then verify your application still works as expected.

    Some of the most important vulnerabilities in your base image include:

    | Severity | Priority Score / 1000 | Issue | Exploit Maturity | | :------: | :-------------------- | :---- | :--------------- | | high severity | 714 | Information Exposure
    SNYK-DEBIAN10-LIBGCRYPT20-1297893 | No Known Exploit | | high severity | 714 | Use After Free
    SNYK-DEBIAN10-LIBXML2-1277346 | No Known Exploit | | high severity | 714 | Out-of-bounds Write
    SNYK-DEBIAN10-LIBXML2-1277349 | No Known Exploit | | high severity | 714 | Use After Free
    SNYK-DEBIAN10-LIBXML2-1277350 | No Known Exploit | | high severity | 671 | OS Command Injection
    SNYK-DEBIAN10-MARIADB103-1087462 | Mature |


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    opened by snyk-bot 0
  • Add Tests

    Add Tests

    • Add basic tests that /rest returns a 200, and that we can retrieve a component without logging in
    • Add github workflow actions to run the Django tests against various versions of python and multiple databases

    Fixes #4

    opened by proffalken 0
  • Feature/add suppliers

    Feature/add suppliers

    This PR adds suppliers to the API, allowing you to assign multiple components to multiple suppliers to ensure you are getting the best value for money when purchasing things.

    It also provides fields for "marking up" products, and returns the total price that the user will pay along with the difference between the cost from the supplier and the price charged so purchasers can see how much they are contributing to the space with each purchase.

    opened by proffalken 1
  • Add GraphQL API to compliment REST

    Add GraphQL API to compliment REST

    GraphQL libraries are required to talk to Octopart ( #5 ), it may be worth exploring if we can add a GraphQL interface as well as the REST API through using https://docs.graphene-python.org/projects/django/en/latest/

    enhancement 
    opened by proffalken 0
  • Add barcode/QRCode support

    Add barcode/QRCode support

    Not too sure how this would be implemented, but being able to send barcode/QRCode data to the platform and have it look up the appropriate bin and return the relevant component would be awesome!

    enhancement 
    opened by proffalken 1
  • Add support for component images

    Add support for component images

    It would be great if you could write a front-end that enabled you to take a photo of a component and then store it alongside the rest of the data about that component.

    enhancement good first issue 
    opened by proffalken 1
Owner
Make Monmouth
The Maker Community in Monmouth, Wales, UK
Make Monmouth
twtxt is a decentralised, minimalist microblogging service for hackers.

twtxt twtxt is a decentralised, minimalist microblogging service for hackers. So you want to get some thoughts out on the internet in a convenient and

buckket 1.8k Jan 9, 2023
Opensea-upload-with-recaptcha-solution - Updated opensea uploading solution with recaptcha pass

opensea-upload-with-recaptcha-solution updated opensea uploading solution with r

byeonggeon sim 25 Nov 15, 2022
Event-driven-model-serving - Unified API of Apache Kafka and Google PubSub

event-driven-model-serving Unified API of Apache Kafka and Google PubSub 1. Proj

Danny Toeun Kim 4 Sep 23, 2022
The Official Twilio SendGrid Led, Community Driven Python API Library

The default branch name for this repository has been changed to main as of 07/27/2020. This library allows you to quickly and easily use the SendGrid

Twilio SendGrid 1.4k Jan 7, 2023
UniHub API is my solution to bringing students and their universities closer

?? UniHub API UniHub API is my solution to bringing students and their universities closer... By joining UniHub, students will be able to join their r

Abdelbaki Boukerche 5 Nov 21, 2021
MONAI Deploy App SDK offers a framework and associated tools to design, develop and verify AI-driven applications in the healthcare imaging domain.

MONAI Deploy App SDK offers a framework and associated tools to design, develop and verify AI-driven applications in the healthcare imaging domain.

Project MONAI 49 Dec 23, 2022
First Party data integration solution built for marketing teams to enable audience and conversion onboarding into Google Marketing products (Google Ads, Campaign Manager, Google Analytics).

Megalista Sample integration code for onboarding offline/CRM data from BigQuery as custom audiences or offline conversions in Google Ads, Google Analy

Google 76 Dec 29, 2022
The Research PACS on AWS solution facilitates researchers' access medical images stored in the clinical PACS in a secure and seamless manner

Research PACS on AWS Challenge to solve Solution presentation Deploy the solution Further reading Releases License Challenge to solve The rise of new

AWS Samples 23 Sep 9, 2022
A solution designed to extract, transform and load Chicago crime data from an RDS instance to other services in AWS.

This project is intended to implement a solution designed to extract, transform and load Chicago crime data from an RDS instance to other services in AWS.

Yesaswi Avula 1 Feb 4, 2022
This solution helps you deploy Data Lake Infrastructure on AWS using CDK Pipelines.

CDK Pipelines for Data Lake Infrastructure Deployment This solution helps you deploy data lake infrastructure on AWS using CDK Pipelines. This is base

AWS Samples 66 Nov 23, 2022
Want to get your driver's license? Can't get a appointment because of COVID? Well I got a solution for you.

NJDMV-appoitment-alert Want to get your driver's license? Can't get a appointment because of COVID? Well I got a solution for you. We'll get you one i

Harris Spahic 3 Feb 4, 2022
Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API.

Tg_PHub_Bot Telegram PHub Bot using ARQ Api and Pyrogram. This Bot can Download and Send PHub HQ videos in Telegram using ARQ API. OS Support All linu

TheProgrammerCat 13 Oct 21, 2022
🚧 finCLI's own News API. No more limited API calls. Unlimited credible and latest information on BTC, Ethereum, Indian and Global Finance.

?? finCLI's own News API. No more limited API calls. Unlimited credible and latest information on BTC, Ethereum, Indian and Global Finance.

finCLI 5 Jun 16, 2022
Official python API for Phish.AI public and private API to detect zero-day phishing websites

phish-ai-api Summary Official python API for Phish.AI public and private API to detect zero-day phishing websites How it Works (TLDR) Essentially we h

Phish.AI 168 May 17, 2022
A python to scratch API connector. Can fetch data from the API and send it back in cloud variables.

Scratch2py Scratch2py or S2py is a easy to use, versatile tool to communicate with the Scratch API Based of scratchclient by Raihan142857 Installation

null 20 Jun 18, 2022
The Bot provide Hadith API and fetch content via api.hadith.sutanlab.id

Bot Hadith-API on Telegram The Bot provide Hadith API and fetch content via api.hadith.sutanlab.id Built With Python Asynchronous HTTP protocol client

xMan 12 Feb 19, 2022
Deploy a STAC API and a dynamic mosaic tiler API using AWS CDK.

Earth Observation API Deploy a STAC API and a dynamic mosaic tiler API using AWS CDK.

Development Seed 39 Oct 30, 2022
Beyonic API Python official client library simplified examples using Flask, Django and Fast API.

Beyonic API Python official client library simplified examples using Flask, Django and Fast API.

Harun Mbaabu Mwenda 46 Sep 1, 2022
A new coin listing alert bot using Python, Flask, MongoDB, Telegram API and Binance API

Bzzmans New Coin Listing Detection Bot Architecture About Project Work in progress. This bot basically gets new coin listings from Binance using Binan

Eyüp Barlas 21 May 31, 2022