Added MinMoneyValidator to InvenTreeModelMoneyField

- Refactor edit and delete forms for PurchaseOrderLineItem
This commit is contained in:
Oliver 2021-07-03 00:34:41 +10:00
parent 993abd9d91
commit 1cdf03ef49
8 changed files with 49 additions and 54 deletions

View File

@ -14,8 +14,10 @@ from django.core import validators
from django import forms from django import forms
from decimal import Decimal from decimal import Decimal
from djmoney.models.fields import MoneyField as ModelMoneyField from djmoney.models.fields import MoneyField as ModelMoneyField
from djmoney.forms.fields import MoneyField from djmoney.forms.fields import MoneyField
from djmoney.models.validators import MinMoneyValidator
import InvenTree.helpers import InvenTree.helpers
import common.settings import common.settings
@ -47,7 +49,10 @@ def money_kwargs():
class InvenTreeModelMoneyField(ModelMoneyField): class InvenTreeModelMoneyField(ModelMoneyField):
""" custom MoneyField for clean migrations while using dynamic currency settings """ """
Custom MoneyField for clean migrations while using dynamic currency settings
"""
def __init__(self, **kwargs): def __init__(self, **kwargs):
# detect if creating migration # detect if creating migration
if 'makemigrations' in sys.argv: if 'makemigrations' in sys.argv:
@ -58,6 +63,16 @@ class InvenTreeModelMoneyField(ModelMoneyField):
# set defaults # set defaults
kwargs.update(money_kwargs()) kwargs.update(money_kwargs())
# Set a minimum value validator
validators = kwargs.get('validators', [])
if len(validators) == 0:
validators.append(
MinMoneyValidator(0),
)
kwargs['validators'] = validators
super().__init__(**kwargs) super().__init__(**kwargs)
def formfield(self, **kwargs): def formfield(self, **kwargs):

View File

@ -254,10 +254,12 @@ class POLineItemList(generics.ListCreateAPIView):
] ]
class POLineItemDetail(generics.RetrieveUpdateAPIView): class POLineItemDetail(generics.RetrieveUpdateDestroyAPIView):
""" API endpoint for detail view of a PurchaseOrderLineItem object """ """
Detail API endpoint for PurchaseOrderLineItem object
"""
queryset = PurchaseOrderLineItem queryset = PurchaseOrderLineItem.objects.all()
serializer_class = POLineItemSerializer serializer_class = POLineItemSerializer

View File

@ -5,13 +5,16 @@ JSON serializers for the Order API
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from rest_framework import serializers from django.utils.translation import ugettext_lazy as _
from sql_util.utils import SubqueryCount
from django.db.models import Case, When, Value from django.db.models import Case, When, Value
from django.db.models import BooleanField from django.db.models import BooleanField
from rest_framework import serializers
from sql_util.utils import SubqueryCount
import djmoney.settings
from InvenTree.serializers import InvenTreeModelSerializer from InvenTree.serializers import InvenTreeModelSerializer
from InvenTree.serializers import InvenTreeAttachmentSerializerField from InvenTree.serializers import InvenTreeAttachmentSerializerField
@ -125,6 +128,11 @@ class POLineItemSerializer(InvenTreeModelSerializer):
destination = LocationBriefSerializer(source='get_destination', read_only=True) destination = LocationBriefSerializer(source='get_destination', read_only=True)
purchase_price_currency = serializers.ChoiceField(
choices=djmoney.settings.CURRENCY_CHOICES,
help_text=_('Purchase price currency'),
)
class Meta: class Meta:
model = PurchaseOrderLineItem model = PurchaseOrderLineItem

View File

@ -1,6 +0,0 @@
{% extends "modal_delete_form.html" %}
{% load i18n %}
{% block pre_form_content %}
{% trans "Are you sure you wish to delete this line item?" %}
{% endblock %}

View File

@ -73,16 +73,28 @@ function setupCallbacks() {
table.find(".button-line-edit").click(function() { table.find(".button-line-edit").click(function() {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
launchModalForm(`/order/purchase-order/line/${pk}/edit/`, { constructForm(`/api/order/po-line/${pk}/`, {
success: reloadTable, fields: {
part: {},
quantity: {},
reference: {},
purchase_price: {},
purchase_price_currency: {},
destination: {},
notes: {},
},
title: '{% trans "Edit Line Item" %}',
onSuccess: reloadTable,
}); });
}); });
table.find(".button-line-delete").click(function() { table.find(".button-line-delete").click(function() {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
launchModalForm(`/order/purchase-order/line/${pk}/delete/`, { constructForm(`/api/order/po-line/${pk}/`, {
success: reloadTable, method: 'DELETE',
title: '{% trans "Delete Line Item" %}',
onSuccess: reloadTable,
}); });
}); });
{% endif %} {% endif %}

View File

@ -36,10 +36,6 @@ purchase_order_urls = [
url(r'^line/', include([ url(r'^line/', include([
url(r'^new/', views.POLineItemCreate.as_view(), name='po-line-item-create'), url(r'^new/', views.POLineItemCreate.as_view(), name='po-line-item-create'),
url(r'^(?P<pk>\d+)/', include([
url(r'^edit/', views.POLineItemEdit.as_view(), name='po-line-item-edit'),
url(r'^delete/', views.POLineItemDelete.as_view(), name='po-line-item-delete'),
])),
])), ])),
# Display complete list of purchase orders # Display complete list of purchase orders

View File

@ -1213,38 +1213,6 @@ class SOLineItemEdit(AjaxUpdateView):
return form return form
class POLineItemEdit(AjaxUpdateView):
""" View for editing a PurchaseOrderLineItem object in a modal form.
"""
model = PurchaseOrderLineItem
form_class = order_forms.EditPurchaseOrderLineItemForm
ajax_template_name = 'modal_form.html'
ajax_form_title = _('Edit Line Item')
def get_form(self):
form = super().get_form()
# Prevent user from editing order once line item is assigned
form.fields['order'].widget = HiddenInput()
return form
class POLineItemDelete(AjaxDeleteView):
""" View for deleting a PurchaseOrderLineItem object in a modal form
"""
model = PurchaseOrderLineItem
ajax_form_title = _('Delete Line Item')
ajax_template_name = 'order/po_lineitem_delete.html'
def get_data(self):
return {
'danger': _('Deleted line item'),
}
class SOLineItemDelete(AjaxDeleteView): class SOLineItemDelete(AjaxDeleteView):
model = SalesOrderLineItem model = SalesOrderLineItem

View File

@ -1267,7 +1267,7 @@ function constructField(name, parameters, options) {
var extra = parameters.prefix != null; var extra = parameters.prefix != null;
// Some fields can have 'clear' inputs associated with them // Some fields can have 'clear' inputs associated with them
if (!parameters.required) { if (!parameters.required && !parameters.read_only) {
switch (parameters.type) { switch (parameters.type) {
case 'string': case 'string':
case 'url': case 'url':