From ff7570aea4721f8b64143a11850aa364343e55a4 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Fri, 18 Sep 2020 21:49:56 +1000 Subject: [PATCH] VIews / forms / etc --- InvenTree/company/views.py | 2 +- InvenTree/part/forms.py | 21 ++++++ .../part/templates/part/sale_prices.html | 15 +++- InvenTree/part/urls.py | 10 ++- InvenTree/part/views.py | 73 +++++++++++++++++++ 5 files changed, 117 insertions(+), 4 deletions(-) diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index 457cf74ec2..9ef6adea0e 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -401,7 +401,7 @@ class PriceBreakCreate(AjaxCreateView): def get_data(self): return { - 'success': 'Added new price break' + 'success': _('Added new price break') } def get_part(self): diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index ffcb46114a..1e87419026 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -17,6 +17,8 @@ from .models import Part, PartCategory, PartAttachment from .models import BomItem from .models import PartParameterTemplate, PartParameter from .models import PartTestTemplate +from .models import PartSellPriceBreak + from common.models import Currency @@ -253,3 +255,22 @@ class PartPriceForm(forms.Form): 'quantity', 'currency', ] + + +class EditPartSalePriceBreakForm(HelperForm): + """ + Form for creating / editing a sale price for a part + """ + + quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5) + + cost = RoundingDecimalFormField(max_digits=10, decimal_places=5) + + class Meta: + model = PartSellPriceBreak + fields = [ + 'part', + 'quantity', + 'cost', + 'currency', + ] \ No newline at end of file diff --git a/InvenTree/part/templates/part/sale_prices.html b/InvenTree/part/templates/part/sale_prices.html index 0d46542c6d..b8992e093e 100644 --- a/InvenTree/part/templates/part/sale_prices.html +++ b/InvenTree/part/templates/part/sale_prices.html @@ -21,8 +21,19 @@ {% block js_ready %} {{ block.super }} +function reloadTable() { + $("#price-break-table").bootstrapTable("refresh"); +} + $('#new-price-break').click(function() { - // TODO -}) + launchModalForm("{% url 'sale-price-break-create' %}", + { + success: reloadTable, + data: { + part: {{ part.id }}, + } + } + ); +}); {% endblock %} \ No newline at end of file diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 39afd28f38..e61947e243 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -18,6 +18,12 @@ part_attachment_urls = [ url(r'^(?P\d+)/delete/?', views.PartAttachmentDelete.as_view(), name='part-attachment-delete'), ] +sale_price_break_urls = [ + url(r'^new/', views.PartSalePriceBreakCreate.as_view(), name='sale-price-break-create'), + url(r'^(?P\d+)/edit/', views.PartSalePriceBreakEdit.as_view(), name='sale-price-break-edit'), + url(r'^(?P\d+)/delete/', views.PartSalePriceBreakDelete.as_view(), name='sale-price-break-delete'), +] + part_parameter_urls = [ url(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), @@ -27,7 +33,6 @@ part_parameter_urls = [ url(r'^new/', views.PartParameterCreate.as_view(), name='part-param-create'), url(r'^(?P\d+)/edit/', views.PartParameterEdit.as_view(), name='part-param-edit'), url(r'^(?P\d+)/delete/', views.PartParameterDelete.as_view(), name='part-param-delete'), - ] part_detail_urls = [ @@ -109,6 +114,9 @@ part_urls = [ # Part attachments url(r'^attachment/', include(part_attachment_urls)), + # Part price breaks + url(r'^sale-price/', include(sale_price_break_urls)), + # Part test templates url(r'^test-template/', include([ url(r'^new/', views.PartTestTemplateCreate.as_view(), name='part-test-template-create'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 58ece9d0b0..ccf607afc0 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -26,6 +26,7 @@ from .models import PartParameterTemplate, PartParameter from .models import BomItem from .models import match_part_names from .models import PartTestTemplate +from .models import PartSellPriceBreak from common.models import Currency, InvenTreeSetting from company.models import SupplierPart @@ -2097,3 +2098,75 @@ class BomItemDelete(AjaxDeleteView): ajax_template_name = 'part/bom-delete.html' context_object_name = 'item' ajax_form_title = _('Confim BOM item deletion') + + +class PartSalePriceBreakCreate(AjaxCreateView): + """ View for creating a sale price break for a part """ + + model = PartSellPriceBreak + form_class = part_forms.EditPartSalePriceBreakForm + ajax_form_title = _('Add Price Break') + + def get_data(self): + return { + 'success': _('Added new price break') + } + + def get_part(self): + try: + part = Part.objects.get(id=self.request.GET.get('part')) + except (ValueError, Part.DoesNotExist): + part = None + + if part is None: + try: + part = Part.objects.get(id=self.request.POST.get('part')) + except (ValueError, Part.DoesNotExist): + part = None + + return part + + def get_form(self): + + form = super(AjaxCreateView, self).get_form() + form.fields['part'].widget = HiddenInput() + + return form + + def get_initial(self): + + initials = super(AjaxCreateView, self).get_initial() + + initials['part'] = self.get_part() + + # Pre-select the default currency + try: + base = Currency.objects.get(base=True) + initials['currency'] = base + except Currency.DoesNotExist: + pass + + return initials + + +class PartSalePriceBreakEdit(AjaxUpdateView): + """ View for editing a sale price break """ + + model = PartSellPriceBreak + form_class = part_forms.EditPartSalePriceBreakForm + ajax_form_title = _('Edit Price Break') + + def get_form(self): + + form = super().get_form() + form.fields['part'].widget = HiddenInput() + + return form + + +class PartSalePriceBreakDelete(AjaxDeleteView): + """ View for deleting a sale price break """ + + model = PartSellPriceBreak + ajax_form_title = _("Delete Price Break") + ajax_template_name = "modal_delete_form.html"