2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-19 05:25:42 +00:00

Starting to implement BOM management

- Each part can be made of other parts
- Disable tracking and project apps for now
- Project will change (eventually) to work order
- Part parameters have been disabled (for now)
This commit is contained in:
Oliver
2018-04-12 16:27:26 +10:00
parent 47e99d5f35
commit ed61ebe5b7
18 changed files with 284 additions and 140 deletions

View File

@ -1,7 +1,6 @@
from django.contrib import admin
from .models import PartCategory, Part, PartParameter, PartParameterTemplate, CategoryParameterLink
from .models import PartCategory, Part
class PartAdmin(admin.ModelAdmin):
@ -12,18 +11,18 @@ class PartCategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'path', 'description')
"""
class ParameterTemplateAdmin(admin.ModelAdmin):
list_display = ('name', 'units', 'format')
class ParameterAdmin(admin.ModelAdmin):
list_display = ('part', 'template', 'value')
"""
admin.site.register(Part, PartAdmin)
admin.site.register(PartCategory, PartCategoryAdmin)
admin.site.register(PartParameter, ParameterAdmin)
admin.site.register(PartParameterTemplate, ParameterTemplateAdmin)
admin.site.register(CategoryParameterLink)
#admin.site.register(PartParameter, ParameterAdmin)
#admin.site.register(PartParameterTemplate, ParameterTemplateAdmin)
#admin.site.register(CategoryParameterLink)

View File

@ -21,7 +21,10 @@ class PartCategory(InvenTreeTree):
class Part(models.Model):
""" Represents a """
""" Represents an abstract part
Parts can be "stocked" in multiple warehouses,
and can be combined to form other parts
"""
# Short name of the part
name = models.CharField(max_length=100)
@ -92,84 +95,4 @@ class Part(models.Model):
return projects
class PartParameterTemplate(models.Model):
""" A PartParameterTemplate pre-defines a parameter field,
ready to be copied for use with a given Part.
A PartParameterTemplate can be optionally associated with a PartCategory
"""
name = models.CharField(max_length=20, unique=True)
units = models.CharField(max_length=10, blank=True)
# Parameter format
PARAM_NUMERIC = 10
PARAM_TEXT = 20
PARAM_BOOL = 30
PARAM_TYPE_CODES = {
PARAM_NUMERIC: _("Numeric"),
PARAM_TEXT: _("Text"),
PARAM_BOOL: _("Bool")
}
format = models.PositiveIntegerField(
default=PARAM_NUMERIC,
choices=PARAM_TYPE_CODES.items(),
validators=[MinValueValidator(0)])
def __str__(self):
return "{name} ({units})".format(
name=self.name,
units=self.units)
class Meta:
verbose_name = "Parameter Template"
verbose_name_plural = "Parameter Templates"
class CategoryParameterLink(models.Model):
""" Links a PartParameterTemplate to a PartCategory
"""
category = models.ForeignKey(PartCategory, on_delete=models.CASCADE)
template = models.ForeignKey(PartParameterTemplate, on_delete=models.CASCADE)
def __str__(self):
return "{name} - {cat}".format(
name=self.template.name,
cat=self.category)
class Meta:
verbose_name = "Category Parameter"
verbose_name_plural = "Category Parameters"
unique_together = ('category', 'template')
class PartParameter(models.Model):
""" PartParameter is associated with a single part
"""
part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='parameters')
template = models.ForeignKey(PartParameterTemplate)
# Value data
value = models.CharField(max_length=50, blank=True)
min_value = models.CharField(max_length=50, blank=True)
max_value = models.CharField(max_length=50, blank=True)
def __str__(self):
return "{name} : {val}{units}".format(
name=self.template.name,
val=self.value,
units=self.template.units)
@property
def units(self):
return self.template.units
@property
def name(self):
return self.template.name
class Meta:
verbose_name = "Part Parameter"
verbose_name_plural = "Part Parameters"
unique_together = ('part', 'template')

View File

@ -0,0 +1,89 @@
"""
TODO - Implement part parameters, and templates
See code below
"""
class PartParameterTemplate(models.Model):
""" A PartParameterTemplate pre-defines a parameter field,
ready to be copied for use with a given Part.
A PartParameterTemplate can be optionally associated with a PartCategory
"""
name = models.CharField(max_length=20, unique=True)
units = models.CharField(max_length=10, blank=True)
# Parameter format
PARAM_NUMERIC = 10
PARAM_TEXT = 20
PARAM_BOOL = 30
PARAM_TYPE_CODES = {
PARAM_NUMERIC: _("Numeric"),
PARAM_TEXT: _("Text"),
PARAM_BOOL: _("Bool")
}
format = models.PositiveIntegerField(
default=PARAM_NUMERIC,
choices=PARAM_TYPE_CODES.items(),
validators=[MinValueValidator(0)])
def __str__(self):
return "{name} ({units})".format(
name=self.name,
units=self.units)
class Meta:
verbose_name = "Parameter Template"
verbose_name_plural = "Parameter Templates"
class CategoryParameterLink(models.Model):
""" Links a PartParameterTemplate to a PartCategory
"""
category = models.ForeignKey(PartCategory, on_delete=models.CASCADE)
template = models.ForeignKey(PartParameterTemplate, on_delete=models.CASCADE)
def __str__(self):
return "{name} - {cat}".format(
name=self.template.name,
cat=self.category)
class Meta:
verbose_name = "Category Parameter"
verbose_name_plural = "Category Parameters"
unique_together = ('category', 'template')
class PartParameter(models.Model):
""" PartParameter is associated with a single part
"""
part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='parameters')
template = models.ForeignKey(PartParameterTemplate)
# Value data
value = models.CharField(max_length=50, blank=True)
min_value = models.CharField(max_length=50, blank=True)
max_value = models.CharField(max_length=50, blank=True)
def __str__(self):
return "{name} : {val}{units}".format(
name=self.template.name,
val=self.value,
units=self.template.units)
@property
def units(self):
return self.template.units
@property
def name(self):
return self.template.name
class Meta:
verbose_name = "Part Parameter"
verbose_name_plural = "Part Parameters"
unique_together = ('part', 'template')

View File

@ -1,11 +1,11 @@
from rest_framework import serializers
from .models import Part, PartCategory, PartParameter, PartParameterTemplate
from .models import Part, PartCategory
"""
class PartParameterSerializer(serializers.HyperlinkedModelSerializer):
""" Serializer for a PartParameter
"""
" Serializer for a PartParameter
"
class Meta:
model = PartParameter
@ -15,7 +15,7 @@ class PartParameterSerializer(serializers.HyperlinkedModelSerializer):
'name',
'value',
'units')
"""
class PartSerializer(serializers.HyperlinkedModelSerializer):
""" Serializer for complete detail information of a part.
@ -44,7 +44,7 @@ class PartCategorySerializer(serializers.HyperlinkedModelSerializer):
'parent',
'path')
"""
class PartTemplateSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
@ -53,3 +53,4 @@ class PartTemplateSerializer(serializers.HyperlinkedModelSerializer):
'name',
'units',
'format')
"""

View File

@ -12,6 +12,17 @@ part_cat_urls = [
url(r'^$', views.PartCategoryList.as_view())
]
part_urls = [
# Individual part
url(r'^(?P<pk>[0-9]+)/?$', views.PartDetail.as_view(), name='part-detail'),
# List parts with optional filters
url(r'^\?.*/?$', views.PartList.as_view()),
url(r'^$', views.PartList.as_view()),
]
"""
part_param_urls = [
# Detail of a single part parameter
url(r'^(?P<pk>[0-9]+)/?$', views.PartParamDetail.as_view(), name='partparameter-detail'),
@ -29,13 +40,6 @@ part_param_template_urls = [
url(r'^\?.*/?$', views.PartTemplateList.as_view()),
url(r'^$', views.PartTemplateList.as_view())
]
"""
part_urls = [
# Individual part
url(r'^(?P<pk>[0-9]+)/?$', views.PartDetail.as_view(), name='part-detail'),
# List parts with optional filters
url(r'^\?.*/?$', views.PartList.as_view()),
url(r'^$', views.PartList.as_view()),
]

View File

@ -3,11 +3,12 @@ from django_filters.rest_framework import FilterSet, DjangoFilterBackend
from rest_framework import generics, permissions
from InvenTree.models import FilterChildren
from .models import PartCategory, Part, PartParameter, PartParameterTemplate
from .models import PartCategory, Part
from .serializers import PartSerializer
from .serializers import PartCategorySerializer
from .serializers import PartParameterSerializer
from .serializers import PartTemplateSerializer
#from .serializers import PartParameterSerializer
#from .serializers import PartTemplateSerializer
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
@ -28,22 +29,22 @@ class PartDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
"""
class PartParamFilter(FilterSet):
class Meta:
model = PartParameter
fields = ['part']
class PartParamList(generics.ListCreateAPIView):
"""
"
get:
Return a list of all part parameters (with optional filters)
post:
Create a new part parameter
"""
""
queryset = PartParameter.objects.all()
serializer_class = PartParameterSerializer
@ -53,7 +54,7 @@ class PartParamList(generics.ListCreateAPIView):
class PartParamDetail(generics.RetrieveUpdateDestroyAPIView):
"""
""
get:
Detail view of a single PartParameter
@ -64,12 +65,12 @@ class PartParamDetail(generics.RetrieveUpdateDestroyAPIView):
delete:
Remove a PartParameter from the database
"""
"
queryset = PartParameter.objects.all()
serializer_class = PartParameterSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
"""
class PartFilter(FilterSet):
@ -138,8 +139,9 @@ class PartCategoryList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
"""
class PartTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
"""
""
get:
Return detail on a single PartParameterTemplate object
@ -150,7 +152,7 @@ class PartTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
delete:
Remove a PartParameterTemplate object
"""
""
queryset = PartParameterTemplate.objects.all()
serializer_class = PartTemplateSerializer
@ -158,7 +160,7 @@ class PartTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
class PartTemplateList(generics.ListCreateAPIView):
"""
""
get:
Return a list of all PartParameterTemplate objects
@ -167,8 +169,10 @@ class PartTemplateList(generics.ListCreateAPIView):
post:
Create a new PartParameterTemplate object
"""
""
queryset = PartParameterTemplate.objects.all()
serializer_class = PartTemplateSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
"""