From 5420f831147d27892a768526f7f26950ff4d4a4e Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 27 Mar 2017 23:08:12 +1100 Subject: [PATCH] Added Project category --- InvenTree/InvenTree/settings.py | 1 + InvenTree/InvenTree/urls.py | 1 + InvenTree/project/__init__.py | 0 InvenTree/project/admin.py | 7 +++++ InvenTree/project/apps.py | 7 +++++ InvenTree/project/models.py | 54 +++++++++++++++++++++++++++++++++ InvenTree/project/tests.py | 3 ++ InvenTree/project/urls.py | 7 +++++ InvenTree/project/views.py | 5 +++ InvenTree/track/urls.py | 7 +++++ 10 files changed, 92 insertions(+) create mode 100644 InvenTree/project/__init__.py create mode 100644 InvenTree/project/admin.py create mode 100644 InvenTree/project/apps.py create mode 100644 InvenTree/project/models.py create mode 100644 InvenTree/project/tests.py create mode 100644 InvenTree/project/urls.py create mode 100644 InvenTree/project/views.py create mode 100644 InvenTree/track/urls.py diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 61f0b0d8c2..733676ec38 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -39,6 +39,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'part.apps.PartConfig', + 'project.apps.ProjectConfig', 'stock.apps.StockConfig', 'supplier.apps.SupplierConfig', 'track.apps.TrackConfig' diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 65680fe3d7..52b69c4a95 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -24,5 +24,6 @@ urlpatterns = [ url(r'^part/', include('part.urls')), url(r'^supplier/', include('supplier.urls')), url(r'^track/', include('track.urls')), + url(r'^project/', include('project.urls')), url(r'^admin/', admin.site.urls), ] diff --git a/InvenTree/project/__init__.py b/InvenTree/project/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/InvenTree/project/admin.py b/InvenTree/project/admin.py new file mode 100644 index 0000000000..043b785587 --- /dev/null +++ b/InvenTree/project/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin + +from .models import ProjectCategory, Project, ProjectPart + +admin.site.register(ProjectCategory) +admin.site.register(Project) +admin.site.register(ProjectPart) \ No newline at end of file diff --git a/InvenTree/project/apps.py b/InvenTree/project/apps.py new file mode 100644 index 0000000000..6b7b79986e --- /dev/null +++ b/InvenTree/project/apps.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class ProjectConfig(AppConfig): + name = 'project' diff --git a/InvenTree/project/models.py b/InvenTree/project/models.py new file mode 100644 index 0000000000..18da1221f4 --- /dev/null +++ b/InvenTree/project/models.py @@ -0,0 +1,54 @@ +from __future__ import unicode_literals + +from django.db import models + +from InvenTree.models import InvenTreeTree +from part.models import Part + +class ProjectCategory(InvenTreeTree): + """ ProjectCategory provides hierarchical organization of Project objects. + Each ProjectCategory can contain zero-or-more child categories, + and in turn can have zero-or-one parent category. + """ + + class Meta: + verbose_name = "Project Category" + verbose_name_plural = "Project Categories" + +class Project(models.Model): + """ A Project takes multiple Part objects. + A project can output zero-or-more Part objects + """ + + name = models.CharField(max_length=100) + description = models.CharField(max_length=500, blank=True) + category = models.ForeignKey(ProjectCategory, on_delete=models.CASCADE) + + def __str__(self): + return self.name + + +class ProjectPart(models.Model): + """ A project part associates a single part with a project + The quantity of parts required for a single-run of that project is stored. + The overage is the number of extra parts that are generally used for a single run. + """ + + # Overage types + OVERAGE_PERCENT = 0 + OVERAGE_ABSOLUTE = 1 + + part = models.ForeignKey(Part, on_delete=models.CASCADE) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + quantity = models.IntegerField() + overage = models.FloatField() + overage_type = models.IntegerField( + choices=[ + (OVERAGE_PERCENT, "Percent"), + (OVERAGE_ABSOLUTE, "Absolute") + ]) + + def __str__(self): + return "{quan} x {name}".format( + name = self.part.name, + quan = self.quantity) \ No newline at end of file diff --git a/InvenTree/project/tests.py b/InvenTree/project/tests.py new file mode 100644 index 0000000000..7ce503c2dd --- /dev/null +++ b/InvenTree/project/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/InvenTree/project/urls.py b/InvenTree/project/urls.py new file mode 100644 index 0000000000..59e5d723c9 --- /dev/null +++ b/InvenTree/project/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/project/views.py b/InvenTree/project/views.py new file mode 100644 index 0000000000..6b351c0479 --- /dev/null +++ b/InvenTree/project/views.py @@ -0,0 +1,5 @@ +from django.shortcuts import render, get_object_or_404 +from django.http import HttpResponse + +def index(request): + return HttpResponse("This is the Projects page") \ No newline at end of file diff --git a/InvenTree/track/urls.py b/InvenTree/track/urls.py new file mode 100644 index 0000000000..59e5d723c9 --- /dev/null +++ b/InvenTree/track/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