add view to enter whole sketches at once
parent
dfb56c8e4e
commit
ea688ac7e0
|
|
@ -1,5 +1,8 @@
|
||||||
/venv
|
/venv
|
||||||
/pgdata
|
/pgdata
|
||||||
|
sketches/
|
||||||
db.sqlite3
|
db.sqlite3
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
||||||
|
*/*/migrations/*.py
|
||||||
|
!migrations/__init__.py
|
||||||
|
|
|
||||||
|
|
@ -124,3 +124,4 @@ USE_TZ = True
|
||||||
# https://docs.djangoproject.com/en/1.11/howto/static-files/
|
# https://docs.djangoproject.com/en/1.11/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
|
STATIC_ROOT = 'static/'
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,12 @@ Including another URLconf
|
||||||
1. Import the include() function: from django.conf.urls import url, include
|
1. Import the include() function: from django.conf.urls import url, include
|
||||||
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
|
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.conf.urls import url, include
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from django.conf.urls.static import static
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^parts/', include('parts.urls'), name="parts"),
|
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)
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,39 @@ from django.contrib import admin
|
||||||
|
|
||||||
from .models import Brand, Product, Version, Sketch, Part, Usage, BrandedPart, ProductUsage
|
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)
|
||||||
|
|
@ -1,13 +1,21 @@
|
||||||
from django.db import models
|
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)
|
name = models.CharField(max_length=256)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Product(models.Model):
|
class Product(PartModel):
|
||||||
name = models.CharField(max_length=256)
|
name = models.CharField(max_length=256)
|
||||||
brand = models.ForeignKey(Brand)
|
brand = models.ForeignKey(Brand)
|
||||||
|
|
||||||
|
|
@ -15,12 +23,13 @@ class Product(models.Model):
|
||||||
return self.name + " (" + self.brand.name + ")"
|
return self.name + " (" + self.brand.name + ")"
|
||||||
|
|
||||||
|
|
||||||
class Sketch(models.Model):
|
class Sketch(PartModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = "sketches"
|
verbose_name_plural = "sketches"
|
||||||
name = models.CharField(max_length=256)
|
name = models.CharField(max_length=256)
|
||||||
brand = models.ForeignKey(Brand, blank=True, null=True)
|
brand = models.ForeignKey(Brand, blank=True, null=True)
|
||||||
product = models.ForeignKey(Product, 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):
|
def __str__(self):
|
||||||
return "Sketch: " + self.name + " (" + str(self.brand) + ")"
|
return "Sketch: " + self.name + " (" + str(self.brand) + ")"
|
||||||
|
|
@ -35,30 +44,37 @@ class Sketch(models.Model):
|
||||||
return self.usage_set.values('productusage__product__brand').distinct()
|
return self.usage_set.values('productusage__product__brand').distinct()
|
||||||
|
|
||||||
|
|
||||||
class Version(models.Model):
|
class Version(PartModel):
|
||||||
product = models.ForeignKey(Product)
|
product = models.ForeignKey(Product)
|
||||||
name = models.CharField(max_length=256)
|
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):
|
def __str__(self):
|
||||||
return "Version: " + self.name + " (" + str(self.product) + ")"
|
return "Version: " + self.name + " (" + str(self.product) + ")"
|
||||||
|
|
||||||
|
|
||||||
class Part(models.Model):
|
class Part(PartModel):
|
||||||
name = models.CharField(max_length=256)
|
name = models.CharField(max_length=256)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
class BrandedPart(models.Model):
|
class BrandedPart(PartModel):
|
||||||
part = models.ForeignKey(Part)
|
part = models.ForeignKey(Part, null=True)
|
||||||
brand = models.ForeignKey(Brand)
|
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):
|
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)
|
part = models.ForeignKey(BrandedPart)
|
||||||
sketch = models.ForeignKey(Sketch)
|
sketch = models.ForeignKey(Sketch)
|
||||||
sketch_number = models.CharField(max_length=32)
|
sketch_number = models.CharField(max_length=32)
|
||||||
|
|
@ -66,13 +82,15 @@ class Usage(models.Model):
|
||||||
#quantity = models.ManyToManyField(ProductUsage)
|
#quantity = models.ManyToManyField(ProductUsage)
|
||||||
|
|
||||||
def __str__(self):
|
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):
|
class ProductUsage(PartModel):
|
||||||
usage = models.ForeignKey(Usage)
|
usage = models.ForeignKey(Usage, null=True)
|
||||||
product = models.ForeignKey(Product)
|
product = models.ForeignKey(Product)
|
||||||
quantity = models.IntegerField()
|
quantity = models.IntegerField(null=True)
|
||||||
on_demand = models.BooleanField(default=False)
|
on_demand = models.BooleanField(default=False)
|
||||||
obsolete = models.BooleanField(default=False)
|
obsolete = models.BooleanField(default=False)
|
||||||
used_until = models.ForeignKey(Version, null=True, blank=True, related_name='introduces')
|
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)
|
internal_note = models.CharField(max_length=2, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ self.usage.part.number
|
return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ str(self.usage.part.number)
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
{% load static %}
|
||||||
|
<script type="text/javascript" src="{% static 'parts/add_sketch.js' %}"> </script>
|
||||||
|
<h1>add sketch to {{product.name}}</h1>
|
||||||
|
|
||||||
|
<button type="button" onclick="addRow()">add row</button>
|
||||||
|
|
||||||
|
<form action="{% url 'parts:new_sketch' product.id %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<p><label for="sketch_name">Name:</label><input type="text" name="sketch_name" /></p>
|
||||||
|
<table id="table">
|
||||||
|
<tr>
|
||||||
|
<th>Bild-Nr.</th><th>Teil-Nr.</th><th>Intern</th><th>Teilbezeichnung</th><th>Anzahl</th><th>verbaut bis</th><th>verbaut ab</th><th>ersetzt durch</th><th>Anmerkungen</th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<input type="submit" />
|
||||||
|
</form>
|
||||||
|
<table style="display:none;">
|
||||||
|
<tr id="template">
|
||||||
|
<td><input type="text" size="8" name="fignumber" /></td>
|
||||||
|
<td><input type="text" size="13" name="partnumber" /></td>
|
||||||
|
<td><input type="text" size="1" name="internal" /></td>
|
||||||
|
<td><input type="text" size="32" name="name" /></td>
|
||||||
|
<td><input type="number" size="4" name="quantity" /></td>
|
||||||
|
<td><input type="text" size="16" name="last_version" /></td>
|
||||||
|
<td><input type="text" size="16" name="first_version" /></td>
|
||||||
|
<td><input type="text" size="13" name="replaced_by" /></td>
|
||||||
|
<td><input type="text" size="16" name="notes" /></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<script type="text/javascript">addRow();</script>
|
||||||
|
|
@ -2,8 +2,10 @@ from django.conf.urls import url
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
|
app_name = "parts"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', views.index, name="index"),
|
url(r'^$', views.index, name="index"),
|
||||||
url(r'^product/(?P<product_id>[0-9]+)/$', views.product, name="detail"),
|
url(r'^product/(?P<product_id>[0-9]+)/$', views.product, name="detail"),
|
||||||
url(r'^sketch/(?P<sketch_id>[0-9]+)/$', views.sketch, name="sketch"),
|
url(r'^sketch/(?P<sketch_id>[0-9]+)/$', views.sketch, name="sketch"),
|
||||||
|
url(r'^add/(?P<product_id>[0-9]+)/sketch', views.sketch_add, name="new_sketch"),
|
||||||
]
|
]
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import get_object_or_404, render
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.db import transaction
|
||||||
|
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
|
ADD_SKETCH_REQUIRES = ['sketch_name','sketch_number','']
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
product_list = Product.objects.all()
|
product_list = Product.objects.all()
|
||||||
context = {'product_list': product_list}
|
context = {'product_list': product_list}
|
||||||
|
|
@ -16,4 +21,65 @@ def product(request, product_id):
|
||||||
def sketch(request, sketch_id):
|
def sketch(request, sketch_id):
|
||||||
sketch = Sketch.objects.get(id=sketch_id)
|
sketch = Sketch.objects.get(id=sketch_id)
|
||||||
context = {'sketch': sketch}
|
context = {'sketch': sketch}
|
||||||
return render(request, 'parts/sketch.html', context)
|
return render(request, 'parts/sketch.html', context)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def sketch_add(request, product_id):
|
||||||
|
product = get_object_or_404(Product, pk=product_id)
|
||||||
|
print(request.POST)
|
||||||
|
if not "sketch_name" in request.POST:
|
||||||
|
return render(request, 'parts/add.html', {'product': product})
|
||||||
|
sketch = Sketch()
|
||||||
|
sketch.name = request.POST["sketch_name"]
|
||||||
|
sketch.product = product
|
||||||
|
sketch.brand = product.brand
|
||||||
|
sketch.save()
|
||||||
|
for i in range(len(request.POST.getlist('name'))):
|
||||||
|
print(i)
|
||||||
|
usage = Usage()
|
||||||
|
print("ASDF2")
|
||||||
|
usage.sketch = sketch
|
||||||
|
usage.sketch_number = request.POST.getlist('fignumber')[i]
|
||||||
|
if "ähn" in usage.sketch_number or "vgl" in usage.sketch_number:
|
||||||
|
usage.exact_sketch = False
|
||||||
|
|
||||||
|
print("ASDF3")
|
||||||
|
branded_part, created = BrandedPart.objects.get_or_create(brand=product.brand, number=request.POST.getlist('partnumber')[i])
|
||||||
|
print("ASDF", branded_part, created)
|
||||||
|
if created:
|
||||||
|
try:
|
||||||
|
part, _ = Part.objects.get_or_create(name=request.POST.getlist('name')[i])
|
||||||
|
except Part.MultipleObjectsReturned:
|
||||||
|
part = Part.objects.filter(name=request.POST.getlist('name')[i]).first()
|
||||||
|
branded_part.part = part
|
||||||
|
branded_part.brand = product.brand
|
||||||
|
branded_part.save()
|
||||||
|
print("ASDF")
|
||||||
|
usage.part = branded_part
|
||||||
|
usage.save()
|
||||||
|
|
||||||
|
prod = ProductUsage()
|
||||||
|
prod.usage = usage
|
||||||
|
prod.product = product
|
||||||
|
prod.quantity = int(request.POST.getlist('quantity')[i])
|
||||||
|
last_version = request.POST.getlist('last_version')[i]
|
||||||
|
if len(last_version):
|
||||||
|
version, _ = Version.objects.get_or_create(product=product, name=last_version)
|
||||||
|
prod.used_until = version
|
||||||
|
first_version = request.POST.getlist('first_version')[i]
|
||||||
|
if len(first_version):
|
||||||
|
version, _ = Version.objects.get_or_create(product=product, name=first_version)
|
||||||
|
prod.used_since = version
|
||||||
|
replaced = request.POST.getlist('replaced_by')[i]
|
||||||
|
if len(replaced):
|
||||||
|
replacement, _ = ProductUsage.objects.get_or_create(product=product, usage__part__number=replaced)
|
||||||
|
prod.replaced_by = replacement
|
||||||
|
note = request.POST.getlist('notes')[i]
|
||||||
|
if len(note):
|
||||||
|
prod.note = note
|
||||||
|
internal = request.POST.getlist('internal')[i]
|
||||||
|
if len(internal):
|
||||||
|
prod.internal = internal
|
||||||
|
prod.save()
|
||||||
|
|
||||||
|
return HttpResponseRedirect(reverse('parts:sketch', args=(sketch.id,)))
|
||||||
Loading…
Reference in New Issue