437 lines
18 KiB
Python
437 lines
18 KiB
Python
import webnotes
|
|
import conf
|
|
import webnotes.model
|
|
from webnotes.model.code import get_obj
|
|
from wnf import replace_code
|
|
from termcolor import colored
|
|
from webnotes.modules import reload_doc
|
|
from webnotes.utils import make_esc
|
|
import os
|
|
|
|
def execute1():
|
|
#rendt = get_dt_to_be_renamed()
|
|
#rename_dt_files(rendt)
|
|
#update_local_file_system()
|
|
replace_labels_with_fieldnames()
|
|
|
|
def execute():
|
|
|
|
#---------------------------------------------------
|
|
# doctype renaming
|
|
rendt = get_dt_to_be_renamed()
|
|
# Rename dt in db
|
|
rename_in_db(rendt, 'DocType', 1)
|
|
# Upadte dt in records
|
|
update_dt_in_records(rendt)
|
|
|
|
#---------------------------------------------------
|
|
# Dt Mapper renaming
|
|
ren_mapper = get_mapper_to_be_renamed()
|
|
# Rename mapper in db
|
|
rename_in_db(ren_mapper, 'DocType Mapper', 0)
|
|
|
|
#---------------------------------------------------
|
|
# GL Mapper renaming
|
|
gl_mapper = {'Receivable Voucher': 'Sales Invoice', 'Payable Voucher': 'Purchase Invoice'}
|
|
rename_in_db(gl_mapper, 'GL Mapper', 0)
|
|
|
|
|
|
#---------------------------------------------------
|
|
# remove dt label
|
|
webnotes.conn.sql("""delete from `tabDocType Label` where name in ('Ticket', 'Receivable Voucher',
|
|
'QA Inspection Report', 'Payable Voucher', 'Manage Account', 'Indent', 'DocLayer')""")
|
|
|
|
#---------------------------------------------------
|
|
# Reload mapper from file
|
|
for d in ren_mapper:
|
|
mod = '_'.join(webnotes.conn.sql("select module from `tabDocType Mapper` where name = %s",
|
|
ren_mapper[d])[0][0].lower().split())
|
|
reload_doc(mod, 'DocType Mapper', ren_mapper[d])
|
|
|
|
delete_search_criteria()
|
|
change_report_module()
|
|
|
|
# reload custom search criteria
|
|
#for d in webnotes.conn.sql("""select name, module from
|
|
# `tabSearch Criteria` where ifnull(standard, 'No') = 'Yes' and ifnull(disabled, 0) = 0"""):
|
|
#
|
|
for path, folders, files in os.walk(conf.modules_path):
|
|
if not path.endswith('search_criteria'): continue
|
|
module = path.split(os.sep)[-2]
|
|
for sc in folders:
|
|
try:
|
|
reload_doc(module, 'search_criteria', sc)
|
|
print module, sc
|
|
except Exception, e:
|
|
print "did not reload: " + str(d)
|
|
|
|
webnotes.conn.sql("""DELETE FROM `tabPrint Format`
|
|
WHERE name IN ('Delivery Note Format', 'Purchase Order Format',
|
|
'Quotation Format', 'Receivable Voucher Format', 'Sales Order',
|
|
'SalesInvoiceModern_test', 'SalesInvoiceStdNew',
|
|
'Service Order Format', 'Service Quotation Format')""")
|
|
|
|
# reload custom print format
|
|
for d in webnotes.conn.sql("""select name, module from `tabPrint Format`
|
|
where ifnull(standard, 'No') = 'Yes'"""):
|
|
try:
|
|
reload_doc(d[1], 'Print Format', d[0])
|
|
except Exception, e:
|
|
print "did not reload: " + str(d)
|
|
|
|
# Reload GL Mapper
|
|
for d in webnotes.conn.sql("select name from `tabGL Mapper`"):
|
|
reload_doc('accounts', 'GL Mapper', d[0])
|
|
reload_doc('accounts', 'GL Mapper', 'Purchase Invoice with write off')
|
|
|
|
webnotes.conn.sql("update `tabDocType` set module = 'Utilities' where module = 'Knowledge Base'")
|
|
webnotes.conn.sql("update `tabPage` set module = 'Utilities' where module = 'Knowledge Base'")
|
|
|
|
|
|
|
|
def delete_search_criteria():
|
|
webnotes.conn.sql("""DELETE FROM `tabSearch Criteria`
|
|
WHERE name IN ('', 'bills-to_be_paid',
|
|
'bills-to_be_submitted', 'cenvat_credit_-_input_or_capital_goods',
|
|
'appraisal_custom', 'custom_test', 'custom_test1', 'delivery_note-to_be_billed',
|
|
'delivery_note-to_be_submitted', 'delivery_notes',
|
|
'employee_leave_balance_report', 'flat_bom_report',
|
|
'general_ledger1', 'lead_interested',
|
|
'payables_-_as_on_outstanding', 'periodical_budget_report',
|
|
'projectwise_delivered_qty_and_costs_as_per_purchase_cost',
|
|
'projectwise_pending_qty_and_costs_as_per_purchase_cost', 'sales',
|
|
'sales_order1', 'sales_order_pending_items',
|
|
'territory_wise_sales_-_target_vs_actual_', 'test_report',
|
|
'lease_agreement_list', 'lease_monthly_future_installment_inflows',
|
|
'lease_over_due_list', 'lease_overdue_age_wise',
|
|
'lease_receipt_summary_month_wise', 'lease_receipts_client_wise',
|
|
'lease_yearly_future_installment_inflows',
|
|
'monthly_ledger_summary_report', 'payables_-_as_on_outstanding',
|
|
'payment_report', 'progressive_total_excise_duty',
|
|
'service_tax_credit_account_-_inputs',
|
|
'total_amout_collection_for_a_period_-_customerwise',
|
|
'invoices-to_be_submitted', 'invoices-to_receive_payment',
|
|
'opportunity-quotations_to_be_sent', 'purchase_order-to_be_billed',
|
|
'purchase_order-to_be_submitted',
|
|
'purchase_order-to_receive_items',
|
|
'purchase_request-purchase_order_to_be_made',
|
|
'purchase_request-to_be_submitted',
|
|
'sales-order_to_be_submitted', 'sales_order-overdue',
|
|
'sales_order-to_be_billed', 'sales_order-to_be_delivered',
|
|
'sales_order-to_be_submitted', 'task-open', 'appraisal_custom',
|
|
'employee_details', 'employee_in_company_experience',
|
|
'employee_leave_balance_report', 'employeewise_leave_transaction_details',
|
|
'pending_appraisals', 'pending_expense_claims', 'delivery_plan', 'flat_bom_report',
|
|
'dispatch_report', 'projectwise_delivered_qty_and_costs_as_per_purchase_cost',
|
|
'projectwise_pending_qty_and_costs_as_per_purchase_cost', 'custom_test', 'custom_test1',
|
|
'delivery_notes', 'delivery_note_disabled', 'lead', 'lead_interested', 'lead_report',
|
|
'periodic_sales_summary', 'monthly_despatched_trend', 'sales', 'sales_order',
|
|
'sales_order1', 'sales_agentwise_commission', 'test_report',
|
|
'territory_wise_sales_-_target_vs_actual_',
|
|
'pending_po_items_to_bill1', 'pending_po_items_to_receive1',
|
|
'expense_vouchers', 'pending_expense_vouchers', 'shortage_to_indent')""")
|
|
|
|
webnotes.conn.sql("""
|
|
DELETE FROM `tabSearch Criteria`
|
|
WHERE name IN ('monthly_transaction_summary', 'trend_analyzer',
|
|
'yearly_transaction_summary', 'invoices-overdue', 'lead-to_follow_up',
|
|
'opportunity-to_follow_up', 'serial_no-amc_expiring_this_month',
|
|
'serial_no-warranty_expiring_this_month')
|
|
AND IFNULL(standard, 'No') = 'Yes'
|
|
""")
|
|
|
|
def change_report_module():
|
|
reports = {'itemwise_receipt_details': 'Stock'}
|
|
for k in reports:
|
|
webnotes.conn.sql("update `tabSearch Criteria` set module = %s where name = %s", (reports[k], k))
|
|
|
|
def rename_in_db(ren_data, data_type, is_doctype):
|
|
for d in ren_data:
|
|
print colored('Renaming... ' + d + ' --> '+ ren_data[d], 'yellow')
|
|
#rename
|
|
try:
|
|
webnotes.model.rename(data_type, d, ren_data[d], is_doctype)
|
|
except Exception, e:
|
|
if e.args[0]!=1050:
|
|
raise e
|
|
else:
|
|
print e
|
|
pass
|
|
|
|
|
|
def update_dt_in_records(rendt):
|
|
for d in rendt:
|
|
# Feed, property setter, search criteria, gl mapper, form 16A, naming series options, doclayer - dodtype is not mentioed in options
|
|
dt_list = webnotes.conn.sql("""select t1.parent, t1.fieldname from
|
|
tabDocField t1, tabDocType t2 where t1.parent = t2.name and
|
|
t1.fieldname in ('dt', 'doctype', 'doc_type', 'dt_type') and
|
|
ifnull(t1.options, '') = '' and ifnull(t2.issingle, 0) = 0 and
|
|
t1.parent in ('Custom Field', 'Custom Script', 'Property Setter')""")
|
|
for dt in dt_list:
|
|
webnotes.conn.sql("update `tab%s` set %s = replace(%s, '%s', '%s') where %s = '%s'" % (dt[0], dt[1], dt[1], d, rendt[d], dt[1], d))
|
|
|
|
# gl mapper, gl entry
|
|
webnotes.conn.sql("update `tabGL Mapper Detail` set against_voucher_type = replace(against_voucher_type, '%s', '%s') where against_voucher_type like '%%%s%%'" % (d, rendt[d], d))
|
|
webnotes.conn.sql("update `tabGL Entry` set against_voucher_type = replace(against_voucher_type, '%s', '%s') where against_voucher_type = '%s'" % (d, rendt[d], d))
|
|
webnotes.conn.sql("update `tabGL Entry` set voucher_type = replace(voucher_type, '%s', '%s') where voucher_type = '%s'" % (d, rendt[d], d))
|
|
|
|
# Stock ledger entry
|
|
webnotes.conn.sql("update `tabStock Ledger Entry` set voucher_type = replace(voucher_type, '%s', '%s') where voucher_type = '%s'" % (d, rendt[d], d))
|
|
|
|
# Custom fld: options
|
|
webnotes.conn.sql("update `tabCustom Field` set options = replace(options, %s, %s) where fieldtype in ('Link', 'Select', 'Table')", (d, rendt[d]))
|
|
|
|
#Property Setter: value (if property=options)
|
|
webnotes.conn.sql("update `tabProperty Setter` set value = replace(value, %s, %s) where property = 'Options'", (d, rendt[d]))
|
|
|
|
# custom script: script
|
|
webnotes.conn.sql("update `tabCustom Script` set script = replace(script, %s, %s)", (d, rendt[d]))
|
|
|
|
# print format: html
|
|
webnotes.conn.sql("update `tabPrint Format` set html = replace(html, %s, %s) where ifnull(standard, 'Yes') = 'No'", (d, rendt[d]))
|
|
|
|
# custom report: doc_type, filters, columns, parent_doc_type, add_cond, add_col, add_tab,
|
|
# dis_filters, group_by, sort_by, report_script, server_script, custom_query
|
|
webnotes.conn.sql("""
|
|
update
|
|
`tabSearch Criteria`
|
|
set
|
|
doc_type = replace(doc_type, %s, %s),
|
|
filters = replace(filters, %s, %s),
|
|
columns = replace(columns, %s, %s),
|
|
parent_doc_type = replace(parent_doc_type, %s, %s),
|
|
add_cond = replace(add_cond, %s, %s),
|
|
add_col = replace(add_col, %s, %s),
|
|
add_tab = replace(add_tab, %s, %s),
|
|
dis_filters = replace(dis_filters, %s, %s),
|
|
group_by = replace(group_by, %s, %s),
|
|
sort_by = replace(sort_by, %s, %s),
|
|
report_script = replace(report_script, %s, %s),
|
|
server_script = replace(server_script, %s, %s),
|
|
custom_query = replace(custom_query, %s, %s)
|
|
where
|
|
ifnull(standard, 'Yes') = 'No'
|
|
""", (d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d],
|
|
d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], d, rendt[d], ))
|
|
|
|
|
|
|
|
|
|
def get_dt_to_be_renamed():
|
|
rendt = {
|
|
'Receivable Voucher' : 'Sales Invoice',
|
|
'RV Detail' : 'Sales Invoice Item',
|
|
'RV Tax Detail' : 'Sales Taxes and Charges',
|
|
'Payable Voucher' : 'Purchase Invoice',
|
|
'PV Detail' : 'Purchase Invoice Item',
|
|
'Purchase Tax Detail' : 'Purchase Taxes and Charges',
|
|
'Indent' : 'Purchase Request',
|
|
'Indent Detail' : 'Purchase Request Item',
|
|
'QA Inspection Report' : 'Quality Inspection',
|
|
'Ticket' : 'Task',
|
|
'Manage Account' : 'Global Defaults',
|
|
'ToDo Item' : 'ToDo',
|
|
'Term' : 'Terms and Conditions',
|
|
'Static Parameter Detail' : 'SMS Parameter',
|
|
'SS Earning Detail' : 'Salary Slip Earning',
|
|
'SS Deduction Detail' : 'Salary Slip Deduction',
|
|
'Sales Order Detail' : 'Sales Order Item',
|
|
'Sales BOM Detail' : 'Sales BOM Item',
|
|
'Return Detail' : 'Sales and Purchase Return Item',
|
|
'Ref Rate Detail' : 'Item Price',
|
|
'Receiver Detail' : 'SMS Receiver',
|
|
'Quotation Detail' : 'Quotation Item',
|
|
'QA Specification Detail' : 'Quality Inspection Reading',
|
|
'Purchase Receipt Detail' : 'Purchase Receipt Item',
|
|
'Purchase Other Charges' : 'Purchase Taxes and Charges Master',
|
|
'PR Raw Material Detail' : 'Purchase Receipt Item Supplied',
|
|
'PP SO Detail' : 'Production Plan Sales Order',
|
|
'PP Detail' : 'Production Plan Item',
|
|
'PO Raw Material Detail' : 'Purchase Order Item Supplied',
|
|
'PO Detail' : 'Purchase Order Item',
|
|
'Packing Slip Detail' : 'Packing Slip Item',
|
|
'Other Charges' : 'Sales Taxes and Charges Master',
|
|
'Order Lost Reason' : 'Quotation Lost Reason',
|
|
'Manage Account' : 'Global Defaults',
|
|
'Maintenance Visit Detail' : 'Maintenance Visit Purpose',
|
|
'Ledger Balance Export' : 'Multi Ledger Report',
|
|
'LC PR Detail' : 'Landed Cost Purchase Receipt',
|
|
'Landed Cost Detail' : 'Landed Cost Item',
|
|
'KRA Template' : 'Appraisal Template',
|
|
'KRA Sheet' : 'Appraisal Template Goal',
|
|
'Item Specification Detail' : 'Item Quality Inspection Parameter',
|
|
'Item Maintenance Detail' : 'Maintenance Schedule Item',
|
|
'IR Payment Detail' : 'Payment to Invoice Matching Tool Detail',
|
|
'Internal Reconciliation' : 'Payment to Invoice Matching Tool',
|
|
'Installed Item Details' : 'Installation Note Item',
|
|
'Holiday List Detail' : 'Holiday',
|
|
'Follow up' : 'Communication Log',
|
|
'Flat BOM Detail' : 'BOM Explosion Item',
|
|
'Expense Voucher Detail' : 'Expense Claim Detail',
|
|
'Expense Voucher' : 'Expense Claim',
|
|
'Expense Type' : 'Expense Claim Type',
|
|
'Enquiry Detail' : 'Opportunity Item',
|
|
'Enquiry' : 'Opportunity',
|
|
'Earning Detail' : 'Salary Structure Earning',
|
|
'DocLayerField' : 'Customize Form Field',
|
|
'DocLayer' : 'Customize Form',
|
|
'Delivery Note Detail' : 'Delivery Note Item',
|
|
'Deduction Detail' : 'Salary Structure Deduction',
|
|
'Comment Widget Record' : 'Comment',
|
|
'BOM Material' : 'BOM Item',
|
|
'Bill Of Materials' : 'BOM',
|
|
'Appraisal Detail' : 'Appraisal Goal',
|
|
'Advance Allocation Detail' : 'Purchase Invoice Advance',
|
|
'Advance Adjustment Detail' : 'Sales Invoice Advance',
|
|
'Ledger Detail' : 'Multi Ledger Report Detail',
|
|
'TA Control' : 'Trend Analyzer Control',
|
|
'Sales and Purchase Return Wizard' : 'Sales and Purchase Return Tool',
|
|
'Educational Qualifications Detail' : 'Employee Education',
|
|
'Delivery Note Packing Detail' : 'Delivery Note Packing Item',
|
|
'Experience In Company Detail' : 'Employee Internal Work History',
|
|
'Professional Training Details' : 'Employee Training',
|
|
'Previous Experience Detail' : 'Employee External Work History',
|
|
}
|
|
return rendt
|
|
|
|
|
|
def get_mapper_to_be_renamed():
|
|
ren_map = {
|
|
'Sales Order-Receivable Voucher' : 'Sales Order-Sales Invoice',
|
|
'Sales Order-Indent' : 'Sales Order-Purchase Request',
|
|
'Receivable Voucher-Delivery Note' : 'Sales Invoice-Delivery Note',
|
|
'Purchase Receipt-Payable Voucher' : 'Purchase Receipt-Purchase Invoice',
|
|
'Purchase Order-Payable Voucher' : 'Purchase Order-Purchase Invoice',
|
|
'Project-Receivable Voucher' : 'Project-Sales Invoice',
|
|
'Lead-Enquiry' : 'Lead-Opportunity',
|
|
'KRA Template-Appraisal' : 'Appraisal Template-Appraisal',
|
|
'Indent-Purchase Order' : 'Purchase Request-Purchase Order',
|
|
'Enquiry-Quotation' : 'Opportunity-Quotation',
|
|
'Delivery Note-Receivable Voucher' : 'Delivery Note-Sales Invoice'
|
|
}
|
|
return ren_map
|
|
|
|
|
|
|
|
|
|
#--------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
def update_local_file_system():
|
|
""" RUN ONLY IN LOCAL"""
|
|
|
|
# doctype renaming
|
|
rendt = get_dt_to_be_renamed()
|
|
|
|
# replace dt in js/py file
|
|
update_file_content(rendt)
|
|
# git mv
|
|
rename_dt_files(rendt)
|
|
|
|
|
|
# Mapper renaming
|
|
ren_mapper = get_mapper_to_be_renamed()
|
|
|
|
rename_mapper_files(ren_mapper)
|
|
|
|
os.system('git mv erpnext/accounts/GL\ Mapper/Payable\ Voucher erpnext/accounts/GL\ Mapper/Purchase\ Invoice')
|
|
os.system('git mv erpnext/accounts/GL\ Mapper/Purchase\ Invoice/Payable\ Voucher.txt erpnext/accounts/GL\ Mapper/Purchase\ Invoice/Purchase\ Invoice.txt')
|
|
os.system('git mv erpnext/accounts/GL\ Mapper/Receivable\ Voucher erpnext/accounts/GL\ Mapper/Sales\ Invoice')
|
|
os.system('git mv erpnext/accounts/GL\ Mapper/Sales\ Invoice/Receivable\ Voucher.txt erpnext/accounts/GL\ Mapper/Sales\ Invoice/Sales\ Invoice.txt')
|
|
|
|
# git rm production dt mapper
|
|
os.system('git rm -r erpnext/production/DocType\ Mapper/')
|
|
|
|
|
|
|
|
def update_file_content(rendt):
|
|
for d in rendt:
|
|
print colored('Renaming... ' + d + ' --> '+ rendt[d], 'yellow')
|
|
for extn in ['js', 'py', 'txt', 'html']:
|
|
res = replace_code('/var/www/erpnext/', d, rendt[d], extn)
|
|
if res == 'skip':
|
|
break
|
|
|
|
|
|
def rename_dt_files(rendt):
|
|
for d in rendt:
|
|
mod = webnotes.conn.sql("select module from tabDocType where name = %s", rendt[d])[0][0]
|
|
if mod == 'Core':
|
|
os.chdir('/var/www/erpnext/lib/')
|
|
path = 'py/core/doctype/'
|
|
else:
|
|
os.chdir('/var/www/erpnext/')
|
|
path = 'erpnext/' + '_'.join(mod.lower().split()) + '/doctype/'
|
|
old = '_'.join(d.lower().split())
|
|
new = '_'.join(rendt[d].lower().split())
|
|
|
|
print 'git mv ' + path + old + ' ' + path + new
|
|
# rename old dir
|
|
os.system('git mv ' + path + old + ' ' + path + new)
|
|
|
|
# rename all files in that dir
|
|
for extn in ['js', 'py', 'txt', 'html']:
|
|
if os.path.exists(path + new + '/'+ old + '.' +extn):
|
|
os.system('git mv ' + path + new + '/'+ old + '.' +extn + ' ' + path + new + '/' + new + '.' +extn)
|
|
print 'git mv ' + path + new + '/'+ old + '.' +extn + ' ' + path + new + '/' + new + '.' +extn
|
|
|
|
|
|
def rename_mapper_files(ren_mapper):
|
|
for d in ren_mapper:
|
|
# module
|
|
mod = '_'.join(webnotes.conn.sql("select module from `tabDocType Mapper` where name = %s", ren_mapper[d])[0][0].lower().split())
|
|
path = 'erpnext/' + mod + '/DocType Mapper/'
|
|
|
|
# rename old dir
|
|
esc = make_esc('$ ')
|
|
os.system('git mv ' + esc(path + d) + ' ' + esc(path + ren_mapper[d]))
|
|
print 'git mv ' + esc(path + d) + ' ' + esc(path + ren_mapper[d])
|
|
os.system('git mv ' + esc(path + ren_mapper[d] + '/'+ d + '.txt')
|
|
+ ' ' + esc(path + ren_mapper[d] + '/' + ren_mapper[d] + '.txt'))
|
|
print 'git mv ' + esc(path + ren_mapper[d] + '/'+ d + '.txt') + ' ' + esc(path + ren_mapper[d] + '/' + ren_mapper[d] + '.txt')
|
|
|
|
|
|
def replace_labels_with_fieldnames():
|
|
"""
|
|
This is used for replacing instances like cur_frm.cscript['LABEL'] with
|
|
cur_frm.cscript.FIELDNAME in js files
|
|
"""
|
|
doctype = {}
|
|
doctype.update(prepare_dict_of_label_fieldname('/var/www/erpnext/erpnext/'))
|
|
doctype.update(prepare_dict_of_label_fieldname('/var/www/erpnext/lib/py'))
|
|
#print doctype
|
|
|
|
for doc in doctype:
|
|
label_fieldname = doctype[doc]
|
|
for d in label_fieldname:
|
|
#label = "cur_frm.cscript['%s']" % d
|
|
#fieldname = "cur_frm.cscript.%s" % label_fieldname[d]
|
|
label = d
|
|
fieldname = label_fieldname[d]
|
|
print colored('Changing... ' + doc + ': ' + label + ' --> '+ fieldname, 'yellow')
|
|
#res = replace_code('/var/www/erpnext/', label, fieldname, 'js')
|
|
res = replace_code('/var/www/erpnext/', label, fieldname, 'js',
|
|
'hide_field\(.*%s' % label)
|
|
if res == 'skip':
|
|
break
|
|
|
|
def prepare_dict_of_label_fieldname(module_path):
|
|
from webnotes.model.utils import peval_doclist
|
|
from webnotes.model.sync import get_file_path
|
|
doctype = {}
|
|
for path, folders, files in os.walk(module_path):
|
|
if path == module_path:
|
|
modules_list = folders
|
|
for f in files:
|
|
if f.endswith(".txt"):
|
|
rel_path = os.path.relpath(path, conf.modules_path)
|
|
path_tuple = rel_path.split(os.sep)
|
|
if (len(path_tuple)==3 and path_tuple[0] in modules_list and
|
|
path_tuple[1] == 'doctype'):
|
|
file_name = f[:-4]
|
|
with open(get_file_path(path_tuple[0], file_name), 'r') as fn:
|
|
doclist = peval_doclist(fn.read())
|
|
doctype[file_name] = dict(([d.get('label'),d.get('fieldname')] \
|
|
for d in doclist if d.get('doctype')=='DocField'))
|
|
return doctype
|