diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py
index c49507de99..331b0e973e 100644
--- a/InvenTree/InvenTree/urls.py
+++ b/InvenTree/InvenTree/urls.py
@@ -17,6 +17,7 @@ from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
+ url(r'^stock/', include('stock.urls')),
url(r'^part/', include('part.urls')),
url(r'^admin/', admin.site.urls),
]
diff --git a/InvenTree/stock/__init__.py b/InvenTree/stock/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/InvenTree/stock/admin.py b/InvenTree/stock/admin.py
new file mode 100644
index 0000000000..0ddf5d0b3e
--- /dev/null
+++ b/InvenTree/stock/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+
+from .models import Warehouse, StockItem
+
+admin.site.register(Warehouse)
+admin.site.register(StockItem)
\ No newline at end of file
diff --git a/InvenTree/stock/apps.py b/InvenTree/stock/apps.py
new file mode 100644
index 0000000000..de8e50cc26
--- /dev/null
+++ b/InvenTree/stock/apps.py
@@ -0,0 +1,7 @@
+from __future__ import unicode_literals
+
+from django.apps import AppConfig
+
+
+class StockConfig(AppConfig):
+ name = 'stock'
diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py
new file mode 100644
index 0000000000..9d7c90daca
--- /dev/null
+++ b/InvenTree/stock/models.py
@@ -0,0 +1,36 @@
+from __future__ import unicode_literals
+
+from django.db import models
+
+from part.models import Part
+
+class Warehouse(models.Model):
+ name = models.CharField(max_length=100)
+ description = models.CharField(max_length=250, blank=True)
+ parent = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True)
+
+ def __str__(self):
+ if self.parent:
+ return "/".join([p.name for p in self.path]) + "/" + self.name
+ else:
+ return self.name
+
+ # Return path of this category
+ @property
+ def path(self):
+ if self.parent:
+ return self.parent.path + [self.parent]
+ else:
+ return []
+
+class StockItem(models.Model):
+ part = models.ForeignKey(Part, on_delete=models.CASCADE)
+ location = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
+ quantity = models.IntegerField()
+ updated = models.DateField(auto_now=True)
+
+ def __str__(self):
+ return "{n} x {part} @ {loc}".format(
+ n = self.quantity,
+ part = self.part.name,
+ loc = self.location.name)
\ No newline at end of file
diff --git a/InvenTree/stock/templates/stock/index.html b/InvenTree/stock/templates/stock/index.html
new file mode 100644
index 0000000000..234cd000dc
--- /dev/null
+++ b/InvenTree/stock/templates/stock/index.html
@@ -0,0 +1,8 @@
+Warehouses:
+
+{% for warehouse in warehouse %}
+
+
+{{ warehouse.name }}
+
+{% endfor %}
\ No newline at end of file
diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py
new file mode 100644
index 0000000000..7ce503c2dd
--- /dev/null
+++ b/InvenTree/stock/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py
new file mode 100644
index 0000000000..d878de5869
--- /dev/null
+++ b/InvenTree/stock/urls.py
@@ -0,0 +1,7 @@
+from django.conf.urls import url
+
+from . import views
+
+urlpatterns = [
+ url(r'^$', views.index, name='index')
+]
\ No newline at end of file
diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py
new file mode 100644
index 0000000000..2f76a07800
--- /dev/null
+++ b/InvenTree/stock/views.py
@@ -0,0 +1,12 @@
+from django.shortcuts import render, get_object_or_404
+from django.http import HttpResponse
+
+from .models import Warehouse, StockItem
+
+def index(request):
+
+ warehouses = Warehouse.objects.filter(parent = None)
+
+ return render(request, 'stock/index.html',
+ {'warehouses': warehouses
+ })
\ No newline at end of file