mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 20:16:44 +00:00
Added ability to edit parts
- installed django_crispy_forms - added EditPartForm in part/forms.py - Vastly simplified parts views by using class views (need to do this for the other apps too!)
This commit is contained in:
parent
8578c8a1a7
commit
21e3f415c6
@ -35,6 +35,7 @@ INSTALLED_APPS = [
|
|||||||
'django_filters',
|
'django_filters',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
'simple_history',
|
'simple_history',
|
||||||
|
'crispy_forms',
|
||||||
|
|
||||||
# Core django modules
|
# Core django modules
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
@ -144,3 +145,4 @@ MEDIA_URL = '/media/'
|
|||||||
|
|
||||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||||
|
|
||||||
|
CRISPY_TEMPLATE_PACK = 'bootstrap'
|
||||||
|
31
InvenTree/part/forms.py
Normal file
31
InvenTree/part/forms.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from django import forms
|
||||||
|
from crispy_forms.helper import FormHelper
|
||||||
|
from crispy_forms.layout import Submit
|
||||||
|
|
||||||
|
from .models import Part
|
||||||
|
|
||||||
|
|
||||||
|
class EditPartForm(forms.ModelForm):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(EditPartForm, 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.form_action = 'submit'
|
||||||
|
|
||||||
|
self.helper.add_input(Submit('submit', 'Submit'))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Part
|
||||||
|
fields = [
|
||||||
|
'category',
|
||||||
|
'name',
|
||||||
|
'description',
|
||||||
|
'IPN',
|
||||||
|
'URL',
|
||||||
|
'minimum_stock',
|
||||||
|
'trackable',
|
||||||
|
]
|
@ -73,6 +73,9 @@ class Part(models.Model):
|
|||||||
and can be combined to form other parts
|
and can be combined to form other parts
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return '/part/{id}/'.format(id=self.id)
|
||||||
|
|
||||||
# Short name of the part
|
# Short name of the part
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
2
InvenTree/part/templates/part/delete.html
Normal file
2
InvenTree/part/templates/part/delete.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
{% extends 'part/part_base.html' %}
|
||||||
|
|
@ -6,5 +6,10 @@
|
|||||||
|
|
||||||
|
|
||||||
Part details go here...
|
Part details go here...
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<a href="{% url 'part-edit' part.id %}"><button class="btn btn-info">Edit Part</button></a>
|
||||||
|
|
||||||
|
<a href="{% url 'part-delete' part.id %}"><button class="btn btn-danger">Delete Part</button></a>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
11
InvenTree/part/templates/part/edit.html
Normal file
11
InvenTree/part/templates/part/edit.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{% extends "part/part_base.html" %}
|
||||||
|
|
||||||
|
{% block details %}
|
||||||
|
|
||||||
|
Edit part information:
|
||||||
|
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% crispy form %}
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -39,12 +39,17 @@ bom_api_urls = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
part_detail_urls = [
|
part_detail_urls = [
|
||||||
url(r'^track/?', views.track, name='part-track'),
|
url(r'^edit/?', views.PartEdit.as_view(), name='part-edit'),
|
||||||
url(r'^bom/?', views.bom, name='part-bom'),
|
url(r'^delete/?', views.delete, name='part-delete'),
|
||||||
url(r'^stock/?', views.stock, name='part-stock'),
|
url(r'^track/?', views.PartDetail.as_view(template_name='part/track.html'), name='part-track'),
|
||||||
url(r'^used/?', views.used, name='part-used-in'),
|
url(r'^bom/?', views.PartDetail.as_view(template_name='part/bom.html'), name='part-bom'),
|
||||||
url(r'^suppliers/?', views.suppliers, name='part-suppliers'),
|
url(r'^stock/?', views.PartDetail.as_view(template_name='part/stock.html'), name='part-stock'),
|
||||||
url('', views.detail, name='part-detail'),
|
url(r'^used/?', views.PartDetail.as_view(template_name='part/used_in.html'), name='part-used-in'),
|
||||||
|
url(r'^suppliers/?', views.PartDetail.as_view(template_name='part/supplier.html'), name='part-suppliers'),
|
||||||
|
|
||||||
|
# Any other URLs go to the part detail page
|
||||||
|
#url(r'^.*$', views.detail, name='part-detail'),
|
||||||
|
url(r'^.*$', views.PartDetail.as_view(), name='part-detail'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# URL list for part web interface
|
# URL list for part web interface
|
||||||
@ -52,7 +57,7 @@ part_urls = [
|
|||||||
# Individual
|
# Individual
|
||||||
url(r'^(?P<pk>\d+)/', include(part_detail_urls)),
|
url(r'^(?P<pk>\d+)/', include(part_detail_urls)),
|
||||||
|
|
||||||
url('list', views.index, name='part-index'),
|
url('list', views.PartIndex.as_view(), name='part-index'),
|
||||||
# ex: /part/5/
|
# ex: /part/5/
|
||||||
|
|
||||||
url(r'^.*$', RedirectView.as_view(url='list', permanent=False), name='part-index'),
|
url(r'^.*$', RedirectView.as_view(url='list', permanent=False), name='part-index'),
|
||||||
|
@ -1,76 +1,50 @@
|
|||||||
|
|
||||||
# Template stuff (WIP)
|
|
||||||
from django.http import HttpResponse
|
|
||||||
from django.template import loader
|
|
||||||
|
|
||||||
from InvenTree.models import FilterChildren
|
from InvenTree.models import FilterChildren
|
||||||
from .models import PartCategory, Part
|
from .models import PartCategory, Part
|
||||||
|
|
||||||
from django.shortcuts import get_object_or_404, render
|
from django.shortcuts import get_object_or_404, render
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views import generic
|
|
||||||
|
|
||||||
def index(request):
|
from django.views.generic import DetailView, ListView
|
||||||
template = loader.get_template('part/index.html')
|
from django.views.generic.edit import UpdateView
|
||||||
|
|
||||||
parts = Part.objects.all()
|
from .forms import EditPartForm
|
||||||
|
|
||||||
cat = None
|
class PartIndex(ListView):
|
||||||
|
model = Part
|
||||||
|
template_name = 'part/index.html'
|
||||||
|
context_object_name = 'parts'
|
||||||
|
|
||||||
if 'category' in request.GET:
|
def get_queryset(self):
|
||||||
cat_id = request.GET['category']
|
self.category = self.request.GET.get('category', None)
|
||||||
|
|
||||||
cat = get_object_or_404(PartCategory, pk=cat_id)
|
return Part.objects.filter(category=self.category)
|
||||||
|
|
||||||
parts = parts.filter(category = cat_id)
|
def get_context_data(self, **kwargs):
|
||||||
children = PartCategory.objects.filter(parent = cat_id)
|
|
||||||
|
|
||||||
else:
|
context = super(PartIndex, self).get_context_data(**kwargs)
|
||||||
parts = parts.filter(category__isnull=True)
|
|
||||||
children = PartCategory.objects.filter(parent__isnull=True)
|
|
||||||
|
|
||||||
context = {
|
children = PartCategory.objects.filter(parent=self.category)
|
||||||
'parts' : parts.order_by('category__name'),
|
|
||||||
'category' : cat,
|
|
||||||
'children' : children,
|
|
||||||
}
|
|
||||||
|
|
||||||
return HttpResponse(template.render(context, request))
|
context['children'] = children
|
||||||
|
|
||||||
|
if self.category:
|
||||||
|
context['category'] = get_object_or_404(PartCategory, pk=self.category)
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
def detail(request, pk):
|
class PartDetail(DetailView):
|
||||||
#template = loader.get_template('detail.html')
|
context_object_name = 'part'
|
||||||
|
queryset = Part.objects.all()
|
||||||
part = get_object_or_404(Part, pk=pk)
|
template_name = 'part/detail.html'
|
||||||
|
|
||||||
return render(request, 'part/detail.html', {'part' : part})
|
|
||||||
|
|
||||||
#return HttpResponse("You're looking at part %s." % pk)
|
|
||||||
|
|
||||||
|
|
||||||
def bom(request, pk):
|
class PartEdit(UpdateView):
|
||||||
part = get_object_or_404(Part, pk=pk)
|
model = Part
|
||||||
|
form_class = EditPartForm
|
||||||
return render(request, 'part/bom.html', {'part': part})
|
template_name = 'part/edit.html'
|
||||||
|
|
||||||
def used(request, pk):
|
|
||||||
part = get_object_or_404(Part, pk=pk)
|
|
||||||
|
|
||||||
return render(request, 'part/used_in.html', {'part': part})
|
|
||||||
|
|
||||||
def stock(request, pk):
|
|
||||||
part = get_object_or_404(Part, pk=pk)
|
|
||||||
|
|
||||||
return render(request, 'part/stock.html', {'part': part})
|
|
||||||
|
|
||||||
def track(request, pk):
|
|
||||||
part = get_object_or_404(Part, pk=pk)
|
|
||||||
|
|
||||||
return render(request, 'part/track.html', {'part': part})
|
|
||||||
|
|
||||||
|
|
||||||
def suppliers(request, pk):
|
def delete(request, pk):
|
||||||
part = get_object_or_404(Part, pk=pk)
|
return HttpResponseRedirect('/part/{pk}/'.format(pk=pk))
|
||||||
|
|
||||||
return render(request, 'part/supplier.html', {'part' : part})
|
|
||||||
|
@ -4,3 +4,4 @@ django_filter==1.0.2
|
|||||||
django-simple-history==1.8.2
|
django-simple-history==1.8.2
|
||||||
coreapi==2.3.0
|
coreapi==2.3.0
|
||||||
pygments==2.2.0
|
pygments==2.2.0
|
||||||
|
django-crispy-forms==1.7.2
|
Loading…
x
Reference in New Issue
Block a user