mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Added MinMoneyValidator to InvenTreeModelMoneyField
- Refactor edit and delete forms for PurchaseOrderLineItem
This commit is contained in:
parent
993abd9d91
commit
1cdf03ef49
@ -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):
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 %}
|
|
@ -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 %}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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':
|
||||||
|
Loading…
Reference in New Issue
Block a user