Browse Source
fix: misleading "Set Default X" fields after saving (#28798 )
* fix: misleading "Set Default X" fields after saving
* refactor: remove unncessary code and minor formatting
* fix: extend to more doctypes and correct fieldnames
Co-authored-by: Ankush Menat <ankush@frappe.io>
develop
Sagar Sharma
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with
62 additions and
0 deletions
erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
erpnext/accounts/doctype/sales_invoice/sales_invoice.py
erpnext/buying/doctype/purchase_order/purchase_order.py
erpnext/controllers/tests/test_transaction_base.py
erpnext/selling/doctype/sales_order/sales_order.py
erpnext/stock/doctype/delivery_note/delivery_note.py
erpnext/stock/doctype/material_request/material_request.py
erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
erpnext/stock/doctype/stock_entry/stock_entry.py
erpnext/utilities/transaction_base.py
@ -114,6 +114,9 @@ class PurchaseInvoice(BuyingController):
self . set_status ( )
self . set_status ( )
self . validate_purchase_receipt_if_update_stock ( )
self . validate_purchase_receipt_if_update_stock ( )
validate_inter_company_party ( self . doctype , self . supplier , self . company , self . inter_company_invoice_reference )
validate_inter_company_party ( self . doctype , self . supplier , self . company , self . inter_company_invoice_reference )
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
self . reset_default_field_value ( " rejected_warehouse " , " items " , " rejected_warehouse " )
self . reset_default_field_value ( " set_from_warehouse " , " items " , " from_warehouse " )
def validate_release_date ( self ) :
def validate_release_date ( self ) :
if self . release_date and getdate ( nowdate ( ) ) > = getdate ( self . release_date ) :
if self . release_date and getdate ( nowdate ( ) ) > = getdate ( self . release_date ) :
@ -155,6 +155,8 @@ class SalesInvoice(SellingController):
if self . redeem_loyalty_points and self . loyalty_program and self . loyalty_points and not self . is_consolidated :
if self . redeem_loyalty_points and self . loyalty_program and self . loyalty_points and not self . is_consolidated :
validate_loyalty_points ( self , self . loyalty_points )
validate_loyalty_points ( self , self . loyalty_points )
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
def validate_fixed_asset ( self ) :
def validate_fixed_asset ( self ) :
for d in self . get ( " items " ) :
for d in self . get ( " items " ) :
if d . is_fixed_asset and d . meta . get_field ( " asset " ) and d . asset :
if d . is_fixed_asset and d . meta . get_field ( " asset " ) and d . asset :
@ -72,6 +72,7 @@ class PurchaseOrder(BuyingController):
self . create_raw_materials_supplied ( " supplied_items " )
self . create_raw_materials_supplied ( " supplied_items " )
self . set_received_qty_for_drop_ship_items ( )
self . set_received_qty_for_drop_ship_items ( )
validate_inter_company_party ( self . doctype , self . supplier , self . company , self . inter_company_order_reference )
validate_inter_company_party ( self . doctype , self . supplier , self . company , self . inter_company_order_reference )
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
def validate_with_previous_doc ( self ) :
def validate_with_previous_doc ( self ) :
super ( PurchaseOrder , self ) . validate_with_previous_doc ( {
super ( PurchaseOrder , self ) . validate_with_previous_doc ( {
@ -0,0 +1,22 @@
import unittest
import frappe
class TestUtils ( unittest . TestCase ) :
def test_reset_default_field_value ( self ) :
doc = frappe . get_doc ( {
" doctype " : " Purchase Receipt " ,
" set_warehouse " : " Warehouse 1 " ,
} )
# Same values
doc . items = [ { " warehouse " : " Warehouse 1 " } , { " warehouse " : " Warehouse 1 " } , { " warehouse " : " Warehouse 1 " } ]
doc . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
self . assertEqual ( doc . set_warehouse , " Warehouse 1 " )
# Mixed values
doc . items = [ { " warehouse " : " Warehouse 1 " } , { " warehouse " : " Warehouse 2 " } , { " warehouse " : " Warehouse 1 " } ]
doc . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
self . assertEqual ( doc . set_warehouse , None )
@ -63,6 +63,8 @@ class SalesOrder(SellingController):
if not self . billing_status : self . billing_status = ' Not Billed '
if not self . billing_status : self . billing_status = ' Not Billed '
if not self . delivery_status : self . delivery_status = ' Not Delivered '
if not self . delivery_status : self . delivery_status = ' Not Delivered '
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
def validate_po ( self ) :
def validate_po ( self ) :
# validate p.o date v/s delivery date
# validate p.o date v/s delivery date
if self . po_date and not self . skip_delivery_note :
if self . po_date and not self . skip_delivery_note :
@ -138,6 +138,7 @@ class DeliveryNote(SellingController):
self . update_current_stock ( )
self . update_current_stock ( )
if not self . installation_status : self . installation_status = ' Not Installed '
if not self . installation_status : self . installation_status = ' Not Installed '
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
def validate_with_previous_doc ( self ) :
def validate_with_previous_doc ( self ) :
super ( DeliveryNote , self ) . validate_with_previous_doc ( {
super ( DeliveryNote , self ) . validate_with_previous_doc ( {
@ -80,6 +80,9 @@ class MaterialRequest(BuyingController):
# NOTE: Since Item BOM and FG quantities are combined, using current data, it cannot be validated
# NOTE: Since Item BOM and FG quantities are combined, using current data, it cannot be validated
# Though the creation of Material Request from a Production Plan can be rethought to fix this
# Though the creation of Material Request from a Production Plan can be rethought to fix this
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
self . reset_default_field_value ( " set_from_warehouse " , " items " , " from_warehouse " )
def set_title ( self ) :
def set_title ( self ) :
''' Set title as comma separated list of items '''
''' Set title as comma separated list of items '''
if not self . title :
if not self . title :
@ -118,6 +118,10 @@ class PurchaseReceipt(BuyingController):
if getdate ( self . posting_date ) > getdate ( nowdate ( ) ) :
if getdate ( self . posting_date ) > getdate ( nowdate ( ) ) :
throw ( _ ( " Posting Date cannot be future date " ) )
throw ( _ ( " Posting Date cannot be future date " ) )
self . reset_default_field_value ( " set_warehouse " , " items " , " warehouse " )
self . reset_default_field_value ( " rejected_warehouse " , " items " , " rejected_warehouse " )
self . reset_default_field_value ( " set_from_warehouse " , " items " , " from_warehouse " )
def validate_cwip_accounts ( self ) :
def validate_cwip_accounts ( self ) :
for item in self . get ( ' items ' ) :
for item in self . get ( ' items ' ) :
@ -103,6 +103,8 @@ class StockEntry(StockController):
self . set_actual_qty ( )
self . set_actual_qty ( )
self . calculate_rate_and_amount ( )
self . calculate_rate_and_amount ( )
self . validate_putaway_capacity ( )
self . validate_putaway_capacity ( )
self . reset_default_field_value ( " from_warehouse " , " items " , " s_warehouse " )
self . reset_default_field_value ( " to_warehouse " , " items " , " t_warehouse " )
def on_submit ( self ) :
def on_submit ( self ) :
self . update_stock_ledger ( )
self . update_stock_ledger ( )
@ -162,6 +162,28 @@ class TransactionBase(StatusUpdater):
return ret
return ret
def reset_default_field_value ( self , default_field : str , child_table : str , child_table_field : str ) :
""" Reset " Set default X " fields on forms to avoid confusion.
example :
doc = {
" set_from_warehouse " : " Warehouse A " ,
" items " : [ { " from_warehouse " : " warehouse B " } , { " from_warehouse " : " warehouse A " } ] ,
}
Since this has dissimilar values in child table , the default field will be erased .
doc . reset_default_field_value ( " set_from_warehouse " , " items " , " from_warehouse " )
"""
child_table_values = set ( )
for row in self . get ( child_table ) :
child_table_values . add ( row . get ( child_table_field ) )
if len ( child_table_values ) > 1 :
self . set ( default_field , None )
else :
self . set ( default_field , list ( child_table_values ) [ 0 ] )
def delete_events ( ref_type , ref_name ) :
def delete_events ( ref_type , ref_name ) :
events = frappe . db . sql_list ( """ SELECT
events = frappe . db . sql_list ( """ SELECT
distinct ` tabEvent ` . name
distinct ` tabEvent ` . name