diff --git a/.gitignore b/.gitignore index 2060e8c..dd137c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ /venv /pgdata +sketches/ db.sqlite3 __pycache__/ +*/*/migrations/*.py +!migrations/__init__.py diff --git a/partdoc/partdoc/settings.py b/partdoc/partdoc/settings.py index 9704fcf..31adb7d 100644 --- a/partdoc/partdoc/settings.py +++ b/partdoc/partdoc/settings.py @@ -124,3 +124,4 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' +STATIC_ROOT = 'static/' diff --git a/partdoc/partdoc/urls.py b/partdoc/partdoc/urls.py index 699d678..e592657 100644 --- a/partdoc/partdoc/urls.py +++ b/partdoc/partdoc/urls.py @@ -13,10 +13,12 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ +from django.conf import settings from django.conf.urls import url, include from django.contrib import admin +from django.conf.urls.static import static urlpatterns = [ url(r'^parts/', include('parts.urls'), name="parts"), - url(r'^admin/', admin.site.urls), -] + url(r'^admin/', admin.site.urls), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/partdoc/parts/admin.py b/partdoc/parts/admin.py index c5473ff..10c9137 100644 --- a/partdoc/parts/admin.py +++ b/partdoc/parts/admin.py @@ -2,4 +2,39 @@ from django.contrib import admin from .models import Brand, Product, Version, Sketch, Part, Usage, BrandedPart, ProductUsage -admin.site.register([Brand, Product, Version, Sketch, Part, Usage, BrandedPart, ProductUsage]) +#admin.site.register([Brand, Product, Version, Sketch, Part, Usage, BrandedPart, ProductUsage]) +admin.site.register([Brand, Product, Version, Sketch, ProductUsage]) + +class BrandedPartInline(admin.StackedInline): + model = BrandedPart + extra = 1 + +class PartAdmin(admin.ModelAdmin): + inlines = [BrandedPartInline] + +class PartInline(admin.StackedInline): + model = Part + +#class ProductUsageInline(admin.TabularInline): +# model = ProductUsage +# extra = 1 + +class ProductUsageInline(admin.StackedInline): + model = ProductUsage + extra = 1 + +class UsageAdmin(admin.ModelAdmin): + model = Usage + extra = 1 + inlines = [ProductUsageInline] + +class UsageInline(admin.StackedInline): + model = Usage + extra = 1 + +class BrandedPartAdmin(admin.ModelAdmin): + inlines = [UsageInline] + +admin.site.register(Usage, UsageAdmin) +admin.site.register(Part, PartAdmin) +admin.site.register(BrandedPart, BrandedPartAdmin) \ No newline at end of file diff --git a/partdoc/parts/models.py b/partdoc/parts/models.py index 7fee156..6839430 100644 --- a/partdoc/parts/models.py +++ b/partdoc/parts/models.py @@ -1,13 +1,21 @@ from django.db import models -class Brand(models.Model): +class PartModel(models. Model): + creation = models.DateTimeField(auto_now_add=True) + modification = models.DateTimeField(auto_now=True) + + class Meta: + abstract = True + + +class Brand(PartModel): name = models.CharField(max_length=256) def __str__(self): return self.name -class Product(models.Model): +class Product(PartModel): name = models.CharField(max_length=256) brand = models.ForeignKey(Brand) @@ -15,12 +23,13 @@ class Product(models.Model): return self.name + " (" + self.brand.name + ")" -class Sketch(models.Model): +class Sketch(PartModel): class Meta: verbose_name_plural = "sketches" name = models.CharField(max_length=256) brand = models.ForeignKey(Brand, blank=True, null=True) product = models.ForeignKey(Product, blank=True, null=True) + image = models.FileField(upload_to="sketches/", blank=True, null=True) def __str__(self): return "Sketch: " + self.name + " (" + str(self.brand) + ")" @@ -35,30 +44,37 @@ class Sketch(models.Model): return self.usage_set.values('productusage__product__brand').distinct() -class Version(models.Model): +class Version(PartModel): product = models.ForeignKey(Product) name = models.CharField(max_length=256) + replaced_by = models.ForeignKey('self', blank=True, null=True, related_name='replaces') + start = models.DateField(blank=True, null=True) + end = models.DateField(blank=True, null=True) + + additional_sketch = models.ManyToManyField(Sketch, blank=True, related_name='added') + unused_sketch = models.ManyToManyField(Sketch, blank=True, related_name='replaced') def __str__(self): return "Version: " + self.name + " (" + str(self.product) + ")" -class Part(models.Model): +class Part(PartModel): name = models.CharField(max_length=256) def __str__(self): return self.name -class BrandedPart(models.Model): - part = models.ForeignKey(Part) +class BrandedPart(PartModel): + part = models.ForeignKey(Part, null=True) brand = models.ForeignKey(Brand) - number = models.CharField(max_length=32, unique=True) + number = models.CharField(max_length=32, unique=True, blank=True, null=True) def __str__(self): - return self.number +": "+ self.part.name + " @ " + self.brand.name + na = self.part.name if self.part else "--(part)--" + return str(self.number) +": "+ na + " @ " + self.brand.name -class Usage(models.Model): +class Usage(PartModel): part = models.ForeignKey(BrandedPart) sketch = models.ForeignKey(Sketch) sketch_number = models.CharField(max_length=32) @@ -66,13 +82,15 @@ class Usage(models.Model): #quantity = models.ManyToManyField(ProductUsage) def __str__(self): - return self.sketch_number +"; " + self.part.number +"; "+ self.part.part.name + "; " + str(self.sketch) + no = self.part.number if self.part else "--(part.number)--" + na = self.part.part.name if self.part.part else "--(part.part.name)--" + return self.sketch_number +"; " + str(no) +"; "+ na + "; " + str(self.sketch) -class ProductUsage(models.Model): - usage = models.ForeignKey(Usage) +class ProductUsage(PartModel): + usage = models.ForeignKey(Usage, null=True) product = models.ForeignKey(Product) - quantity = models.IntegerField() + quantity = models.IntegerField(null=True) on_demand = models.BooleanField(default=False) obsolete = models.BooleanField(default=False) used_until = models.ForeignKey(Version, null=True, blank=True, related_name='introduces') @@ -83,4 +101,4 @@ class ProductUsage(models.Model): internal_note = models.CharField(max_length=2, blank=True) def __str__(self): - return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ self.usage.part.number \ No newline at end of file + return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ str(self.usage.part.number) \ No newline at end of file diff --git a/partdoc/parts/static/parts/add_sketch.js b/partdoc/parts/static/parts/add_sketch.js new file mode 100644 index 0000000..3919ff5 --- /dev/null +++ b/partdoc/parts/static/parts/add_sketch.js @@ -0,0 +1,8 @@ +function addRow(){ + var src = document.getElementById("template"); + var clone = src.cloneNode(true); + clone.id = ""; + clone.className ="entry"; + clone.children[0].children[0].value = document.getElementsByClassName("entry").length + 1 + document.getElementById("table").appendChild(clone); +} \ No newline at end of file diff --git a/partdoc/parts/templates/parts/add.html b/partdoc/parts/templates/parts/add.html new file mode 100644 index 0000000..dca2146 --- /dev/null +++ b/partdoc/parts/templates/parts/add.html @@ -0,0 +1,30 @@ +{% load static %} + +