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 decimal import Decimal
from djmoney.models.fields import MoneyField as ModelMoneyField
from djmoney.forms.fields import MoneyField
from djmoney.models.validators import MinMoneyValidator
import InvenTree.helpers
import common.settings
@ -47,7 +49,10 @@ def money_kwargs():
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):
# detect if creating migration
if 'makemigrations' in sys.argv:
@ -58,6 +63,16 @@ class InvenTreeModelMoneyField(ModelMoneyField):
# set defaults
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)
def formfield(self, **kwargs):

View File

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

View File

@ -5,13 +5,16 @@ JSON serializers for the Order API
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from rest_framework import serializers
from sql_util.utils import SubqueryCount
from django.utils.translation import ugettext_lazy as _
from django.db.models import Case, When, Value
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 InvenTreeAttachmentSerializerField
@ -125,6 +128,11 @@ class POLineItemSerializer(InvenTreeModelSerializer):
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:
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() {
var pk = $(this).attr('pk');
launchModalForm(`/order/purchase-order/line/${pk}/edit/`, {
success: reloadTable,
constructForm(`/api/order/po-line/${pk}/`, {
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() {
var pk = $(this).attr('pk');
launchModalForm(`/order/purchase-order/line/${pk}/delete/`, {
success: reloadTable,
constructForm(`/api/order/po-line/${pk}/`, {
method: 'DELETE',
title: '{% trans "Delete Line Item" %}',
onSuccess: reloadTable,
});
});
{% endif %}

View File

@ -36,10 +36,6 @@ purchase_order_urls = [
url(r'^line/', include([
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

View File

@ -1213,38 +1213,6 @@ class SOLineItemEdit(AjaxUpdateView):
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):
model = SalesOrderLineItem

View File

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