mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Adds ajax table for part sale price information
This commit is contained in:
parent
ff7570aea4
commit
ca1281ee10
@ -20,6 +20,7 @@ from django.urls import reverse
|
|||||||
from .models import Part, PartCategory, BomItem, PartStar
|
from .models import Part, PartCategory, BomItem, PartStar
|
||||||
from .models import PartParameter, PartParameterTemplate
|
from .models import PartParameter, PartParameterTemplate
|
||||||
from .models import PartAttachment, PartTestTemplate
|
from .models import PartAttachment, PartTestTemplate
|
||||||
|
from .models import PartSellPriceBreak
|
||||||
|
|
||||||
from . import serializers as part_serializers
|
from . import serializers as part_serializers
|
||||||
|
|
||||||
@ -107,6 +108,27 @@ class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
queryset = PartCategory.objects.all()
|
queryset = PartCategory.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class PartSalePriceList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
API endpoint for list view of PartSalePriceBreak model
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = PartSellPriceBreak.objects.all()
|
||||||
|
serializer_class = part_serializers.PartSalePriceSerializer
|
||||||
|
|
||||||
|
permission_classes = [
|
||||||
|
permissions.IsAuthenticated,
|
||||||
|
]
|
||||||
|
|
||||||
|
filter_backends = [
|
||||||
|
DjangoFilterBackend
|
||||||
|
]
|
||||||
|
|
||||||
|
filter_fields = [
|
||||||
|
'part',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class PartAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
|
class PartAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
|
||||||
"""
|
"""
|
||||||
API endpoint for listing (and creating) a PartAttachment (file upload).
|
API endpoint for listing (and creating) a PartAttachment (file upload).
|
||||||
@ -756,6 +778,11 @@ part_api_urls = [
|
|||||||
url(r'^$', PartStarList.as_view(), name='api-part-star-list'),
|
url(r'^$', PartStarList.as_view(), name='api-part-star-list'),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
|
# Base URL for part sale pricing
|
||||||
|
url(r'^sale-price/', include([
|
||||||
|
url(r'^.*$', PartSalePriceList.as_view(), name='api-part-sale-price-list'),
|
||||||
|
])),
|
||||||
|
|
||||||
# Base URL for PartParameter API endpoints
|
# Base URL for PartParameter API endpoints
|
||||||
url(r'^parameter/', include([
|
url(r'^parameter/', include([
|
||||||
url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'),
|
url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'),
|
||||||
|
@ -12,6 +12,7 @@ from .models import BomItem
|
|||||||
from .models import PartParameter, PartParameterTemplate
|
from .models import PartParameter, PartParameterTemplate
|
||||||
from .models import PartAttachment
|
from .models import PartAttachment
|
||||||
from .models import PartTestTemplate
|
from .models import PartTestTemplate
|
||||||
|
from .models import PartSellPriceBreak
|
||||||
|
|
||||||
from stock.models import StockItem
|
from stock.models import StockItem
|
||||||
|
|
||||||
@ -87,6 +88,32 @@ class PartTestTemplateSerializer(InvenTreeModelSerializer):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class PartSalePriceSerializer(InvenTreeModelSerializer):
|
||||||
|
"""
|
||||||
|
Serializer for sale prices for Part model.
|
||||||
|
"""
|
||||||
|
|
||||||
|
symbol = serializers.CharField(read_only=True)
|
||||||
|
|
||||||
|
suffix = serializers.CharField(read_only=True)
|
||||||
|
|
||||||
|
quantity = serializers.FloatField()
|
||||||
|
|
||||||
|
cost = serializers.FloatField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = PartSellPriceBreak
|
||||||
|
fields = [
|
||||||
|
'pk',
|
||||||
|
'part',
|
||||||
|
'quantity',
|
||||||
|
'cost',
|
||||||
|
'currency',
|
||||||
|
'symbol',
|
||||||
|
'suffix',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class PartThumbSerializer(serializers.Serializer):
|
class PartThumbSerializer(serializers.Serializer):
|
||||||
"""
|
"""
|
||||||
Serializer for the 'image' field of the Part model.
|
Serializer for the 'image' field of the Part model.
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<h4>{% trans "Sale Price" %}</h4>
|
<h4>{% trans "Sale Price" %}</h4>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div id='price-break-bar' class='btn-group'>
|
<div id='price-break-toolbar' class='btn-group'>
|
||||||
<button class='btn btn-primary' id='new-price-break' type='button'>{% trans "Add Price Break" %}</button>
|
<button class='btn btn-primary' id='new-price-break' type='button'>{% trans "Add Price Break" %}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -21,14 +21,14 @@
|
|||||||
{% block js_ready %}
|
{% block js_ready %}
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
|
|
||||||
function reloadTable() {
|
function reloadPriceBreaks() {
|
||||||
$("#price-break-table").bootstrapTable("refresh");
|
$("#price-break-table").bootstrapTable("refresh");
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#new-price-break').click(function() {
|
$('#new-price-break').click(function() {
|
||||||
launchModalForm("{% url 'sale-price-break-create' %}",
|
launchModalForm("{% url 'sale-price-break-create' %}",
|
||||||
{
|
{
|
||||||
success: reloadTable,
|
success: reloadPriceBreaks,
|
||||||
data: {
|
data: {
|
||||||
part: {{ part.id }},
|
part: {{ part.id }},
|
||||||
}
|
}
|
||||||
@ -36,4 +36,75 @@ $('#new-price-break').click(function() {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#price-break-table').inventreeTable({
|
||||||
|
name: 'saleprice',
|
||||||
|
formatNoMatches: function() { return "{% trans 'No price break information found' %}"; },
|
||||||
|
queryParams: {
|
||||||
|
part: {{ part.id }},
|
||||||
|
},
|
||||||
|
url: "{% url 'api-part-sale-price-list' %}",
|
||||||
|
onLoadSuccess: function() {
|
||||||
|
var table = $('#price-break-table');
|
||||||
|
|
||||||
|
table.find('.button-price-break-delete').click(function() {
|
||||||
|
var pk = $(this).attr('pk');
|
||||||
|
|
||||||
|
launchModalForm(
|
||||||
|
`/part/sale-price/${pk}/delete/`,
|
||||||
|
{
|
||||||
|
success: reloadPriceBreaks
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.find('.button-price-break-edit').click(function() {
|
||||||
|
var pk = $(this).attr('pk');
|
||||||
|
|
||||||
|
launchModalForm(
|
||||||
|
`/part/sale-price/${pk}/edit/`,
|
||||||
|
{
|
||||||
|
success: reloadPriceBreaks
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
field: 'pk',
|
||||||
|
title: 'ID',
|
||||||
|
visible: false,
|
||||||
|
switchable: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'quantity',
|
||||||
|
title: '{% trans "Quantity" %}',
|
||||||
|
sortable: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'cost',
|
||||||
|
title: '{% trans "Price" %}',
|
||||||
|
sortable: true,
|
||||||
|
formatter: function(value, row, index) {
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
html += row.symbol || '';
|
||||||
|
html += value;
|
||||||
|
|
||||||
|
if (row.suffix) {
|
||||||
|
html += ' ' + row.suffix || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `<div class='btn-group float-right' role='group'>`
|
||||||
|
|
||||||
|
html += makeIconButton('fa-edit icon-blue', 'button-price-break-edit', row.pk, '{% trans "Edit price break" %}');
|
||||||
|
html += makeIconButton('fa-trash-alt icon-red', 'button-price-break-delete', row.pk, '{% trans "Delete price break" %}');
|
||||||
|
|
||||||
|
html += `</div>`;
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user