diff --git a/addons/account_analytic_analysis/__terp__.py b/addons/account_analytic_analysis/__terp__.py index cc9f5d862e2..650dcd4fb50 100644 --- a/addons/account_analytic_analysis/__terp__.py +++ b/addons/account_analytic_analysis/__terp__.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -29,7 +29,7 @@ Add menu to show relevant information for each manager.""", "category" : "Generic Modules/Accounting", "module": "", "website": "http://www.camptocamp.com/", - "depends" : ["account","hr_timesheet","hr_timesheet_invoice"], + "depends" : ["account","hr_timesheet","hr_timesheet_invoice","project"], "init_xml" : [], "update_xml" : [ "security/ir.model.access.csv", diff --git a/addons/base_module_record/base_module_record.py b/addons/base_module_record/base_module_record.py index 992c167643f..109f1b4e0ae 100644 --- a/addons/base_module_record/base_module_record.py +++ b/addons/base_module_record/base_module_record.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -41,7 +41,8 @@ def fnct_call(fnct): if args[4] not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc'): if _old_args is not None: args[5].update(_old_args) - mod.recording_data.append(('query', args, argv,res)) + if args[5]: + mod.recording_data.append(('query', args, argv,res)) return res return execute @@ -55,7 +56,6 @@ def fnct_call_workflow(fnct): return res return exec_workflow - class base_module_record(osv.osv): _name = "ir.module.record" _columns = { @@ -93,6 +93,8 @@ class base_module_record(osv.osv): return val def _get_id(self, cr, uid, model, id): + if type(id)==type(()): + id=id[0] if (model,id) in self.ids: return self.ids[(model,id)], False dt = self.pool.get('ir.model.data') @@ -107,11 +109,11 @@ class base_module_record(osv.osv): record = doc.createElement('record') record.setAttribute("id", record_id) record.setAttribute("model", model) + record_list = [record] lids = self.pool.get('ir.model.data').search(cr, uid, [('model','=',model)]) res = self.pool.get('ir.model.data').read(cr, uid, lids[:1], ['module']) if res: self.depends[res[0]['module']]=True - record_list = [record] fields = self.pool.get(model).fields_get(cr, uid) for key,val in data.items(): if not (val or (fields[key]['type']=='boolean')): @@ -145,7 +147,7 @@ class base_module_record(osv.osv): record.appendChild(field) elif fields[key]['type'] in ('one2many',): for valitem in (val or []): - if valitem[0]==0: + if valitem[0] in (0,1): if key in self.pool.get(model)._columns: fname = self.pool.get(model)._columns[key]._fields_id else: @@ -181,11 +183,55 @@ class base_module_record(osv.osv): val = val and ('"""%s"""' % val.replace('\\', '\\\\').replace('"', '\"')) or 'False' if isinstance(val, basestring): val = val.decode('utf8') - field.setAttribute(u"eval", val) record.appendChild(field) return record_list, noupdate + def get_copy_data(self, cr, uid,model,id,result): + res = [] + obj=self.pool.get(model) + data=obj.read(cr, uid,[id]) + if type(data)==type([]): + del data[0]['id'] + data=data[0] + else: + del data['id'] + + mod_fields = obj.fields_get(cr, uid) + for f in filter(lambda a: isinstance(obj._columns[a], fields.function)\ + and (not obj._columns[a].store),obj._columns): + del data[f] + + for key,val in data.items(): + if result.has_key(key): + continue + if mod_fields[key]['type'] == 'many2one': + if type(data[key])==type(True) or type(data[key])==type(1): + result[key]=data[key] + else: + result[key]=data[key][0] + + elif mod_fields[key]['type'] in ('one2many',): + rel = mod_fields[key]['relation'] + if len(data[key]): + res1=[] + for rel_id in data[key]: + res=[0,0] + res.append(self.get_copy_data(cr, uid,rel,rel_id,{})) + res1.append(res) + result[key]=res1 + else: + result[key]=data[key] + + elif mod_fields[key]['type'] == 'many2many': + result[key]=[(6,0,data[key])] + + else: + result[key]=data[key] + for k,v in obj._inherits.items(): + del result[v] + return result + def _generate_object_xml(self, cr, uid, rec, recv, doc, result=None): record_list = [] noupdate = False @@ -198,48 +244,62 @@ class base_module_record(osv.osv): record,update = self._create_record(cr, uid, doc, rec[3], rec[6], id) noupdate = noupdate or update record_list += record + elif rec[4]=='create': id = self._create_id(cr, uid, rec[3],rec[5]) record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[5], id) self.ids[(rec[3],result)] = id record_list += record + + elif rec[4]=='copy': + data=self.get_copy_data(cr,uid,rec[3],rec[5],rec[6]) + copy_rec=(rec[0],rec[1],rec[2],rec[3],rec[4],rec[5],data,rec[7]) + rec=copy_rec + rec_data=[(self.recording_data[0][0],rec,self.recording_data[0][2],self.recording_data[0][3])] + self.recording_data=rec_data + id = self._create_id(cr, uid, rec[3],rec[6]) + record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[6], id) + self.ids[(rec[3],result)] = id + record_list += record + return record_list,noupdate def _generate_assert_xml(self, rec, doc): pass def generate_xml(self, cr, uid): # Create the minidom document - self.ids = {} - doc = minidom.Document() - terp = doc.createElement("openerp") - doc.appendChild(terp) - for rec in self.recording_data: - if rec[0]=='workflow': - rec_id,noupdate = self._get_id(cr, uid, rec[1][3], rec[1][5]) - if not rec_id: - continue - data = doc.createElement("data") - terp.appendChild(data) - wkf = doc.createElement('workflow') - data.appendChild(wkf) - wkf.setAttribute("model", rec[1][3]) - wkf.setAttribute("action", rec[1][4]) - if noupdate: - data.setAttribute("noupdate", "1") - wkf.setAttribute("ref", rec_id) - if rec[0]=='query': - res_list,noupdate = self._generate_object_xml(cr, uid, rec[1], rec[2], doc, rec[3]) - data = doc.createElement("data") - if noupdate: - data.setAttribute("noupdate", "1") - if res_list: + if len(self.recording_data): + self.ids = {} + doc = minidom.Document() + terp = doc.createElement("openerp") + doc.appendChild(terp) + for rec in self.recording_data: + if rec[0]=='workflow': + rec_id,noupdate = self._get_id(cr, uid, rec[1][3], rec[1][5]) + if not rec_id: + continue + data = doc.createElement("data") terp.appendChild(data) - for res in res_list: - data.appendChild(res) - elif rec[0]=='assert': - pass - res = doc.toprettyxml(indent="\t") - return doc.toprettyxml(indent="\t").encode('utf8') + wkf = doc.createElement('workflow') + data.appendChild(wkf) + wkf.setAttribute("model", rec[1][3]) + wkf.setAttribute("action", rec[1][4]) + if noupdate: + data.setAttribute("noupdate", "1") + wkf.setAttribute("ref", rec_id) + if rec[0]=='query': + res_list,noupdate = self._generate_object_xml(cr, uid, rec[1], rec[2], doc, rec[3]) + data = doc.createElement("data") + if noupdate: + data.setAttribute("noupdate", "1") + if res_list: + terp.appendChild(data) + for res in res_list: + data.appendChild(res) + elif rec[0]=='assert': + pass + res = doc.toprettyxml(indent="\t") + return doc.toprettyxml(indent="\t").encode('utf8') base_module_record() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_record/base_module_record_wizard.xml b/addons/base_module_record/base_module_record_wizard.xml index 76b902382b1..095d5fa81c8 100644 --- a/addons/base_module_record/base_module_record_wizard.xml +++ b/addons/base_module_record/base_module_record_wizard.xml @@ -41,5 +41,18 @@ action="wizard_base_module_save" id="menu_wizard_base_module_save"/> + + + diff --git a/addons/base_module_record/wizard/__init__.py b/addons/base_module_record/wizard/__init__.py index 35353054f32..8cd013423e6 100644 --- a/addons/base_module_record/wizard/__init__.py +++ b/addons/base_module_record/wizard/__init__.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -22,5 +22,6 @@ import base_module_record import base_module_save +import base_module_record_objects # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_record/wizard/base_module_record_objects.py b/addons/base_module_record/wizard/base_module_record_objects.py new file mode 100644 index 00000000000..55862399917 --- /dev/null +++ b/addons/base_module_record/wizard/base_module_record_objects.py @@ -0,0 +1,145 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved +# $Id$ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +import wizard +import osv +import pooler +import time +import base_module_save +info = ''' +
+