mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Added views and pages for Build model
- Edit / create - View details - View build index at /build/
This commit is contained in:
parent
11b9fb10d8
commit
291992ab7f
33
InvenTree/build/forms.py
Normal file
33
InvenTree/build/forms.py
Normal file
@ -0,0 +1,33 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from crispy_forms.helper import FormHelper
|
||||
from crispy_forms.layout import Submit
|
||||
|
||||
from .models import Build
|
||||
|
||||
|
||||
class EditBuildForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(EditBuildForm, self).__init__(*args, **kwargs)
|
||||
self.helper = FormHelper()
|
||||
|
||||
self.helper.form_id = 'id-edit-part-form'
|
||||
self.helper.form_class = 'blueForms'
|
||||
self.helper.form_method = 'post'
|
||||
|
||||
self.helper.add_input(Submit('submit', 'Submit'))
|
||||
|
||||
class Meta:
|
||||
model = Build
|
||||
fields = [
|
||||
'title',
|
||||
'notes',
|
||||
'part',
|
||||
'batch',
|
||||
'quantity',
|
||||
'status',
|
||||
'completion_date',
|
||||
]
|
@ -14,6 +14,9 @@ class Build(models.Model):
|
||||
Parts are then taken from stock
|
||||
"""
|
||||
|
||||
def get_absolute_url(self):
|
||||
return '/build/{pk}/'.format(pk=self.id)
|
||||
|
||||
# Build status codes
|
||||
PENDING = 10 # Build is pending / active
|
||||
HOLDING = 20 # Build is currently being held
|
||||
|
9
InvenTree/build/templates/build/build_list.html
Normal file
9
InvenTree/build/templates/build/build_list.html
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
{% for build in builds %}
|
||||
<tr>
|
||||
<td><a href="{% url 'build-detail' build.id %}">{{ build.title }}</a></td>
|
||||
<td><a href="{% url 'part-build' build.part.id %}">{{ build.part.name }}</a></td>
|
||||
<td>{{ build.quantity }}</td>
|
||||
<td>{% include "build_status.html" with build=build %}
|
||||
</tr>
|
||||
{% endfor %}
|
5
InvenTree/build/templates/build/create.html
Normal file
5
InvenTree/build/templates/build/create.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "create_edit_obj.html" %}
|
||||
|
||||
{% block obj_title %}
|
||||
Create a new build
|
||||
{% endblock %}
|
@ -1,3 +1,41 @@
|
||||
{% include "base.html" %}
|
||||
|
||||
Build detail for Build No. {{ build.id }}.
|
||||
{% block content %}
|
||||
<h3>Build Details</h3>
|
||||
<table class='table table-striped'>
|
||||
<tr>
|
||||
<td>Title</td><td>{{ build.title }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Part</td><td><a href="{% url 'part-build' build.part.id %}">{{ build.part.name }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Quantity</td><td>{{ build.quantity }}</td>
|
||||
</tr>
|
||||
{% if build.batch %}
|
||||
<tr>
|
||||
<td>Batch</td><td>{{ build.batch }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>Status</td><td>{% include "build_status.html" with build=build %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Created</td><td>{{ build.creation_date }}</td>
|
||||
</tr>
|
||||
{% if batch.completion_date %}
|
||||
<tr>
|
||||
<td>Completed</td><td>{{ build.creation_date }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if build.notes %}
|
||||
<tr>
|
||||
<td>Notes</td><td>{{ build.notes }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
|
||||
<div class='container-fluid'>
|
||||
<a href="{% url 'build-edit' build.id %}"><button class="btn btn-info">Edit Build</button></a>
|
||||
|
||||
{% endblock %}
|
@ -2,6 +2,33 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h3>Builds</h3>
|
||||
<h3>Part Builds</h3>
|
||||
|
||||
<table class='table table-striped'>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Part</th>
|
||||
<th>Quantity</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
|
||||
{% if active|length > 0 %}
|
||||
<tr><td colspan="4"><b>Active Builds</b></td></tr>
|
||||
{% include "build/build_list.html" with builds=active %}
|
||||
{% endif %}
|
||||
|
||||
{% if complete|length > 0 %}
|
||||
<tr></tr>
|
||||
<tr><td colspan="4"><b>Completed Builds</b></td></tr>
|
||||
{% include "build/build_list.html" with builds=complete %}
|
||||
{% endif %}
|
||||
|
||||
{% if cancelled|length > 0 %}
|
||||
<tr></tr>
|
||||
<tr><td colspan="4"><b>Cancelled Builds</b></td></tr>
|
||||
{% include "build/build_list.html" with builds=cancelled.all %}
|
||||
{% endif %}
|
||||
|
||||
</table>
|
||||
|
||||
{% endblock %}
|
||||
|
5
InvenTree/build/templates/build/update.html
Normal file
5
InvenTree/build/templates/build/update.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "create_edit_obj.html" %}
|
||||
|
||||
{% block obj_title %}
|
||||
Edit build details
|
||||
{% endblock %}
|
@ -4,12 +4,13 @@ from django.views.generic.base import RedirectView
|
||||
from . import views
|
||||
|
||||
build_detail_urls = [
|
||||
url(r'^edit/?', views.BuildUpdate.as_view(), name='build-edit'),
|
||||
|
||||
url(r'^.*$', views.BuildDetail.as_view(), name='build-detail'),
|
||||
]
|
||||
|
||||
build_urls = [
|
||||
# url(r'new/?', views.BuildCreate.as_view(), name='build-create'),
|
||||
url(r'new/?', views.BuildCreate.as_view(), name='build-create'),
|
||||
|
||||
url(r'^(?P<pk>\d+)/', include(build_detail_urls)),
|
||||
|
||||
|
@ -7,16 +7,56 @@ from django.http import HttpResponseRedirect
|
||||
from django.views.generic import DetailView, ListView
|
||||
from django.views.generic.edit import UpdateView, DeleteView, CreateView
|
||||
|
||||
from part.models import Part
|
||||
from .models import Build
|
||||
|
||||
from .forms import EditBuildForm
|
||||
|
||||
class BuildIndex(ListView):
|
||||
model = Build
|
||||
template_name = 'build/index.html'
|
||||
context_object_name = 'builds'
|
||||
|
||||
def get_queryset(self):
|
||||
return Build.objects.order_by('status', '-completion_date')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
||||
context = super(BuildIndex, self).get_context_data(**kwargs).copy()
|
||||
|
||||
context['active'] = self.get_queryset().filter(status__in=[Build.PENDING, Build.HOLDING])
|
||||
|
||||
context['complete'] = self.get_queryset().filter(status=Build.COMPLETE)
|
||||
context['cancelled'] = self.get_queryset().filter(status=Build.CANCELLED)
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class BuildDetail(DetailView):
|
||||
model = Build
|
||||
template_name = 'build/detail.html'
|
||||
context_object_name = 'build'
|
||||
|
||||
|
||||
class BuildCreate(CreateView):
|
||||
model = Build
|
||||
template_name = 'build/create.html'
|
||||
context_object_name = 'build'
|
||||
form_class = EditBuildForm
|
||||
|
||||
def get_initial(self):
|
||||
initials = super(BuildCreate, self).get_initial().copy()
|
||||
|
||||
part_id = self.request.GET.get('part', None)
|
||||
|
||||
if part_id:
|
||||
initials['part'] = get_object_or_404(Part, pk=part_id)
|
||||
|
||||
return initials
|
||||
|
||||
|
||||
class BuildUpdate(UpdateView):
|
||||
model = Build
|
||||
form_class = EditBuildForm
|
||||
context_object_name = 'build'
|
||||
template_name = 'build/update.html'
|
||||
|
@ -6,9 +6,10 @@
|
||||
<a class="navbar-brand" href="/"><img src="{% static 'img/inventree.png' %}" width="40" height="40"/></a>
|
||||
</div>
|
||||
<ul class="nav navbar-nav">
|
||||
<li><a href="/part/">Parts</a></li>
|
||||
<li><a href="/stock/">Stock</a></li>
|
||||
<li><a href="/supplier/">Suppliers</a></li>
|
||||
<li><a href="{% url 'part-index' %}">Parts</a></li>
|
||||
<li><a href="{% url 'stock-index' %}">Stock</a></li>
|
||||
<li><a href="{% url 'build-index' %}">Build</a></li>
|
||||
<li><a href="{% url 'supplier-index' %}">Suppliers</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
@ -20,7 +20,7 @@
|
||||
<td><a href="{% url 'build-detail' build.id %}">{{ build.title }}</a></td>
|
||||
<td><a href="{% url 'part-detail' build.part.id %}">{{ build.part.name }}</a></td>
|
||||
<td>Quantity</td>
|
||||
<td>{% include "part/build_status.html" with build=build %}</td>
|
||||
<td>{% include "build_status.html" with build=build %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
@ -31,4 +31,7 @@
|
||||
|
||||
</table>
|
||||
|
||||
<div class='container-fluid'>
|
||||
<a href="{% url 'build-create' %}?part={{ part.id }}"><button class="btn btn-success">Start New Build</button></a>
|
||||
|
||||
{% endblock %}
|
@ -3,7 +3,7 @@
|
||||
<td><a href="{% url 'build-detail' build.id %}">{{ build.title }}</a></td>
|
||||
<td>{{ build.quantity }}</td>
|
||||
<td>
|
||||
{% include "part/build_status.html" with build=build %}
|
||||
{% include "build_status.html" with build=build %}
|
||||
</td>
|
||||
<td>{% if build.completion_date %}{{ build.completion_date }}{% endif %}</td>
|
||||
</tr>
|
||||
|
@ -77,7 +77,7 @@
|
||||
{% if part.allocation_count > part.total_stock %}
|
||||
<td><span class='label label-danger'>{{ part.allocation_count }}</span>
|
||||
{% else %}
|
||||
{{ part.allocation_count }} {{ part.total_stock }}
|
||||
{{ part.allocation_count }}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -1,10 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from crispy_forms.helper import FormHelper
|
||||
from crispy_forms.layout import Submit
|
||||
|
||||
from .models import StockLocation, StockItem
|
||||
|
||||
|
||||
class EditStockLocationForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
Loading…
Reference in New Issue
Block a user