From 0ca8a751665532fc0fa0bcbf9b22b28e60350c5e Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 11 Apr 2017 23:12:07 +1000 Subject: [PATCH] Added projects API --- InvenTree/project/models.py | 6 ++- InvenTree/project/serializers.py | 66 ++++++++++++++++++++++++++++++++ InvenTree/project/urls.py | 15 +++++++- InvenTree/project/views.py | 40 +++++++++++++++++-- 4 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 InvenTree/project/serializers.py diff --git a/InvenTree/project/models.py b/InvenTree/project/models.py index 15f87ae006..c289f5ebd3 100644 --- a/InvenTree/project/models.py +++ b/InvenTree/project/models.py @@ -17,6 +17,10 @@ class ProjectCategory(InvenTreeTree): verbose_name = "Project Category" verbose_name_plural = "Project Categories" + @property + def projects(self): + return self.project_set.all() + class Project(models.Model): """ A Project takes multiple Part objects. @@ -57,7 +61,7 @@ class ProjectPart(models.Model): quantity = models.PositiveIntegerField(default=1) overage = models.FloatField(default=0) overage_type = models.PositiveIntegerField( - default=1, + default=OVERAGE_ABSOLUTE, choices=OVARAGE_CODES.items()) def __str__(self): diff --git a/InvenTree/project/serializers.py b/InvenTree/project/serializers.py new file mode 100644 index 0000000000..4123968042 --- /dev/null +++ b/InvenTree/project/serializers.py @@ -0,0 +1,66 @@ +from rest_framework import serializers + +from .models import ProjectCategory, Project, ProjectPart + +from part.serializers import PartBriefSerializer + + +class ProjectPartSerializer(serializers.ModelSerializer): + + class Meta: + model = ProjectPart + fields = ('pk', + 'part', + 'project', + 'quantity', + 'overage', + 'overage_type') + + +class ProjectBriefSerializer(serializers.ModelSerializer): + """ Serializer for displaying brief overview of a project + """ + + + class Meta: + model = Project + fields = ('pk', + 'name', + 'description', + 'category') + + +class ProjectDetailSerializer(serializers.ModelSerializer): + """ Serializer for detailed project information + """ + + class Meta: + model = Project + fields = ('pk', + 'name', + 'description', + 'category') + + +class ProjectCategoryBriefSerializer(serializers.ModelSerializer): + + class Meta: + model = ProjectCategory + fields = ('pk','name','description') + + +class ProjectCategoryDetailSerializer(serializers.ModelSerializer): + + projects = ProjectBriefSerializer(many=True) + + children = ProjectCategoryBriefSerializer(many=True) + + class Meta: + model = ProjectCategory + fields = ('pk', + 'name', + 'description', + 'parent', + 'path', + 'children', + 'projects') diff --git a/InvenTree/project/urls.py b/InvenTree/project/urls.py index 9cb3403af4..2758a64cc8 100644 --- a/InvenTree/project/urls.py +++ b/InvenTree/project/urls.py @@ -3,5 +3,18 @@ from django.conf.urls import url from . import views urlpatterns = [ - url(r'^$', views.index, name='index') + # Single project detail + url(r'^(?P[0-9]+)/$', views.ProjectDetail.as_view()), + + # Parts associated with a project + url(r'^(?P[0-9]+)/parts$', views.ProjectPartsList.as_view()), + + # List of all projects + url(r'^$', views.ProjectList.as_view()), + + # List of top-level project categories + url(r'^category/$', views.ProjectCategoryList.as_view()), + + # Detail of a single project category + url(r'^category/(?P[0-9]+)/$', views.ProjectCategoryDetail.as_view()) ] diff --git a/InvenTree/project/views.py b/InvenTree/project/views.py index adbd6ac6ef..a92158ff48 100644 --- a/InvenTree/project/views.py +++ b/InvenTree/project/views.py @@ -1,5 +1,39 @@ -from django.http import HttpResponse +from rest_framework import generics + +from .models import ProjectCategory, Project, ProjectPart +from .serializers import ProjectBriefSerializer, ProjectDetailSerializer +from .serializers import ProjectCategoryBriefSerializer, ProjectCategoryDetailSerializer +from .serializers import ProjectPartSerializer + +class ProjectDetail(generics.RetrieveAPIView): + + queryset = Project.objects.all() + serializer_class = ProjectDetailSerializer -def index(request): - return HttpResponse("This is the Projects page") +class ProjectList(generics.ListAPIView): + + queryset = Project.objects.all() + serializer_class = ProjectBriefSerializer + + + +class ProjectCategoryDetail(generics.RetrieveAPIView): + + queryset = ProjectCategory.objects.all() + serializer_class = ProjectCategoryDetailSerializer + + +class ProjectCategoryList(generics.ListAPIView): + + queryset = ProjectCategory.objects.filter(parent=None) + serializer_class = ProjectCategoryDetailSerializer + + +class ProjectPartsList(generics.ListAPIView): + + serializer_class = ProjectPartSerializer + + def get_queryset(self): + project_id = self.kwargs['pk'] + return ProjectPart.objects.filter(project=project_id)