brotherton-erpnext/erpnext/patches/jan_mar_2012/rename_dt.py
2012-05-29 15:47:27 +05:30

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