seitime-frappe/cgi-bin/webnotes/modules/export_module.py
2011-06-08 14:24:18 +05:30

237 lines
7 KiB
Python

# ==============================================================================
# export to files
# ==============================================================================
updated_modules = []
from webnotes.modules import scrub, get_module_path
def export_to_files(modules = [], record_list=[], from_db=None, from_ac=None, verbose=1, record_module=None):
# Multiple doctype and multiple modules export to be done
# for Module Def, right now using a hack..should consider table update in the next version
# all modules transfer not working, because source db not known
# get the items
global updated_modules
if from_ac or from_db:
init_db_login(from_ac, from_db)
out = []
import webnotes.model.doc
module_doclist =[]
if record_list:
for record in record_list:
module_doclist.append([d.fields for d in webnotes.model.doc.get(record[0], record[1])])
# build the doclist
if modules:
for m in modules:
module_doclist +=get_module_doclist(m)
# write files
for doclist in module_doclist:
if verbose:
out.append("Writing for " + doclist[0]['doctype'] + " / " + doclist[0]['name'])
write_document_file(doclist, record_module)
# write out attachments
for m in modules:
write_attachments(m)
return out
# ==============================================================================
# write module.info file with last updated timestamp
# ==============================================================================
def write_attachments(m):
import webnotes, os
from webnotes.utils.file_manager import get_file
try:
fl = webnotes.conn.sql("select name from `tabFile Data` where module=%s", m)
except Exception, e:
if e.args[0]==1054: # no field called module
return
else:
raise e
# write the files
if fl:
folder = os.path.join(webnotes.defs.modules_path, m, 'files')
webnotes.create_folder(folder)
for f in fl:
file_det = get_file(f)
file = open(os.path.join(folder, file_det[0]), 'w+')
file.write(file_det[1])
file.close()
# ==============================================================================
# write module.info file with last updated timestamp
# ==============================================================================
def write_module_info(mod):
import webnotes.utils, os
file = open(os.path.join(get_module_path(mod), 'module.info'), 'w')
file.write(str({'update_date': webnotes.utils.now()}))
file.close()
# ==============================================================================
# prepare a list of items in a module
# ==============================================================================
def get_module_items(mod):
import webnotes
from webnotes.modules import transfer_types
from webnotes.modules import scrub
dl = []
for dt in transfer_types:
try:
dl2 = webnotes.conn.sql('select name, modified from `tab%s` where module="%s"' % (dt,mod))
for e in dl2:
dl += [dt + ',' + e[0] + ',0']
if e[0] == 'Control Panel':
dl += [e[0]+','+e[0]+',1']
except:
pass
dl1 = webnotes.conn.sql('select doctype_list from `tabModule Def` where name=%s', mod)
dl1 = dl1 and dl1[0][0] or ''
if dl1:
dl1 = dl1.split('\n')
dl += [t+',1' for t in dl1]
dl += ['Module Def,'+mod+',0']
# build finally
dl = [e.split(',') for e in dl]
dl = [[e[0].strip(), e[1].strip(), e[2]] for e in dl] # remove blanks
return dl
# ==============================================================================
# build a list of doclists of items in that module and send them
# ==============================================================================
def get_module_doclist(module):
import webnotes
import webnotes.model.doc
item_list = get_module_items(module)
# build the super_doclist
super_doclist = []
for i in item_list:
dl = webnotes.model.doc.get(i[0], i[1])
if i[2]=='1':
dl[0].module = module
# remove compiled code (if any)
if dl[0].server_code_compiled:
dl[0].server_code_compiled = None
# add to super
super_doclist.append([d.fields for d in dl])
return super_doclist
# ==============================================================================
# Create __init__.py files
# ==============================================================================
def create_init_py(modules_path, dt, dn):
import os
from webnotes.modules import scrub
# in module
if not '__init__.py' in os.listdir(modules_path):
open(os.path.join(modules_path, '__init__.py'), 'w').close()
# in type and name folders
if dt in ['doctype', 'page', 'search_criteria']:
if not '__init__.py' in os.listdir(os.path.join(modules_path, dt)):
open(os.path.join(modules_path, dt, '__init__.py'), 'w').close()
if not '__init__.py' in os.listdir(os.path.join(modules_path, dt, dn)):
open(os.path.join(modules_path, dt, dn, '__init__.py'), 'w').close()
# ==============================================================================
# Create module folders
# ==============================================================================
def create_folder(module, dt, dn):
import webnotes, os
# get module path by importing the module
modules_path = get_module_path(module)
code_type = dt in ['DocType', 'Page', 'Search Criteria']
# create folder
folder = os.path.join(modules_path, code_type and scrub(dt) or dt, code_type and scrub(dn) or dn)
webnotes.create_folder(folder)
# create init_py_files
if code_type:
create_init_py(modules_path, scrub(dt), scrub(dn))
return folder
# ==============================================================================
# Write doclist into file
# ==============================================================================
def write_document_file(doclist, record_module=None):
import os
from webnotes.utils import pprint_dict
global updated_modules
# module name
if doclist[0]['doctype'] == 'Module Def':
module = doclist[0]['name']
elif doclist[0]['doctype']=='Control Panel':
module = 'System'
elif record_module:
module = record_module
else:
module = doclist[0]['module']
updated_modules.append(module)
# create the folder
code_type = doclist[0]['doctype'] in ['DocType','Page','Search Criteria']
# create folder
folder = create_folder(module, doclist[0]['doctype'], doclist[0]['name'])
# separate code files
clear_code_fields(doclist, folder, code_type)
# write the data file
fname = (code_type and scrub(doclist[0]['name'])) or doclist[0]['name']
dict_list = [pprint_dict(d) for d in doclist]
txtfile = open(os.path.join(folder, fname +'.txt'),'w+')
txtfile.write('[\n' + ',\n'.join(dict_list) + '\n]')
txtfile.close()
# ==============================================================================
# Create seperate files for code
# ==============================================================================
def clear_code_fields(doclist, folder, code_type):
import os
import webnotes
# code will be in the parent only
code_fields = webnotes.code_fields_dict.get(doclist[0]['doctype'], [])
for code_field in code_fields:
if doclist[0].get(code_field[0]):
doclist[0][code_field[0]] = None