From 48dbf92a9c0751af0d27af0890e4d19275ab2027 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Fri, 27 May 2011 12:55:23 +0530 Subject: [PATCH 001/510] [EDI]: develop a ir_edi_document class bzr revid: aar@tinyerp.com-20110527072523-v93lpjnpxm765bqd --- openerp/addons/base/ir/__init__.py | 2 +- openerp/addons/base/ir/ir_edi.py | 215 +++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 openerp/addons/base/ir/ir_edi.py diff --git a/openerp/addons/base/ir/__init__.py b/openerp/addons/base/ir/__init__.py index 9b4eb96df5f..673c4f7e0ab 100644 --- a/openerp/addons/base/ir/__init__.py +++ b/openerp/addons/base/ir/__init__.py @@ -36,6 +36,6 @@ import ir_rule import wizard import ir_config_parameter import osv_memory_autovacuum - +import ir_edi # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py new file mode 100644 index 00000000000..8b980d4cf4c --- /dev/null +++ b/openerp/addons/base/ir/ir_edi.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv,fields +import json +import hashlib +import time +import base64 +import urllib2 + +class ir_edi_document(osv.osv): + _name = 'ir.edi.document' + _description = 'ir_edi_document' + _columns = { + 'name': fields.char('EDI token', size = 128), + 'document': fields.text() + + } + + def safe_unique_id(model, database_id): + + """Generate a unique string to represent a (model,database id) pair + without being too long, without revealing the database id, and + with a very low probability of collisions. + """ + msg = "%s-%s-%s" % (model, time.time(), database_id) + digest = hashlib.sha1(msg).digest() + digest = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in zip(digest[:9], digest[9:-2])) + # finally, use the b64-encoded folded digest as ID part of the unique ID: + digest = base64.urlsafe_b64encode(digest) + + return '%s' % (digest) + + def new_edi_token(self,cr,uid,ids,browse_records,database_id,context=None): + + """Generate new unique tokent value to uniquely identify each edi_document""" + + db_uuid = self.safe_unique_id(browse_records, database_id) + edi_token = hashlib.sha256('%s-%s-%s' % (time.time(),db_uuid,time.time())).hexdigest() + + + return edi_token + + def serialize(self,edi_list_of_dicts): + + """Serialize the list of dictionaries using json dumps method""" + + serialized_list = json.dumps(edi_list_of_dicts) + return serialized_list + + def generate_edi(self,browse_record_list): + + """ Generate the list of dictionaries using edi_export method of edi class """ + + edi = edi() + edi_list = [] + for record in browse_record_list: + edi_struct = edi.edi_export(record) + edi_list.append(edi_struct[0]) + return self.serialize(edi_list) + + def get_document(self,cr,uid,ids,edi_token,context=None): + + """Get the edi document from database using given edi token """ + + records = self.search(cr,uid,[('name','=',edi_token)],context=context) + if records: + doc_string = self.read(cr,uid,records,['document'],context=context) + else: + raise osv.except_osv(_('Error !'), + _('Desired EDI Document does not Exist')) + + return True + + def load_edi(self,cr,uid,ids,edi_list_of_dicts,context=None): + + """loads the values from list of dictionaries to the corresponding OpenERP records + using the edi_import method of edi class""" + edi = edi() + edi_list = [] + for record in edi_list_of_dicts: + edi_record = edi.edi_import(record) + + + return True + + def deserialize(self,edi_document_string): + """ Deserialized the edi document string""" + + deserialize_string = json.loads(edi_document_string) + return self.load_edi(deserialize_string) + + def export_doc(self, cr, uid, ids,browse_records,database_id,context=None): + """the method handles the flow of the edi document generation and store it in + the database and return the edi_token of the particular document""" + + edi_document = { + 'name': self.new_edi_token(browse_records,database_id), + 'document': self.generate_edi(browse_records) + } + + unique_id = self.create(cr,uid,edi_document,context=context) + return edi_document['name'] + + def import_doc(self, cr, uid, ids, edi_document=None,edi_url=None,context=None): + + """the method handles the flow of importing particular edi document and + updates the database values on the basis of the edi document using + edi_loads method """ + + if edi_document is not None: + self.deserialize(edi_document) + elif edi_url is not None: + edi_document = urllib2.urlopen(edi_url).read() + self.deserialize(edi_document) + + return True + +ir_edi_document() + + +class edi(object): + _name = 'edi' + _description = 'edi document handler' + + """Mixin class for OSV objects that want be exposed as EDI documents. + Classes that inherit from this mixin class should override the + ``edi_import()`` and ``edi_export()`` methods to implement their + specific behavior, based on the primitives provided by this superclass.""" + + + def edi_metadata(self, cr, uid, browse_rec_list, context=None): + """Return a list representing the boilerplate EDI structure for + exporting the record in the given browse_rec_list, including + the metadata fields""" + # generic implementation! + return + + def edi_m2o(self, browse_rec, context=None): + """Return a list representing a M2O EDI value for + the given browse_record.""" + # generic implementation! + return + + def edi_o2m(self, browse_rec_list, context=None): + """Return a list representing a O2M EDI value for + the browse_records from the given browse_record_list.""" + # generic implementation! + return + + def edi_m2m(self, browse_rec_list, context=None): + """Return a list representing a M2M EDI value for + the browse_records from the given browse_record_list.""" + # generic implementation! + return + + def edi_export(self, cr, uid, ids, edi_struct=None, context=None): + """Returns a list of dicts representing an edi.document containing the + browse_records with ``ids``, using the generic algorithm. + :param edi_struct: if provided, edi_struct should be a dictionary + with a skeleton of the OSV fields to export as edi. + Basic fields can have any key as value, but o2m + values should have a sample skeleton dict as value. + For example, for a res.partner record: + edi_struct: { + 'name': True, + 'company_id': True, + 'address': { + 'name': True, + 'street': True, + } + } + Any field not specified in the edi_struct will not + be included in the exported data. + """ + # generic implementation! + + edi_struct = { + 'Openerp_fields':'', + '__model':'', + '__module':'', + '__id':'', + '__last_update':'', + '__version':'', + '__attachments':'', + + } + + + + return edi_struct + def edi_import(self, cr, uid, edi_document, context=None): + """Imports a list of dicts representing an edi.document, using the + generic algorithm. + """ + # generic implementation! + pass From 2e7ee8692142df851053967954e8eb55ffb13203 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Fri, 27 May 2011 19:01:31 +0530 Subject: [PATCH 002/510] [EDI]: working on a edi class bzr revid: aar@tinyerp.com-20110527133131-a1romjw8fft97950 --- openerp/addons/base/ir/ir_edi.py | 35 +++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 8b980d4cf4c..2187b4f89ca 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -74,7 +74,7 @@ class ir_edi_document(osv.osv): edi_list = [] for record in browse_record_list: edi_struct = edi.edi_export(record) - edi_list.append(edi_struct[0]) + edi_list.append(edi_struct) return self.serialize(edi_list) def get_document(self,cr,uid,ids,edi_token,context=None): @@ -193,8 +193,8 @@ class edi(object): """ # generic implementation! - edi_struct = { - 'Openerp_fields':'', + self.edi_document = { + '__model':'', '__module':'', '__id':'', @@ -203,10 +203,31 @@ class edi(object): '__attachments':'', } - - - - return edi_struct + data_object = self.pool.get('ir.model.data') + fields_object = self.pool.get('ir.model.fields') + for field in edi_struct.keys(): + if field in self.edi_document.keys(): + if field == 'model': + model_name = edi_struct['model'] + + record_ids = data_object.search(cr,uid,[('model','=','hr.holidays')]) + for fname in data_object.browse(cr,uid,record_ids): + if fname.name: + xml_ID = fname.name + self.edi_metadata(field,model_name) + else: + self.metadata(field) + else: + + f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',model_name)],context=context) + for fname in fields_object.browse(cr,uid,f_ids): + if fname.ttype == 'many2one': + self.edi_document[field] = self.edi_m2o(edi_struct[field]) + elif fname.ttype == 'one2many': + self.edi_ducument[field] = self.edi_o2m(edi_struct[field]) + elif fname.ttype == 'many2many': + self.edi_document[field] = self.edi_m2m(edi_struct[field]) + return self.edi_document def edi_import(self, cr, uid, edi_document, context=None): """Imports a list of dicts representing an edi.document, using the generic algorithm. From 2853ca743f27769f67803e405353c8656d7600b6 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Sat, 28 May 2011 19:09:43 +0530 Subject: [PATCH 003/510] [EDI]: working on a edi class bzr revid: aar@tinyerp.com-20110528133943-1r1hle6k75dvr17o --- openerp/addons/base/ir/ir_edi.py | 37 +++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 2187b4f89ca..251108cbf04 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -147,12 +147,16 @@ class edi(object): specific behavior, based on the primitives provided by this superclass.""" - def edi_metadata(self, cr, uid, browse_rec_list, context=None): + def edi_metadata(self, cr, uid, browse_rec_list,model=None, context=None): """Return a list representing the boilerplate EDI structure for exporting the record in the given browse_rec_list, including the metadata fields""" # generic implementation! - return + if model is not None: + self.edi_document['__model'] = model + + + return True def edi_m2o(self, browse_rec, context=None): """Return a list representing a M2O EDI value for @@ -195,28 +199,30 @@ class edi(object): self.edi_document = { - '__model':'', - '__module':'', - '__id':'', - '__last_update':'', - '__version':'', - '__attachments':'', + 'model':'', + 'module':'', + 'id':'', + 'last_update':'', + 'version':'', + 'attachments':'', } + if 'model' not in edi_struct.keys(): + return False data_object = self.pool.get('ir.model.data') + fields_object = self.pool.get('ir.model.fields') - for field in edi_struct.keys(): - if field in self.edi_document.keys(): + + for field in self.edi_document.keys(): + + if field in edi_struct.keys(): if field == 'model': model_name = edi_struct['model'] - - record_ids = data_object.search(cr,uid,[('model','=','hr.holidays')]) + record_ids = data_object.search(cr,uid,[('model','=',model_name)]) for fname in data_object.browse(cr,uid,record_ids): if fname.name: xml_ID = fname.name - self.edi_metadata(field,model_name) - else: - self.metadata(field) + else: f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',model_name)],context=context) @@ -229,6 +235,7 @@ class edi(object): self.edi_document[field] = self.edi_m2m(edi_struct[field]) return self.edi_document def edi_import(self, cr, uid, edi_document, context=None): + """Imports a list of dicts representing an edi.document, using the generic algorithm. """ From d6f19568d0b08c2b2110a357fa443d176c9c515e Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Mon, 30 May 2011 19:04:28 +0530 Subject: [PATCH 004/510] [EDI]: working on edi import bzr revid: aar@tinyerp.com-20110530133428-v68yubyv3rb9r4xb --- openerp/addons/base/ir/ir_edi.py | 161 ++++++++++++++++++++----------- 1 file changed, 107 insertions(+), 54 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 251108cbf04..9d66d4ed866 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -26,6 +26,20 @@ import time import base64 import urllib2 +def safe_unique_id(model, database_id): + + """Generate a unique string to represent a (model,database id) pair + without being too long, without revealing the database id, and + with a very low probability of collisions. + """ + msg = "%s-%s-%s" % (model, time.time(), database_id) + digest = hashlib.sha1(msg).digest() + digest = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in zip(digest[:9], digest[9:-2])) + # finally, use the b64-encoded folded digest as ID part of the unique ID: + digest = base64.urlsafe_b64encode(digest) + + return '%s' % (digest) + class ir_edi_document(osv.osv): _name = 'ir.edi.document' _description = 'ir_edi_document' @@ -35,25 +49,13 @@ class ir_edi_document(osv.osv): } - def safe_unique_id(model, database_id): - - """Generate a unique string to represent a (model,database id) pair - without being too long, without revealing the database id, and - with a very low probability of collisions. - """ - msg = "%s-%s-%s" % (model, time.time(), database_id) - digest = hashlib.sha1(msg).digest() - digest = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in zip(digest[:9], digest[9:-2])) - # finally, use the b64-encoded folded digest as ID part of the unique ID: - digest = base64.urlsafe_b64encode(digest) - - return '%s' % (digest) + def new_edi_token(self,cr,uid,ids,browse_records,database_id,context=None): """Generate new unique tokent value to uniquely identify each edi_document""" - db_uuid = self.safe_unique_id(browse_records, database_id) + db_uuid = safe_unique_id(browse_records, database_id) edi_token = hashlib.sha256('%s-%s-%s' % (time.time(),db_uuid,time.time())).hexdigest() @@ -88,7 +90,7 @@ class ir_edi_document(osv.osv): raise osv.except_osv(_('Error !'), _('Desired EDI Document does not Exist')) - return True + return doc_string def load_edi(self,cr,uid,ids,edi_list_of_dicts,context=None): @@ -147,34 +149,91 @@ class edi(object): specific behavior, based on the primitives provided by this superclass.""" - def edi_metadata(self, cr, uid, browse_rec_list,model=None, context=None): + def edi_metadata(self, cr, uid, ids, browse_rec_list, context=None): """Return a list representing the boilerplate EDI structure for exporting the record in the given browse_rec_list, including the metadata fields""" # generic implementation! - if model is not None: - self.edi_document['__model'] = model + data_object = self.pool.get('ir.model.data') + if self.edi_document['__model'] is not None: + model_ids = data_object.search(cr,uid,[('model','=',self.edi_document['__model'])],context=context) + for data in data_object.browse(cr,uid,model_ids): + self.edi_document['__module'] = data.module + if data.name is not None: + self.edi_document['__id'] = context['active_id']+':'+data.name + self.edi_document['__last_updata'] = context['__last_update'].values()[0] return True - def edi_m2o(self, browse_rec, context=None): + def edi_m2o(self, cr, uid, ids, browse_rec,model=None,context=None): """Return a list representing a M2O EDI value for the given browse_record.""" # generic implementation! - return + res = [] + data_object = self.pool.get('ir.model.data') + uu_id = data_model.search(cr,uid,[('model','=',model)]) + for xml in data_model.browse(cr,uid,uu_id): + if xml: + xml_ID = xml.name + else: + xml_ID = None + for data in browse_rec: + if data.name is not None: + if xml_ID is not None: + res.append(safe_unique_id(model,data.id)+':'+xml_ID) + else: + res.append(safe_unique_id(model,data.id)+':'+model+'-'+safe_unique_id(model,data.id)) + res.append(data.name) + return res - def edi_o2m(self, browse_rec_list, context=None): + def edi_o2m(self, cr, uid, ids, browse_rec_list, model=None, context=None): """Return a list representing a O2M EDI value for the browse_records from the given browse_record_list.""" # generic implementation! - return + res = [] + init_data = {} + data_object = self.pool.get('ir.model.data') + uu_id = data_model.search(cr,uid,[('model','=',model)]) + for xml in data_model.browse(cr,uid,uu_id): + if xml: + xml_ID = xml.name + else: + xml_ID = None + data_model = self.pool.get(model) + for record in browse_rec_list: + if xml_ID is not None: + init_data['__id'] = safe_unique_id(model,record.id)+':'+xml_ID + else: + init_data['__id'] = safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id) + init_data['__last_update'] =record.write_date + init_data.update(datamodel.read(cr,uid,[record],[],context=context)[0]) + res.append(init_data) + return res - def edi_m2m(self, browse_rec_list, context=None): + def edi_m2m(self, cr, uid, ids, browse_rec_list,model=None, context=None): """Return a list representing a M2M EDI value for the browse_records from the given browse_record_list.""" # generic implementation! - return + res = [] + init_data = [] + data_object = self.pool.get('ir.model.data') + uu_id = data_model.search(cr,uid,[('model','=',model)]) + for xml in data_model.browse(cr,uid,uu_id): + if xml: + xml_ID = xml.name + else: + xml_ID = None + data_model = self.pool.get(model) + for record in browse_rec_list: + if xml_ID is not None: + init_data.append(safe_unique_id(model,record.id)+':'+xml_ID) + else: + init_data.append(safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id)) + if record.name is not None: + init_data.append('name:'+record.name) + res.append(init_data) + return res def edi_export(self, cr, uid, ids, edi_struct=None, context=None): """Returns a list of dicts representing an edi.document containing the @@ -199,40 +258,32 @@ class edi(object): self.edi_document = { - 'model':'', - 'module':'', - 'id':'', - 'last_update':'', - 'version':'', - 'attachments':'', + '__model':'', + '__module':'', + '__id':'', + '__last_update':'', + '__version':'', + '__attachments':'', } - if 'model' not in edi_struct.keys(): - return False - data_object = self.pool.get('ir.model.data') - - fields_object = self.pool.get('ir.model.fields') + self.edi_document['__model'] = self._name - for field in self.edi_document.keys(): - - if field in edi_struct.keys(): - if field == 'model': - model_name = edi_struct['model'] - record_ids = data_object.search(cr,uid,[('model','=',model_name)]) - for fname in data_object.browse(cr,uid,record_ids): - if fname.name: - xml_ID = fname.name + + fields_object = self.pool.get('ir.model.fields') + model_object = self.pool.get(self.edi_document['__model']) + edi_metadata(context=context) + for field in self.edi_struct.keys(): + f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',self.edi_document['__model'])],context=context) + for fname in fields_object.browse(cr,uid,f_ids): + if fname.ttype == 'many2one': - else: - - f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',model_name)],context=context) - for fname in fields_object.browse(cr,uid,f_ids): - if fname.ttype == 'many2one': - self.edi_document[field] = self.edi_m2o(edi_struct[field]) - elif fname.ttype == 'one2many': - self.edi_ducument[field] = self.edi_o2m(edi_struct[field]) - elif fname.ttype == 'many2many': - self.edi_document[field] = self.edi_m2m(edi_struct[field]) + self.edi_document[field] = self.edi_m2o(edi_struct[field],fname.relation) + elif fname.ttype == 'one2many': + self.edi_ducument[field] = self.edi_o2m(edi_struct[field],fname.relation) + elif fname.ttype == 'many2many': + self.edi_document[field] = self.edi_m2m(edi_struct[field],fname.relation) + else: + self.edi_document[field] = model_object.read(cr,uid,[context['active_id']],[field],context=context) return self.edi_document def edi_import(self, cr, uid, edi_document, context=None): @@ -240,4 +291,6 @@ class edi(object): generic algorithm. """ # generic implementation! + for field in edi_document.keys(): + pass From 4deb609685c4fa002d13bb102fb141b09b4f6782 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Wed, 1 Jun 2011 19:03:10 +0530 Subject: [PATCH 005/510] [EDI]: working on edi import bzr revid: aar@tinyerp.com-20110601133310-nklnhlymx8u38nsg --- openerp/addons/base/ir/ir_edi.py | 81 ++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 9d66d4ed866..a87453fd277 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -38,7 +38,7 @@ def safe_unique_id(model, database_id): # finally, use the b64-encoded folded digest as ID part of the unique ID: digest = base64.urlsafe_b64encode(digest) - return '%s' % (digest) + return '%s-%s' % (model,digest) class ir_edi_document(osv.osv): _name = 'ir.edi.document' @@ -51,7 +51,7 @@ class ir_edi_document(osv.osv): - def new_edi_token(self,cr,uid,ids,browse_records,database_id,context=None): + def new_edi_token(self,browse_records,database_id): """Generate new unique tokent value to uniquely identify each edi_document""" @@ -71,15 +71,14 @@ class ir_edi_document(osv.osv): def generate_edi(self,browse_record_list): """ Generate the list of dictionaries using edi_export method of edi class """ - - edi = edi() + edi_list = [] for record in browse_record_list: - edi_struct = edi.edi_export(record) + edi_struct = record.edi_export(record) edi_list.append(edi_struct) return self.serialize(edi_list) - def get_document(self,cr,uid,ids,edi_token,context=None): + def get_document(self,cr,uid,edi_token,context=None): """Get the edi document from database using given edi token """ @@ -96,21 +95,21 @@ class ir_edi_document(osv.osv): """loads the values from list of dictionaries to the corresponding OpenERP records using the edi_import method of edi class""" - edi = edi() + edi_list = [] for record in edi_list_of_dicts: - edi_record = edi.edi_import(record) + edi_record = record.edi_import(record) return True - def deserialize(self,edi_document_string): + def deserialize(self,cr,uid,edi_document_string,context=None): """ Deserialized the edi document string""" deserialize_string = json.loads(edi_document_string) - return self.load_edi(deserialize_string) + return self.load_edi(cr,uid,deserialize_string,context=context) - def export_doc(self, cr, uid, ids,browse_records,database_id,context=None): + def export_doc(self, cr, uid, browse_records, database_id, context=None): """the method handles the flow of the edi document generation and store it in the database and return the edi_token of the particular document""" @@ -129,10 +128,10 @@ class ir_edi_document(osv.osv): edi_loads method """ if edi_document is not None: - self.deserialize(edi_document) + self.deserialize(cr,uid,edi_document,context=context) elif edi_url is not None: edi_document = urllib2.urlopen(edi_url).read() - self.deserialize(edi_document) + self.deserialize(cr,uid,edi_document,context=context) return True @@ -149,7 +148,7 @@ class edi(object): specific behavior, based on the primitives provided by this superclass.""" - def edi_metadata(self, cr, uid, ids, browse_rec_list, context=None): + def edi_metadata(self, cr, uid,browse_rec_list, context=None): """Return a list representing the boilerplate EDI structure for exporting the record in the given browse_rec_list, including the metadata fields""" @@ -162,14 +161,18 @@ class edi(object): self.edi_document['__module'] = data.module if data.name is not None: self.edi_document['__id'] = context['active_id']+':'+data.name + else: + self.edi_document['__id'] = context['active_id']+':'+safe_unique_id(data.model,) self.edi_document['__last_updata'] = context['__last_update'].values()[0] return True - def edi_m2o(self, cr, uid, ids, browse_rec,model=None,context=None): + def edi_m2o(self, cr, uid,browse_rec): """Return a list representing a M2O EDI value for the given browse_record.""" # generic implementation! + + model = browse_rec._name res = [] data_object = self.pool.get('ir.model.data') uu_id = data_model.search(cr,uid,[('model','=',model)]) @@ -183,23 +186,26 @@ class edi(object): if xml_ID is not None: res.append(safe_unique_id(model,data.id)+':'+xml_ID) else: - res.append(safe_unique_id(model,data.id)+':'+model+'-'+safe_unique_id(model,data.id)) + res.append(safe_unique_id(model,data.id)+':'+safe_unique_id(model,data.id)) res.append(data.name) return res - def edi_o2m(self, cr, uid, ids, browse_rec_list, model=None, context=None): + def edi_o2m(self, cr, uid,line = None,browse_rec_list, context=None): """Return a list representing a O2M EDI value for the browse_records from the given browse_record_list.""" # generic implementation! res = [] init_data = {} + model = browse_rec_list._name data_object = self.pool.get('ir.model.data') uu_id = data_model.search(cr,uid,[('model','=',model)]) + for xml in data_model.browse(cr,uid,uu_id): if xml: xml_ID = xml.name else: xml_ID = None + data_model = self.pool.get(model) for record in browse_rec_list: if xml_ID is not None: @@ -207,14 +213,16 @@ class edi(object): else: init_data['__id'] = safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id) init_data['__last_update'] =record.write_date - init_data.update(datamodel.read(cr,uid,[record],[],context=context)[0]) + init_data.update(self.determine_type(cr,uid,ids,line,record,context=context)) + res.append(init_data) return res - def edi_m2m(self, cr, uid, ids, browse_rec_list,model=None, context=None): + def edi_m2m(self, cr, uid, line = None, browse_rec_list, context=None): """Return a list representing a M2M EDI value for the browse_records from the given browse_record_list.""" # generic implementation! + model = browse_rec_list[0]._name res = [] init_data = [] data_object = self.pool.get('ir.model.data') @@ -271,20 +279,43 @@ class edi(object): fields_object = self.pool.get('ir.model.fields') model_object = self.pool.get(self.edi_document['__model']) - edi_metadata(context=context) - for field in self.edi_struct.keys(): + edi_metadata(edi_struct,context=context) + record = model_object.read(cr,uid,ids,[],context=context) + for field in edi_struct.keys(): f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',self.edi_document['__model'])],context=context) + for fname in fields_object.browse(cr,uid,f_ids): if fname.ttype == 'many2one': - self.edi_document[field] = self.edi_m2o(edi_struct[field],fname.relation) + self.edi_document[field] = self.edi_m2o(cr, uid, browse_rec = record[0][field]) elif fname.ttype == 'one2many': - self.edi_ducument[field] = self.edi_o2m(edi_struct[field],fname.relation) + + self.edi_ducument[field] = self.edi_o2m(cr,uid,line = edi_struct[field],browse_rec_list = record[0][field]) elif fname.ttype == 'many2many': - self.edi_document[field] = self.edi_m2m(edi_struct[field],fname.relation) + self.edi_document[field] = self.edi_m2m(cr,uid,line = edi_struct[field],browse_rec_list = record[0][field]) else: - self.edi_document[field] = model_object.read(cr,uid,[context['active_id']],[field],context=context) + self.edi_document[field] = record[0][field] + + return self.edi_document + def determine_type(self,cr,uid,ids,record_line,browse_record=None,context=None): + model = browse_record._name + fields_object = self.pool.get('ir.model.fields') + obj = self.pool.get(model) + field_data = obj.read(cr,uid,browse_record.id,record_line.keys())[0] + for field in field_data.keys(): + field_ids = field_object.search(cr,uid,[field]) + for field_type in field_object.browse(cr,uid,field_ids): + if field_type.ttype == 'many2one': + record_line.update(field,self.edi_m2o(cr,uid,browse_rec = field_data[field])) + elif field_type.ttype == 'one2many': + pass + elif field_type.ttype == 'many2many': + pass + else: + record_line.update(field,field_data[field]) + return record_line + def edi_import(self, cr, uid, edi_document, context=None): """Imports a list of dicts representing an edi.document, using the From 1e3ae46ec7a48a80b8625ae18aa654c936a8876c Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Thu, 2 Jun 2011 19:12:18 +0530 Subject: [PATCH 006/510] [EDI]: developing edi_import method bzr revid: aar@tinyerp.com-20110602134218-32aolwbdbwkp63qp --- openerp/addons/base/ir/ir_edi.py | 78 ++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index a87453fd277..d5146b4c655 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -240,7 +240,9 @@ class edi(object): init_data.append(safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id)) if record.name is not None: init_data.append('name:'+record.name) - res.append(init_data) + res.append(init_data) + + # blob: return res def edi_export(self, cr, uid, ids, edi_struct=None, context=None): @@ -279,7 +281,7 @@ class edi(object): fields_object = self.pool.get('ir.model.fields') model_object = self.pool.get(self.edi_document['__model']) - edi_metadata(edi_struct,context=context) + edi_metadata(cr, uid, edi_struct, context=context) record = model_object.read(cr,uid,ids,[],context=context) for field in edi_struct.keys(): f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',self.edi_document['__model'])],context=context) @@ -322,6 +324,76 @@ class edi(object): generic algorithm. """ # generic implementation! + new = True + resource = {} + model = edi_document['__model'] + model_object = self.pool.get(model) + data_model = self.pool.get('ir.model.data') + field_model = self.pool.get('ir.model.fields') for field in edi_document.keys(): + if field == '__id': + db_id , xml_ID = edi_document[field].split(':') + self.data_ids = data_model.search(cr,uid,[('name','=',xml_ID)]) - pass + + f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',model)],context=context) + for fname in fields_object.browse(cr,uid,f_ids): + + if fname.ttype == 'many2one': + field_ids,field_xml = edi_document[field][0].split(':') + field_ids = int(field_ids) + model_ids = data_model.search(cr,uid,[('name','=',field_xml)]) + if not len(model_ids): + obj = self.pool.get(fname.relation) + model1_ids = obj.search(cr,uid,[('name','=',edi_document[field][1])]) + if len(model1_ids) == 1: + resourse[field] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':model1_ids})[0] + + elif not len(model1_ids) or len(model1_ids) > 1: + edi_document[field][1] = obj.create(cr,uid,{'name':edi_document[field][1]}) + resource[field] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':edi_document[field][0]})[0] + else: + resource[field] = model_ids[0] + + elif fname.ttype == 'one2many': + for records in edi_document[field]: + res = {} + field_ids,field_xml = records['__id'].split(':') + field_ids = int(field_ids) + model3_ids = data_model.search(cr,uid,[('name','=',field_xml)]) + for fields in records.keys(): + if fields != '__id' or fields != '__last_update': + res[fields] = records[fields] + if not len(model3_ids): + resource[field][records] = (4,self.edi_import(cr,uid,res,context = context)[0]) + else: + resource[field][records] = (4,model3_ids[0])obj = self.pool.get(model) + record_ids = obj.create(cr,uid,resource,context=context) + return record_ids + + elif fname.ttype == 'many2many': + for records in edi_document[field]: + field_ids,field_xml = records[0].split(':') + field_ids = int(field_ids) + model4_ids = data_model.search(cr,uid,[('name','=',field_xml)]) + if not len(model4_ids): + obj = self.pool.get(fname.relation) + name,value = records[1].split(':') + model5_ids = obj.search(cr,uid,[(name,'=',value)]) + if len(model5_ids) == 1: + resource[field][records] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':model5_ids})[0] + elif not len(model5_ids) or len(model5_ids) > 1: + edi_document[field][records][1] = obj.create(cr,uid,{'name':edi_document[field][1]}) + resource[field] = (4,data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':edi_document[field][records][1]})[0]) + else: + resource[field] = (4,model4_ids[0]) + else: + resource[field] = edi_document[field] + if len(self.data_ids): + obj = self.pool.get(model) + record_ids = obj.write(cr,uid,resource,context=context) + return record_ids + else: + obj = self.pool.get(model) + record_ids = obj.create(cr,uid,resource,context=context) + return record_ids From f1ce7642fbf5edcb1cb392f4a7a1feb0a3725888 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 3 Jun 2011 12:59:50 +0530 Subject: [PATCH 007/510] [REVIEW] edi: optimize code bzr revid: hmo@tinyerp.com-20110603072950-441p4kd4vyvzpo7a --- openerp/addons/base/ir/ir_edi.py | 344 +++++++++++++++++-------------- 1 file changed, 190 insertions(+), 154 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index d4d3692203d..2a0c9282de9 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -27,10 +27,24 @@ import base64 import urllib2 def safe_unique_id(model, database_id): - """Generate a unique string to represent a (model,database id) pair without being too long, without revealing the database id, and with a very low probability of collisions. + + Each EDI record and each relationship value are represented using a unique + database identifier. These database identifiers include the database unique + ID, as a way to uniquely refer to any record within any OpenERP instance, + without conflict. + + For OpenERP records that have an existing "XML ID" (i.e. an entry in + ir.model.data), the EDI unique identifier for this record will be made of + "%s:%s" % (the database's UUID, the XML ID). The database's UUID MUST + NOT contain a colon characters (this is guaranteed by the UUID algorithm). + + For OpenERP records that have no existing "XML ID", a new one should be + created during the EDI export. It is recommended that the generated XML ID + contains a readable reference to the record model, plus a unique value that + hides the database ID. """ msg = "%s-%s-%s" % (model, time.time(), database_id) digest = hashlib.sha1(msg).digest() @@ -42,10 +56,10 @@ def safe_unique_id(model, database_id): class ir_edi_document(osv.osv): _name = 'ir.edi.document' - _description = 'ir_edi_document' + _description = 'To represent the EDI export of any OpenERP record, it could be an invoice, a project task, etc. _columns = { - 'name': fields.char("EDI token", size = 128), - 'document': fields.text("Document") + 'name': fields.char("EDI token", size = 128, help="EDI Token is a unique identifier for the EDI document."), + 'document': fields.text("Document", help="hold the serialization of the EDI document.") } _sql_constraints = [ @@ -53,90 +67,115 @@ class ir_edi_document(osv.osv): ] - def new_edi_token(self,browse_records,database_id): - - """Generate new unique tokent value to uniquely identify each edi_document""" - - db_uuid = safe_unique_id(browse_records, database_id) - edi_token = hashlib.sha256('%s-%s-%s' % (time.time(),db_uuid,time.time())).hexdigest() - - + def new_edi_token(self, record): + """ + Return a new, random unique token to identify an edi.document + :param record: It's a object of browse_record of any model + """ + db_uuid = safe_unique_id(record._name, record.id) + edi_token = hashlib.sha256('%s-%s-%s' % (time.time(), db_uuid, time.time())).hexdigest() return edi_token - def serialize(self,edi_list_of_dicts): - - """Serialize the list of dictionaries using json dumps method""" - - serialized_list = json.dumps(edi_list_of_dicts) + def serialize(self, edi_documents): + """Serialize the list of dictionaries using json dumps method + perform a JSON serialization of a list of dicts prepared by generate_edi() and return a UTF-8 encoded string that could be passed to deserialize() + :param edi_dicts: it's list of edi_dict + """ + serialized_list = json.dumps(edi_dicts) return serialized_list - def generate_edi(self,browse_record_list): - - """ Generate the list of dictionaries using edi_export method of edi class """ - + def generate_edi(self, cr, uid, records, context=None): + """ + Generate the list of dictionaries using edi_export method of edi class + :param records: it's a object of browse_record_list of any model + """ edi_list = [] - for record in browse_record_list: - edi_struct = record.edi_export(record) + for record in record_list: + edi_struct = record.edi_export(cr, uid, record, context=context) edi_list.append(edi_struct) return self.serialize(edi_list) - def get_document(self,cr,uid,edi_token,context=None): + def get_document(self, cr, uid, edi_token, context=None): + """ + Get the edi document from database using given edi token + returns the string serialization that is in the database (column: document) for the given edi_token or raise. + """ - """Get the edi document from database using given edi token """ - - records = self.search(cr,uid,[('name','=',edi_token)],context=context) + records = self.name_search(cr, uid, edi_token, context=context) if records: - doc_string = self.read(cr,uid,records,['document'],context=context) + edi = self.browse(cr, uid, records[0], context=context) + return edi.document else: raise osv.except_osv(_('Error !'), _('Desired EDI Document does not Exist')) - return doc_string + - def load_edi(self,cr,uid,ids,edi_list_of_dicts,context=None): - - """loads the values from list of dictionaries to the corresponding OpenERP records - using the edi_import method of edi class""" - - edi_list = [] - for record in edi_list_of_dicts: - edi_record = record.edi_import(record) - - - return True - - def deserialize(self,cr,uid,edi_document_string,context=None): - """ Deserialized the edi document string""" - - deserialize_string = json.loads(edi_document_string) - return self.load_edi(cr,uid,deserialize_string,context=context) - - def export_doc(self, cr, uid, browse_records, database_id, context=None): - """the method handles the flow of the edi document generation and store it in - the database and return the edi_token of the particular document""" - - edi_document = { - 'name': self.new_edi_token(browse_records,database_id), - 'document': self.generate_edi(browse_records) - } - - unique_id = self.create(cr,uid,edi_document,context=context) - return edi_document['name'] - - def import_doc(self, cr, uid, ids, edi_document=None,edi_url=None,context=None): - - """the method handles the flow of importing particular edi document and - updates the database values on the basis of the edi document using - edi_loads method """ - - if edi_document is not None: - self.deserialize(cr,uid,edi_document,context=context) - elif edi_url is not None: - edi_document = urllib2.urlopen(edi_url).read() - self.deserialize(cr,uid,edi_document,context=context) + def load_edi(self, cr, uid, edi_documents, context=None): + """ + loads the values from list of dictionaries to the corresponding OpenERP records + using the edi_import method of edi class + For each edi record (dict) in the list, call the corresponding osv.edi_import() method, based on the __model attribute (see section 2.4 of for spec of + osv.edi_import) + :param edi_dicts: list of edi_dict + """ + + for edi_document in edi_documents: + model = edi_document.get('__model') + assert model, _('model should be provided in EDI Dict') + model_obj = self.pool.get(model) + model_obj.edi_import(cr, uid, edi_document, context=context) return True + def deserialize(self, edi_document_string): + """ Deserialized the edi document string + perform JSON deserialization from an edi document string, and returns a list of dicts + """ + edi_document = json.loads(edi_document_string) + return edi_document + + def export(self, cr, uid, records, context=None): + """ + The method handles the flow of the edi document generation and store it in + the database and return the edi_token of the particular document + Steps: + * call generate_edi() to get a serialization and new_edi_token() to get a unique ID + * serialize the list returned by generate_edi() using serialize(), and save it in database with unique ID. + * return the unique ID + + : param records: list of browse_record of any model + """ + exported_ids = [] + for record in records: + document = self.generate_edi(cr, uid, [record], context) + token = self.new_edi_token(record) + self.create(cr, uid, { + 'name': token, + 'document': document + }, context=context) + + exported_ids.append(token) + return exported_ids + + def import(self, cr, uid, edi_document=None, edi_url=None, context=None): + """ + The method handles the flow of importing particular edi document and + updates the database values on the basis of the edi document using + edi_loads method + + * N: a serialized edi.document or the URL to download a serialized document + * If a URL is provided, download it first to get the document + * Calls deserialize() to get the resulting list of dicts from the document + * Call load_edi() with the list of dicts, to create or update the corresponding OpenERP records based on the edi.document. + """ + + if edi_url and not edi_document: + edi_document = urllib2.urlopen(edi_url).read() + assert edi_document, _('EDI Document should be provided') + edi_documents = self.deserialize(edi_document) + return self.load_edi(cr, uid, edi_documents, context=context) + ir_edi_document() @@ -150,102 +189,99 @@ class edi(object): specific behavior, based on the primitives provided by this superclass.""" - def edi_metadata(self, cr, uid,browse_rec_list, context=None): + def edi_metadata(self, cr, uid, records, context=None): """Return a list representing the boilerplate EDI structure for exporting the record in the given browse_rec_list, including - the metadata fields""" - # generic implementation! - data_object = self.pool.get('ir.model.data') + the metadata fields - if self.edi_document['__model'] is not None: - model_ids = data_object.search(cr,uid,[('model','=',self.edi_document['__model'])],context=context) - for data in data_object.browse(cr,uid,model_ids): - self.edi_document['__module'] = data.module - if data.name is not None: - self.edi_document['__id'] = context['active_id']+':'+data.name - else: - self.edi_document['__id'] = context['active_id']+':'+safe_unique_id(data.model,) - self.edi_document['__last_updata'] = context['__last_update'].values()[0] + The metadata fields MUST always include: + - __model': the OpenERP model name + - __module': the OpenERP module containing the model + - __id': the unique (cross-DB) identifier for this record + - __last_update': last update date of record, ISO date string in UTC + - __version': a list of components for the version + - __attachments': a list (possibly empty) of dicts describing the files attached to this record. + """ + # generic implementation! + attachment_object = self.pool.get('ir.attachment') + edi_dict_list = [] + for record in records: + attachment_ids = attachment_object.search(cr, uid, [('res_model','=', record._name), ('res_id', '=', record.id)]) + attachment_dict_list = [] + for attachment in attachment_object.browse(cr, uid, attachment_ids, context=context): + attachment_dict_list.append({ + 'name' : attachment.name, + 'content': base64.encodestring(attachment.datas), + 'file_name': attachment.datas_fname, + }) + edi_dict = { + '__model' : record._name, + '__module' : record._module, + '__id': record.id, + '__last_update': record.write_date, #TODO: convert into UTC + '__version': [], # ? + '__attachments': attachment_dict_list + } + edi_dict_list.append(edi_dict) - return True + return edi_dict_list - def edi_m2o(self, cr, uid,browse_rec): + def edi_m2o(self, cr, uid, record, context=None): """Return a list representing a M2O EDI value for - the given browse_record.""" + the given browse_record. + M2O are passed as pair (ID, Name) + Exmaple: ['db-uuid:xml-id', 'Partner Name'] + """ # generic implementation! - - model = browse_rec._name - res = [] data_object = self.pool.get('ir.model.data') - uu_id = data_model.search(cr,uid,[('model','=',model)]) - for xml in data_model.browse(cr,uid,uu_id): - if xml: - xml_ID = xml.name - else: - xml_ID = None - for data in browse_rec: - if data.name is not None: - if xml_ID is not None: - res.append(safe_unique_id(model,data.id)+':'+xml_ID) - else: - res.append(safe_unique_id(model,data.id)+':'+safe_unique_id(model,data.id)) - res.append(data.name) - return res + db_uuid = safe_unique_id(record._name, record.id) + xml_ids = data_object.search(cr, uid, [('model','=',record._name),('res_id','=',record.id)]) + if xml_ids: + xml_id = data_object.browse(cr, uid, xml_ids[0], context=context) + xml_id = xml_id.name + db_uuid = '%s:%s' %(db_uuid, xml_id) + name = record.name + return [db_uuid, name] + - def edi_o2m(self, cr, uid,line = None,browse_rec_list, context=None): + def edi_o2m(self, cr, uid, records, context=None): """Return a list representing a O2M EDI value for - the browse_records from the given browse_record_list.""" - # generic implementation! - res = [] - init_data = {} - model = browse_rec_list._name - data_object = self.pool.get('ir.model.data') - uu_id = data_model.search(cr,uid,[('model','=',model)]) - - for xml in data_model.browse(cr,uid,uu_id): - if xml: - xml_ID = xml.name - else: - xml_ID = None - - data_model = self.pool.get(model) - for record in browse_rec_list: - if xml_ID is not None: - init_data['__id'] = safe_unique_id(model,record.id)+':'+xml_ID - else: - init_data['__id'] = safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id) - init_data['__last_update'] =record.write_date - init_data.update(self.determine_type(cr,uid,ids,line,record,context=context)) - - res.append(init_data) - return res + the browse_records from the given browse_record_list. - def edi_m2m(self, cr, uid, line = None, browse_rec_list, context=None): - """Return a list representing a M2M EDI value for - the browse_records from the given browse_record_list.""" + Example: + [ # O2M fields would be a list of dicts, with their + { '__id': 'db-uuid:xml-id', # own __id. + '__last_update': 'iso date', # The update date, just in case... + 'name': 'some name', + ... + }], + """ # generic implementation! - model = browse_rec_list[0]._name - res = [] - init_data = [] - data_object = self.pool.get('ir.model.data') - uu_id = data_model.search(cr,uid,[('model','=',model)]) - for xml in data_model.browse(cr,uid,uu_id): - if xml: - xml_ID = xml.name - else: - xml_ID = None - data_model = self.pool.get(model) - for record in browse_rec_list: - if xml_ID is not None: - init_data.append(safe_unique_id(model,record.id)+':'+xml_ID) - else: - init_data.append(safe_unique_id(model,record.id)+':'+model+'-'+safe_unique_id(model,record.id)) - if record.name is not None: - init_data.append('name:'+record.name) - res.append(init_data) - - # blob: - return res + dict_list = [] + for record in records: + model_obj = self.pool.get(record._name) + dict_list += model_obj.edi_export(cr, uid, [record.id], context=context) + return dict_list + + + def edi_m2m(self, cr, uid, records, context=None): + """Return a list representing a M2M EDI value for + the browse_records from the given browse_record_list. + + Example: + 'related_tasks': [ # M2M fields would exported as a list of pairs, + ['db-uuid:xml-id1', # similar to a list of M2O values. + 'Task 01: bla bla'], + ['db-uuid:xml-id2', + 'Task 02: bla bla'] + ] + """ + # generic implementation! + dict_list = [] + for record in records: + dict_list.append(self.edi_o2m(cr, uid, record, context=None)) + + return dict_list def edi_export(self, cr, uid, ids, edi_struct=None, context=None): """Returns a list of dicts representing an edi.document containing the From ef7ee72f406efb58ea5c9863d4b3fa5d698f547a Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 3 Jun 2011 14:34:08 +0530 Subject: [PATCH 008/510] [REVIEW] edi: refactor code in import/export method bzr revid: hmo@tinyerp.com-20110603090408-fcumns7va18trdwx --- openerp/addons/base/ir/ir_edi.py | 235 +++++++++++++++---------------- 1 file changed, 112 insertions(+), 123 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 2a0c9282de9..c428bca7cb2 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -89,10 +89,8 @@ class ir_edi_document(osv.osv): Generate the list of dictionaries using edi_export method of edi class :param records: it's a object of browse_record_list of any model """ - edi_list = [] - for record in record_list: - edi_struct = record.edi_export(cr, uid, record, context=context) - edi_list.append(edi_struct) + + edi_list = self.edi_export(cr, uid, records, context=context) return self.serialize(edi_list) def get_document(self, cr, uid, edi_token, context=None): @@ -283,6 +281,8 @@ class edi(object): return dict_list + + def edi_export(self, cr, uid, ids, edi_struct=None, context=None): """Returns a list of dicts representing an edi.document containing the browse_records with ``ids``, using the generic algorithm. @@ -303,135 +303,124 @@ class edi(object): be included in the exported data. """ # generic implementation! - - self.edi_document = { - - '__model':'', - '__module':'', - '__id':'', - '__last_update':'', - '__version':'', - '__attachments':'', - - } - self.edi_document['__model'] = self._name + if context is None: + context = {} + _fields = self.fields_get(cr, uid, context=context) - fields_object = self.pool.get('ir.model.fields') - model_object = self.pool.get(self.edi_document['__model']) - edi_metadata(cr, uid, edi_struct, context=context) - record = model_object.read(cr,uid,ids,[],context=context) - for field in edi_struct.keys(): - f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',self.edi_document['__model'])],context=context) - - for fname in fields_object.browse(cr,uid,f_ids): - if fname.ttype == 'many2one': - - self.edi_document[field] = self.edi_m2o(cr, uid, browse_rec = record[0][field]) - elif fname.ttype == 'one2many': - - self.edi_ducument[field] = self.edi_o2m(cr,uid,line = edi_struct[field],browse_rec_list = record[0][field]) - elif fname.ttype == 'many2many': - self.edi_document[field] = self.edi_m2m(cr,uid,line = edi_struct[field],browse_rec_list = record[0][field]) + fields_to_export = edi_struct and edi_struct.keys() or _fields.key() + + edi_dict_list = [] + for row in self.browse(cr, uid, ids, fields_to_export, context): + edi_dict = {} + edi_dict.update(self.edi_metadata(cr, uid, [row.id], context=context)[0]) + for field in fields_to_export: + cols = self._fields[field] + if cols['type'] == 'many2one': + m2o_record = row.getattrs(field) + value = self.m2o(cr, uid, m2o_record, context=context) + elif cols['type'] == 'many2many': + m2m_records = row.getattrs(field) + value = self.m2m(cr, uid, m2m_records, context=context) + elif cols['type'] == 'one2many': + o2m_records = row.getattrs(field) + value = self.o2m(cr, uid, o2m_records, context=context) else: - self.edi_document[field] = record[0][field] + value = row.getattrs(field) + edi_dict[field] = value + edi_dict_list.append(edi_dict) + return edi_dict_list - - return self.edi_document - def determine_type(self,cr,uid,ids,record_line,browse_record=None,context=None): - model = browse_record._name - fields_object = self.pool.get('ir.model.fields') - obj = self.pool.get(model) - field_data = obj.read(cr,uid,browse_record.id,record_line.keys())[0] - for field in field_data.keys(): - field_ids = field_object.search(cr,uid,[field]) - for field_type in field_object.browse(cr,uid,field_ids): - if field_type.ttype == 'many2one': - record_line.update(field,self.edi_m2o(cr,uid,browse_rec = field_data[field])) - elif field_type.ttype == 'one2many': - pass - elif field_type.ttype == 'many2many': - pass - else: - record_line.update(field,field_data[field]) - return record_line def edi_import(self, cr, uid, edi_document, context=None): """Imports a list of dicts representing an edi.document, using the generic algorithm. + + All relationship fields are exported in a special way, and provide their own + unique identifier, so that we can avoid duplication of records when importing. + Note: for all ir.model.data entries, the "module" value to use for read/write + should always be "edi_import", and the "name" value should be the full + db_id provided in the EDI. + + 1: Many2One + M2O fields are always exported as a pair [db_id, name], where db_id + is in the form "db_uuid:xml_id", both being values that come directly + from the original database. + The import should behave like this: + a. Look in ir.model.data for a record that matches the db_id. + If found, replace the m2o value with the correct database ID and stop. + If not found, continue to next step. + b. Perform name_search(name) to look for a record that matches the + given m2o name. If only one record is found, create the missing + ir.model.data record to link it to the db_id, and the replace the m2o + value with the correct database ID, then stop. If zero result or + multiple results are found, go to next step. + c. Create the new record using the only field value that is known: the + name, and create the ir.model.data entry to map to it. + This should work for many models, and if not, the module should + provide a custom EDI import logic to care for it. + + 2: One2Many + O2M fields are always exported as a list of dicts, where each dict corresponds + to a full EDI record. The import should not update existing records + if they already exist, it should only link them to the parent object. + a. Look for a record that matches the db_id provided in the __id field. If + found, keep the corresponding database id, and connect it to the parent + using a write value like (4,db_id). + b. If not found via db_id, create a new entry using the same method that + imports a full EDI record (recursive call!), grab the resulting db id, + and use it to connect to the parent via a write value like (4, db_id). + + 3: Many2Many + M2M fields are always exported as a list of pairs similar to M2O. + For each pair in the M2M: + a. Perform the same steps as for a Many2One (see 1.2.1.1) + b. After finding the database ID of the final record in the database, + connect it to the parent record via a write value like (4, db_id). """ # generic implementation! - new = True - resource = {} - model = edi_document['__model'] - model_object = self.pool.get(model) - data_model = self.pool.get('ir.model.data') - field_model = self.pool.get('ir.model.fields') + fields = edi_document.keys() + fields_to_import = [] + data_line = [] + _fields = self.fields_get(cr, uid, context=context) for field in edi_document.keys(): - if field == '__id': - db_id , xml_ID = edi_document[field].split(':') - self.data_ids = data_model.search(cr,uid,[('name','=',xml_ID)]) - - - f_ids = fields_object.search(cr,uid,[('name','=',field),('model','=',model)],context=context) - for fname in fields_object.browse(cr,uid,f_ids): - - if fname.ttype == 'many2one': - field_ids,field_xml = edi_document[field][0].split(':') - field_ids = int(field_ids) - model_ids = data_model.search(cr,uid,[('name','=',field_xml)]) - if not len(model_ids): - obj = self.pool.get(fname.relation) - model1_ids = obj.search(cr,uid,[('name','=',edi_document[field][1])]) - if len(model1_ids) == 1: - resourse[field] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':model1_ids})[0] - - elif not len(model1_ids) or len(model1_ids) > 1: - edi_document[field][1] = obj.create(cr,uid,{'name':edi_document[field][1]}) - resource[field] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':edi_document[field][0]})[0] - else: - resource[field] = model_ids[0] - - elif fname.ttype == 'one2many': - for records in edi_document[field]: - res = {} - field_ids,field_xml = records['__id'].split(':') - field_ids = int(field_ids) - model3_ids = data_model.search(cr,uid,[('name','=',field_xml)]) - for fields in records.keys(): - if fields != '__id' or fields != '__last_update': - res[fields] = records[fields] - if not len(model3_ids): - resource[field][records] = (4,self.edi_import(cr,uid,res,context = context)[0]) - else: - resource[field][records] = (4,model3_ids[0])obj = self.pool.get(model) - record_ids = obj.create(cr,uid,resource,context=context) - return record_ids - - elif fname.ttype == 'many2many': - for records in edi_document[field]: - field_ids,field_xml = records[0].split(':') - field_ids = int(field_ids) - model4_ids = data_model.search(cr,uid,[('name','=',field_xml)]) - if not len(model4_ids): - obj = self.pool.get(fname.relation) - name,value = records[1].split(':') - model5_ids = obj.search(cr,uid,[(name,'=',value)]) - if len(model5_ids) == 1: - resource[field][records] = data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':model5_ids})[0] - elif not len(model5_ids) or len(model5_ids) > 1: - edi_document[field][records][1] = obj.create(cr,uid,{'name':edi_document[field][1]}) - resource[field] = (4,data_model.create(cr,uid,{'module':'edi_import','name':field_xml,'res_id':edi_document[field][records][1]})[0]) - else: - resource[field] = (4,model4_ids[0]) + if not field.startwith('__'): + field_to_import.append(field) + edi_field_value = edi_document[field] + if _fields[field]['type'] == 'many2one': + #Look in ir.model.data for a record that matches the db_id. + #If found, replace the m2o value with the correct database ID and stop. + #If not found, continue to next step. + + #Perform name_search(name) to look for a record that matches the + #given m2o name. If only one record is found, create the missing + #ir.model.data record to link it to the db_id, and the replace the m2o + #value with the correct database ID, then stop. If zero result or + #multiple results are found, go to next step. + + #Create the new record using the only field value that is known: the + #name, and create the ir.model.data entry to map to it. + #This should work for many models, and if not, the module should + #provide a custom EDI import logic to care for it. + pass + elif _fields[field]['type'] == 'one2many': + #Look for a record that matches the db_id provided in the __id field. If + #found, keep the corresponding database id, and connect it to the parent + #using a write value like (4,db_id). + + #If not found via db_id, create a new entry using the same method that + #imports a full EDI record (recursive call!), grab the resulting db id, + #and use it to connect to the parent via a write value like (4, db_id). + elif _fields[field]['type'] == 'many2many': + #Perform the same steps as for a Many2One (see 1.2.1.1) + + + + #After finding the database ID of the final record in the database, + #connect it to the parent record via a write value like (4, db_id). else: - resource[field] = edi_document[field] - if len(self.data_ids): - obj = self.pool.get(model) - record_ids = obj.write(cr,uid,resource,context=context) - return record_ids - else: - obj = self.pool.get(model) - record_ids = obj.create(cr,uid,resource,context=context) - return record_ids + data_line.append(edi_field_value) + + return self.import_data(cr, uid, field_to_import, [data_line], mode='init', current_module='edi_import', noupdate=False, context=context, filename=None) + From eaec4a25f23e4182bc5620f1a9dcef664f811861 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 3 Jun 2011 14:41:09 +0530 Subject: [PATCH 009/510] [REVIEW] edi: refactor code in generate_edi() bzr revid: hmo@tinyerp.com-20110603091109-e1gn7mr0gpcr88sy --- openerp/addons/base/ir/ir_edi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index c428bca7cb2..1fc9371b66c 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -90,7 +90,10 @@ class ir_edi_document(osv.osv): :param records: it's a object of browse_record_list of any model """ - edi_list = self.edi_export(cr, uid, records, context=context) + edi_list = [] + for record in records: + record_model_obj = self.pool.get(record._name) + edi_list += record_model_obj.edi_export(cr, uid, [record], context=context) return self.serialize(edi_list) def get_document(self, cr, uid, edi_token, context=None): From 9cb3205a6432ccc7ba2458416786774b39bc50d6 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 3 Jun 2011 15:25:26 +0530 Subject: [PATCH 010/510] [FIX] fix problem of search multiple conditions O2M with active=False then not work. lp bug: https://launchpad.net/bugs/711919 fixed bzr revid: ysa@tinyerp.com-20110603095526-s26wgkahwc1d6zfd --- openerp/osv/expression.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index 1922d5e8388..4c74a11506a 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -108,6 +108,10 @@ class expression(object): self.__main_table = table self.__all_tables.add(table) + active = False + for exp in self.__exp: + if exp[0] == 'active': + active = exp i = -1 while i + 1','<=','>='] ) and 'in' or operator - + dict_op = {'not in':'!=','in':'=','=':'in','!=':'not in','<>':'not in'} if isinstance(right,tuple): right = list(right) @@ -319,7 +326,7 @@ class expression(object): elif isinstance(right,(list,tuple)): m2o_str = True for ele in right: - if not isinstance(ele, basestring): + if not isinstance(ele, basestring): m2o_str = False break elif right == []: @@ -335,7 +342,7 @@ class expression(object): new_op = '!=' #Is it ok to put 'left' and not 'id' ? self.__exp[i] = (left,new_op,False) - + if m2o_str: self.__exp[i] = _get_expression(field_obj,cr, uid, left, right, operator, context=context) else: From 2a9a5e2a0e3fdf1bc104e1a5c923baf85f1d963b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 3 Jun 2011 15:42:17 +0530 Subject: [PATCH 011/510] Improve code. bzr revid: ysa@tinyerp.com-20110603101217-v69rcqtpcfics925 --- openerp/osv/expression.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index 4c74a11506a..8fb85ce7612 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -154,10 +154,10 @@ class expression(object): # Making search easier when there is a left operand as field.o2m or field.m2m if field._type in ['many2many','one2many']: right = field_obj.search(cr, uid, [(fargs[1], operator, right)], context=context) + domain = [(fargs[0],'in', right)] if active: - right1 = table.search(cr, uid, [(fargs[0],'in', right),active], context=context) - else: - right1 = table.search(cr, uid, [(fargs[0],'in', right)], context=context) + domain.append(active) + right1 = table.search(cr, uid, domain, context=context) if right1 == []: self.__exp[i] = ( 'id', '=', 0 ) else: From 332d385390a48cd82670182c6b76e92bbf35397e Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 3 Jun 2011 16:15:39 +0530 Subject: [PATCH 012/510] [REVIEW] edi: refactor code of edi_import bzr revid: hmo@tinyerp.com-20110603104539-nh0i45zv6zna2wau --- openerp/addons/base/ir/ir_edi.py | 96 ++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 24 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 1fc9371b66c..35b1b411a38 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -386,44 +386,92 @@ class edi(object): fields = edi_document.keys() fields_to_import = [] data_line = [] + model_data = self.pool.get('ir.model.data') _fields = self.fields_get(cr, uid, context=context) + current_module = 'edi_import' + values = {} for field in edi_document.keys(): if not field.startwith('__'): field_to_import.append(field) edi_field_value = edi_document[field] - if _fields[field]['type'] == 'many2one': - #Look in ir.model.data for a record that matches the db_id. - #If found, replace the m2o value with the correct database ID and stop. - #If not found, continue to next step. + if _fields[field]['type'] in ('many2one', 'many2many'): - #Perform name_search(name) to look for a record that matches the - #given m2o name. If only one record is found, create the missing - #ir.model.data record to link it to the db_id, and the replace the m2o - #value with the correct database ID, then stop. If zero result or - #multiple results are found, go to next step. + if _fields[field]['type'] == 'many2one': + edi_parent_documents = [edi_field_value] + else: + edi_parent_documents = edi_field_value - #Create the new record using the only field value that is known: the - #name, and create the ir.model.data entry to map to it. - #This should work for many models, and if not, the module should - #provide a custom EDI import logic to care for it. - pass + parent_lines = [] + + for edi_parent_document in edi_parent_documents: + #Look in ir.model.data for a record that matches the db_id. + #If found, replace the m2o value with the correct database ID and stop. + #If not found, continue to next step + + db_uuid, xml_id = tuple(edi_parent_document[0].split(':')) + data_ids = model_data.name_search(cr, uid, xml_id) + if data_ids: + d = model_data.browse(cr, uid, data_ids[0], context=context) + parent_lines.append(d.res_id) + + else: + #Perform name_search(name) to look for a record that matches the + #given m2o name. If only one record is found, create the missing + #ir.model.data record to link it to the db_id, and the replace the m2o + #value with the correct database ID, then stop. If zero result or + #multiple results are found, go to next step. + #Create the new record using the only field value that is known: the + #name, and create the ir.model.data entry to map to it. + + relation_object = self.get.pool(_fields[field]['relation']) + relation_ids = relation_object.name_search(cr, uid, edi_parent_document[1]) + if relation_ids and len(relation_ids) == 1: + relation_id = relation_ids[0] + else: + relation_id = relation_object.create(cr, uid, {'name': edi_parent_document[1]}, context=context) + model_data.create(cr, uid, { + 'name': xml_id, + 'model': relation_object._name, + #'module':relation_object._module, + 'res_id':relation_id, + },context=context) + + parent_lines.append(relation_id) + + if _fields[field]['type'] == 'many2one': + values[field] = parent_lines[0] + else: + many2many_ids = [] + for m2m_id in parent_lines: + many2many_ids.append((4,m2m_id)) + values[field] = many2many_ids + + elif _fields[field]['type'] == 'one2many': #Look for a record that matches the db_id provided in the __id field. If #found, keep the corresponding database id, and connect it to the parent #using a write value like (4,db_id). - #If not found via db_id, create a new entry using the same method that #imports a full EDI record (recursive call!), grab the resulting db id, #and use it to connect to the parent via a write value like (4, db_id). - elif _fields[field]['type'] == 'many2many': - #Perform the same steps as for a Many2One (see 1.2.1.1) - - - - #After finding the database ID of the final record in the database, - #connect it to the parent record via a write value like (4, db_id). + + relations = [] + relation_object = self.get.pool(_fields[field]['relation']) + for edi_relation_document in edi_field_value: + db_uuid, xml_id = tuple(edi_relation_document.get('__id').split(':')) + data_ids = model_data.name_search(cr, uid, xml_id) + if data_ids: + d = model_data.browse(cr, uid, data_ids[0], context=context) + relations.append(d.res_id) + else: + r = relation_object.edi_import(cr, uid, edi_relation_document, context=context) + relations.append(r) + one2many_ids = [] + for o2m_id in relations: + one2many_ids.append((4,o2m_id)) + values[field] = one2many_ids else: - data_line.append(edi_field_value) + values[field] = edi_field_value - return self.import_data(cr, uid, field_to_import, [data_line], mode='init', current_module='edi_import', noupdate=False, context=context, filename=None) + return model_data._update(cr, uid, self._name, current_module, values, context=context) From 023ce68e841d91ae3610bf50774f61b2be7de090 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Mon, 6 Jun 2011 11:22:57 +0530 Subject: [PATCH 013/510] [EDI]: worked on the local time to UTC time conversion bzr revid: aar@tinyerp.com-20110606055257-d33gwzaidwxufn64 --- openerp/addons/base/ir/ir_edi.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 4ed7b0a4d3a..2cb40c4dfa7 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -26,6 +26,7 @@ import time import base64 import urllib2 import release +import datetime def safe_unique_id(model, database_id): """Generate a unique string to represent a (model,database id) pair @@ -216,14 +217,21 @@ class edi(object): 'content': base64.encodestring(attachment.datas), 'file_name': attachment.datas_fname, }) + ''' Here we are obtaining the release version ''' version = [] for ver in release.version.split('.'): version.append(int(ver)) + ''' Here we are converting local time into UTC time''' + UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now() + local_datetime = datetime.datetime.strptime(record.write_date, "%Y-%m-%d %H:%M:%S") + result_utc_datetime = local_datetime - UTC_OFFSET_TIMEDELTA + write_date = result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S") + edi_dict = { '__model' : record._name, '__module' : record._module, '__id': record.id, - '__last_update': record.write_date, #TODO: convert into UTC + '__last_update': write_date, #TODO: convert into UTC '__version': version, '__attachments': attachment_dict_list } From 110483e93d4a6cf1f461002be93a607b4fb1ec65 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 8 Jun 2011 16:11:28 +0530 Subject: [PATCH 014/510] [FIX] fix problem of ir.property created if same value exists then record not create in ir.property object. lp bug: https://launchpad.net/bugs/726592 fixed bzr revid: ysa@tinyerp.com-20110608104128-7mdykmk0ovqenz6u --- openerp/osv/fields.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 306e7d007f3..ec1845344ab 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1047,7 +1047,14 @@ class property(function): default_val = self._get_default(obj, cr, uid, prop_name, context) - if id_val is not default_val: + property_create = False + if hasattr(default_val, '_id'): + if default_val._id != id_val: + property_create = True + elif id_val != default_val: + property_create = True + + if property_create: def_id = self._field_get(cr, uid, obj._name, prop_name) company = obj.pool.get('res.company') cid = company._company_default_get(cr, uid, obj._name, def_id, From 4203df9c260fda5bcc5f2e60504483d1078b770c Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 13 Jun 2011 11:40:41 +0530 Subject: [PATCH 015/510] [IMP] add yaml test case. bzr revid: ysa@tinyerp.com-20110613061041-15edtf67mj0oa8hq --- .../addons/base/test/test_osv_expression.yml | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/test/test_osv_expression.yml b/openerp/addons/base/test/test_osv_expression.yml index 4916fe06203..1f76a210293 100644 --- a/openerp/addons/base/test/test_osv_expression.yml +++ b/openerp/addons/base/test/test_osv_expression.yml @@ -40,7 +40,7 @@ - !assert {model: res.partner, search: "[('category_id', '=', False)]"}: - category_id in (False, None, []) -- +- Filtering on invalid value across x2many relationship should return an empty set - !assert {model: res.partner, search: "[('address.city','=','foo')]", count: 0, string: "Searching for address.city = foo should give empty results"} @@ -110,4 +110,21 @@ res_ids = self.search(cr, uid, [('company_id.partner_id', 'not in', [])]) res_ids.sort() assert res_ids == all_ids, "Searching against empty set failed, returns %r" % res_ids - +- + Testing for Many2Many field with category supplier and active=False +- + !python {model: res.partner }: | + vals = {'category_id': [(6, 0, [ref("base.res_partner_category_8")])], + 'name': 'OpenERP Test', + 'active': False, + 'address': [(0, 0, {'country_id': ref("base.be")})] + } + self.create(cr, uid, vals, context=context) + res_ids = self.search(cr, uid, [('category_id', 'ilike', 'supplier'), ('active', '=', False)]) + assert len(res_ids) != 0, "Record not Found with category supplier and active False." +- + Testing for One2Many field with country Belgium and active=False +- + !python {model: res.partner }: | + res_ids = self.search(cr, uid, [('address.country_id','=','Belgium'),('active','=',False)]) + assert len(res_ids) != 0, "Record not Found with country Belgium and active False." From ab62f7b7802571f56a56fce7389b777d6fee2583 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Tue, 21 Jun 2011 18:46:32 +0530 Subject: [PATCH 016/510] [EDI] revised edi class bzr revid: aar@tinyerp.com-20110621131632-rdwn6in74q5t1wkj --- openerp/addons/base/__openerp__.py | 3 +- openerp/addons/base/ir/ir_edi.py | 316 +++++++++++++++++------------ 2 files changed, 191 insertions(+), 128 deletions(-) diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 75e0a8c56d0..b0c437352f9 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -71,7 +71,7 @@ 'res/partner/wizard/partner_clear_ids_view.xml', 'res/partner/wizard/partner_wizard_ean_check_view.xml', 'res/partner/partner_data.xml', - + #'test/test_edi_document.yml', 'res/ir_property_view.xml', 'security/base_security.xml', 'publisher_warranty/publisher_warranty_view.xml', @@ -96,6 +96,7 @@ 'test/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules. 'test/test_config_users.yml', 'test/test_ir_values.yml', + ], 'installable': True, 'active': True, diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 2cb40c4dfa7..fe8320491bf 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -20,14 +20,13 @@ ############################################################################## from osv import osv,fields -import json +import simplejson import hashlib import time import base64 import urllib2 -import release -import datetime - +import unicodedata +import openerp.release as release def safe_unique_id(model, database_id): """Generate a unique string to represent a (model,database id) pair without being too long, without revealing the database id, and @@ -58,7 +57,7 @@ def safe_unique_id(model, database_id): class ir_edi_document(osv.osv): _name = 'ir.edi.document' - _description = 'To represent the EDI export of any OpenERP record, it could be an invoice, a project task, etc.' + _description = 'To represent' _columns = { 'name': fields.char("EDI token", size = 128, help="EDI Token is a unique identifier for the EDI document."), 'document': fields.text("Document", help="hold the serialization of the EDI document.") @@ -83,7 +82,7 @@ class ir_edi_document(osv.osv): perform a JSON serialization of a list of dicts prepared by generate_edi() and return a UTF-8 encoded string that could be passed to deserialize() :param edi_dicts: it's list of edi_dict """ - serialized_list = json.dumps(edi_dicts) + serialized_list = simplejson.dumps(edi_documents) return serialized_list def generate_edi(self, cr, uid, records, context=None): @@ -95,7 +94,7 @@ class ir_edi_document(osv.osv): edi_list = [] for record in records: record_model_obj = self.pool.get(record._name) - edi_list += record_model_obj.edi_export(cr, uid, [record], context=context) + edi_list += record_model_obj.edi_export(cr, uid, [record],context=context) return self.serialize(edi_list) def get_document(self, cr, uid, edi_token, context=None): @@ -104,14 +103,12 @@ class ir_edi_document(osv.osv): returns the string serialization that is in the database (column: document) for the given edi_token or raise. """ - records = self.name_search(cr, uid, edi_token, context=context) + records = self.search(cr, uid, [('name','=',edi_token)]) if records: - edi = self.browse(cr, uid, records[0], context=context) - return edi.document - else: - raise osv.except_osv(_('Error !'), - _('Desired EDI Document does not Exist')) - + for edi in self.browse(cr, uid, records, context=context): + return edi.document + else: + pass def load_edi(self, cr, uid, edi_documents, context=None): @@ -135,10 +132,11 @@ class ir_edi_document(osv.osv): """ Deserialized the edi document string perform JSON deserialization from an edi document string, and returns a list of dicts """ - edi_document = json.loads(edi_document_string) + edi_document = simplejson.loads(edi_document_string) + return edi_document - def export(self, cr, uid, records, context=None): + def export_edi(self, cr, uid, records, context=None): """ The method handles the flow of the edi document generation and store it in the database and return the edi_token of the particular document @@ -161,7 +159,7 @@ class ir_edi_document(osv.osv): exported_ids.append(token) return exported_ids - def import(self, cr, uid, edi_document=None, edi_url=None, context=None): + def import_edi(self, cr, uid, edi_document=None, edi_url=None, context=None): """ The method handles the flow of importing particular edi document and updates the database values on the basis of the edi document using @@ -175,8 +173,10 @@ class ir_edi_document(osv.osv): if edi_url and not edi_document: edi_document = urllib2.urlopen(edi_url).read() - assert edi_document, _('EDI Document should be provided') - edi_documents = self.deserialize(edi_document) + #assert edi_document, _('EDI Document should be provided') + else: + + edi_documents = self.deserialize(edi_document) return self.load_edi(cr, uid, edi_documents, context=context) ir_edi_document() @@ -206,8 +206,11 @@ class edi(object): - __attachments': a list (possibly empty) of dicts describing the files attached to this record. """ # generic implementation! + model_data = self.pool.get('ir.model.data') + data_ids = [] attachment_object = self.pool.get('ir.attachment') edi_dict_list = [] + db_uuid = '' for record in records: attachment_ids = attachment_object.search(cr, uid, [('res_model','=', record._name), ('res_id', '=', record.id)]) attachment_dict_list = [] @@ -217,22 +220,24 @@ class edi(object): 'content': base64.encodestring(attachment.datas), 'file_name': attachment.datas_fname, }) - ''' Here we are obtaining the release version ''' version = [] - for ver in release.version.split('.'): - version.append(int(ver)) - ''' Here we are converting local time into UTC time''' - UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now() - local_datetime = datetime.datetime.strptime(record.write_date, "%Y-%m-%d %H:%M:%S") - result_utc_datetime = local_datetime - UTC_OFFSET_TIMEDELTA - write_date = result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S") + + for ver in release.major_version.split('.'): + version.append(ver) + data_ids = model_data.search(cr, uid, [('res_id','=',record.id)]) + + if len(data_ids): + xml_obj = model_data.browse(cr,uid,data_ids[0]) + uuid = safe_unique_id(record._name,record.id) + db_uuid = '%s:%s' % (uuid,xml_obj.name) + edi_dict = { '__model' : record._name, '__module' : record._module, - '__id': record.id, - '__last_update': write_date, #TODO: convert into UTC - '__version': version, + '__id': db_uuid, + '__last_update': False, #record.write_date, #TODO: convert into UTC + '__version': version, # ? '__attachments': attachment_dict_list } edi_dict_list.append(edi_dict) @@ -249,10 +254,15 @@ class edi(object): data_object = self.pool.get('ir.model.data') db_uuid = safe_unique_id(record._name, record.id) xml_ids = data_object.search(cr, uid, [('model','=',record._name),('res_id','=',record.id)]) + if xml_ids: xml_id = data_object.browse(cr, uid, xml_ids[0], context=context) xml_id = xml_id.name - db_uuid = '%s:%s' %(db_uuid, xml_id) + else: + xml_id = record._name + db_uuid = '%s:%s' %(db_uuid, xml_id) + + name = record.name return [db_uuid, name] @@ -271,9 +281,12 @@ class edi(object): """ # generic implementation! dict_list = [] + for record in records: + model_obj = self.pool.get(record._name) - dict_list += model_obj.edi_export(cr, uid, [record.id], context=context) + dict_list += model_obj.edi_export(cr, uid, [record], context=context) + return dict_list @@ -291,14 +304,15 @@ class edi(object): """ # generic implementation! dict_list = [] + for record in records: - dict_list.append(self.edi_o2m(cr, uid, record, context=None)) - + dict_list.append(self.edi_o2m(cr, uid, [record], context=None)) + return dict_list - def edi_export(self, cr, uid, ids, edi_struct=None, context=None): + def edi_export(self, cr, uid, records, edi_struct=None, context=None): """Returns a list of dicts representing an edi.document containing the browse_records with ``ids``, using the generic algorithm. :param edi_struct: if provided, edi_struct should be a dictionary @@ -318,32 +332,39 @@ class edi(object): be included in the exported data. """ # generic implementation! + if context is None: context = {} _fields = self.fields_get(cr, uid, context=context) - fields_to_export = edi_struct and edi_struct.keys() or _fields.key() - + fields_to_export = edi_struct and edi_struct.keys() or _fields.keys() edi_dict_list = [] - for row in self.browse(cr, uid, ids, fields_to_export, context): + value = None + for row in records: edi_dict = {} - edi_dict.update(self.edi_metadata(cr, uid, [row.id], context=context)[0]) + edi_dict.update(self.edi_metadata(cr, uid, [row], context=context)[0]) + for field in fields_to_export: - cols = self._fields[field] - if cols['type'] == 'many2one': - m2o_record = row.getattrs(field) - value = self.m2o(cr, uid, m2o_record, context=context) - elif cols['type'] == 'many2many': - m2m_records = row.getattrs(field) - value = self.m2m(cr, uid, m2m_records, context=context) - elif cols['type'] == 'one2many': - o2m_records = row.getattrs(field) - value = self.o2m(cr, uid, o2m_records, context=context) + cols = _fields[field] + if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): + + pass else: - value = row.getattrs(field) + if cols['type'] == 'many2one': + m2o_record = getattr(row, field) + value = self.edi_m2o(cr, uid, m2o_record, context=context) + elif cols['type'] == 'many2many': + m2m_records = getattr(row, field) + value = self.edi_m2m(cr, uid, m2m_records, context=context) + elif cols['type'] == 'one2many': + o2m_records = getattr(row, field) + value = self.edi_o2m(cr, uid, o2m_records, context=context ) + else: + value = getattr(row, field) edi_dict[field] = value edi_dict_list.append(edi_dict) + return edi_dict_list @@ -395,6 +416,19 @@ class edi(object): connect it to the parent record via a write value like (4, db_id). """ # generic implementation! + + def convert(data): + if isinstance(data, unicode): + return str(data) + elif isinstance(data, dict): + return dict(map(convert, data.iteritems())) + elif isinstance(data, (list, tuple, set, frozenset)): + return type(data)(map(convert, data)) + else: + return data + #edi_document = convert(edi_document) + + fields = edi_document.keys() fields_to_import = [] data_line = [] @@ -403,87 +437,115 @@ class edi(object): current_module = 'edi_import' values = {} for field in edi_document.keys(): - if not field.startwith('__'): - field_to_import.append(field) + if field.startswith('__') and field == '__id': + db_uuid, xml_ids = tuple(edi_document[field].split(':')) + + elif not field.startswith('__'): + + + fields_to_import.append(field) edi_field_value = edi_document[field] - if _fields[field]['type'] in ('many2one', 'many2many'): - - if _fields[field]['type'] == 'many2one': - edi_parent_documents = [edi_field_value] - else: - edi_parent_documents = edi_field_value - - parent_lines = [] - - for edi_parent_document in edi_parent_documents: - #Look in ir.model.data for a record that matches the db_id. - #If found, replace the m2o value with the correct database ID and stop. - #If not found, continue to next step - - db_uuid, xml_id = tuple(edi_parent_document[0].split(':')) - data_ids = model_data.name_search(cr, uid, xml_id) - if data_ids: - d = model_data.browse(cr, uid, data_ids[0], context=context) - parent_lines.append(d.res_id) - - else: - #Perform name_search(name) to look for a record that matches the - #given m2o name. If only one record is found, create the missing - #ir.model.data record to link it to the db_id, and the replace the m2o - #value with the correct database ID, then stop. If zero result or - #multiple results are found, go to next step. - #Create the new record using the only field value that is known: the - #name, and create the ir.model.data entry to map to it. - - relation_object = self.get.pool(_fields[field]['relation']) - relation_ids = relation_object.name_search(cr, uid, edi_parent_document[1]) - if relation_ids and len(relation_ids) == 1: - relation_id = relation_ids[0] - else: - relation_id = relation_object.create(cr, uid, {'name': edi_parent_document[1]}, context=context) - model_data.create(cr, uid, { - 'name': xml_id, - 'model': relation_object._name, - #'module':relation_object._module, - 'res_id':relation_id, - },context=context) - - parent_lines.append(relation_id) - - if _fields[field]['type'] == 'many2one': - values[field] = parent_lines[0] - else: - many2many_ids = [] - for m2m_id in parent_lines: - many2many_ids.append((4,m2m_id)) - values[field] = many2many_ids - + if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): - elif _fields[field]['type'] == 'one2many': - #Look for a record that matches the db_id provided in the __id field. If - #found, keep the corresponding database id, and connect it to the parent - #using a write value like (4,db_id). - #If not found via db_id, create a new entry using the same method that - #imports a full EDI record (recursive call!), grab the resulting db id, - #and use it to connect to the parent via a write value like (4, db_id). - - relations = [] - relation_object = self.get.pool(_fields[field]['relation']) - for edi_relation_document in edi_field_value: - db_uuid, xml_id = tuple(edi_relation_document.get('__id').split(':')) - data_ids = model_data.name_search(cr, uid, xml_id) - if data_ids: - d = model_data.browse(cr, uid, data_ids[0], context=context) - relations.append(d.res_id) + pass + else: + if _fields[field]['type'] in ('many2one', 'many2many'): + + if _fields[field]['type'] == 'many2one': + edi_parent_documents = [edi_field_value] + else: + edi_parent_documents = edi_field_value + + parent_lines = [] + + for edi_parent_document in edi_parent_documents: + #Look in ir.model.data for a record that matches the db_id. + #If found, replace the m2o value with the correct database ID and stop. + #If not found, continue to next step + if edi_parent_document[0].find(':') != -1 and edi_parent_document[1] != None: + db_uuid, xml_id = tuple(edi_parent_document[0].split(':')) + data_ids = model_data.name_search(cr, uid, xml_id) + if data_ids: + for data in model_data.browse(cr, uid, [data_ids[0][0]], context=context): + parent_lines.append(data.res_id) + print "..............................................",data.res_id + else: + #Perform name_search(name) to look for a record that matches the + #given m2o name. If only one record is found, create the missing + #ir.model.data record to link it to the db_id, and the replace the m2o + #value with the correct database ID, then stop. If zero result or + #multiple results are found, go to next step. + #Create the new record using the only field value that is known: the + #name, and create the ir.model.data entry to map to it. + + relation_object = self.pool.get(_fields[field]['relation']) + print "parent_document",edi_parent_document[1] + relation_ids = relation_object.search(cr, uid, [('name','=',edi_parent_document[1])]) + if relation_ids and len(relation_ids) == 1: + relation_id = relation_ids[0] + else: + relation_id = relation_object.create(cr, uid, {'name': edi_parent_document[1]}, context=context) + model_data.create(cr, uid, { + 'name': xml_id, + 'model': relation_object._name, + 'module':relation_object._module, + 'res_id':relation_id + }, context=context) + + parent_lines.append(relation_id) + + else: + pass + if len(parent_lines): + if _fields[field]['type'] == 'many2one': + values[field] = parent_lines[0] + + else: + many2many_ids = [] + for m2m_id in parent_lines: + many2many_ids.append((4,m2m_id)) + values[field] = many2many_ids + + + elif _fields[field]['type'] == 'one2many': + #Look for a record that matches the db_id provided in the __id field. If + #found, keep the corresponding database id, and connect it to the parent + #using a write value like (4,db_id). + #If not found via db_id, create a new entry using the same method that + #imports a full EDI record (recursive call!), grab the resulting db id, + #and use it to connect to the parent via a write value like (4, db_id). + + relations = [] + relation_object = self.pool.get(_fields[field]['relation']) + for edi_relation_document in edi_field_value: + '''print "pppppppppppppppppppppppppppppppppppppppppp" + print edi_field_value + print ":::::::::::::::::::::::::::::::::::::::::::::" + print edi_relation_document + print edi_parent_document + print "ppppppppppppppppppppppppppppppppppp" + if edi_relation_document['__id'].find(':') != -1: + db_uuid, xml_id = tuple(edi_relation_document['__id'].split(':')) + print xml_id + data_ids = model_data.name_search(cr, uid, xml_id) + print "dddddddddddddddddddddddddddddddddddddddddddddd",data_ids + if data_ids: + for data in model_data.browse(cr,uid,[data_ids[0][0]]): + relations.append(data.res_id) + else:''' r = relation_object.edi_import(cr, uid, edi_relation_document, context=context) relations.append(r) - one2many_ids = [] - for o2m_id in relations: - one2many_ids.append((4,o2m_id)) - values[field] = one2many_ids - else: - values[field] = edi_field_value + print "relation id ssssssssssssssssssss",relations + one2many_ids = [] + for o2m_id in relations: + one2many_ids.append((4,o2m_id)) + values[field] = one2many_ids + else: + values[field] = edi_field_value + for val in values.keys(): + print '::::::::::::::::::::::',val,'::::::::::;;;;;;;;;;;;;;;;;;;;;;' + print values[val] return model_data._update(cr, uid, self._name, current_module, values, context=context) - +# vim: ts=4 sts=4 sw=4 si et \ No newline at end of file From e60caf7d51b5f86f3597d610708a42ba3eeadbc6 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Tue, 21 Jun 2011 18:49:27 +0530 Subject: [PATCH 017/510] [EDI] revised edi class bzr revid: aar@tinyerp.com-20110621131927-872hkmor321f1gdf --- openerp/addons/base/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index b0c437352f9..bccaf7f660b 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -71,7 +71,7 @@ 'res/partner/wizard/partner_clear_ids_view.xml', 'res/partner/wizard/partner_wizard_ean_check_view.xml', 'res/partner/partner_data.xml', - #'test/test_edi_document.yml', + 'test/test_edi_document.yml', 'res/ir_property_view.xml', 'security/base_security.xml', 'publisher_warranty/publisher_warranty_view.xml', From 395b953f47d1098732aab9999535a8e6bca88329 Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Tue, 21 Jun 2011 18:51:33 +0530 Subject: [PATCH 018/510] [EDI] revised edi class bzr revid: aar@tinyerp.com-20110621132133-g24z7zi1ln16h06d --- openerp/addons/base/test/test_edi_documents.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 openerp/addons/base/test/test_edi_documents.yml diff --git a/openerp/addons/base/test/test_edi_documents.yml b/openerp/addons/base/test/test_edi_documents.yml new file mode 100644 index 00000000000..1b66caaf4dc --- /dev/null +++ b/openerp/addons/base/test/test_edi_documents.yml @@ -0,0 +1,16 @@ +- + Tesing of Export functionality +- + !python {model: ir.edi.document}: | + partner_obj = self.pool.get('res.partner') + partner_ids = partner_obj.search(cr, uid, []) + + if partner_ids: + partners = partner_obj.browse(cr, uid, partner_ids) + tokens = self.export_edi(cr, uid, partners) + print '>>>>>>>>>>',tokens + for token in tokens: + document = self.get_document(cr, uid, token, context=context) + a = self.import_edi(cr, uid, edi_document = document) + print '////////////',a + From 6d4b05e3d4840629fe04bffb75ef078174dfa65b Mon Sep 17 00:00:00 2001 From: "Amit Parmar (OpenERP)" Date: Wed, 22 Jun 2011 14:41:23 +0530 Subject: [PATCH 019/510] [EDI] refactored code of edi class bzr revid: aar@tinyerp.com-20110622091123-6zal2su3vy8nv1nm --- openerp/addons/base/__openerp__.py | 2 +- openerp/addons/base/ir/ir_edi.py | 79 +++---------------- .../addons/base/test/test_edi_documents.yml | 4 +- 3 files changed, 15 insertions(+), 70 deletions(-) diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index bccaf7f660b..6406ec7b716 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -71,7 +71,6 @@ 'res/partner/wizard/partner_clear_ids_view.xml', 'res/partner/wizard/partner_wizard_ean_check_view.xml', 'res/partner/partner_data.xml', - 'test/test_edi_document.yml', 'res/ir_property_view.xml', 'security/base_security.xml', 'publisher_warranty/publisher_warranty_view.xml', @@ -96,6 +95,7 @@ 'test/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules. 'test/test_config_users.yml', 'test/test_ir_values.yml', + 'test/test_edi_documents.yml', ], 'installable': True, diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index fe8320491bf..fa41da161cc 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -20,12 +20,11 @@ ############################################################################## from osv import osv,fields -import simplejson import hashlib +import json import time import base64 import urllib2 -import unicodedata import openerp.release as release def safe_unique_id(model, database_id): """Generate a unique string to represent a (model,database id) pair @@ -82,7 +81,7 @@ class ir_edi_document(osv.osv): perform a JSON serialization of a list of dicts prepared by generate_edi() and return a UTF-8 encoded string that could be passed to deserialize() :param edi_dicts: it's list of edi_dict """ - serialized_list = simplejson.dumps(edi_documents) + serialized_list = json.dumps(edi_documents) return serialized_list def generate_edi(self, cr, uid, records, context=None): @@ -94,7 +93,7 @@ class ir_edi_document(osv.osv): edi_list = [] for record in records: record_model_obj = self.pool.get(record._name) - edi_list += record_model_obj.edi_export(cr, uid, [record],context=context) + edi_list += record_model_obj.edi_export(cr, uid, [record], context=context) return self.serialize(edi_list) def get_document(self, cr, uid, edi_token, context=None): @@ -103,13 +102,12 @@ class ir_edi_document(osv.osv): returns the string serialization that is in the database (column: document) for the given edi_token or raise. """ - records = self.search(cr, uid, [('name','=',edi_token)]) + records = self.name_search(cr, uid, edi_token) if records: - for edi in self.browse(cr, uid, records, context=context): - return edi.document + edi = self.browse(cr, uid, records, context=context) + return edi.document else: pass - def load_edi(self, cr, uid, edi_documents, context=None): """ @@ -132,7 +130,7 @@ class ir_edi_document(osv.osv): """ Deserialized the edi document string perform JSON deserialization from an edi document string, and returns a list of dicts """ - edi_document = simplejson.loads(edi_document_string) + edi_document = json.loads(edi_document_string) return edi_document @@ -173,15 +171,13 @@ class ir_edi_document(osv.osv): if edi_url and not edi_document: edi_document = urllib2.urlopen(edi_url).read() - #assert edi_document, _('EDI Document should be provided') + assert edi_document, _('EDI Document should be provided') else: - edi_documents = self.deserialize(edi_document) return self.load_edi(cr, uid, edi_documents, context=context) ir_edi_document() - class edi(object): _name = 'edi' _description = 'edi document handler' @@ -191,7 +187,6 @@ class edi(object): ``edi_import()`` and ``edi_export()`` methods to implement their specific behavior, based on the primitives provided by this superclass.""" - def edi_metadata(self, cr, uid, records, context=None): """Return a list representing the boilerplate EDI structure for exporting the record in the given browse_rec_list, including @@ -221,11 +216,10 @@ class edi(object): 'file_name': attachment.datas_fname, }) version = [] - for ver in release.major_version.split('.'): version.append(ver) - data_ids = model_data.search(cr, uid, [('res_id','=',record.id)]) + data_ids = model_data.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) if len(data_ids): xml_obj = model_data.browse(cr,uid,data_ids[0]) @@ -261,12 +255,9 @@ class edi(object): else: xml_id = record._name db_uuid = '%s:%s' %(db_uuid, xml_id) - - name = record.name return [db_uuid, name] - def edi_o2m(self, cr, uid, records, context=None): """Return a list representing a O2M EDI value for the browse_records from the given browse_record_list. @@ -289,7 +280,6 @@ class edi(object): return dict_list - def edi_m2m(self, cr, uid, records, context=None): """Return a list representing a M2M EDI value for the browse_records from the given browse_record_list. @@ -310,8 +300,6 @@ class edi(object): return dict_list - - def edi_export(self, cr, uid, records, edi_struct=None, context=None): """Returns a list of dicts representing an edi.document containing the browse_records with ``ids``, using the generic algorithm. @@ -336,19 +324,15 @@ class edi(object): if context is None: context = {} _fields = self.fields_get(cr, uid, context=context) - - fields_to_export = edi_struct and edi_struct.keys() or _fields.keys() edi_dict_list = [] value = None for row in records: edi_dict = {} edi_dict.update(self.edi_metadata(cr, uid, [row], context=context)[0]) - for field in fields_to_export: cols = _fields[field] if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): - pass else: if cols['type'] == 'many2one': @@ -364,10 +348,8 @@ class edi(object): value = getattr(row, field) edi_dict[field] = value edi_dict_list.append(edi_dict) - return edi_dict_list - def edi_import(self, cr, uid, edi_document, context=None): """Imports a list of dicts representing an edi.document, using the @@ -417,18 +399,6 @@ class edi(object): """ # generic implementation! - def convert(data): - if isinstance(data, unicode): - return str(data) - elif isinstance(data, dict): - return dict(map(convert, data.iteritems())) - elif isinstance(data, (list, tuple, set, frozenset)): - return type(data)(map(convert, data)) - else: - return data - #edi_document = convert(edi_document) - - fields = edi_document.keys() fields_to_import = [] data_line = [] @@ -437,23 +407,15 @@ class edi(object): current_module = 'edi_import' values = {} for field in edi_document.keys(): - if field.startswith('__') and field == '__id': - db_uuid, xml_ids = tuple(edi_document[field].split(':')) - - elif not field.startswith('__'): - - + if not field.startswith('__'): fields_to_import.append(field) edi_field_value = edi_document[field] if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): - pass else: if _fields[field]['type'] in ('many2one', 'many2many'): - if _fields[field]['type'] == 'many2one': edi_parent_documents = [edi_field_value] - else: edi_parent_documents = edi_field_value @@ -469,7 +431,6 @@ class edi(object): if data_ids: for data in model_data.browse(cr, uid, [data_ids[0][0]], context=context): parent_lines.append(data.res_id) - print "..............................................",data.res_id else: #Perform name_search(name) to look for a record that matches the #given m2o name. If only one record is found, create the missing @@ -506,8 +467,6 @@ class edi(object): for m2m_id in parent_lines: many2many_ids.append((4,m2m_id)) values[field] = many2many_ids - - elif _fields[field]['type'] == 'one2many': #Look for a record that matches the db_id provided in the __id field. If #found, keep the corresponding database id, and connect it to the parent @@ -519,24 +478,15 @@ class edi(object): relations = [] relation_object = self.pool.get(_fields[field]['relation']) for edi_relation_document in edi_field_value: - '''print "pppppppppppppppppppppppppppppppppppppppppp" - print edi_field_value - print ":::::::::::::::::::::::::::::::::::::::::::::" - print edi_relation_document - print edi_parent_document - print "ppppppppppppppppppppppppppppppppppp" if edi_relation_document['__id'].find(':') != -1: db_uuid, xml_id = tuple(edi_relation_document['__id'].split(':')) - print xml_id data_ids = model_data.name_search(cr, uid, xml_id) - print "dddddddddddddddddddddddddddddddddddddddddddddd",data_ids if data_ids: for data in model_data.browse(cr,uid,[data_ids[0][0]]): relations.append(data.res_id) - else:''' - r = relation_object.edi_import(cr, uid, edi_relation_document, context=context) - relations.append(r) - print "relation id ssssssssssssssssssss",relations + else: + r = relation_object.edi_import(cr, uid, edi_relation_document, context=context) + relations.append(r) one2many_ids = [] for o2m_id in relations: one2many_ids.append((4,o2m_id)) @@ -544,8 +494,5 @@ class edi(object): else: values[field] = edi_field_value - for val in values.keys(): - print '::::::::::::::::::::::',val,'::::::::::;;;;;;;;;;;;;;;;;;;;;;' - print values[val] return model_data._update(cr, uid, self._name, current_module, values, context=context) # vim: ts=4 sts=4 sw=4 si et \ No newline at end of file diff --git a/openerp/addons/base/test/test_edi_documents.yml b/openerp/addons/base/test/test_edi_documents.yml index 1b66caaf4dc..06656800d4f 100644 --- a/openerp/addons/base/test/test_edi_documents.yml +++ b/openerp/addons/base/test/test_edi_documents.yml @@ -4,13 +4,11 @@ !python {model: ir.edi.document}: | partner_obj = self.pool.get('res.partner') partner_ids = partner_obj.search(cr, uid, []) - if partner_ids: partners = partner_obj.browse(cr, uid, partner_ids) tokens = self.export_edi(cr, uid, partners) - print '>>>>>>>>>>',tokens for token in tokens: document = self.get_document(cr, uid, token, context=context) a = self.import_edi(cr, uid, edi_document = document) - print '////////////',a + From b5050763692468b73263455c54b28ad0351bba5c Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 24 Jun 2011 14:16:56 +0530 Subject: [PATCH 020/510] [FIX] add get method in refrence field and check if refrence id not exists then return false. lp bug: https://launchpad.net/bugs/783961 fixed bzr revid: ysa@tinyerp.com-20110624084656-c2jd3xskk10fwt35 --- openerp/osv/fields.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index f55e4b9c027..aa042ca6541 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -148,9 +148,23 @@ class integer_big(_column): class reference(_column): _type = 'reference' + _classic_read = False # post-process to handle missing target + def __init__(self, string, selection, size, **args): _column.__init__(self, string=string, size=size, selection=selection, **args) + def get(self, cr, obj, ids, name, uid=None, context=None, values=None): + result = {} + # copy initial values fetched previously. + for row in values: + result[row['id']] = row[name] + # verify target object exists + for id, value in result.iteritems(): + if value: + model, res_id = value.split(',') + if not obj.pool.get(model).exists(cr, uid, [int(res_id)], context=context): + result[id] = False + return result class char(_column): _type = 'char' From 5ac271fa1fa85fc24a34c76ca5258d45a422955f Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Mon, 27 Jun 2011 13:59:45 +0530 Subject: [PATCH 021/510] [IMP] edi: improve metadata function to create xml record if does not found bzr revid: hmo@tinyerp.com-20110627082945-xtoibwmlsl8187yg --- openerp/addons/base/ir/ir_edi.py | 50 ++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index ad9fd2a2adf..8db5b397116 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -26,6 +26,9 @@ import time import base64 import urllib2 import openerp.release as release + +edi_module = 'edi_import' + def safe_unique_id(model, database_id): """Generate a unique string to represent a (model,database id) pair without being too long, without revealing the database id, and @@ -201,8 +204,9 @@ class edi(object): - __version': a list of components for the version - __attachments': a list (possibly empty) of dicts describing the files attached to this record. """ - # generic implementation! - model_data = self.pool.get('ir.model.data') + if context is None: + context = {} + model_data_pool = self.pool.get('ir.model.data') data_ids = [] attachment_object = self.pool.get('ir.attachment') edi_dict_list = [] @@ -214,6 +218,7 @@ class edi(object): except: pass version.append(ver) + for record in records: attachment_ids = attachment_object.search(cr, uid, [('res_model','=', record._name), ('res_id', '=', record.id)]) attachment_dict_list = [] @@ -225,21 +230,32 @@ class edi(object): }) - data_ids = model_data.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) - + data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) + uuid = safe_unique_id(record._name, record.id) + if len(data_ids): - xml_record = model_data.browse(cr, uid, data_ids[0]) - uuid = safe_unique_id(record._name, record.id) - db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name) - + xml_record_id = data_ids[0] + else: + xml_record_id = model_data_pool.create(cr, uid, { + 'name': uuid, + 'model': record._name, + 'module': edi_module, + 'res_id': record.id}, context=context) + + xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context) + db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name) + edi_dict = { - '__model' : record._name, - '__module' : record._module, '__id': db_uuid, '__last_update': False, #record.write_date, #TODO: convert into UTC - '__version': version, - '__attachments': attachment_dict_list } + if not context.get('o2m_export'): + edi_dict.update({ + '__model' : record._name, + '__module' : record._module, + '__version': version, + '__attachments': attachment_dict_list + }) edi_dict_list.append(edi_dict) return edi_dict_list @@ -278,11 +294,14 @@ class edi(object): """ # generic implementation! dict_list = [] - + if context is None: + context = {} + ctx = context.copy() + ctx.update({'o2m_export':True}) for record in records: model_obj = self.pool.get(record._name) - dict_list += model_obj.edi_export(cr, uid, [record], context=context) + dict_list += model_obj.edi_export(cr, uid, [record], context=ctx) return dict_list @@ -410,7 +429,6 @@ class edi(object): data_line = [] model_data = self.pool.get('ir.model.data') _fields = self.fields_get(cr, uid, context=context) - current_module = 'edi_import' values = {} for field in edi_document.keys(): if not field.startswith('__'): @@ -500,5 +518,5 @@ class edi(object): else: values[field] = edi_field_value - return model_data._update(cr, uid, self._name, current_module, values, context=context) + return model_data._update(cr, uid, self._name, edi_module, values, context=context) # vim: ts=4 sts=4 sw=4 si et From 25dcd09489096441f2588b06db2ad23bab0fd462 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Mon, 27 Jun 2011 17:51:45 +0530 Subject: [PATCH 022/510] [IMP] EDI: introduce new methods in edi class edi_import_relation: create record of relation object if does not match with relation value edi_xml_id: generate xml id with unique db id. create record of ir.model.data if xml id is not found for particular record. bzr revid: hmo@tinyerp.com-20110627122145-v2d2wtkjut68rcba --- openerp/addons/base/ir/ir_edi.py | 74 ++++++++++++++++---------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 8db5b397116..9672b9a2207 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -190,6 +190,22 @@ class edi(object): Classes that inherit from this mixin class should override the ``edi_import()`` and ``edi_export()`` methods to implement their specific behavior, based on the primitives provided by this superclass.""" + + def edi_xml_id(self, cr, uid, record, context=None): + model_data_pool = self.pool.get('ir.model.data') + uuid = safe_unique_id(record._name, record.id) + data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) + if len(data_ids): + xml_record_id = data_ids[0] + else: + xml_record_id = model_data_pool.create(cr, uid, { + 'name': uuid, + 'model': record._name, + 'module': edi_module, + 'res_id': record.id}, context=context) + xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context) + db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name) + return db_uuid def edi_metadata(self, cr, uid, records, context=None): """Return a list representing the boilerplate EDI structure for @@ -206,7 +222,6 @@ class edi(object): """ if context is None: context = {} - model_data_pool = self.pool.get('ir.model.data') data_ids = [] attachment_object = self.pool.get('ir.attachment') edi_dict_list = [] @@ -230,21 +245,7 @@ class edi(object): }) - data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) - uuid = safe_unique_id(record._name, record.id) - - if len(data_ids): - xml_record_id = data_ids[0] - else: - xml_record_id = model_data_pool.create(cr, uid, { - 'name': uuid, - 'model': record._name, - 'module': edi_module, - 'res_id': record.id}, context=context) - - xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context) - db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name) - + db_uuid = self.edi_xml_id(cr, uid, record, context=context) edi_dict = { '__id': db_uuid, '__last_update': False, #record.write_date, #TODO: convert into UTC @@ -267,20 +268,13 @@ class edi(object): Exmaple: ['db-uuid:xml-id', 'Partner Name'] """ # generic implementation! - data_object = self.pool.get('ir.model.data') - db_uuid = safe_unique_id(record._name, record.id) - xml_ids = data_object.search(cr, uid, [('model','=',record._name),('res_id','=',record.id)]) - - if xml_ids: - xml_id = data_object.browse(cr, uid, xml_ids[0], context=context) - xml_id = '%s.%s' %(xml_id.module, xml_id.name) - else: - xml_id = record._name - db_uuid = '%s:%s' %(db_uuid, xml_id) - name = record.name + db_uuid = self.edi_xml_id(cr, uid, record, context=context) + relation_model_pool = self.pool.get(record._name) + name = relation_model_pool.name_get(cr, uid, [record.id], context=context) + name = name and name[0][1] or False return [db_uuid, name] - def edi_o2m(self, cr, uid, records, context=None): + def edi_o2m(self, cr, uid, records, edi_struct=None, context=None): """Return a list representing a O2M EDI value for the browse_records from the given browse_record_list. @@ -301,7 +295,7 @@ class edi(object): for record in records: model_obj = self.pool.get(record._name) - dict_list += model_obj.edi_export(cr, uid, [record], context=ctx) + dict_list += model_obj.edi_export(cr, uid, [record], edi_struct=edi_struct, context=ctx) return dict_list @@ -368,12 +362,22 @@ class edi(object): elif cols['type'] == 'many2many': value = self.edi_m2m(cr, uid, record, context=context) elif cols['type'] == 'one2many': - value = self.edi_o2m(cr, uid, record, context=context ) + value = self.edi_o2m(cr, uid, record, edi_struct=edi_struct.get(field, {}), context=context ) else: value = record edi_dict[field] = value edi_dict_list.append(edi_dict) return edi_dict_list + + def edi_import_relation(self, cr, uid, relation_model, relation_value, values={}, context=None): + relation_object = self.pool.get(relation_model) + relation_ids = relation_object.name_search(cr, uid, relation_value, context=context) + if relation_ids and len(relation_ids) == 1: + relation_id = relation_ids[0][0] + else: + values.update({'name': relation_value}) + relation_id = relation_object.create(cr, uid, values, context=context) + return relation_id def edi_import(self, cr, uid, edi_document, context=None): @@ -465,13 +469,9 @@ class edi(object): #multiple results are found, go to next step. #Create the new record using the only field value that is known: the #name, and create the ir.model.data entry to map to it. - - relation_object = self.pool.get(_fields[field]['relation']) - relation_ids = relation_object.search(cr, uid, [('name','=',edi_parent_document[1])]) - if relation_ids and len(relation_ids) == 1: - relation_id = relation_ids[0] - else: - relation_id = relation_object.create(cr, uid, {'name': edi_parent_document[1]}, context=context) + relation_model = _fields[field]['relation'] + relation_id = self.edi_import_relation(cr, uid, relation_model, edi_parent_document[1], context=context) + relation_object = self.pool.get(relation_model) model_data.create(cr, uid, { 'name': xml_id, 'model': relation_object._name, From 5cc4b243b683f7ecf69b1ae2e18247d82950e50b Mon Sep 17 00:00:00 2001 From: mtr Date: Tue, 28 Jun 2011 17:16:33 +0530 Subject: [PATCH 023/510] [FIX] hr_holidays:-Exception raised on confirmation of leave request is now translated in user's lang. lp bug: https://launchpad.net/bugs/798739 fixed bzr revid: mtr@mtr-20110628114633-78h4k4q3d8jectjo --- addons/hr_holidays/hr_holidays.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 7074fd5cecc..4c000aab968 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -224,14 +224,20 @@ class hr_holidays(osv.osv): return True def holidays_validate(self, cr, uid, ids, *args): - self.check_holidays(cr, uid, ids) + context = {} + lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang + context.update({'lang': lang}) + self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) manager = ids2 and ids2[0] or False return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) def holidays_validate2(self, cr, uid, ids, *args): - self.check_holidays(cr, uid, ids) + context = {} + lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang + context.update({'lang': lang}) + self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) manager = ids2 and ids2[0] or False @@ -277,7 +283,10 @@ class hr_holidays(osv.osv): return True def holidays_confirm(self, cr, uid, ids, *args): - self.check_holidays(cr, uid, ids) + context = {} + lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang + context.update({'lang': lang}) + self.check_holidays(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state':'confirm'}) def holidays_refuse(self, cr, uid, ids, *args): @@ -302,8 +311,10 @@ class hr_holidays(osv.osv): return True - def check_holidays(self, cr, uid, ids): + def check_holidays(self, cr, uid, ids, context=None): holi_status_obj = self.pool.get('hr.holidays.status') + if context is None: + context = {} for record in self.browse(cr, uid, ids): if record.holiday_type == 'employee' and record.type == 'remove': if record.employee_id and not record.holiday_status_id.limit: From 3be8619d32f3ca9ca3859fde34585ccb3f3d3ae8 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Wed, 29 Jun 2011 12:10:37 +0530 Subject: [PATCH 024/510] [IMP] web_service: introduce EDI Services to provide service like get_edi_document, import_edi_document, import_edi_url bzr revid: hmo@tinyerp.com-20110629064037-2wb76qua48m1g2bh --- openerp/service/web_services.py | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 39457807868..37dadc195fb 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -37,6 +37,47 @@ import openerp.modules import locale import logging from cStringIO import StringIO +import threading + +class edi(netsvc.ExportService): + def exp_get_edi_document(self, edi_token): + db_name = getattr(threading.currentThread(), 'dbname', None) + if db_name: + cr = pooler.get_db_only(db_name).cursor() + else: + raise Exception("No database cursor found!") + pool = pooler.get_pool(db_name) + edi_pool = pool.get('ir.edi.document') + return edi_pool.get_document(cr, 1, edi_token) + + def exp_import_edi_document(self, db, uid, passwd, edi_document, context=None): + cr = pooler.get_db_only(db).cursor() + pool = pooler.get_pool(db) + edi_pool = pool.get('ir.edi.document') + return edi_pool.import_edi(cr, uid, edi_document=edi_document, context=context) + + def exp_import_edi_url(self, db, uid, passwd, edi_url, context=None): + cr = pooler.get_db_only(db).cursor() + pool = pooler.get_pool(db) + edi_pool = pool.get('ir.edi.document') + return edi_pool.import_edi(cr, uid, edi_url=edi_url, context=context) + + def __init__(self, name="edi"): + netsvc.ExportService.__init__(self, name) + self.joinGroup("web-services") + + def dispatch(self, method, auth, params): + if method in ['import_edi_document', 'import_edi_url']: + (db, uid, passwd ) = params[0:3] + security.check(db, uid, passwd) + elif method in ['get_edi_document']: + # params = params + # No security check for these methods + pass + else: + raise KeyError("Method not found: %s" % method) + fn = getattr(self, 'exp_'+method) + return fn(*params) class db(netsvc.ExportService): def __init__(self, name="db"): @@ -763,6 +804,7 @@ def start_web_services(): objects_proxy() wizard() report_spool() + edi() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 784b6af17c37b278c30c8b8d14e8ad3be9751abb Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Wed, 29 Jun 2011 15:49:28 +0530 Subject: [PATCH 025/510] [FIX] edi: In export_edi method, edi_struct should be have blank dict if None value bzr revid: hmo@tinyerp.com-20110629101928-djc9hvlm0pmqm362 --- openerp/addons/base/ir/ir_edi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 9672b9a2207..0ee29e13a3a 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -342,6 +342,8 @@ class edi(object): if context is None: context = {} + if edi_struct is None: + edi_struct = {} _fields = self.fields_get(cr, uid, context=context) fields_to_export = edi_struct and edi_struct.keys() or _fields.keys() edi_dict_list = [] From c2ba873ab842a98efa4f12cb9b73784c6fd577bc Mon Sep 17 00:00:00 2001 From: mtr Date: Thu, 30 Jun 2011 14:06:02 +0530 Subject: [PATCH 026/510] [IMP] hr_holidays: improved code for translation using context bzr revid: mtr@mtr-20110630083602-au21nsi3yyw97qnp --- addons/hr_holidays/hr_holidays.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 4c000aab968..3dfc9370ecc 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -224,9 +224,8 @@ class hr_holidays(osv.osv): return True def holidays_validate(self, cr, uid, ids, *args): - context = {} lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context.update({'lang': lang}) + context = {'lang': lang} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -234,9 +233,8 @@ class hr_holidays(osv.osv): return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) def holidays_validate2(self, cr, uid, ids, *args): - context = {} lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context.update({'lang': lang}) + context = {'lang': lang} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -283,9 +281,8 @@ class hr_holidays(osv.osv): return True def holidays_confirm(self, cr, uid, ids, *args): - context = {} lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context.update({'lang': lang}) + context = {'lang': lang} self.check_holidays(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state':'confirm'}) @@ -313,8 +310,6 @@ class hr_holidays(osv.osv): def check_holidays(self, cr, uid, ids, context=None): holi_status_obj = self.pool.get('hr.holidays.status') - if context is None: - context = {} for record in self.browse(cr, uid, ids): if record.holiday_type == 'employee' and record.type == 'remove': if record.employee_id and not record.holiday_status_id.limit: From a7e16487e484cffa2a0b817340808816c2ee139c Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Thu, 30 Jun 2011 14:59:05 +0530 Subject: [PATCH 027/510] [IMP] Hr_holidays: Improve the code by making generic method for context lang get bzr revid: mra@mra-laptop-20110630092905-4ggbh1i7bnm7ibqb --- addons/hr_holidays/hr_holidays.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 3dfc9370ecc..7756e218ce0 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -223,9 +223,12 @@ class hr_holidays(osv.osv): wf_service.trg_create(uid, 'hr.holidays', id, cr) return True - def holidays_validate(self, cr, uid, ids, *args): + def get_user_lang(self, cr, uid, ids): lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context = {'lang': lang} + return {'lang': lang} + + def holidays_validate(self, cr, uid, ids, *args): + context = self.get_user_lang(cr, uid, ids) self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -233,8 +236,7 @@ class hr_holidays(osv.osv): return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) def holidays_validate2(self, cr, uid, ids, *args): - lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context = {'lang': lang} + context = self.get_user_lang(cr, uid, ids) self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -281,8 +283,7 @@ class hr_holidays(osv.osv): return True def holidays_confirm(self, cr, uid, ids, *args): - lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - context = {'lang': lang} + context = self.get_user_lang(cr, uid, ids) self.check_holidays(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state':'confirm'}) From d93d0aa0faf14c043eaf7eebf1e49a1b65a0e16f Mon Sep 17 00:00:00 2001 From: mtr Date: Tue, 5 Jul 2011 12:41:51 +0530 Subject: [PATCH 028/510] [IMP] hr_holidays: passed context as an argument in all the methods() bzr revid: mtr@mtr-20110705071151-lhg6wqbphg9hoysw --- addons/hr_holidays/hr_holidays.py | 39 +++++++++++++------------ addons/hr_holidays/hr_holidays_view.xml | 12 ++++---- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 7756e218ce0..e2cf2a5bace 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -161,7 +161,7 @@ class hr_holidays(osv.osv): leave_ids = obj_res_leave.search(cr, uid, [('holiday_id', 'in', ids)], context=context) return obj_res_leave.unlink(cr, uid, leave_ids) - def onchange_type(self, cr, uid, ids, holiday_type): + def onchange_type(self, cr, uid, ids, holiday_type, context=None): result = {'value': {'employee_id': False}} if holiday_type == 'employee': ids_employee = self.pool.get('hr.employee').search(cr, uid, [('user_id','=', uid)]) @@ -172,7 +172,7 @@ class hr_holidays(osv.osv): return result # TODO: can be improved using resource calendar method - def _get_number_of_days(self, date_from, date_to): + def _get_number_of_days(self, date_from, date_to, context=None): """Returns a float equals to the timedelta between two dates given as string.""" DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" @@ -188,10 +188,12 @@ class hr_holidays(osv.osv): raise osv.except_osv(_('Warning!'),_('You cannot delete a leave which is not in draft state !')) return super(hr_holidays, self).unlink(cr, uid, ids, context) - def onchange_date_from(self, cr, uid, ids, date_to, date_from): + def onchange_date_from(self, cr, uid, ids, date_to, date_from, context=None): result = {} + if context is None: + context = {} if date_to and date_from: - diff_day = self._get_number_of_days(date_from, date_to) + diff_day = self._get_number_of_days(date_from, date_to, context=context) result['value'] = { 'number_of_days_temp': round(diff_day)+1 } @@ -212,7 +214,7 @@ class hr_holidays(osv.osv): } return {'warning': warning} - def set_to_draft(self, cr, uid, ids, *args): + def set_to_draft(self, cr, uid, ids, context=None): self.write(cr, uid, ids, { 'state': 'draft', 'manager_id': False, @@ -223,20 +225,18 @@ class hr_holidays(osv.osv): wf_service.trg_create(uid, 'hr.holidays', id, cr) return True - def get_user_lang(self, cr, uid, ids): - lang = self.pool.get('res.users').browse(cr, uid, uid).context_lang - return {'lang': lang} - - def holidays_validate(self, cr, uid, ids, *args): - context = self.get_user_lang(cr, uid, ids) + def holidays_validate(self, cr, uid, ids, context=None): + if context is None: + context = {} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) manager = ids2 and ids2[0] or False return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) - def holidays_validate2(self, cr, uid, ids, *args): - context = self.get_user_lang(cr, uid, ids) + def holidays_validate2(self, cr, uid, ids, context=None): + if context is None: + context = {} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -282,20 +282,23 @@ class hr_holidays(osv.osv): wf_service.trg_validate(uid, 'hr.holidays', leave_id, 'second_validate', cr) return True - def holidays_confirm(self, cr, uid, ids, *args): - context = self.get_user_lang(cr, uid, ids) + def holidays_confirm(self, cr, uid, ids, context=None): + if context is None: + context = {} self.check_holidays(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state':'confirm'}) - def holidays_refuse(self, cr, uid, ids, *args): + def holidays_refuse(self, cr, uid, ids, context=None): + if context is None: + context = {} obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) manager = ids2 and ids2[0] or False self.write(cr, uid, ids, {'state': 'refuse', 'manager_id2': manager}) - self.holidays_cancel(cr, uid, ids) + self.holidays_cancel(cr, uid, ids, context=context) return True - def holidays_cancel(self, cr, uid, ids, *args): + def holidays_cancel(self, cr, uid, ids, context=None): obj_crm_meeting = self.pool.get('crm.meeting') for record in self.browse(cr, uid, ids): # Delete the meeting diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 608fda554fb..45f8aa8c3f5 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -71,7 +71,7 @@
- + @@ -83,8 +83,8 @@ - - + + @@ -115,7 +115,7 @@ - + @@ -181,8 +181,8 @@ - - + + From 9784142fe7bc141f9695dbf0d6d4ed7d18c08a67 Mon Sep 17 00:00:00 2001 From: mtr Date: Tue, 5 Jul 2011 14:45:25 +0530 Subject: [PATCH 029/510] [IMP] hr_holidays: removed condition checked for context and context passed in xml bzr revid: mtr@mtr-20110705091525-hm0772szzv6xa3zc --- addons/hr_holidays/hr_holidays.py | 10 ---------- addons/hr_holidays/hr_holidays_view.xml | 12 ++++++------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index e2cf2a5bace..2fcd594bee0 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -190,8 +190,6 @@ class hr_holidays(osv.osv): def onchange_date_from(self, cr, uid, ids, date_to, date_from, context=None): result = {} - if context is None: - context = {} if date_to and date_from: diff_day = self._get_number_of_days(date_from, date_to, context=context) result['value'] = { @@ -226,8 +224,6 @@ class hr_holidays(osv.osv): return True def holidays_validate(self, cr, uid, ids, context=None): - if context is None: - context = {} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -235,8 +231,6 @@ class hr_holidays(osv.osv): return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) def holidays_validate2(self, cr, uid, ids, context=None): - if context is None: - context = {} self.check_holidays(cr, uid, ids, context=context) obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) @@ -283,14 +277,10 @@ class hr_holidays(osv.osv): return True def holidays_confirm(self, cr, uid, ids, context=None): - if context is None: - context = {} self.check_holidays(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state':'confirm'}) def holidays_refuse(self, cr, uid, ids, context=None): - if context is None: - context = {} obj_emp = self.pool.get('hr.employee') ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) manager = ids2 and ids2[0] or False diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 45f8aa8c3f5..608fda554fb 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -71,7 +71,7 @@ - + @@ -83,8 +83,8 @@ - - + + @@ -115,7 +115,7 @@ - + @@ -181,8 +181,8 @@ - - + + From 70b65e0922b75901d594ac782b95464d0f0affa1 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Mon, 11 Jul 2011 13:30:17 +0530 Subject: [PATCH 030/510] [IMP+FIX] edi_service: fixed wrong method call to get_db into import_edi_url service and return list of tuple (mobel,record_id) from load_edi function. it will be useful to redirect document after import successful bzr revid: hmo@tinyerp.com-20110711080017-chgth42d2409o81m --- openerp/addons/base/ir/ir_edi.py | 8 ++++---- openerp/service/web_services.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 0ee29e13a3a..b37abbb7747 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -122,13 +122,14 @@ class ir_edi_document(osv.osv): :param edi_dicts: list of edi_dict """ - + res = [] for edi_document in edi_documents: model = edi_document.get('__model') assert model, _('model should be provided in EDI Dict') model_obj = self.pool.get(model) - model_obj.edi_import(cr, uid, edi_document, context=context) - return True + record_id = model_obj.edi_import(cr, uid, edi_document, context=context) + res.append((model,record_id)) + return res def deserialize(self, edi_document_string): """ Deserialized the edi document string @@ -175,7 +176,6 @@ class ir_edi_document(osv.osv): if edi_url and not edi_document: edi_document = urllib2.urlopen(edi_url).read() - assert edi_document, _('EDI Document should be provided') edi_documents = self.deserialize(edi_document) return self.load_edi(cr, uid, edi_documents, context=context) diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 116eefdd1a1..ec2a3c7507e 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -69,7 +69,7 @@ class edi(netsvc.ExportService): def exp_import_edi_url(self, db, uid, passwd, edi_url, context=None): res = None - cr = pooler.get_db_only(db).cursor() + cr = pooler.get_db(db).cursor() pool = pooler.get_pool(db) edi_pool = pool.get('ir.edi.document') try: From 841cc683c6d0fb91f2dde005cc7c42658bd12442 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Mon, 11 Jul 2011 13:56:03 +0530 Subject: [PATCH 031/510] [IMP] edi: yml of edi document bzr revid: hmo@tinyerp.com-20110711082603-56r1dmtfc2h0lxgt --- openerp/addons/base/test/partner.pdf | 118 ++++++++++++++++++ .../addons/base/test/test_edi_documents.yml | 15 ++- 2 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 openerp/addons/base/test/partner.pdf diff --git a/openerp/addons/base/test/partner.pdf b/openerp/addons/base/test/partner.pdf new file mode 100644 index 00000000000..1b1c7f0daac --- /dev/null +++ b/openerp/addons/base/test/partner.pdf @@ -0,0 +1,118 @@ +%PDF-1.3 +% ReportLab Generated PDF document http://www.reportlab.com +% 'BasicFonts': class PDFDictionary +1 0 obj +% The standard fonts dictionary +<< /F1 2 0 R + /F2 3 0 R + /F3 4 0 R >> +endobj +% 'F1': class PDFType1Font +2 0 obj +% Font Helvetica +<< /BaseFont /Helvetica + /Encoding /WinAnsiEncoding + /Name /F1 + /Subtype /Type1 + /Type /Font >> +endobj +% 'F2': class PDFType1Font +3 0 obj +% Font Helvetica-Bold +<< /BaseFont /Helvetica-Bold + /Encoding /WinAnsiEncoding + /Name /F2 + /Subtype /Type1 + /Type /Font >> +endobj +% 'F3': class PDFType1Font +4 0 obj +% Font Times-Roman +<< /BaseFont /Times-Roman + /Encoding /WinAnsiEncoding + /Name /F3 + /Subtype /Type1 + /Type /Font >> +endobj +% 'Page1': class PDFPage +5 0 obj +% Page dictionary +<< /Contents 9 0 R + /MediaBox [ 0 + 0 + 841.8898 + 595.2756 ] + /Parent 8 0 R + /Resources << /Font 1 0 R + /ProcSet [ /PDF + /Text + /ImageB + /ImageC + /ImageI ] >> + /Rotate 0 + /Trans << >> + /Type /Page >> +endobj +% 'R6': class PDFCatalog +6 0 obj +% Document Root +<< /Outlines 10 0 R + /PageMode /UseNone + /Pages 8 0 R + /Type /Catalog >> +endobj +% 'R7': class PDFInfo +7 0 obj +<< /Author (Generated by OpenERP, Fabien Pinckaers) + /CreationDate (20100421145542) + /Keywords () + /Producer (ReportLab http://www.reportlab.com) + /Subject (\(unspecified\)) + /Title (Partner) >> +endobj +% 'R8': class PDFPages +8 0 obj +% page tree +<< /Count 1 + /Kids [ 5 0 R ] + /Type /Pages >> +endobj +% 'R9': class PDFStream +9 0 obj +% page stream +<< /Filter [ /ASCII85Decode + /FlateDecode ] + /Length 524 >> +stream +Gat=(?#P3ie[>S,B2ME\)S7:@oo6@nF8`I+h##OY3a-n#Qm!>5jiD.9pQ@E1#Xj$=)27)F3RmD%fbqZh,T`gJd0/,?A3`0:_VVm`"l`>oOf9p&HGF7>WCGVJoD2&_+c#BDb)/&0>>rL5@]KY$9YOAqZHTJq8k]!o+?4a5\-KbB#NYJC'`~>endstream + +endobj +% 'R10': class PDFOutlines +10 0 obj +<< /Count 0 + /Type /Outlines >> +endobj +xref +0 11 +0000000000 65535 f +0000000113 00000 n +0000000233 00000 n +0000000398 00000 n +0000000573 00000 n +0000000740 00000 n +0000001017 00000 n +0000001152 00000 n +0000001395 00000 n +0000001500 00000 n +0000002169 00000 n +trailer +<< /ID + % ReportLab generated PDF document -- digest (http://www.reportlab.com) + [(\210\344\006bE\230CUUi\010[\)Qif) (\210\344\006bE\230CUUi\010[\)Qif)] + + /Info 7 0 R + /Root 6 0 R + /Size 11 >> +startxref +2221 +%%EOF diff --git a/openerp/addons/base/test/test_edi_documents.yml b/openerp/addons/base/test/test_edi_documents.yml index 85a350bf3a9..03dbe623ede 100644 --- a/openerp/addons/base/test/test_edi_documents.yml +++ b/openerp/addons/base/test/test_edi_documents.yml @@ -1,5 +1,5 @@ - - create partner + I create partner - !record {model: res.partner, id: res_partner_test33}: name: Ivan @@ -17,7 +17,7 @@ company_id: base.main_company - - I am creating one Document to be stored in ". + I am creating one Document to be attached in partner ". - !record {model: 'ir.attachment', id: document_4}: name : "My partner document" @@ -25,7 +25,7 @@ type : binary - - Attach a pdf file in "My partner document" + I attach a pdf file in "My partner document" - !python {model: 'ir.attachment'}: | import addons @@ -34,15 +34,14 @@ self.write(cr, uid, [ref("document_4")], {'res_id':ref("res_partner_test33"), 'datas_fname': 'partner.pdf', 'datas' : base64.encodestring(pdf_file.read())}, context) - - Testing import and export + I am Tesing of EDI functionality. so first export partner and than import it again. - !python {model: ir.edi.document}: | partner_obj = self.pool.get('res.partner') partners = [partner_obj.browse(cr, uid, ref("res_partner_test33"))] tokens = self.export_edi(cr, uid, partners) - for token in tokens: - document = self.get_document(cr, uid, token, context=context) - print document - a = self.import_edi(cr, uid, edi_document = document) + assert tokens, 'Token is not generated.' + document = self.get_document(cr, uid, tokens[0], context=context) + a = self.import_edi(cr, uid, edi_document = document) From db70049e4d4ed37c83d71f3cafc8d5722a27b6ad Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 15 Jul 2011 14:05:09 +0530 Subject: [PATCH 032/510] [ADD] base: add configuration parameter to store web.base.url bzr revid: hmo@tinyerp.com-20110715083509-j0dyh2dq1j9c9t0q --- openerp/addons/base/base_data.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index 3f8208b8ec4..5b9a1e07e7f 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1,6 +1,10 @@ + + web.base.url + http://localhost:8002 + ir.ui.menu.tree ir.ui.menu From 045b42b03a65b6120b2457f8afd64980514fb230 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 15 Jul 2011 14:05:56 +0530 Subject: [PATCH 033/510] [FIX] base.ir_edi: value of function fields should be exported on EDI Document bzr revid: hmo@tinyerp.com-20110715083556-u60zjo42ync4d47w --- openerp/addons/base/ir/ir_edi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index b37abbb7747..208f69dabac 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -356,9 +356,9 @@ class edi(object): record = getattr(row, field) if not record: continue - if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): - # Do not Export Function Fields and related fields - continue + #if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): + # # Do not Export Function Fields and related fields + # continue elif cols['type'] == 'many2one': value = self.edi_m2o(cr, uid, record, context=context) elif cols['type'] == 'many2many': From 1d7eb0cdc25ce45a0d48881f5732f1b010d47ff1 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 15 Jul 2011 15:20:59 +0530 Subject: [PATCH 034/510] [FIX] service: put autocommit true on EDI import service to store imported data bzr revid: hmo@tinyerp.com-20110715095059-96rrh2pu4acevzj4 --- openerp/addons/base/ir/ir_edi.py | 3 +-- openerp/service/web_services.py | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 208f69dabac..7347625c622 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -519,6 +519,5 @@ class edi(object): values[field] = one2many_ids else: values[field] = edi_field_value - - return model_data._update(cr, uid, self._name, edi_module, values, context=context) + return self.pool.get(self._name).create(cr, uid, values, context=context) # vim: ts=4 sts=4 sw=4 si et diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index ec2a3c7507e..58b31ede7ff 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -62,6 +62,7 @@ class edi(netsvc.ExportService): pool = pooler.get_pool(db) edi_pool = pool.get('ir.edi.document') try: + cr.autocommit(True) res = edi_pool.import_edi(cr, uid, edi_document=edi_document, context=context) finally: cr.close() @@ -73,6 +74,7 @@ class edi(netsvc.ExportService): pool = pooler.get_pool(db) edi_pool = pool.get('ir.edi.document') try: + cr.autocommit(True) res = edi_pool.import_edi(cr, uid, edi_url=edi_url, context=context) finally: cr.close() From 69259d01711f41349f251cbc610087c9a3acfc0b Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 15 Jul 2011 16:27:39 +0530 Subject: [PATCH 035/510] [FIX] base.ir_edi: call _update method of ir.model.data on import bzr revid: hmo@tinyerp.com-20110715105739-6vvwjlmghh19pjsu --- openerp/addons/base/ir/ir_edi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 7347625c622..1d13b84aedc 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -519,5 +519,5 @@ class edi(object): values[field] = one2many_ids else: values[field] = edi_field_value - return self.pool.get(self._name).create(cr, uid, values, context=context) + return model_data._update(cr, uid, self._name, edi_module, values, context=context) # vim: ts=4 sts=4 sw=4 si et From 614477f6e92ed35b379b46a74395737b46cd7236 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Mon, 18 Jul 2011 19:11:25 +0530 Subject: [PATCH 036/510] [AAD]purchase_double_validation: add yml for purchase_double_validation_installer.py bzr revid: aag@tinyerp.com-20110718134125-cimkcz05krvlxrfy --- .../purchase_double_validation/__openerp__.py | 1 + .../test/purchase_double_validation_test.yml | 117 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100755 addons/purchase_double_validation/test/purchase_double_validation_test.yml diff --git a/addons/purchase_double_validation/__openerp__.py b/addons/purchase_double_validation/__openerp__.py index 1a10fb5c0ce..803b48a59c0 100644 --- a/addons/purchase_double_validation/__openerp__.py +++ b/addons/purchase_double_validation/__openerp__.py @@ -39,6 +39,7 @@ that exceeds minimum amount set by configuration wizard. 'purchase_double_validation_workflow.xml', 'purchase_double_validation_installer.xml' ], + 'test': ['test/purchase_double_validation_test.yml'], 'demo_xml': [], 'installable': True, 'active': False, diff --git a/addons/purchase_double_validation/test/purchase_double_validation_test.yml b/addons/purchase_double_validation/test/purchase_double_validation_test.yml new file mode 100755 index 00000000000..ecc8d08a493 --- /dev/null +++ b/addons/purchase_double_validation/test/purchase_double_validation_test.yml @@ -0,0 +1,117 @@ +- + I Create new limit amount from Configure Limit Amount for Purchase wizard. +- + !record {model: purchase.double.validation.installer, id: purchase_double_validation_installer_1}: + limit_amount: 3000 +- + Then I set the Limit Amount +- + !python {model: purchase.double.validation.installer}: | + self.execute(cr, uid, [ref("purchase_double_validation_installer_1")]) +- + In order to test the purchase double validation flow,I start by creating a new product 'MOB1' +- + !record {model: product.product, id: product_product_mob1}: + categ_id: 'product.product_category_3' + cost_method: standard + mes_type: fixed + name: MOB1 + price_margin: 2.0 + procure_method: make_to_stock + property_stock_inventory: stock.location_inventory + property_stock_procurement: stock.location_procurement + property_stock_production: stock.location_production + seller_delay: '1' + standard_price: 2000.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 +- + In order to test the purchase double validation flow,I create a new record where "invoice_method" is From Order. +- + Test for purchase double validation in which Total > = Limit Amount. +- + I create purchase order for MOB1 for 3 quantity. +- + !record {model: purchase.order, id: purchase_order_po11}: + company_id: base.main_company + date_order: '2011-01-1' + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: '2011-01-11' + name: MOB1 + price_unit: 2000.0 + product_id: 'product_product_mob1' + product_qty: 3.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_po11}: + - state == 'draft' +- + I confirm the purchase order for MOB1. +- + !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_po11} +- + I check that the order which was initially in the draft state has transmit to confirm state for double validation. +- + !assert {model: purchase.order, id: purchase_order_po11}: + - state == 'confirmed' +- + I Approved purchase order by Supplier for MOB1. +- + !workflow {model: purchase.order, action: purchase_approve, ref: purchase_order_po11} +- + I check that the order which was initially in the confirmed state has transmit to approved state. +- + !assert {model: purchase.order, id: purchase_order_po11}: + - state == 'approved' +- + Test for purchase double validation in which Total < Limit Amount. +- + I create purchase order for MOB1 for 1 quantity. +- + !record {model: purchase.order, id: purchase_order_po12}: + company_id: base.main_company + date_order: '2011-01-02' + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: '2011-01-12' + name: MOB1 + price_unit: 2000.0 + product_id: 'product_product_mob1' + product_qty: 1.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_po12}: + - state == 'draft' +- + I confirm the purchase order for MOB1. +- + !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_po12} +- + I check that the order which was initially in the draft state has transmit to approved state. +- + !assert {model: purchase.order, id: purchase_order_po12}: + - state == 'approved' + + + \ No newline at end of file From 43f07464800836a8da3f3eacd13ddf8dba9e5658 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Mon, 18 Jul 2011 18:17:46 +0200 Subject: [PATCH 037/510] [imp] Added POS category bzr revid: mit@openerp.com-20110718161746-megdu9xb1jeu19g9 --- addons/point_of_sale/point_of_sale.py | 23 +++++++---- addons/point_of_sale/point_of_sale_view.xml | 46 +++++++++++++++++---- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 90bfa975a76..62c5438389f 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -425,15 +425,12 @@ class pos_order(osv.osv): move_obj = self.pool.get('stock.move') pick_name = self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.out') orders = self.browse(cr, uid, ids, context=context) - partner_obj = self.pool.get('res.partner') for order in orders: - addr = order.partner_id and partner_obj.address_get(cr, uid, [order.partner_id.id], ['delivery']) or {} if not order.picking_id: new = True picking_id = picking_obj.create(cr, uid, { 'name': pick_name, 'origin': order.name, - 'address_id': addr.get('delivery',False), 'type': 'out', 'state': 'draft', 'move_type': 'direct', @@ -479,7 +476,6 @@ class pos_order(osv.osv): 'state': 'waiting', 'location_id': location_id, 'location_dest_id': stock_dest_id, - 'prodlot_id': line.prodlot_id and line.prodlot_id.id or False }, context=context) wf_service = netsvc.LocalService("workflow") @@ -650,7 +646,6 @@ class pos_order(osv.osv): 'reference': order.name, 'partner_id': order.partner_id.id, 'comment': order.note or '', - 'currency_id': order.pricelist_id.currency_id.id, # considering partner's sale pricelist's currency } inv.update(inv_ref.onchange_partner_id(cr, uid, [], 'out_invoice', order.partner_id.id)['value']) if not inv.get('account_id', None): @@ -897,13 +892,13 @@ class pos_order(osv.osv): for pos in self.browse(cr, uid, ids, context=context): create_contract_nb = False for line in pos.lines: - if line.product_id.product_type == 'MD': + if line.product_id.type == 'MD': create_contract_nb = True break if create_contract_nb: seq = sequence_obj.get(cr, uid, 'pos.user_%s' % pos.user_salesman_id.login) vals['contract_number'] = '%s-%s' % (pos.user_salesman_id.login, seq) - self.write(cr, uid, ids, vals, context=context) + return self.write(cr, uid, ids, vals, context=context) def action_paid(self, cr, uid, ids, context=None): if context is None: @@ -1149,7 +1144,6 @@ class pos_order_line(osv.osv): 'discount': fields.float('Discount (%)', digits=(16, 2)), 'order_id': fields.many2one('pos.order', 'Order Ref', ondelete='cascade'), 'create_date': fields.datetime('Creation Date', readonly=True), - 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot', help="You can specify Production lot for stock move created when you validate the pos order"), } _defaults = { @@ -1226,6 +1220,15 @@ class pos_order_line(osv.osv): pos_order_line() +class pos_category(osv.osv): + _name = 'pos.category' + _inherit = 'product.category' + _columns = { + 'parent_id': fields.many2one('pos.category','Parent Category', select=True), + 'child_id': fields.one2many('pos.category', 'parent_id', string='Child Categories'), + } +pos_category() + class product_product(osv.osv): _inherit = 'product.product' _columns = { @@ -1233,9 +1236,13 @@ class product_product(osv.osv): 'expense_pdt': fields.boolean('Product for expenses'), 'am_out': fields.boolean('Control for Output Operations'), 'disc_controle': fields.boolean('Discount Control'), + 'img': fields.binary('Pos Image, must be 50x50'), + 'pos_ok': fields.boolean('Can be POS-sold'), + 'pos_categ_id': fields.many2one('pos.category','POS Category', change_default=True, domain="[('type','=','normal')]" ,help="Select a pos category for the current product") } _defaults = { 'disc_controle': True, + 'pos_ok': True, } product_product() diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 1435f6cc2b6..80db7ece330 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -41,7 +41,6 @@ - @@ -89,7 +88,7 @@ - + @@ -639,11 +638,12 @@ form - - - - - + + + + + + @@ -653,16 +653,44 @@ form - - + + + + + + + + + pos.category.tree + pos.category + tree + child_id + + + + + + + + Products by POS-Category + ir.actions.act_window + pos.category + [('parent_id','=',False)] + tree + + Here is a list of all your products classified by POS category. You can click a category to get the list of all products linked to this category or to a child of this category. + + + + product.normal.form.inherit product.product From 3e29dbf440d5d70a00391f441683a532122e370e Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Tue, 19 Jul 2011 11:15:33 +0530 Subject: [PATCH 038/510] [AAD]purchase_requisition: add yml purchase_requisition_test.yml for cover more functionality of module bzr revid: aag@tinyerp.com-20110719054533-64qd1znwp3opsqc2 --- addons/purchase_requisition/__openerp__.py | 4 +- .../test/purchase_requisition_test.yml | 174 ++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) create mode 100755 addons/purchase_requisition/test/purchase_requisition_test.yml diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index 5fd224b14f9..7e15c585803 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -42,7 +42,9 @@ This new object will regroup and will allow you to easily keep track and order a "security/ir.model.access.csv","purchase_requisition_sequence.xml" ], "active": False, - "test":['test/purchase_requisition_report.yml'], + "test":['test/purchase_requisition_report.yml', + 'test/purchase_requisition_test.yml', + ], "installable": True, "certificate" : "001023264099823179629", } diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml new file mode 100755 index 00000000000..3cc0a4bb065 --- /dev/null +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -0,0 +1,174 @@ +- + In order to test the purchase requisition flow,I start by creating a new product 'MOB1' +- + !record {model: product.product, id: product_product_mob1}: + name: MOB1 + categ_id: product.product_category_3 + cost_method: standard + mes_type: fixed + price_margin: 2.0 + procure_method: make_to_stock + property_stock_inventory: stock.location_inventory + property_stock_procurement: stock.location_procurement + property_stock_production: stock.location_production + seller_delay: '1' + standard_price: 2000.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 +- + I create purchase requisition for MOB1 for 1 quantity. +- + !record {model: purchase.requisition, id: purchase_requisition_te0}: + company_id: base.main_company + exclusive: multiple + line_ids: + - company_id: base.main_company + product_id: product_product_mob1 + product_qty: 10.0 + product_uom_id: product.product_uom_unit + name: TE00009 +- + Initially purchase requisition is in draft state. +- + !assert {model: purchase.requisition, id: purchase_requisition_te0}: + - state == 'draft' +- + I confirm the purchase requisition for MOB1. +- + !python {model: purchase.requisition}: | + self.tender_in_progress(cr, uid, [ref("purchase_requisition_te0")]) +- + I check that the purchase requisition which was initially in the draft state has transmit to In Progress after confirm it. +- + !assert {model: purchase.requisition, id: purchase_requisition_te0}: + - state == 'in_progress' +- + I Create a Purchase Order for the supplier 'Axelor'. +- + !record {model: purchase.requisition.partner, id: purchase_requisition_partner_0}: + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_desertic_hispafuentes +- + I create Quotations For supplier 'Axelor'. +- + !python {model: purchase.requisition.partner}: | + self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"active_model": "purchase.requisition", + "active_ids": [ref("purchase_requisition_te0")],"active_id": ref("purchase_requisition_te0"), }) +- + I confirm the purchase order of Axelor. +- + !python {model: purchase.order}: | + req_obj = self.pool.get('purchase.requisition') + ids =req_obj.search(cr, uid, [('name','=','TE00009')]) + purchase_id= self.search(cr, uid, [('requisition_id','in',ids)]) + import netsvc + wf_service = netsvc.LocalService("workflow") + if purchase_id: + wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_confirm', cr) + wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_approve', cr) +- + I check that Quotation of Axelor is Approved. +- + !python {model: purchase.order}: | + req_obj = self.pool.get('purchase.requisition') + ids =req_obj.search(cr, uid,[('name','=','TE00009')]) + purchase_id= self.search(cr, uid, [('requisition_id','in',ids)])[0] + state=self.browse(cr,uid,purchase_id).state + assert (state=='approved') +- + I click on Done button +- + !python {model: purchase.requisition}: | + self.tender_done(cr, uid, [ref("purchase_requisition_te0")],) +- + I check that after click on Done button state is in done. +- + !assert {model: purchase.requisition, id: purchase_requisition_te0}: + - state == 'done' +- + In order to test the purchase requisition flow for Requisition Type is exclusive +- + I create purchase requisition for Requisition Type is exclusive +- + !record {model: purchase.requisition, id: purchase_requisition_ex1}: + company_id: base.main_company + exclusive: exclusive + line_ids: + - company_id: base.main_company + product_id: product_product_mob1 + product_qty: 10.0 + product_uom_id: product.product_uom_unit + name: TE000010 +- + I Create a First Purchase Order for the supplier 'DistriPC'. +- + !record {model: purchase.requisition.partner, id: purchase_requisition_partner_1}: + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 +- + I create Quotations For supplier 'DistriPC'. +- + !python {model: purchase.requisition.partner}: | + self.create_order(cr, uid, [ref("purchase_requisition_partner_1")], {"active_model": "purchase.requisition", + "active_ids": [ref("purchase_requisition_ex1")],"active_id": ref("purchase_requisition_ex1"), }) +- + I Create a Second Purchase Order for the supplier ASUStek. +- + !record {model: purchase.requisition.partner, id: purchase_requisition_partner_2}: + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_asus +- + I create Quotations For supplier 'ASUStek'. +- + !python {model: purchase.requisition.partner}: | + self.create_order(cr, uid, [ref("purchase_requisition_partner_2")], {"active_model": "purchase.requisition", + "active_ids": [ref("purchase_requisition_ex1")],"active_id": ref("purchase_requisition_ex1"), }) +- + I check that Initially purchase requisition is draft state. +- + !assert {model: purchase.requisition, id: purchase_requisition_ex1}: + - state == 'draft' +- + I confirm the Second purchase order of ASUStek. +- + !python {model: purchase.order}: | + partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','ASUStek')])[0] + req_obj = self.pool.get('purchase.requisition') + ids =req_obj.search(cr, uid, [('name','=','TE000010')]) + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)]) + import netsvc + wf_service = netsvc.LocalService("workflow") + if purchase_id: + wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_confirm', cr) + wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_approve', cr) +- + I check that Quotation of ASUStek is Approved. +- + !python {model: purchase.order}: | + partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','ASUStek')])[0] + req_obj = self.pool.get('purchase.requisition') + ids =req_obj.search(cr, uid,[('name','=','TE000010')]) + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] + state=self.browse(cr,uid,purchase_id).state + assert (state=='approved') +- + I check that Quotation of DistriPC is cancelled. +- + !python {model: purchase.order}: | + partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','Distrib PC')])[0] + req_obj = self.pool.get('purchase.requisition') + ids =req_obj.search(cr, uid,[('name','=','TE000010')]) + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] + state=self.browse(cr,uid,purchase_id).state + assert (state=='cancel') +- + I check that Purchase Requisition is Done. +- + !assert {model: purchase.requisition, id: purchase_requisition_ex1}: + - state == 'done' \ No newline at end of file From 6dc6b8dddc246c05afc4254bfcdde8a68bc0415e Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 21 Jul 2011 17:28:17 +0530 Subject: [PATCH 039/510] [AAD]purchase: add yml purchase_order_merge.yml for cover more functionality of merging PO bzr revid: aag@tinyerp.com-20110721115817-io4fomevc9v8egwk --- addons/purchase/__openerp__.py | 1 + addons/purchase/test/purchase_order_merge.yml | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 addons/purchase/test/purchase_order_merge.yml diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index 1fb49198404..d52c84ceedf 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -65,6 +65,7 @@ Dashboard for purchase management that includes: 'purchase_unit_test.xml', 'test/procurement_buy.yml', 'test/purchase_report.yml', + 'test/purchase_order_merge.yml' ], 'demo': ['purchase_demo.xml'], 'installable': True, diff --git a/addons/purchase/test/purchase_order_merge.yml b/addons/purchase/test/purchase_order_merge.yml new file mode 100644 index 00000000000..fab75f63037 --- /dev/null +++ b/addons/purchase/test/purchase_order_merge.yml @@ -0,0 +1,85 @@ +- + In order to test to merge two purchase order,I start by creating a new product 'Nokia3110c' +- + !record {model: product.product, id: product_product_nokia3110c}: + categ_id: 'product.product_category_3' + cost_method: standard + mes_type: fixed + name: NOKIA 3110c + price_margin: 1.0 + procure_method: make_to_order + property_stock_inventory: stock.location_inventory + property_stock_procurement: stock.location_procurement + property_stock_production: stock.location_production + seller_delay: '1' + standard_price: 5000.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 +- + In order to test the merge purchase order flow,I create a new record where "invoice_method" is From Order. +- + I create first purchase order for Nokia3110c. +- + !record {model: purchase.order, id: purchase_order_po_nokia1}: + company_id: base.main_company + date_order: !eval time.strftime('%Y-%m-%d') + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: !eval time.strftime('%Y-%m-%d') + name: NOKIA 3110c + price_unit: 100.0 + product_id: 'product_product_nokia3110c' + product_qty: 10.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially first purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_po_nokia1}: + - state == 'draft' +- + I create second purchase order for Nokia3110c with same supplier,have same stock location, same pricelist as First Purchase order of Nokia3110. +- + !record {model: purchase.order, id: purchase_order_po_nokia2}: + company_id: base.main_company + date_order: !eval time.strftime('%Y-%m-%d') + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: !eval time.strftime('%Y-%m-%d') + name: NOKIA 3110c + price_unit: 100.0 + product_id: 'product_product_nokia3110c' + product_qty: 20.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially second purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_po_nokia2}: + - state == 'draft' +- + I have merged first and second purchase order which are in draft state, belong to the same supplier,have same stock location, same pricelist. +- + !python {model: purchase.order.group}: | + pur_obj=self.pool.get('purchase.order') + pur_id11=pur_obj.browse(cr, uid, ref("purchase_order_po_nokia1")) + pur_id1=pur_id11.id + pur_id22=pur_obj.browse(cr, uid, ref("purchase_order_po_nokia2")) + pur_id2=pur_id22.id + ids = [pur_id1,pur_id2] + self.fields_view_get(cr, uid, context={'active_ids': ids}) + self.merge_orders(cr, uid, [1], context={'active_ids': ids}) From 5b9d4e1c76cd7f48ca29c80563f883490c422191 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 28 Jul 2011 15:10:42 +0530 Subject: [PATCH 040/510] [IMP]purchase: Change Expected Date in Purchase order . bzr revid: aag@tinyerp.com-20110728094042-8k06xmajr9xp1w5x --- addons/purchase/test/purchase_from_order.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addons/purchase/test/purchase_from_order.yml b/addons/purchase/test/purchase_from_order.yml index 3acc68cb51b..cb2fe88f841 100644 --- a/addons/purchase/test/purchase_from_order.yml +++ b/addons/purchase/test/purchase_from_order.yml @@ -51,6 +51,17 @@ I confirm the purchase order for iPod. - !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_po0} +- + I changed Expected Date to Next Day. +- + !python {model: purchase.order}: | + from tools.translate import _ + import time + from datetime import datetime + from dateutil.relativedelta import relativedelta + next_day = datetime.today() + relativedelta(days=1) + purod_id=self.browse(cr, uid, ref("purchase_order_po0")) + self._set_minimum_planned_date(cr, uid, purod_id.id, 'minimum_planned_date', next_day.strftime('%Y-%m-%d'),None ) - I check that the order which was initially in the draft state has transit to confirm state. - From 9f104b52e3dc16400b2f0ec7d25a1ec9e03e0d30 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 28 Jul 2011 18:38:00 +0530 Subject: [PATCH 041/510] [ADD]purchase: Add yml for Purchase Order cancel from Aproved state. bzr revid: aag@tinyerp.com-20110728130800-ti3360jmmncbg8jh --- addons/purchase/__openerp__.py | 5 +- .../test/purchase_order_cancel_draft.yml | 94 +++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 addons/purchase/test/purchase_order_cancel_draft.yml diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index d52c84ceedf..827d2a4971e 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -65,8 +65,9 @@ Dashboard for purchase management that includes: 'purchase_unit_test.xml', 'test/procurement_buy.yml', 'test/purchase_report.yml', - 'test/purchase_order_merge.yml' - ], + 'test/purchase_order_merge.yml', + 'test/purchase_order_cancel_draft.yml' + ], 'demo': ['purchase_demo.xml'], 'installable': True, 'active': False, diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml new file mode 100644 index 00000000000..b1c8b6ef938 --- /dev/null +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -0,0 +1,94 @@ +- + In order to test to Cancel purchase order from Approved State,I start by creating a new product 'Pen Drive1' +- + !record {model: product.product, id: product_product_pendrive1}: + categ_id: 'product.product_category_3' + cost_method: standard + mes_type: fixed + name: Pen Drive + price_margin: 1.0 + procure_method: make_to_order + property_stock_inventory: stock.location_inventory + property_stock_procurement: stock.location_procurement + property_stock_production: stock.location_production + seller_delay: '1' + standard_price: 500.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 +- + In order to test the purchase order flow,I create a new record where "invoice_method" is From Order. +- + I create first purchase order for Pen Drive1. +- + !record {model: purchase.order, id: purchase_order_pendrive1}: + company_id: base.main_company + date_order: !eval time.strftime('%Y-%m-%d') + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: !eval time.strftime('%Y-%m-%d') + name: Pen Drive + price_unit: 100.0 + product_id: 'product_product_pendrive1' + product_qty: 10.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_pendrive1}: + - state == 'draft' +- + I confirm the purchase order for Pen Drive1. +- + !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_pendrive1} +- + I check that the order which was initially in the draft state has transmit to confirm state. +- + !assert {model: purchase.order, id: purchase_order_pendrive1}: + - state == 'approved' +- + I have to first cancel Picking of Approved Perchase order . +- + !python {model: stock.picking}: | + from tools.translate import _ + pur_ord=self.pool.get( 'purchase.order') + name = pur_ord.browse(cr, uid, ref("purchase_order_pendrive1")).name + search_ids=self.search(cr, uid, [('origin', '=', name) ]) + self.action_cancel(cr, uid, search_ids) +- + Now I have to cancel confirm purchase order for Pen Drive1. +- + !python {model: purchase.order}: | + from tools.translate import _ + ids = [] + ids.append(ref("purchase_order_pendrive1")) + self.action_cancel(cr, uid, ids) +- + I check that the order which was in approved state has transmit to cancel state. +- + !assert {model: purchase.order, id: purchase_order_pendrive1}: + - state == 'cancel' +- + Now again set purchase order for Pen Drive1 to draft state. +- + !python {model: purchase.order}: | + from tools.translate import _ + ids = [] + ids.append(ref("purchase_order_pendrive1")) + self.action_cancel_draft(cr, uid, ids) +- + I check that the order which was in cancel state has transmit to draft state. +- + !assert {model: purchase.order, id: purchase_order_pendrive1}: + - state == 'draft' + \ No newline at end of file From 30c2c2e997f4f716b7e154adcc420b31eb9d8e1c Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 29 Jul 2011 16:15:40 +0530 Subject: [PATCH 042/510] [IMP]purchase: Add Functionality to test onchange Warehouse id , product_id, uom_id bzr revid: aag@tinyerp.com-20110729104540-9a2pvv34rw1rm8yk --- .../test/purchase_order_cancel_draft.yml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index b1c8b6ef938..ad8eb1d3508 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -21,6 +21,29 @@ warranty: 0.0 weight: 0.0 weight_net: 0.0 +- + Create second new product 'Pen Drive2' +- + !record {model: product.product, id: product_product_pendrive2}: + categ_id: 'product.product_category_3' + cost_method: standard + mes_type: fixed + name: Pen Drive 2 + price_margin: 1.0 + procure_method: make_to_order + property_stock_inventory: stock.location_inventory + property_stock_procurement: stock.location_procurement + property_stock_production: stock.location_production + seller_delay: '1' + standard_price: 500.0 + supply_method: buy + type: product + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 - In order to test the purchase order flow,I create a new record where "invoice_method" is From Order. - @@ -47,6 +70,27 @@ - !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' +- + I test onchanged on Wharehouse ,Product , Uom . +- + !python {model: purchase.order}: | + from tools.translate import _ + ids = [] + ids.append(ref("purchase_order_pendrive1")) + self.onchange_warehouse_id(cr, uid, ids , 1) + part_obj = self.pool.get('res.partner') + price_obj = self.pool.get('product.pricelist') + product_obj = self.pool.get('product.product') + addrss_obj = self.pool.get('res.partner.address') + po_line_obj = self.pool.get('purchase.order.line') + uom_obj = self.pool.get('product.uom') + price_id = price_obj.search(cr, uid, [('name','=','Default Purchase Pricelist')]) + product_id = product_obj.search(cr, uid, [('name','=','Pen Drive 2')]) + uom_id = uom_obj.search(cr, uid, [('name','=','PCE')]) + part_ids = part_obj.search(cr, uid, [('name','=','Distrib PC')]) + line_id = po_line_obj.search(cr, uid, [('order_id','=',ids[0])]) + po_line_obj.product_id_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) + po_line_obj.product_uom_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) - I confirm the purchase order for Pen Drive1. - From e34cb5bc84d3cef25a1544e93ff1a1a59caebea4 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 29 Jul 2011 16:36:41 +0530 Subject: [PATCH 043/510] [IMP]purchase: Add Functionality to test onchange Destination Address and Unlink PO bzr revid: aag@tinyerp.com-20110729110641-g37tzvesaidhy2uq --- addons/purchase/test/purchase_order_cancel_draft.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index ad8eb1d3508..0bae780348c 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -71,7 +71,7 @@ !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' - - I test onchanged on Wharehouse ,Product , Uom . + I test onchanged on Wharehouse ,Product, Uom, Destination Address . - !python {model: purchase.order}: | from tools.translate import _ @@ -91,6 +91,8 @@ line_id = po_line_obj.search(cr, uid, [('order_id','=',ids[0])]) po_line_obj.product_id_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) po_line_obj.product_uom_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) + address_id = addrss_obj.search(cr, uid, [('partner_id','=',part_ids)]) + self.onchange_dest_address_id(cr, uid, ids, address_id[0]) - I confirm the purchase order for Pen Drive1. - @@ -135,4 +137,12 @@ - !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' +- + I test for Delete Perchase order in Draft state. +- + !python {model: purchase.order}: | + from tools.translate import _ + ids = [] + ids.append(ref("purchase_order_pendrive1")) + self.unlink(cr, uid, ids) \ No newline at end of file From 4564c11b9948439ec4ce502c6378aaa07bfb6160 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 29 Jul 2011 17:00:46 +0530 Subject: [PATCH 044/510] [IMP]purchase: Add Functionality to test copy Purchase order bzr revid: aag@tinyerp.com-20110729113046-s9gcm17noc4snu9y --- addons/purchase/test/purchase_order_cancel_draft.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 0bae780348c..662467b8bfb 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -138,11 +138,12 @@ !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' - - I test for Delete Perchase order in Draft state. + I test for Copy and Delete Perchase order in Draft state. - !python {model: purchase.order}: | from tools.translate import _ ids = [] ids.append(ref("purchase_order_pendrive1")) + self.copy(cr, uid, ids[0]) self.unlink(cr, uid, ids) \ No newline at end of file From fedd3f9b7816d9f4337338a16ec48bbe2e16180d Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Thu, 11 Aug 2011 00:28:49 +0200 Subject: [PATCH 045/510] Some field cleanup bzr revid: mit@openerp.com-20110810222849-hksoumxf7dmvnigk --- addons/point_of_sale/point_of_sale.py | 3 --- addons/point_of_sale/point_of_sale_view.xml | 3 --- addons/point_of_sale/report/pos_receipt.rml | 1 - 3 files changed, 7 deletions(-) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 62c5438389f..0f86030500c 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -287,7 +287,6 @@ class pos_order(osv.osv): 'nb_print': fields.integer('Number of Print', readonly=True), 'sale_journal': fields.many2one('account.journal', 'Journal', required=True, states={'draft': [('readonly', False)]}, readonly=True), 'invoice_wanted': fields.boolean('Create Invoice'), - 'note_2': fields.char('Customer Note', size=64), 'type_rec': fields.char('Type of Receipt', size=64), 'remboursed': fields.boolean('Remboursed'), 'contract_number': fields.char('Contract Number', size=512, select=1), @@ -1237,12 +1236,10 @@ class product_product(osv.osv): 'am_out': fields.boolean('Control for Output Operations'), 'disc_controle': fields.boolean('Discount Control'), 'img': fields.binary('Pos Image, must be 50x50'), - 'pos_ok': fields.boolean('Can be POS-sold'), 'pos_categ_id': fields.many2one('pos.category','POS Category', change_default=True, domain="[('type','=','normal')]" ,help="Select a pos category for the current product") } _defaults = { 'disc_controle': True, - 'pos_ok': True, } product_product() diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 80db7ece330..64286d82acc 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -653,9 +653,6 @@ form - - - diff --git a/addons/point_of_sale/report/pos_receipt.rml b/addons/point_of_sale/report/pos_receipt.rml index b9da3f5e9a6..ea40450421a 100644 --- a/addons/point_of_sale/report/pos_receipt.rml +++ b/addons/point_of_sale/report/pos_receipt.rml @@ -165,6 +165,5 @@ - [[o.note_2]] From a7a52fe5f4793c8ea999cfefad2ce906cf40fc39 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 12 Aug 2011 15:39:14 +0530 Subject: [PATCH 046/510] [ADD] Product: Add product_test yml bzr revid: aag@tinyerp.com-20110812100914-sumunc1837xqp9zf --- addons/product/__openerp__.py | 2 +- addons/product/test/product_test.yml | 51 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 addons/product/test/product_test.yml diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py index bcddcc93bdf..b05ba4d3a25 100644 --- a/addons/product/__openerp__.py +++ b/addons/product/__openerp__.py @@ -61,7 +61,7 @@ Print product labels with barcode. 'partner_view.xml', 'process/product_process.xml' ], - 'test':['test/product_report.yml'], + 'test':['test/product_report.yml','test/product_test.yml'], 'installable': True, 'active': False, 'certificate': '0068861431437', diff --git a/addons/product/test/product_test.yml b/addons/product/test/product_test.yml new file mode 100644 index 00000000000..dcf83cb9740 --- /dev/null +++ b/addons/product/test/product_test.yml @@ -0,0 +1,51 @@ +- + In order to test product,I start by creating a Category +- + !record {model: product.category, id: product_category_suger}: + name: vehicle + type: normal +- + I create a 20KG UOM for 'Suger' +- + !record {model: product.uom, id: product_20k_uom_suger}: + name: 20KG + uom_type: bigger + category_id: 2 + rounding: 0.010 + factor_inv: 20 +- + I create a 10KG UOM for 'Suger' +- + !record {model: product.uom, id: product_10k_uom_suger}: + name: 10KG + uom_type: bigger + category_id: 2 + rounding: 0.010 + factor_inv: 10 +- + I create a new product 'Suger' +- + !record {model: product.product, id: product_suger_id1}: + categ_id: 'product.product_category_suger' + cost_method: standard + name: Cycle + procure_method: make_to_order + seller_delay: '1' + standard_price: 400.0 + uom_id: product.product_20k_uom_suger + uom_po_id: product.product_20k_uom_suger + volume: 0.0 + warranty: 0.0 + weight: 0.0 + weight_net: 0.0 +- + I test onchanged on Uom, Create Dublicate Product and Delete original Product. +- + !python {model: product.product}: | + from tools.translate import _ + ids = [] + ids.append(ref("product_suger_id1")) + self.onchange_uom(cr ,uid, ids, ref("product.product_20k_uom_suger"), ref("product_10k_uom_suger")) + self.copy(cr, uid, ids[0]) + self.unlink(cr, uid, ids) +- \ No newline at end of file From abb387c4cf74991ec79ff3b565b5369e8fac9503 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 12 Aug 2011 16:39:12 +0530 Subject: [PATCH 047/510] [IMP] Purchase: Optimize Purcase Code for merging PO bzr revid: aag@tinyerp.com-20110812110912-7iqg5lu5s3xw183f --- addons/purchase/test/purchase_order_merge.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/addons/purchase/test/purchase_order_merge.yml b/addons/purchase/test/purchase_order_merge.yml index fab75f63037..61555806d88 100644 --- a/addons/purchase/test/purchase_order_merge.yml +++ b/addons/purchase/test/purchase_order_merge.yml @@ -75,11 +75,6 @@ I have merged first and second purchase order which are in draft state, belong to the same supplier,have same stock location, same pricelist. - !python {model: purchase.order.group}: | - pur_obj=self.pool.get('purchase.order') - pur_id11=pur_obj.browse(cr, uid, ref("purchase_order_po_nokia1")) - pur_id1=pur_id11.id - pur_id22=pur_obj.browse(cr, uid, ref("purchase_order_po_nokia2")) - pur_id2=pur_id22.id - ids = [pur_id1,pur_id2] + ids = [ref("purchase_order_po_nokia1"),ref("purchase_order_po_nokia2")] self.fields_view_get(cr, uid, context={'active_ids': ids}) self.merge_orders(cr, uid, [1], context={'active_ids': ids}) From cbb1d53ac8178f5211da46e6b91fcc2adbcf8083 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 12 Aug 2011 16:44:24 +0530 Subject: [PATCH 048/510] [IMP] Purchase: Optimize Purcase Code for From Order yml bzr revid: aag@tinyerp.com-20110812111424-37eumzycikt8jdk8 --- addons/purchase/test/purchase_from_order.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/purchase/test/purchase_from_order.yml b/addons/purchase/test/purchase_from_order.yml index cb2fe88f841..4e72079b3be 100644 --- a/addons/purchase/test/purchase_from_order.yml +++ b/addons/purchase/test/purchase_from_order.yml @@ -60,8 +60,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta next_day = datetime.today() + relativedelta(days=1) - purod_id=self.browse(cr, uid, ref("purchase_order_po0")) - self._set_minimum_planned_date(cr, uid, purod_id.id, 'minimum_planned_date', next_day.strftime('%Y-%m-%d'),None ) + self._set_minimum_planned_date(cr, uid, ref("purchase_order_po0"), 'minimum_planned_date', next_day.strftime('%Y-%m-%d'),None ) - I check that the order which was initially in the draft state has transit to confirm state. - From 9013acbe9033d3ae2c86caa43c20f494431a68a4 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 12 Aug 2011 17:00:22 +0530 Subject: [PATCH 049/510] [IMP] Purchase: Optimize purchase_order_cancel_draft yml bzr revid: aag@tinyerp.com-20110812113022-9bvodza62zjt1j6d --- .../purchase/test/purchase_order_cancel_draft.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 662467b8bfb..6065e34994f 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -116,9 +116,7 @@ - !python {model: purchase.order}: | from tools.translate import _ - ids = [] - ids.append(ref("purchase_order_pendrive1")) - self.action_cancel(cr, uid, ids) + self.action_cancel(cr, uid, [ref("purchase_order_pendrive1")]) - I check that the order which was in approved state has transmit to cancel state. - @@ -129,9 +127,7 @@ - !python {model: purchase.order}: | from tools.translate import _ - ids = [] - ids.append(ref("purchase_order_pendrive1")) - self.action_cancel_draft(cr, uid, ids) + self.action_cancel_draft(cr, uid, [ref("purchase_order_pendrive1")]) - I check that the order which was in cancel state has transmit to draft state. - @@ -142,8 +138,6 @@ - !python {model: purchase.order}: | from tools.translate import _ - ids = [] - ids.append(ref("purchase_order_pendrive1")) - self.copy(cr, uid, ids[0]) - self.unlink(cr, uid, ids) + self.copy(cr, uid, ref("purchase_order_pendrive1")) + self.unlink(cr, uid, [ref("purchase_order_pendrive1")]) \ No newline at end of file From 9e5c84fd2ae393a5d68d7e9bf74c1bcd8c649fbc Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Fri, 12 Aug 2011 17:14:12 +0530 Subject: [PATCH 050/510] [IMP] Purchase: Optimize purchase_order_cancel_draft yml Again bzr revid: aag@tinyerp.com-20110812114412-1zi5v8ueg4jxx0d6 --- addons/purchase/test/purchase_order_cancel_draft.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 6065e34994f..c31ba7ce68c 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -75,9 +75,7 @@ - !python {model: purchase.order}: | from tools.translate import _ - ids = [] - ids.append(ref("purchase_order_pendrive1")) - self.onchange_warehouse_id(cr, uid, ids , 1) + self.onchange_warehouse_id(cr, uid, [ref("purchase_order_pendrive1")], 1) part_obj = self.pool.get('res.partner') price_obj = self.pool.get('product.pricelist') product_obj = self.pool.get('product.product') @@ -88,11 +86,11 @@ product_id = product_obj.search(cr, uid, [('name','=','Pen Drive 2')]) uom_id = uom_obj.search(cr, uid, [('name','=','PCE')]) part_ids = part_obj.search(cr, uid, [('name','=','Distrib PC')]) - line_id = po_line_obj.search(cr, uid, [('order_id','=',ids[0])]) + line_id = po_line_obj.search(cr, uid, [('order_id','=',ref("purchase_order_pendrive1"))]) po_line_obj.product_id_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) po_line_obj.product_uom_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) address_id = addrss_obj.search(cr, uid, [('partner_id','=',part_ids)]) - self.onchange_dest_address_id(cr, uid, ids, address_id[0]) + self.onchange_dest_address_id(cr, uid, [ref("purchase_order_pendrive1")], address_id[0]) - I confirm the purchase order for Pen Drive1. - From 7417f09da100f46f77dc78d75af3ef5b69d5ff1e Mon Sep 17 00:00:00 2001 From: "Hardik Ansodariy (OpenERP)" Date: Fri, 19 Aug 2011 18:54:22 +0530 Subject: [PATCH 051/510] [IMP]: made changes and removed unwanted code bzr revid: han@tinyerp.com-20110819132422-5frpi82rdhczpykb --- openerp/addons/base/ir/ir_edi.py | 18 +++++++++++++----- openerp/addons/base/res/partner/partner.py | 4 ++-- openerp/service/web_services.py | 6 ++---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 225df8d9944..44d6d8f4303 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -26,6 +26,8 @@ import time import base64 import urllib2 import openerp.release as release +from tools.translate import _ +import netsvc edi_module = 'edi_import' @@ -122,13 +124,19 @@ class ir_edi_document(osv.osv): :param edi_dicts: list of edi_dict """ + module_obj =self.pool.get('ir.module.module') res = [] for edi_document in edi_documents: - model = edi_document.get('__model') - assert model, _('model should be provided in EDI Dict') - model_obj = self.pool.get(model) - record_id = model_obj.edi_import(cr, uid, edi_document, context=context) - res.append((model,record_id)) + module = edi_document.get('__module') + module_id = module_obj.search(cr, uid, [('name','=',module),('state','=','installed')]) + if module_id: + model = edi_document.get('__model') + assert model, _('model should be provided in EDI Dict') + model_obj = self.pool.get(model) + record_id = model_obj.edi_import(cr, uid, edi_document, context=context) + res.append((model,record_id)) + else: + raise osv.except_osv(_('Invalid action !'), _('Module is not Installed')) return res def deserialize(self, edi_document_string): diff --git a/openerp/addons/base/res/partner/partner.py b/openerp/addons/base/res/partner/partner.py index de8fce3c5e9..e1e71f4996d 100644 --- a/openerp/addons/base/res/partner/partner.py +++ b/openerp/addons/base/res/partner/partner.py @@ -111,7 +111,7 @@ class res_partner(osv.osv): _order = "name" _columns = { 'name': fields.char('Name', size=128, required=True, select=True), - 'opt_out':fields.boolean('Opt-out'), + 'opt_out':fields.boolean('Opt-out', help='After enable opt-out, Automated Mail will not be sent to provided email address of partner'), 'date': fields.date('Date', select=1), 'title': fields.many2one('res.partner.title','Partner Firm'), 'parent_id': fields.many2one('res.partner','Parent Partner'), @@ -150,7 +150,7 @@ class res_partner(osv.osv): 'customer': lambda *a: 1, 'category_id': _default_category, 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner', context=c), - 'opt_out' : False + 'opt_out' : True } def copy(self, cr, uid, id, default={}, context={}): name = self.read(cr, uid, [id], ['name'])[0]['name'] diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 58b31ede7ff..0e8acc6bb7a 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -40,10 +40,8 @@ from cStringIO import StringIO import threading class edi(netsvc.ExportService): - def exp_get_edi_document(self, edi_token, db_name=None): + def exp_get_edi_document(self, edi_token, db_name): res = None - if not db_name: - db_name = getattr(threading.currentThread(), 'dbname', None) if db_name: cr = pooler.get_db(db_name).cursor() else: @@ -74,8 +72,8 @@ class edi(netsvc.ExportService): pool = pooler.get_pool(db) edi_pool = pool.get('ir.edi.document') try: - cr.autocommit(True) res = edi_pool.import_edi(cr, uid, edi_url=edi_url, context=context) + cr.commit() finally: cr.close() return res From fc5bf7ae26b6e7cea45cae8e072bc78ee1dd28c3 Mon Sep 17 00:00:00 2001 From: "Hardik Ansodariy (OpenERP)" Date: Tue, 23 Aug 2011 17:06:32 +0530 Subject: [PATCH 052/510] [IMP] bzr revid: han@tinyerp.com-20110823113632-3k859oxwq5k7kwzw --- openerp/addons/base/ir/ir_edi.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 44d6d8f4303..443a1d12ec6 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -129,14 +129,14 @@ class ir_edi_document(osv.osv): for edi_document in edi_documents: module = edi_document.get('__module') module_id = module_obj.search(cr, uid, [('name','=',module),('state','=','installed')]) - if module_id: + if not module_id: + raise Exception("The document you are trying to import requires the OpenERP" +module+ "application") + else: model = edi_document.get('__model') assert model, _('model should be provided in EDI Dict') model_obj = self.pool.get(model) record_id = model_obj.edi_import(cr, uid, edi_document, context=context) res.append((model,record_id)) - else: - raise osv.except_osv(_('Invalid action !'), _('Module is not Installed')) return res def deserialize(self, edi_document_string): @@ -323,7 +323,7 @@ class edi(object): dict_list = [] for record in records: - dict_list.append(self.edi_o2m(cr, uid, [record], context=None)) + dict_list.append(self.edi_m2o(cr, uid, [record], context=None)) return dict_list From f287c3dd053e6edb41ca039b6582d66d52c53a03 Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Tue, 23 Aug 2011 14:24:46 +0200 Subject: [PATCH 053/510] Added demo data bzr revid: mit@openerp.com-20110823122446-lks3tbshjx88ek15 --- addons/point_of_sale/point_of_sale_demo.xml | 751 +++++++++++++++++++- 1 file changed, 733 insertions(+), 18 deletions(-) diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml index e95ce05256f..2e4a01bf1d2 100644 --- a/addons/point_of_sale/point_of_sale_demo.xml +++ b/addons/point_of_sale/point_of_sale_demo.xml @@ -7,24 +7,6 @@ - - - buy - - Cash In - - Cash In - - - - - buy - - Cash Out - - Cash Out - - POS/019 @@ -219,5 +201,738 @@ Discount Applied + + + + Beverages + + + + + Water + + + + Plain Water + + + + Sparkling Water + + + + + Soda + + + + Coke + + + + + + + + Orange + + + + + Beers + + + + Pils + + + + Fruity Beers + + + + Special Beers + + + + + + + + + + + + + + Food + + + + Pizza + + + + Ice Cream + + + + Chips + + + + + + 1.49 + Coca-Cola Regular 1L + + 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 + + + 2.38 + Coca-Cola Regular 2L + + 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 + + + 0.97 + Coca-Cola Regular 50cl + + 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 + + + 0.51 + Coca-Cola Regular 33cl + + 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 + + + + 1.49 + Coca-Cola Light 1L + + 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 + + + 2.38 + Coca-Cola Light 2L + + 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 + + + 0.97 + Coca-Cola Light 50cl + + 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 + + + 0.51 + Coca-Cola Light 33cl + + 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 + + + 0.53 + Coca-Cola Light Decaf 33cl + + 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 + + + + 1.49 + Coca-Cola Zero 1L + + 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 + + + 2.38 + Coca-Cola Zero 2L + + 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 + + + 0.97 + Coca-Cola Zero 50cl + + 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 + + + 0.51 + Coca-Cola Zero 33cl + + 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 + + + 0.67 + Coca-Cola Zero Decaf 33cl + + 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 + + + + 2.83 + Coca-Cola Light Lemon 2L + + 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 + + + 1.16 + Coca-Cola Light Lemon 50cl + + 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 + + + 0.53 + Coca-Cola Light Lemon 33cl + + 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 + + + + 1.70 + Pepsi 2L + + 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 + + + 0.43 + Pepsi 33cl + + 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 + + + 1.71 + Pepsi Max 2L + + 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 + + + 0.40 + Pepsi Max 33cl + + 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 + + + 0.61 + Pepsi Max 50cl + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAIQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYzgfHvxBufDGqw6ZZwwF3gEzSygkDJIAAyPT1pO/QqPLfW5kaF8Wbu91mxsrmGCSO6lWFiilSjM2Mjk8ciq05fMmVubTY9VpAfL/AIuOfGet/wDYQn/9GNV1Jczv5L8vV/10Wwj6gqBnk/xS8KaprXiW3urG1aRBaiMlT3BY++OtIDm/DHgXXLfX9Mup7JhHDdo75J6KwPpgfjQB75TA+XvFv/I5a3/2EJ//AEY1Aj6ekkSGNpJGCogJYnsKBmZY6/pN89ybe/hme3G6fY24RjnqRx2NIQy38U6DfadcXtvqMUltbn97IM4TPrxRcZoWF9bajarcWlxHPE3R42DA/iKYHzP4s/5HLW/+whP/AOjGoEez/F7WG0zwd5EZ+e9mWIj/AGR8zfyA/GkBw/hXVINI+F2v3OQLi5LRj5hkAqFHH1ZjQV1I/hheQTaTr+lT8i7tcDJAAOGH9RSQMufBPWXTW7vSm4jnh8xRn+NT/gT+QpoRxPi3/kctb/7CE/8A6MamxHpnx2V/7H0px90TuD9Sox/I0ho8Y86ZIHjR8RyfeUDrjpmkUh1ldXFs7GCQpvXa2CRkenFAM7T4PI5+IFuV6JDKW+m0j+ZFMlmJ4t/5HLW/+whP/wCjGpiPX/jTEkvgZXON0d3GV/Jh/WkB4EQdtMYkYNAHpvwMhVvE9/KRlksyAfTLr/hSYjkPFv8AyOWt/wDYQn/9GNT0A9k+MY3eA3P925jP86QHhtnbJdWU6cLKrqVc9hzkf59qUpWOjDYaVe6jujf0vQbbZbCZEId2Ek0zFVjUYznBHPoM/wA61pSrOSUI6+h1PCYOnCcqtS9uie78u52Hwjht4PGuupabvISLCbuoG8cGitfndzy4bHn3iz/kctb/AOwhcf8AoxqhFHsvxaJPgC6/66xf+hCkgPJLSGO3tkAiWNZYY3YlgSSQc49CaipserlDlzysnt/V+tiOS5vI7eQ280ijblQrY5HLH64Aq6FWUVozLN6HLXs0rW0t0O8+DdqLa/uZvm3XFkrsWPX94w4/ACqlfd9TzlY898Wc+MdaP/UQn/8ARjUhnsXxclSPwFMr9ZJ41X65z/Q0kB4pDqpSNUuIiMRqgdeu0cjg/XtilKN0deCxSw8+ZxuSy6hbM9xKs7sZo8AYJ2nDDHP1FCvYyryhKbcb2f8AXQ9A+Dd5DPqt7DGjjybQAM77iw35/ADPT3pmJwXirnxfrX/X/P8A+jGpgenfGqc/8IxZRA8NeAn8Eb/GpGtzxmWR5I13uzbRtXcc4HpTKYyHknNAHffBycw+MJ0z8slm4P4MppCZzfig7vFusH1v5/8A0Y1USeq/FexN54MM462k6SH6H5f/AGYVLHHVnh7H5cUymrDFco2aBHf/AAktpm8Qz3uMRpbMufclaVwa0Ob8RnPifVT63s3/AKGaok6y01rxB4odtCN/HLHcQmN1lCjjHUcZLDg0mNHK3/hPV9MumhurN8L91hwrfiaVinK5Vfw5qovRarZSvIwDDaMgg+9Amdtoeu2Xg+ObTYLR7i7AVbiRm2KGA5A4JIyTSUeo5SukuxxWp3H2zVry6K7POneTbnOMsTj9asgdO7IQyMUZTkFTgikBFeXt3fSCS7uZrhwNoaVyxx6ZNAyxZa9q2nWzW1lqNxbxOclY5CvP9KGIgS6lMrSOxkdjlmckkn3NMCF23Sux6kk0AP/Z + + + 0.40 + Pepsi Max Cool Lemon 33cl + + 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 + + + + 0.75 + Spa et Fruit Orange 50cl + + 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 + + + 0.72 + Orangina 33cl + + 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 + + + 2.42 + Orangina 1.5L + + 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 + + + 0.98 + Fanta Orange 50cl + + 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 + + + 2.28 + Fanta Orange 2L + + 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 + + + 0.51 + Fanta Orange 33cl + + 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 + + + 0.84 + Fanta Orange 25cl + + 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 + + + 2.08 + Fanta Zero Orange 1.5L + + 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 + + + 0.53 + Fanta Zero Orange 33cl + + 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 + + + + 0.52 + Evian 50cl + + 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 + + + 0.70 + Evian 1L + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQALgMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZKZICgZwcWqXj3lxm7b5ZmXG4kcGvWUKfKtOh4kqtTnfvdToPDl3JcXF5G83mbNvG7OOtcuLjFKNjtwUpNyuzerjO4awJAwSORyPrQOO4uKYiOaVYImkboo/OhK4pOyKNnp6sGmlJ3SuXI44JOfSrc2tjKNNPVi28aWF9IuTsnYZJ7HtSb5kOK5HY0qg1GvtCjcMjI7Z5zQio3uOxQSUrthJMsechOSPftVR2IlqyzDgRikykU75oXlMJdd5UHbnmqjdEzs2WLC4+0WwLHLoSj/Uf48H8amSsyou6JLhZWjAhdVbehJYZG3cNw+pGRUs1puKfvLo/y0/EWR/LjZyCdoJwKZmYugXj6rpqX8ibGnZ2x0wNxAH5AVpJJPQzhdq7NUjjk5xSKK99YWt9BtnhDEdGzgj6Ec0KTTFKCktSro0KadfS2UKsI5Q0uWfccjavHfFE25aipxUXZGw+dowxHI5H1qEbR3EkAaNh6gigk57w/cJa6WtusR/csy4JUE5JPT8a1cTOD0NcXKeT5shCKFLEk4AH40lFt2Q5SUVqMa8ja3SRCrpKMowYYYde/tTcGm0+hKqKSTXUq6dJ9o1p5MYEUBUHcDncw/wDiamSsi47m0QGGCM85qC07Ebn5G+hpiZxmlSC3tJZbpcrHnO0cnk//AFq6JtCoxcrJbss2mqWdzMZrjTJhLLAEiWUEpKCyfKAwHOWUn6HrjNc6xk1HlWmt/wCvvOiWTwc3JyT0s+tlq9texHDqFpNJp62+mq0zRgwusrKgJ27lJ2kD754BY9elNY6rJNb8w55HRpvmvbkb+7Xz/NI0vDreZM1wUEfnQhwmckAmqk7xTMalL2dSSXc3weazERvyhHtVCORsrKURlkgZ4pCQVUZ7/wCOa1crsqk7L0NSwtI7ZIlFgoMTb03RklTgjg9OhIrJ04GksRUd9Xqv+CSLpNpE6SQ6fDEyDCtt+6OOnp0H5Uo04IJ4uvNWcmGmB01GQGERr5eEAXAABHAq5WtYibTtrc2FPzCoZKGE5p2EZ1i5RXs4VkYxOQXYHAGc9T149M02iE+hfAI//XSKGyLuUqSwz6HFMGipaRFdQc+azqsePmxwSf8A61DZMVZ7mih+YVL2NEMpiKkK+TeXDD/lowJ/IUydmyx5j+nH0osO412O33oEyKzjKyzyf3yPzxQES4n3xSexSG0AU7eVbjdMvRmIH4cVTViE76k+RjofzpDBgPLzQD2I7Z8TPH6jcKAiyzhyV8tlU7hksuRjPI6jnGee3v0qZXsaRavqG00yTO0xCtuUC4XexXBz1JP9auT1Mqasi0VNSXYGVyuAcfSgGmU7aIR6tg72dojzgkAZHGSf84pt6ExVpGsikMDUNmiJMCkMy7LTpbZ5kWVgN5KhuVIPI+npV8xmotFGfVWj1JoDHA+xCS+5gRgjjGPetY07xuYTruMrWTLdhcteqytNCsgOdsZJwMep6n6VE48ppTqc4/T7KQahLePKzoRtjB4wOO1KclaxUIvmbNSszUKADFAEMlnazSCSW3idx0ZkBNNSktmQ6cW9Uh6wRIQViQEdCFFK7KUUh9AwoAD/2Q== + + + 1.26 + Evian 2L + + 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 + + + 0.40 + Spa Reine 33cl + + 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 + + + 0.46 + Spa Reine 50cl + + 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 + + + 0.65 + Spa Reine 1L + + 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 + + + 1.30 + Spa Reine 2L + + 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 + + + 0.34 + Chaudfontaine 33cl + + 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 + + + 0.44 + Chaudfontaine 50cl + + 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 + + + 0.86 + Chaudfontaine 1.5l + + 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 + + + + 0.38 + Spa Barisart 33cl + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAPAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYHEap4snh1Oe1TUoIDE+0rsHH1JqedGyw1ZxuouxYsfGFn9lzdaxbO5OAysmP0p3Qnh6q3i/uK3/AAlNruWR9Zc/3lSRMD9OaLi9jU/lf3FqHxppzqyvqcMJB+UtIrbv5YouHsKv8r+4z5/HsULEpqsEig9RsI/Si6LWErv7D+46/RdQOqaXDeEqfMGQVzg/nQncylFxdmXxTJKOr6lFpenS3MjAbVOKmTsi6VNzkkjw64d9Q1J7g4fzZgXYHlRj/wCvn8qxZ9NBKnTt2R19j4dsV0iETWMTEPkttwc45P5ViubT1OOpiZc7s+hwv9nq73I2KEiVlDBhjOVxz3PP+cVqr2PTdWyj5/8ABOq0bw9pD26PLaK5cZ3FiTWHO7nFWr1NbM5PW7SOx1Sa3WIxxnBUL29/yzWtKV0ddJucEz0r4W64ZbA6VMRui5j9xjNbwfQ8PM6PLU5l1PQhWh5pxPxKaVdPtTET/rMEdiO4rKo7HflyTm79jiNN0OaSSO4DfY7RGAVpRv8AMPOQigBic+npUKNz0q2LUU18T+63q9jrIkYRx2ptr2SFzgyTzCPPGOFB3fnirjSR5lSu9XeN/JX/AB2J10KwFv5TW8bxnjY2XHX6+1acqMfrdXmvfUhJMDCCz0q1dVGCBO0bD6cEH9KzlRi+hrGu2rym/uuc74i0STU5DcK0thcFduy5UNG/GMCRSQOvfrmkqaWx2YbG8mjSkvLf7mZvgm2vrLxrBb3EbwOr7XTp6kfUcdaFudGPqU54e8Xc90FbHzxy3jOzW+l02F9xj84s4U4yoUnH49PxrOau0dWFqOCk12MSfxPoWkXht5pGM6DazRxlljH90Y6Aegp80UaxwWIrR5ktPXclXXdM1CQzW16jLEm4ledv1HaqUkYzwtWnpKL1Gf8ACW6P5f8AyEbffjGd/FLnj3H9Qr/yMSDUtNv/ACorS9huHU5dUbnk01JPYmdCrT1lFob/AMJNpNvetps91umMvlBNhPJ4wT0pOSuUsFWlDnS0tcuJpccWvWFzGMeXJhfZSD8v0BIx6ZNDWqJjWbhJPqdyKo5zG1sA3dpnqCSPzFS90aR+Fnm1xDrPhfWrm9tdP+32dySSVXdkE5HTkGsknFs9mMqGLoxjKXK0FprOjalaXn2W0NpfGB/MXGA4H064q00zOrhq9KUeaV43Rh+FrzQ7W2nGrKrMzjZmAycY+nFRBxW52ZhSxE5L2fbvYiszEviKfVLCGSPT7bc5JGBjGMfiegoXxXQ6qk8Oqc2nJlO5hRtKj1Q3MZvZbhnZBINwB6HHXqP1pPa5pTk/aunZ8qietaFf/wBqWtlckfNIUfj8M/rW97o+crUvZVJR7HaimYHP+KblbU2bsduZCN3ZcjGfzIrObtY3oQcuZeRy11Y6zZLJdaZqsflyuzvDcp8sZySQD7UJSWqZ0xq0J2jOD06rqYWmeGZ7Z7y7uLqCW5uI5FQIflBbqc//AFqFB7nViMfGSjFRaSa/Au+EdKOk2l3DetbypKQyyI24Lj1/SnCNjHMMSq8ouN1Yk8S2V1qujxWVlJBFBv3yM74DAemB0H+FE02tDPBVYUajlJNsil8J6O9q0FtDAZniIDB9zKemevY0ckSo4+up3k3a5r+F7M6U9pYG583Y+BxjjOSPzIpR93S5liqntpOdrXPQxWhxHLeOQxsI9ozg5z6cisa2x14L4zkLbWHe3uYbjLSxRMx44lUDlW9DjgMO3Ws4VHZ3O2rhlzRa2b+7+uxFBrvh6eVFuZJLRv8AbLEDOc4IyOc961hOLFPB4qKfKkzVE/hnyy0Gq2ytzjdcrn+E/wAX+4PpV3j3OZ08VfWD+71/zK82peF7cb5tRjYhGQ+XKZCwOcjC8dz/AJApXiupUaGLltB/db8yGDxVp8s/lWEUsMSozGXGWbJyQo7ZJ6n8qj2ivoaSwFSMbzabvt/mTeF75rzxDG7KV7BT0Vc+/wDPv+NRTleQsVS5KVj1AV0nmHN+Mxu09VBwzZUHHrWdX4TpwjtUOJurN7SzuSNqRzI5HJLEAYA+lYuNkz0IVFOce6aOelFv5Mbboi4QDDbOvvkf1pQasdq5+Z7/AI/oymRaYZgIMAbsfuz/AF/SrNP3m2v4jljsyAN8Ay3IXYR/j/kUm7Et1PP8S9AiPcOIyD+5wu3GM5BxwBWe7MZtqKv3/rudb4btTBr6SLh4ixGSMbTnkY7c9K1hG0jzcTU5qVup6UK6DzzB8UBTBDuxt3jOfTNRPY2oX5jjrmSO4uoC2ArfLGNw5yTng9eOOPasnZtHbFOMWNX7PexFIJLdLhF2mBoVIkx0wWB6j05zmqVmEuam7u9u99jGv4oY7fzH0yGBw5GPLyPc46468A8cUn6HRSlJyspt6dxINPtRcIZIFVWYEqRt8sgcjP8AFk44Hr2xSsrhOtPldn/wf8jSWWBolkRI1gR23qq8nCnqB6Dn8+tF0czjK9ne5seFTPIIJpUVFdifLC4OSwwfyq6V7GOM5VJpHoIrQ4zB8UZMcABx83ripnsa0d2cOmmXsklwEchYpdwLA5KnkgcevSsVBu56Uq9NJeaGaBYudZVZyVFuhPUMMAYIz9SeD0p0k+YMXVXstOpa124jgXyR5aXdyCI5ypOFz8pA559+/wDK5OxhhoOWvRbr8ytdXkzp5s8SK9vgT/vMBeM8cY6jj6j61MmyoU4p2T320ILe0Y3BubZnlW64wDuyM5yO/r271KWt11LlU93llpY6fQoLi2eD7SyNOzguV6AZOB9ef1raCa3OKvKMn7ux3AqznMnWQxmhAAPBOCM546CkyomcXt1yAFLOBlV5JI9u3T9PajQdpGWLi0syIfKlaaVihMy4aXGDk57HNQmkbOM563Vl+BBLcFoTILRblol++ArkHd0Byc49OKL+Q1Gzte1ysNLXWJrgXEhWCWNXZCMFWBzkjPHf60uXm3L9s6KVt0zRtdJSyt1EMpd1yQzcevPv1+neqULIwnWc5XaLOmTXF3dW7zwNbgsMRPjKkE+nqMU029xVIxjonc7GqMhksKTLtcZ9D6UAc5qVvJaTkt5mzO5X6j9cgUrD5rGRd7bknz5pHQj7hjQ/qBmk43NIVeXZDBJao2d82AQVQRjaoGMAD8PWnyidVsJLyIwNFBJNCG5LKnzZzzySaGtCVPW7VxbS4kaMW0Rurl92dzMC3/jo6UJWQSnd3skdfpulRWqrM6fvyOec7c9f/wBdFhNtmhTEFABQBBJY2k3+ttYX/wB6MGgCu2haQxydMtCf+uK/4UAPj0bS4jmPTrVT6iFf8KALaoqLtRQo9AMUAKaAAHmgAAD/2Q== + + + 0.49 + Spa Barisart 50cl + + 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 + + + 1.00 + Spa Barisart 1.5l + + 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 + + + 0.41 + Chaudfontaine Petillante 33cl + + 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 + + + 0.57 + Chaudfontaine Petillante 50cl + + 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 + + + 0.98 + Chaudfontaine Petillante 1.5l + + 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 + + + 0.71 + Perrier 50cl + + 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 + + + 0.96 + Perrier 1L + + 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 + + + 0.98 + San Pellegrino 1L + + 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 + + + + 1.19 + Stella Artois 50cl + + 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 + + + 0.82 + Stella Artois 33cl + + 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 + + + 0.95 + Maes 50cl + + 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 + + + 0.77 + Maes 33cl + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAQgMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYBQAUAFABQAUAFABQBDA2Zrgbs4kAxnOPkX3OPyH07kNJr3Y+n6vy/z9eimoMwoARnVF3OwUepOKAIXvrWMZadcevWldAQnWtOAybtP1ougsTpeW8kYkWVdh5BPApgSo6SLuRlZT3U5FAC0ARxY8yb5s/OOM5x8o9zj9Pp3IXPaPp+r/AK6/opKCAoAzNVjS8nhtc4KncT6UWuBT1HSZ2tWWKVjxjaDt/l/jSSQ2zj5fBd9dSfNHeMnX/Xr/AD6072EdNo3h6SxsmhDuiuPmEjmQ/maltjNLQvKtjNZA4YNvHuOlNCNemBBbvumuhk/JKBzn+4p45Pr7fTuQ1qRtGPmv1fl/n69FPQZBQB5w/i240vxbqEd3ALiBJmVCowyjPAPPT8K76WEVWmmnZnPOq4SLl58SbFbqCyhsLqa4nPypFg/zIqKmCcFdyRUK3Psi3p3xF07U5JorPS9RleDiT5IwAfTJfGa5pU7LdGtyhb/FDT5tRuLM6ddxyRkjEu1cY4wRk1tTwjmrpmc63L0Kdp4lm1DxvYpaRrBBJJhxyWPtn/61VUwqpwvcUKvOz0uuQ2I40RZJivV3y3PfaB/ICkXJtpX6L9WSUyAoA8e8QL/xVWpf9dj/ADr2cH/DRxYjcxPMlt/F+mSwQG4bDDywwBYFSDgnjOCaeNV6YYZ6la6vYY4dO07R47y205rvc9zLgNNJnGMg4OB7+n1rzkt297HUx0jtN431F2jMR3EbSQSMYHOOK68F8Bz4k6Dwyv8AxWen+0lPGfAGH3PY68o6xkYkDylwoUt8mGJyMDrnpzngf1oaRUrWVu36j6CQoA8h8QKT4t1BR3lNexg3+7RxYjcwtVuf7I8Q6feRQtdGLcRGDgsSCMdD608R79J30Jw71NCzQ3dnDGfBhtrS3kMqNc37RqjHqeRmvLdk9JHcZMLJdeL9QmDxlXcndG25e3Q9x7134a8aZyYh6nQeGFP/AAmOnkjq3FGMfuBh9z2GvLOwQEEnAPB54oG0LQIKAPJtbB/4TS82jJ82vVwv8E4sTuY+sT3UGs20mm2wlvVJMYxuycY6fSqqRTpavQihfmLsQ1bVYbiHWPD8kS3SBZporkJwDkfK5IFebLlT0Z3epkaTYwWOtXlpAS8SEhWYgnHuRxXdTb5E2cdf4jc8NuG8aWBxgbsAUYpWpl4fc9frzDrGIH3ybwMFvkw2eMD245zxz+uA2kVK1lbt/X9aD6RIUAeUeI2li8WahJEcYIyfwFerhEnTSZxYncwgZH1ez/0oWxDMfPY/c45NdGIS9m9DOj8W5u6pp41Gy8lYodXn/huTJHGV9D8p5x7148fdld3R2vVaanMWkc1jey2jx+U65D85NenRSmkziqRadmb3hhWPjLT2OBlz/KssZ8Bth9z2CvMOsKACgAoA8m8VE/8ACVX69twP6CvWwS9xHHiNzDDKNQgWSAzq+5diqCSSOMA++K6K6vDexjS3GQy6XcTxiKyKTGRCIgu7PzPlevoU/KuaUaiTu+n+X/BNrxfQijYPqcrru2EnbvABx26cflW9JWikZT3N3ww5/wCEv09MZw5x+Vc2LXuM2obnsFeYdYUAFABQB5j4o02/h8TXV59kaSGTBVlXcMY7ivSwk4OHK3Y5q0ZXvY5+a8S0nS9WGIPb5wm8gsTwOOcj8q6akG1y3epjCVnexWtrx7W4+2Tjf5YDBNwAbcPlHuPXA7dq5fZ1JSaurHVKdFU1ZPm/ASGb/T98io7SLvBLZyD0HH8vauiEdN2csn5HQeFdLv5fFNpdJaOII23M7rtAHtmufF1I8trm1CLvex6xXnHSFABQAUARzwJcRlHH0I6igDIutBlm4EsUg7CWPNNSa2FYoN4Wud3ywaZj18rn+VPnn3Ycq7Fq18OzxH5p4Yh38mMf/WqW292NJI27a2jtYvLjB9yeSfrQBLQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAAP/Z + + + 0.97 + Jupiler 50cl + + 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 + + + 0.77 + Jupiler 33cl + + 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 + + + + 2.53 + Boon Framboise 37.5cl + + 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 + + + 1.54 + Timmermans Geuze 37.5cl + + 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 + + + 1.7 + Timmermans Kriek 37.5cl + + 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 + + + 1.56 + Timmermans Faro 37.5cl + + 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 + + + 1.94 + Lindemans Pecheresse 37.5cl + + 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 + + + 1.51 + Lindemans Kriek 37.5cl + + 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 + + + 1.04 + Grisette Cerise 25cl + + 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 + + + 0.83 + Belle-Vue Kriek 25cl + + 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 + + + + 1.00 + Leffe Brune 33cl + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAF8AZAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYGRr3iTT9Dgf7RdRx3BjLRo4Jye2cdqmUrFRjc4JPiRrZuE2NZzRscDbA3+PFZOpJbo09nHueoW8jS20UjABnQMQDwCRWxizmvFHjOHR1SKwns57jeVkR3zsx2IHQ1Ep22LjC+5S8KeOb3XdVSyubSBQ4b54N2BgZ6nilGo27WHKmkr3O1ZgqlmICgZJPatDM4LxD8RpNP1B4NMWxu4lAw5kJ3cc9OOvvUSm09jSNNNbm/4U8QzeILaZ5oYkaEgFomJVic8cjtj9acJ8wpx5TbnnhtYWmnlSKNfvM5wBVEHn978TLtNQeCztbOSIS7EZ5W+Zc/eyOKhza6Gqpp9TstB1VtY0tLt4ljYsVIUkg47jIBqoy5kROPK7GlVEhQB558RTi/X5ZS3kKV2LkHlutc1fc6aOx5410slsj750b+PPAc5+6PbHp6CoirFyPfdNdZdLtZEGFeFCB6AqK6zke54vr8kMd5cNsLSrcyIQ8W4RneRwcc/rXJK/MdcdjX8EXEcnjK1jE8rIEfYjDb82089B7jHtWlLczqbHputAnQ78AEn7NJgA4z8prd7GEdzxNpbaO/tyk9wdy8ymL7mfTjrXFrc7Eei/Dpw0eoL5rSENGRu7Ag4H866KPU56vQ0fHsixeFJ3fcFEsWWU8qN4596up8LJp/EeW6Y1v/aksKpIiYyhWLDOT0J46Vy3dzqex614Qz/YSFpDI5c7mx1PArppfCc1X4jbrQzCgDzz4gtJJeSRoSSsYwoGSe9cld+8dVD4Tzu9kkW2WYlQyx/cH8HzDp79amFi+Vydkj3fw+6yeHdNdPutaxkf98iuxbHHLdnj2rSyyXazOBOHnZjHjgEseT7964pbnZHYueFmaHxzYlmB3ynGOBnaRj6YzWtLdGdT4Weq6/J5Ph7UZMZxbSYHr8preWzOeO6PFl3rq0aMvmMU+UdQn9K4WdvQ7v4aSsbrUomIOI4WyD97O7mumic9ZbGv8QZGTw0FQhS9xGuT25z/AEq6vwMml8R5xpXmm+lQooOOZCOW9q5FudT2PUPBr7tEPAG2UjA7cCuqj8JzVviN6tTIKAPKPH9+y6velF+4nBzjouD+oNYzpczub06llY8+W5M+mQEjZ5ySAd/ukN/Ss5U7XXkdeHkrqXnb8Ge5/D6/S88C6dMW/wBTGY39tpI/kBXRH4V6HFWVqkvU8Z1DVnj0u2kVCBPLhgG6jJNYuhd7miq+Rf0+9+yeJbe4f5Us7uKRj6KWjB/RjRGPLJGzalRfy/X/ACPXPHdyLTwTqs5PSDH5kD+tbSV0cUdGeMXGqGLXbWxKtsYA4zxzXP7DXc6PbLsdx8N70DxM8O7i504OP95H2kfzq6atIeIX7teprfFK78rTtLthyZr3OM9gjZ/nWk48ysc9OXK7nm2iak1x4luIGBzGdqkt05rH2Nupuqt+h6n4AujJb3UBOCCkuPQnIP8A6CPzrWCsZ1tWmdfWhiIzBFLMQABkk9qWwHi3iaO4vZL+5DRN5iuw/eqME5OMEj1qOdWNFFnJQ2c8eg2c0ixAQXJVwJUY7GHPGaHOLLXMjsfB/iddK8HeIdNklVbiINJApIz8+E7ehwaSkuUUoyck31OU1/TriPSLGFBGWjK5/er2H1qnNE8rLN1BcR38uPL/ANMs1IBKPlgCPw9c+1TKUWXHmR23i3XjrPwy0iGBhJNqbxxyDeB/qz8/fn5gKrmSSM+V3Z5/qFlff8JhbOtnOygoNwQkdf8A69JzjfdD5XbY6Lw1dS6Pr9rcTKUFrfvDIcLhYpTwSeo5JwPaoclzF6uNjd+JFzJqHjLTrCHaUsIHlky4GGcYHBPoB+dauSWhnGLscJoVnef8JReymBgCxIbjH3vWp54t7js0eoeE5ns9TjEgVY5C0BOFHXleR1PA/Okn7w5axO+rUyMrxNe/YdEmcDJkKxgeoJ+b/wAdzUy2Gtzy6/aO7sbmSCVdmw5R4gXUnPA9e/Oe1c9R8i1OqjF1JWRzoNvH4bvobiRGki2uI4UG7nkEt26/X2pwvJXQqvuSafQwNMnhfWbd5Y2dLkhXVWwRyMnP1Fayg2rIUqi5Udh4iWOW3SSK5jeLdxmEbweCcjtj6nr9a56suS10b4Wg67aTsUfEc9va6RYyySiS4jYxMIlAVOxyccng/wCNaRTlZrY53PlZmeFbwTalBYXdwwity7w8bkUnrkdfyqpxk2mh1JR52bF9bTHX0ZY7X5mGza5PmdvXA59cdKwlUUZWdzanRnOm5LZFHxfJFFeeTFMDLNEshEY+QMucc9zjdzW8Yu92ZU5rmsaGhawPEOoalqt3II7yQjPmDKMOcAHtwAOaJRlczUlawuj28kWrzGX7MmDmQcgJgn8+uOM9qxjNOVlc6alGUKak9mdDJfw293bTRyMQJEKNjAZ1dTwOw+7XQlZHMne565Whicf8TrmSz8NQ3EfPl3alh6jY4IpMaPHLzxEqW8i2jMsrjHzoCvXuDkUpQUlZlwnKDunZmNFqEq2t6HDTNcqNzse4701FJWRLd2VNMuVt9St5pFJSInp+P+NMDW1PxBJIyCwlaNeS29Qcntwe45596znTjPdF06s4fC2inf6kJ9BhtWR2kWQu0jHr97/GqtYgg0DUItPv3uJ1dl2EfKM8nFMC1da/dPdSvBLtiJ+QMoLLxg4Pb+mazlSjKV2jWFecIOKejG6zqiX17bPEh+RNh3d+v+NaGQ7QNWi062nSSJ3MhBBXpwKBEuna3cRzxi7uS8I6gIMnjjJ6n8ahUoqV0jWVacoqLeiOlsdTTVr20ijUrHDIDz1JLL/h+tVLRER3PoCqIOQ+JqPJ4YjjjTe73SKq4zklW4qJuyuXDc84bwNZ2ti1xqUq+ZjJSLhV/Hv+FeVPNVKpyU9X/XyOlUNLsoXfgtY7CaaylVvk3BH6N9D2P1/OqpZmnNwno0xOhePNHVHMaLYzX1+tpDAHlYkbWA4+uelejUqKMbt6GUI3udbceBLK1hRry4XeTj5CQoJ9OCT+leYszdWbjSTdv68jZ0FFXloUPEHg9tN0prq2dZY05ZSPmUeo9RWuFzKnXduop0HAw/DWjz6zMbeCFXI5Z24CD3NddatGkrtmcYcyOlk8CQLMsU90d7k7QpwCfYf/AKq8/wDtTmTlGLaW7Nfq6Vk+pj+I/DcuhSQOdkkLsAJF659COxrrw+MhiFeLInS5N0T+GfDE+r2Jn2pDCMjzGHLfQd6MRjadDdhGk59DTh8C20rvFFdfvEODuORn3A6frXN/anKlKSaT2ZX1dN2W6Nbwhoclpr0+n3MCqwh3LjkNhlIIP4VvXxF4RlHVXRMYJNo9trvOYyfENutxbW24ZEdwH/8AHWH9a4Mzk1h2l10NsOvfOLkubG9WRb6TylW6aBFAYHIOASR2II9AM15uGyyMI3XVHROvd69zI0vUba7tY7Zbcxb1BQBt4GVVsZx2Drk+pqcZl1rzT1Lp4jmepmeD9NS38R6zOy5EBwuPfJ4/Kox9SVWjSpp77/IdOKjKTNu+u9PudFS+upPnMDypAjEbtoJIz9VI98HFdGHy32V1F9V/wPzMpYhNptDma31CxlsSm11jcEfeUhSVJDY9QcdzjNceIwEqE1OL6/8ABNoVlPRmD4Kgj0fwvPfyJuJlPGcZ+baK0xyli8Wqaelv+CTTtSp3NzV/sEciTvOklzG8f7pJMbATkEnrjBz+I9a6KOXyjDlTaWv46Mh14817f0jP8WfZ9T8LTzw5zCUYgjlTkfh+Vc+Fws8Lio22ZpOoqlNl/SUi06303TVVQ00RwzHAG0An+dYU8M8ZUnNvqVKoqSSGJcaZZaoskMvnrLH80quNvLHtntsJJPYd8131svnUp8rfy9FYxhXjHZHRwNaQXVpqbyqkbxmNGPG7cy4GOueOlYYOjWpJ0/O/3bjqyjLU7qvpTgMPxbqkej6VHdSxNJGJwrBOoG1uf0rlxlH2sEr9TSlKzOI/tLw2sYvLd2gfd5w3eYFBIwc4yBnv61z0/aRVmaySZkpqGhaRp+RctdSxqAJEjYcBFTA7dEXr3FZ1oVq0XHuVDli7mV4Z8WWEOo3v22GWOG8OQ6846jnHP5VlUy2aUGmm4ov2ylfQ6K/GgfYHt4L9bcyRPAPOkYgKxz39M5HSuqnOdtUYuKINS13R9KsXmEzzzybtzRqwDkszdDwOWPvXLiMPWxMVHT1NacowdzL8I+INJvtIOlX3mwMxY8MwDAkn7y/XvSng6lKu6kbPYbqqcbGzexaTIxW11e2VpJFkfz5VJBVNmQMZ6BeOnB6V2c8uXYx5VcyvFmsaRY6PLp9nK0sk+OASR1GTnoBxXM8PVrYiE3okaqcYQaNHSNY0PWbaGeWaWCW2GCGdl25BB9u/Wow+Hq4ZtbphUlGeo6K20drlB/alo1pFCsO0TL5jABxg7cdnHPXiuyVSatZf1p/kZKKLl3rWmXhsbC0drlkvIgDyADuwOe557VlhMPUjUlN6XRc5KyR6pXqnIcl8S5JIfCTToMiKdGcEAjHI5B4PUVE4plQdmeNSataSWzJJaRRq3V4QwYH1wTg/Tj8Kh0muppzoqf2rb/ZZVisoeBhWfc7fjk4/ShUn1YOaJpLObSLDSdQuYA8WoRyNtkT5eHIHTGOMdPWqlTTFGQt5qenTRxrNAYschoWJzjt82fzzx71m6UlsyudFa81a3k08CGyhVjwrEFmH5nH6U1S7thzj0iOgapLp1/bB5I1VhvyGG5Q3BBHr3zTdO+wlIWfUdMe681lmjZOPKWTIfPocfL78HNT7KQ+ZFq1gj8Ra/bada2ihpw2SGZm4UnvwOnpVRp2tqKUtCrpWowRW7rPaIXHDFSUY/wBP0odJ9GHOiS1v9MjmLoJpN/OwybdnsTj5v04x+E+zkx8yO7+GdnZ6zqsjm2CR2JWZdhPMmfl3E59zxjpWkYWerIlLQ9crQzIL2yttRs5bO7iWWCZdro3cUmrgcJd/BvQ5mb7NeXdujfwZVwPpkZo1Hcfp/wAHfD1o2bme6uxkEozBFP1wM/rRqFzpNd8IaRr+jw6XcwmKG3x5BhO0xYGOPw7UNAmcRdfBC2mI8rXHRR2a2DH89wpajujR0X4P6Ppt3Dc3l3NfNAwZUKhELA5yRkk/nRYLm14n8AaN4puUvLkSw3aLtE0R6gdAQeDTsJM5N/gbaPOZBrkqj0+zj+e6lZjujqvC3w+0jwrcNd27S3F2ylfOlI+UdwAOn607CbKms/CzQdUupbuAy2U0xLP5eChPc7T0/AigLmJD8EbKOXc2tTMvoIAD+eaNR3O38OeF9N8L2bW2no+ZCDJJI2WcjpmhITdzYpiAAP/Z + + + 1.00 + Leffe Blonde 33cl + + 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 + + + 1.16 + Leffe Brune "9" 33cl + + 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 + + + 1.59 + Orval 33cl + + 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 + + + 1.75 + Rochefort "8" 33cl + + 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 + + + 1.46 + Chimay Bleu 33cl + + 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 + + + 3.57 + Chimay Bleu 75cl + + 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 + + + 1.02 + Chimay Rouge 33cl + + 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 + + + + 2.86 + Dr. Oetker Ristorante Mozzarella + + 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 + + + 2.86 + Dr. Oetker Ristorante Bolognese + + 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 + + + 2.86 + Dr. Oetker Ristorante Funghi + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAZAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APSpZUgjLyHCj2J/lWVjRK5WXVLRjhWlOBniB/8ACh3XRlqjJ9vvX+Y2PWbCV9kczO391Y2J/lUqSZcsLVirtfih39q2f99/+/T/AOFVZ9n9xn7N9196/wAxf7UtP77/APfp/wDCiz7P7g9m+6+9f5h/adp/ff8A79t/hRZ9n9wezfdfev8AMP7TtP77f9+2/wAKLPs/uD2b7r71/mL/AGla/wB9v+/bf4UWfZ/cHs33X3r/ADD+0rX++/8A37b/AAos+z+4PZvuvvX+Yf2la/33/wC/bf4UWfZ/cHs33X3r/MP7Stf77/8Aftv8KLPs/uD2b7r71/mOjvreVwiOxY9Mow/mKLPsxODXb70cT8SP+QtoX/XO8/8ARYq1/Arf4P8A26JyY/8A3b/uJD8zuLqFZ4djZxnPBI/lUxV2dSk4u6OW1G0sv7cjgv2j+zSIuxbqZ1iY5O7HIBbGOD7e9DjT5nz9tD0aNXE+xvS3Td7JXtpb5blRYNEdI2NloqIVZw7O8e5VbaSDns3GO/UU+XCMr2uaJ7yetu+6v+RtaJZwz2RkHmNC0hMTOz5K/wDAjnGc4z2xShGNvIwxdapGaTavZXtbf5fj5mpHplsx/wBVn3yarlT6HM69RdSX+yrQdYh+Zo5EL6zU7irplnkf6Op+tHJEHiavcnbTtPSPc9vGBkDJHcnAo5Ygq9VvdnmnifxTdabrlzY29paokDYB2ZLAgH1964KtWSm0j6fL8vp1cPGcpS18ynYeM9QuHES21gXHOZUIBHccGpjXknqXiMspqN4ykeqw6fYSwpKtvGVcBhx2r0Ixi1ex8tKtVi2m2K1lZw/PHAisDwQOaHFJEutUlo2zgfiR/wAhbQv+ud5/6LFNfwK3+D/26JyY/wD3b/uJD8zvtobg0obnQyG5063vITDcQxzRnqrqGFW0pLUqnVnTleLaZzt7FpNvfx6fbWCXlzENxjOWWAE9W4bBPYAE9+OtL2UErv8AzOhYrEyvaT136FgarfnU3sYIUka2hE9xujKbFP3VyWPJweo4A6c1oopxvZ7nM9HuaNhq7av5q6abctEEMgctlN6hlzxjoQeDUThUj2HH2fW5DPe6nDrFrpkl7YrPdq7xxpayMdq4ySd+B1FJQqOLd1/XzNOfDpfDL71/kay298E5lhL+uw4/LNK0u5neF9n9/wDwCjf2+uTW7wrc6ftYcExOGB6g53evtUyjNq10b0amHjJPll96/wAjz3xF4Q1y+1B7lhbl3ADFHPOOM8j0rglTkpan0OGzLDxo8iuVtM8G6hpiPNd7UjdsyzqCfKjAyT0/zgVTozm0kjD6/RTk29loj1PSL621XS4LuxlBt3QFB3AxxkduK9FxcXbsfOyve7W5YlVVHXJzUSSBNnn3xI/5C2hf9c7z/wBFimv4Fb/B/wC3RObH/wC7f9xIfmd1M5SMsO1KG50sga5tVsjd3kjeSBlgScemMDrzxjnNaKPMHM47EOlNb6Ja309xCYInmkunmKBVEZGVyOowoC4xnirkr2SIbb1ZzXhe4/taDU5dUka0Org6jJj77WuSipn+EBVHPUh+CK2qrlat00+YkWLLXtQTw3o9y8scNxqmpQrKscSBoYJCRGMYxnaqDJGcGh04ubXZBcZdahPa+IdV1tZDc3FuYdHsEYALJM+GfPHQMwzjn5TQopxUfmwLHiHXtasbdtPsXJvJbiG1hnlCFmkbLOwUAgLsGeemRxUQjFu72tceoxrzUv7evLWbV5RaWFuLq9m8uMBCQdsaccDALEnJ4Az1qFBSgnbVuy/zNHLlZHYajrs2meHbV7lRqWqytdTs0SkR24BbGMehQevPWtHSppydtF+ZHPJkV7qV9qnhO8sVvXlOqaqdPsZSqBnhyFcnaACBiTnHQCrjCMZp22V3/X3Et3NfRidT1SUWy7LDTpTaIyoFLiMYJ3gAn5sKAOMKSeorGpBJa7vUqM5LRPQ2pHVbryVZmAAJJPT2rlluarWNzhfiR/yFtC/653n/AKLFWv4Fb/B/7dE48f8A7t/3Eh+Z2167R2xZV3HIAFKO51JXMhJmQLHOm1rebzljcbQwwRjnuM5+uKpTs2XKndXRW1tzryx2c+6LTtwa4iRhvnx0QkHhfXHJ9q87FZ1TwdXl5W3Y0p4NzV72Ib6yFxrhuWRls59JlsJIojhlUkNkfhxRDPEqa9z+8tV0WonhNdy95FrM1ks/nNFaulysOVVS6LhScDOAADj2HWpWeq9lDdX36A8HpuMW106KMHyZzm8a9hZnU+XKW3MRxzycc54rOXEVoKTpuzVt+xSwN21zbE80NjLqlpqEkUxms98iAuNrNIApZuOTjgegq/7baTjybpPfo7W/Mn6p5kdxZafey30kkVwY9VjWKeJZFCthSoPTIIB9cdDinDPJOEGqe7016/0geE1a5ie3Szi1VtTWKeSdLYWwLyDaqcvwABjOP0FKOeOomlT6338n5eQPCW3kUbbT9MsINMiiW6H9mlmtmMikqGDAj7uP4jz16c1nU4lS1dP4lff+uxSwLf2tjV06LT9Ptv8ARXaKJ5XmWFmysbMSWxx6k9fWvSp4329KM9roxdBxk0T2xEjNKclpGzn0HakncuasrHGfEj/kLaF/1zvP/RYrZfwK3+D/ANuicGP/AN2/7iQ/M79CAwLDpSjudDHS7GX95GCPcZrQSKU2m28x8wDHHrxXFiMtw+InzTjd+rNoYipBWTMue+0q1maJyZZFGCqOc49K53l2Ci9b7W3e3bc3g68l/wAAa160iedb6Y+wpne0zHj0wPp0rKeGwy1UZbd3/n5GqjLZyW/YyBrnm2zOlvCuz/lnJIy4PH9P6VyyoYdqzjp6v/M29nJPf8EatrI09mt0yqqmMGQlyAox69COlXChh9XyO9tfee3TqZS5lKyfpojHj8SxoZGNqJoo2++kxXHp1qKVDD8qvF/ezedGfNZP8DYs9X0m7SMq7iSUZ2hi3YgdPauuOEwu/vJ+r/zOeUKyvorIb59u93PBIrw+Udil2+8e20c5Fc0sDhm/eVraLVlKc0k1qWorkuzQLE6KnQjBX8TXbQcYx5YrRESit29y5bxXIkQtgRg5wO9dcYyMakoWdtzj/iR/yFtC/wCud5/6LFbr+BW/wf8At0Tzcf8A7t/3Eh+Z3jOY13DtShudDKV1feWMntyWJwBVtpIqMLmReeIp57J47Jxajd800ke4uvfaO31rgqY2+kTvo4OMJXnr5f5mDcrDbxRzWGptLHJgSDeJOQDzk9DjmuOrojrg3OTukinaX91ptxFJaiS9ZjtbzZtxfJwBgHj6mlCrzaNDnh092bF0r7i11DFG7cH93kKfTceh5rD2coNpIUXDpdmpdG0bQGHmMYsASfPgtjnHPFdKUfZ3776nNHn9ttr0KAEmnWCz2NvC5IBCSe/pjofxqVL2fwotrnlaTJINbWFI3nX/AEoDDRxkBY/Yse/0pTxfLotX5A8NdvXTz/yKura00llLfWW1ZomRmjYqysAex9af1jmd9UVDD2dnroUbbXW+zNcGMiRm3+Wpzk1hSnGFRmk6Mtjb8Oa/I11FYPFI3nA7snPl4GRn9R+Vd2ErO9lqmc+Kwy9nz9vxM34kf8hbQv8Arnef+ixXpr+BW/wf+3RPDx/+7f8AcSH5nfBQxwRn2pR3OhnO6xq9jDd+VIjSojBSqLkluOffFcleupT5XsdtHDyUObuYZivJ7toIrsKsoPlhwOfoMZHHua8+0pO0Tr5oRjdozp/D02m2BnkKmVzjySRjHt9aclyxTZvTxHPKyLWm3MUdu8j6ZNCoH7tihcM2eRjrUqOl7+hNXm5rXv3JppbjUrryLtiIZQBGe6H157fypQqurKzuTyqnG6Ks8WpK8kbSvOjyBY44QAcE49MfU804yhUmlYNErpl7V7ybS5poRASgTbC6DKwkjqRnLH+VdFVxgmjKjF1LO5l6PchrWSG8G7zckAINuO+T6flXHJwhqjecJyZYsbOJbM2a2irC7khWHDAdOu3P4Nz6V2Q9+KlL8f6X5mUr05aPX+vX8jZ0rRTcxsFZYnC5BjPy5H1DY/BjWscDSm9Fb+v66nPPFzj5/wBeVvyG6G2nPqStEZYbsXDpPE53EsoKnn044/lWkcJKnJW2RnLFOpTaf/DFH4kf8hbQv+ud5/6LFdi/gVv8H/t0Ty8f/u3/AHEh+Z3rP5aPIP4VJ/SovY6bXOROmC7tC8jCJw+UYsT5fXkdOOK8zkTgm2etOryystdDM1DR7SKN/Mum+1qi+XPGoaQnPGFHPr1NU4cr8hU6jl0Q/VdTjig+y3qCUoCA/lHAI5BPp6VlUld2uaUqL3iFla2sjRDdNNcPGsgaOQoqggkA85OfpSVKMYW6sc68r7KxLb6jHY3k1rcwKiNGxaVySSB23E9Paphzwg721JmlUs43uhkcN3NqzR28gSOL96rA8bccAdsnNFNe9q9hza9mn30KaWl/IZHvpR5ZmboASoznBYHAp1Yc+qRcJKKsv6+Ran1nSrOPMcTyFRtxBHvPXuTgfkTWcsPBtczS/EiMZv8Ar+mNa+1Gyuv9HsFgM4yXklLFh7gYX9DV08VTorRMJU1VWslp5f0zW03xBfWN2YdT0opGwG2eD0/2l/wrthj4R0cbHJUwnOrxlcqeFLe6i1K4muUQm5uXl3NwRuJOF9cZxziumOKp1NEc0sPKmtSv8SP+QtoX/XO8/wDRYrZfwK3+D/26Jw4//dv+4kPzO9OMHPQipjudDOJLXmmSXttPIhMh/dZJ5APGPXg/nXlVounzQZ7cHTrxhJX03LkOmW1zKEmUysgBWRmC47gEAZ4+uKdOEr2v+JhUnZXMe60iCCKSaJpGHV5HkLDPoK5qiUlojenUknqS6BrQmRbe9WQSYOGYDIAOOc9q0jBp6t6E1qSa5olyfTLTUdVjS9s3SNlODgBWHXqPU9quMU566ExnKFJuLVx2rBrObyo5xCkmWQJCGb6c+mPyFKrTcW2rE0ZqS1/Mx/7Ke/vYPtMV7LwX86QMpXjgD9KzVWVrS7G3PGN7WLEWnokT3C+c723yhM7jnPYev+Nc9P312KqSadu42wsLmf7Rdukybyqlu2BnOPQ9M/SrteK7Jmc5pNK5q2ctpbaX5VxKnlqTgTsScjry3NdTUZRs7GDU3LRMzNI1KDUfE1pHZxiVI5Gk80HhV2kYx65xSwq5Kiv1Z24nDOnhpSk9bfqO+JH/ACFtC/653n/osV7K/gVv8H/t0T5jH/7t/wBxIfmd1O5jgZwMkdqUdzpZn3OnwaxAGABdehPVfxqcRQjWjZl0K86Mro5+6urnQ7draODdGjbmR13Ajpx3NeVzVKD5JL/Jnr0o08U+a+pqW8ltHJHLPCqlMFY1OFD4/wATVudKnO76HJJTlFpFXxDJAtuNzf6xxswOo71wuTvJp6N6G2Gg5O1tkVBrNpaQNdTzRCYptBDgufQAVtTq8ye9xyoS5rWHvdLq6rM5Yq6oAqj542PAPA9R+Fbe1TfvGbpunoaemt5MbPcnfIONxXBJ9OO2frWanRT5rGc03ojI1G40+RDC1yqzOyuyhfm4PfHT8/zpK1OHMjaKm2kLHf38lm9tbGAW6MFLzPjqM4FLD0cRiKT5WrDqOhTmnO9/Ixta0Se/nhEF5GsY4ffISAc9vWumll9aC1SNcNmeHp3bR0HhfRLfS2jMLo3z/MwOdxx/niujD4SUPfqW5vyOPG494l2Wxn/Ej/kLaF/1zvP/AEWK7F/Arf4P/bonkY//AHb/ALiQ/M7qYFoWCjJNTHc6TP8AstzE/mQAq3cZ4NacyELJA97Hsu7Qg/3gRUzVOorSVxxlKDvFmdeeG5Z2TEheNeNuccV5s8sgneEreTO6lmEorVFCfQtVSB1jt1lY/KrGTlU9ACcZ461g8HUiuVRW+rR1wxlCUk22v8/kVI/D+otHCIdNkt3iBJeZkfJ9OG/Wl9VqRvaO5tPGUru8079rr9C5Ba6xZt5KaVNJHIMvIJIxg+wzVLDVeVqxhKeHlrzq/wAyKa38R28CLa2M0x8zcwYxjgdvvf59qmGDmtErCUsPNvmml6X/AMjOl0PxNf3zzf2eLUO2cyTAhfoATTeDnrdXN44jCU4/Hf0Ru6L4butPs3t5AHDP5h3gdcdua9LBxlTg1K255ePrwrzTitkWrnTp4h+5sElY88KAPz3V1c6ONQRVt9Mv5tZ06WWwNvDaSvISGXGShUcA+9TOSsbRUYxepmfEj/kLaF/1zvP/AEWKS/gVv8H/ALdE4sf/ALt/3Eh+Z31QdIUAFABQAUAFABQAUAFABQAUAFAHA/Ej/kLaF/1zvP8A0WKtfwK3+D/26JzY/wD3b/uJD8wA/9k= + + + 2.86 + Dr. Oetker Ristorante Hawaii + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAZAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APSpJUiTe5wo74rI0SbZB/aNqTgOxPtG3+FIv2M/6aEXVLN2KpKWI6gIxx+lHMinh6iWqF/tK1/56N/37b/CmT7KXl96D+0bX/no3/ftv8KNezD2UvL70H9o2v8Afb/v23+FGvZi9nLy+9B/aNr/AM9G/wC/bf4Ua9mHs35feg/tG1/vt/37b/Ciz7MPZvy+9B/aNr/fb/v23+FFn2Yezfl96D+0bX++3/ftv8KLPsw9m/L70H9o2v8Afb/v23+FFn2Yezfl96Hx3kErhEclj0ypH8xRZ9mJxa7feiegkgu4FuYPLfdgnPysVP5iqjuNScXc5i+06yOux2t05+zyRrsjmu3RHOTuwdwyQMcfT60SjByak3tpqehRrV40ealFXTd2oq62t023KkenaGyxsmn6cmVZ/MF08fyqdpZWLdm460eywvct4rNFo7vW1rJ7q+1jX0TTre5sjIJLiWIyN5TtO/zL9c8jOcHuMUQs1u7epz4upKE0nGKdldJLf7jVj0i1PRZT/wBtn/xqrJ9/vOZ1peX3L/Il/se1H8Mn/f1/8aOX1F7eXl9y/wAhy6TZ55R/+/r/AONHKvMPbz8vuX+RKdKsFTLRsOcAmVuv50uVD9tN9vuX+R5x4k8Vz6ZrNxYwWcYWBtu5nc7u/wDe964ateak0j6XAZXTrUIzk912X+RVsPGd3cyCIWdsWHLF5ZFG3v8AxcUo4iSev6lYnKqcI3jJ/cv8j1CLS7B0V1jYqwyP3rf413qKaPmHWqJ20+5CmwtIDvjjIYdDvY/zNDikhOrKWj/JC1BIBdxAqo7iZDe6Xa38BhureOaM/wALrn8auUVJWaLpVp0pXi2mc7f2ei2t9Fp8dkt5dIN6wtIzJCpPVs5xk9gCT1x3qfY00rs6VjsVK9pb7vRfiWhq12NQezgt0lNvCJ7hfLKiNT91QSRycNjIHStVFNXszkkrPc07LVhqfmLpvkSGIJvDyEbdyhlzgehBqJRnHoEfZ9WyGa/1CLVrfTZZ7BLi5R3jiEcjkquMknoOo69aSjUab0NL4e20vw/yNRY70Jy0Bf6ECl73kZ3hfqUb9NcmgeKMWGDgglnUgg5B6HuKmSm1bQ6KMsPGSb5vwPOfEXhTXb/U5Lo28QeQDdsmyCQMZ5A9K4Z05c2p9Fhcxw0KHIm/u/4craZ4Sv8ATEaXUFWGNm3SXGciKNRkn155/IU3RnNpJGLx9Jc0r3stEes6ddQ6jp1vd2cmbaWMNEcEEqRxwelei4tadj5qW92TSoqrnOTUyQJkVQMZK5jTcO1VDcGRNc2y2hu7ydlgVcsdxUD245PpjvWijcXNYraQbXR7a+nuI/IEk8t08xjKr5XVST2wgUYPPB4q2r2SJbb1Zzfhi5/te21SbUZDZnVs6hKf4zaZMaoD/DhU5PXD8YPI2qLlat00+YkWLDXb2Pw9o1yTBb3Gr6jEkqxRoGihk3eXxjqVRBkjofaplBczXZBcjuNQmtfEWq64HNzPbmHR7FCAqyzNhnzxwAzDOOflPNNRvFR+bAt694h1mwtzY2QL3slxDaxTShAWkPzOQoyAuwZ55GRwaiEIvV7WGRvqOq/21fWsmqYtrC3F1eTCFAI8glY1BB4wCxJyemMZqVBSinbfYtuzGWOp65PY+HbZ3i/tHVGe6uC8QxFbgE4x/wACQeuc1TpQTlpovzJ55Fe91G91rwjLp/2su2q6q1haTKiqZIA2HYgDGAFk5GO1XGKjO9tlclu5raG39o6lMbNRFYWczWwMahDKEBUszADJ3cADspJ6ispwSWu7LVSVrXNx5AtwYQxfABJP8q55PWxaV43H0iSC8kMduWAycjiqhuFrmWk3CJMoDW84lEbnbuGD69wTn6gdK0UtWipQ0ujK8T6mmqNHptwJYtPJD3KxspecDomQcBT3OcnpxXNVzGnhp2s2zpoZdUrQ5k0ipdyJe6z9pW2mj0+90x9L2xFQyFmyCOeBjIop5knBNRfxeQ55c4yaclovP/Iv/a7O6OnebFO0EFwk0UKhF3yooVc85wOMD17npUrM420i9dOg3lslf3lp6kaTaXBDv8m6kEOoNdRO2xgkrMWPQ/N1Iz6Yx60pZqkm+V226DWVybtzK9r9Sea70+TUbHWZLa8Y2xcxjKbXkkBUse+cKQPQfhS/tNezvyuzF/Zsua3Mrr1/rqMu0sL59XeWC8WHUEEV1GHjADKuzdnqMAj2rSOYP+R+6/L/ADIeA299a+v+RLFf2EGqSaq8N48rWKwqGZAqRbs5UDpkkfkKzeZrltyvuWssk38S3t13KED6Vpf9mQKt7v0kMkLEpwrKQRxxnnr1oqZxFSacXqVDKZyjdSR0ejR2Fhp0YtJ3S3ZnljgkdcRbyWIGBnqx65610/WVUipd0cc6EoTcX0LVsQ+6U5LSNuz6DtWadxzVlYs1RmKm3eCwGB61UdxMfMsUg/exgj/aFaCuZN94esb6bz3DA4xw2BXNWwdKrK8jqo46rSjyxM97DSLN0DCdmjOUCN0NR9RoxtvobfXa877aldm05PL2WsqKoIRnl7c5wAPc/nUPD0I21ehoquIlfbz0HTWthHpMlxMHiyDIsTErnGcZz0rGcMOo2d/QqFWu6qSt2vuZSfb2sluE0jfCrgKqzkt1ODjHTk/nUKnFLZ29TqlKHO06mvp/wTVWKxSD/TnMEsgHmxi5yBgcDPc1EauHc3F3131OZyrN+6k0ttCWOPQboiNbpmZl2bS/bOcfnXT7LDy0uyXUxUNeVfcQXtvoiXHzF2ZjgsZMDP1rir+x5k1Fu/W5tRq4nl6L5FjT9UtZYVtkBiKABVODkfX8a7aU4qNtjGtRkpOT1ua8C3O5NwAjB7d66YxkcdRws7blurMBC/l4b0NVDcTK1xdkMAAST+lagkUr/wARw2K/Z1CGZ+hc/KP8a5auJjB2R2YfAzqLmexgS3rC/jaSOe+YcOigKme2B/jXFWqTb0d3+B306EVTe0fz+80hfQXEKpK62rAYCOAWTPb2rOjOTTUnb8TB0ZRd0rlGbUo4NQEMyG7jlG0iUBQv4Y/nR7N82mvqdEKDnTuvd9Cxda1MYGSxhVNjbMAAgEcYrOSrue9kZQw8E/e1KLabFNp00+s3UBdVJRIcAZ55Pc9cY+tXCFKintc0dWXtEqadvMmtI7HSdNgaK0TzTGCzyMRyR15PFZ169aLtGKJalVm05aX2Mi5iudSkWBLJym/P7ofLj8/85q6Dk4pOJ1qdOmvi+83Vu4dMJsrmxEcRTPK5yDwOR+VFSrVpy+HQ43T9t70ZahoviJI9eOiBnlimJMLM2SmBnH04NdeGqt6dH+BOLwl6PtNmtzrK6zyg2hmAIzzVR3Eznde1G5/tOHTNPtS8jsDLKeFRc85PbvWVeq78qO/CUIcjqTfogurezhcbYXupTlnYE5HpgZ/zivNr1p869mr9zSnObWrsiMXlhaQfbGjkn7jd95PqB159aJVWoqShd+fQapVJy5bpCwS/2vbSmUKszDfErHlQAcE/59K0oxlKL5nqOa9hJW26kOjw2M7bJZIWJPBRTlyOOvHp0xThWpyai9OxeKlVirpMlvNQuop5IbG1htVhYozuMMfdcDp3qasqspNRtGxlTp0+VObbuc/KHt7/APtDUjb+VF8wXH329fpUqHLq9WjvivaQ5IX1Hx6QninVGnbzjZf6zz1fOP8AZB9c9q0jecm7aESxH1Wly/a/rU21QafH5dkWW3QkAMc8dByWB5+v4VXIparb+vQ4V7797f8Aryf5EUNjNr0h8x/uJwGOFb2IK5HXqC1bQwsG+v8AXqJ1/Yx0s/68n+iMvw/ZQz+JbO+ido2geWKSOZgXYhSMYHTBzz3ojh506m2hpUx0KmGcer/DU9BroPMFRgrhj2px3Ezhvstxqms3c5upIooG2lQ2Nx6E8e+etefKHtL3Pc9pGjRirJtkdjf3GmardqkyTyPgBN/TGef1rD3qWkXqXWpQrUotqyNpDPqOI7qVFPO8q/GfQeopqpHmtOWpw6U9YorRJpehMTexMHlJUSmTdx+ZxVe25H8F/NM3ftsSvce3Qa1klxawf2fdfacPtLoBux3JPSiVN1IpLXUPa8k3zxtoPks4olEU99LGQS0rSNhnHJ2j2PFJUofDJvQj2k5O8YpnP3FgdXkk+0xSWsSPwzfcK9u3FVCV9kejGqqMVZp6fMsSeIdH8P2SwW0rvv8AvCBN3PTt8v8A49VuCk9zklTnUleS/r8/wNJdQuZ7Ym1so7YTYZhOCWb3I6D9al4ynTdrHPKg7/FexPp3iaOwkSC5siu87C9up2ggZ5HTkdxXTTxkL2tZGc8DOeqld+Zi+CbuV9YkjmjXzJJ5JWZwQfm3NhfXHQ10yxEZuyMqmAq0KfNL/hvU9DpHMIelOO4mcfJp81lqv/HwIrW6ys204wQPp1Irhn+5vzbHrwrRq0truOwW/h+7sr/7RbQWU0R+YSnO8j0Oe/5j6VCU5x9xryKqYunONpOSfboW7iK31WOMQXAtpo84CkDjuPzrKNOFeCU1ZoyjKdFvS6ZU1mx05dOVJpmNyOELucFvf/61R7SjB8kNzfDVazntoYujauulWdzblokeaQKroGAU+mT36Vs5OVNxs9TpxOG9pOMuy8jVBvzasbqSO4iTAZo1Bk5PQ5rLlnFeX3s5U6d9Lp/gTXPhiO7QSPdMk4H7uSY7mA9CM4reUY9ZEQxjg9I3XkQ6do+kaeDPqFujSMQRvHyg+wPesamJVFXcbmlepVru0NkWdQitbpomgvTauSFClQVYf571hCdOrq48pFN1KaaauZ+oaXePF5dtta3zwYZMtnuW9c10KcJaRs/Q2w9aEdZb+YnhfVof7cttLhikd13B5nOein+ZxXVSkuZWQY+hJ0ZTb+XzO+rrPCI55DFEXAzjtVQ3EzJ1bSF1u03QOBMvKk9PoanEUFVjbqb4TEuhO/QwLqTXdIiTyVjmt4QDJFnDr/iPpmvLjF0XaR6sHhsQ+qb6mVYTyajcR3SqEkOTuVhtUDtgcD6VXNeWqTOupGNKDj0N+wthEix3ypLDOWMcm0MV/Ek9gDUtRoPmaVn2PPq1PaO8NGhyW1/pliVlaC9jEm9U6t1yOMcnvUynUTUoyT8hynSrT2cdDO1XWUsHLPZLFIwyWdcsc+/Sq1e8dTow+GU18V0V7DVhqEe65R442yqssYZm96xnQUXdx+4qrT5H7r/E1YYreeyFot6Z4ZJANk68j6EcjpV0qsZ+5+DOaUpRlzctml0KF5oF01+ryxxOkbAqzTFVPttNdlPDzvsmaLMaUYWu1fy/UkaO7tyWtWjy424ZsAcd/wAaweWVPac63MVjcPLSTLfhnQhY6iLtnjaR3O5kPGdp4H6110sNKD5pdNjLG49VoqMdjsa3POI5wTEQBk+lVF2YmUPIuYWMluGBPVexrTmQCyRfbU2XNowPripnGnNWeo4ylB3TMG48EQyTSMryFJB0VtrD8R1/GuCeBivglY9Onm1VRSaMN9G8VaXcMlpBJcW54CNg7fcc/wCc1lKjOUHCS+461iMLUs27M2fteuwW0bxaHcfakPMnysGHpjPSpp0pxtaOvcycMNJu9RW7amdqo1rVJI2n8OXMpXkEkJt9uDyK1lSnJ3aLw86NFNKqhEi8VRjbbaFFbr03KBux9Salxq9Eac2CfxVG/wAilceHPF15IHYNCEO5dpGQfwqVCa+y2ynicHD4WdNoek6pHYNHqG6aRn3ZlAGOAOMH2rvwl4QfNpqePmFSnVqLkWli1dWMsKgJpwlY9kXj8810qa7nGoJla1sb2fXdNmfT5LaC0eR2JIwSYyo4z7/rSnJWNIpRizq6xJCgAoAKACgAoAKACgAoAKACgAoAKACgAP/Z + + + 2.86 + Dr. Oetker Ristorante Pollo + + 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 + + + 2.86 + Dr. Oetker Ristorante Prosciutto + + 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 + + + 2.86 + Dr. Oetker Ristorante Quattro Formaggi + + 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 + + + 2.86 + Dr. Oetker Ristorante Speciale + + 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 + + + 2.86 + Dr. Oetker Ristorante Spinaci + + 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 + + + 2.86 + Dr. Oetker Ristorante Tonno + + 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 + + + 2.86 + Dr. Oetker Ristorante Vegetale + + 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 + + + 2.67 + Dr. Oetker La Margherita + + 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 + + + + 0.33 + Croky Paprika 45g + + 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 + + + 0.39 + Croky Naturel 45g + + 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 + + + 1.78 + Croky Bolognaise 250g + + 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 + + + 1.48 + Lays Pickels 250g + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAQgMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AO/8Q6vqOn6xHBBOEilh3oCgIJBII/lXBi8RUpTVno0RJtPQhj8TaoAA0Vs/qcEf1rD+0qi6IFKRcj8USnAfTyT6q/8A9atYZi5fYYcxbh8QwyZ32twmBycAj+ddMMTzfZaHzGe/im+Z28nSflBwC8vJ/ACsXjZ30gLmKs/inXF4j021T3d2P9BWM8fWj9gOYj/4SnXtozaWi+p+bj8zU/2lU7f194nJkdl4k1y71S2tzLEFllVSqRdup5PtmijjqtSokurBSbZ2qDDynnl89Mdh7c/r/Qeqra2RtJ6L0/V/10/UwPGVsGsre94zbS4JPZW4P67a4M0hekpdn+ZDMSKNpGAA5rzqNJzZJPFfW8EjRoslzMv3lgXft+p6CvThT5Fors6IYaVry0XmVx4usGYBlmXPTKjH865ajqyerO1ZfNLSxPba9pt2Mx3W3nA3nZ/PGa460sQndOWnmS8JOG8S4t3u+U7JQw4Zf64q8NmVRtQqJu/lqY1MNG11oVn8i5DBHUsg+dQ2dufpXZVoxnG6OWpSlDcf4QtGm1Ke9KnyYQUjLf3j1/T+dZZTTlzyk9loiUjrItvmT4TafMGTtxuO1eegz6Z56Yzxge173X5f101v+ZrO9o69P1fn/l6dXm+K4TP4ZvkXOQgbj/ZYH+lc+NjzUJLyIZxEeoNaaNczM2GSMBGPYkhR/OvNy1txuy8PHmqpEuiA2vhi+ulH7yf5Ix6n7q/+PNXpUlaDZ342XPWjHsEWn2sOsWujRQRzIkfmXcki7i3HAHpzj86FTipKNr9yZV6k6cqnM10SM+TyLfQtY1KSzgKm4MVmu3oOFBH5k/hUOMVCTt10No1KkqlKHM9Vd/16GkNPsoLvT7W5f7NKbYmQoxQSOcABiD0JDcd+laKMINLyMJVatWM2tVf7kZ8X2+x8SQ2xsbaEmKRJZIMqHGMrgFj3HpWTTTat0LrqM8O5czfqeh6BtazkZSMeYQQOgI6/rWuGtyu3c8yJehfdLcDI+WQDjt8qn0Hr7/XsNkkr6ms1aMfT9X5/5enVs1PH9lXeRkeQ+R6/Kamr/Dl6GbPK7uNLzwzfwlXD+UDlOc7WB/pXj5a1yteRrhJcteLL0TFvDem2MWpWyTx7JZd7biDyxHHfJ/SvTk4qCXMkdTlbESm4trX/ACLUk18moC+h1DRY42TEmWO6TjjJ7YpKqm7qUfvM7UuRxan5EGjx3k7RW10tk9iLjfaqIWBO3n5V9O+4+veilPmtta+hVb2cUpRcua2pQ8R3tzJrlzHNpUF7asViTcrlhgc4K9OSayr1bTasmdmBpL2SaqOL+X5DbWC9vPE6Xd3Gg8gDEgj4jjwRtBJz3/WhVLybZFf2VLDuKe/5nqmnJFHYQiHGwrkEd666SSgrHkLYLUYuL3gjM46kc/u06Y/rVJ7/ANf18vzub1fgh/h/VhqTbNLu3/uwuf8Ax01NV8sJPyMWeZaYEkL2zqXjkUo4HcEYNfP5dU5ZakpuMk0aVjZDToYrIQmQY4mC7gx/2vQ+9Xj8vrVI3i22vuZ3rEqTu2WTdC3QpKrKOxA4FeAvaU047GvIpaopXGpOsge1WMyhCgkZCSAfTnFenhM0qUqajKKbWzJeFTerG6VpjyTLLLuIByWY8seuT755pYWnXxda62vq+hpWrQpQsjcu/msnHG1VIAr6CtFRhyroeVKTlds6PSYmg0uCJzllXBrpox5aaQLYlhULLckOjFpASF6r8ijB9+M/QitLI1m24x0e36vb+txL9PN0+5j/AL0TD8wamorwa8jNnl1gWUAqcD27mvmcInzXIZtyXZs7YNgNtAyCcdSB1/Gvcp1XFJeQDYdTS4JjkhDN/CFO7cMZyCQOOD+IpThRrr34plxnKOzIhqNivzCEDEhRufukZx17nHTtmueGCwcXdU1+L/Mp16j6luLVIpm8qMn26cf5x16V2OolGy0Mr3G6hcyQ2sJRVdpJ0UqTj5d3Pcdq8eWKqOtyyel+iN1Ti43O3txi3j/3RXvw+FGYy3k3zXS5HySheAePkU/17Vb+f9dv63ua1I2jDzX6smYZUg+lIyPJrG8WK7S0RAzqu53P8I4/x/SvmYS5I6HTQoKUeZmylws6FXXcp2nB9c5H9KuGJkuZmk6KZK1tDI28qQwHGGI9ehB9zXdQm5LZo5Z0ktin9mg3AGMDGcdRjqf6n6ZqU2mYE0ccKSowBzg9WJ555+vPWqdaKaTfQuNOUuhbltI7uWB5EDRwfNkkgbsf/qrCNDnre0jI0cnBcrR2Vtj7LFjpsH8q9uPwogIUkWS4LnKtICnsNqj+YNOyXf8Art/W5pNxcY27a/e/0JaDM8Zm26dr0gkIHm5QZ9Vbp+lfLV4SUWl0bPRwclKFuxp205FwIgT93j6gCuaM2zacdC3DcvtyvP1FdFHE1EtDnnTVyWSUtFzgH19K2qYiXJroZqmuYgcE7QhOfUVxTmtLM2Xmbdm/mtFaupxIMKw9a9bCV7tQa32OavTurnV20ZhtYoi24ogXPrgV7UFaKRzokPSqAKAPJvE+lJc61dxsBgyEgN7nNfN4yp7Ku7EptO6ZnRaNcxurJqUiFDlQV34/E1ze1hLeKOiOLqrd3NbbdEqwkj3fxYBUN79alqL2djaFacvskyrfXK7MQCPI3NuJI+grWNN1INN6B7RqWkbBJuibah49uprz53g2kdMbS3LsV1JDY+eoPmQMGU575ruwtblp3fRmNdJI7uznNzZxTEAF1BOK+ppy5op9zgJj0qwEdlRC7HCqMk+gpN2A81vtQj1TVHuoxHDEzfKGUkkev49a+XxmJhXq32sIRrCfO5QrD0XArklQm3oXTipSSYkasZMFGOOq46VNKlNy2Z6crJaFlIuc7Cvrk13woO+xi5Fe6vFhkVIkimJHOJlDD8Kqp7OCvJIydRolidriyljVAjYywzn8vyrCM6c6clBEVK/MrHb6DIJdDtGH/PMA/hX0eClzUIPyMEaB6V0gY/im5NvocyI2158RKfQHr/47muTHVHChK270E2cpbxwRRptePaBw2RzXgwpWWwE7RpOCrESZ9Diq5WNOxE1rNgeVcyIoGMDaR/Kmqskae2mynLp8z4SS7lYM23/V5AJ9cfzoqTcUrx3V9/Ow4xnVv7xBFotukySvJ5rqcgghdv4Zr0JZTiKsLLlSa87/AJHHzRT6k8jRQuQrDkYIDZzU0uHKyd+eP4/5CliYrodj4VuoptPlgVyZLeUq4IxjPI/DH8jXp0YRhHli72N0pJao3D0rUZyHi9kvL2GzkYhIBvwp5LH/AAH868zMffaj21M5syUiuoW/0bTpJFP8XlyEn61zRnVgrKDf3gpMtxWmqvz/AGc/PbymXp05JrVfWJL4B3fYWWx1hCWXTpueSBg/1rkeBrpt23C77GfI+rCdhFoups3QjyflP4mu3D1sTTgoezTttdMhwbbd2Pg0/wATXDknQ/LjPeSSMH/Gu6nisY370Y/j/mL2JZk8O6tsJNo6k9drowH5HNa/X8Ul/DRnLDXE0aa90PVjJdWtwsc2Ec+UeeeCfcZNefTxE4VPehZPsdHtJOyZ3x6V6RYUAFABQAGgAoAKAAUAFAAaGAAA/9k= + + + 1.48 + Lays Ketchup 250g + + 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 + + + 1.58 + Lays Sel et Poivre Oven Baked 150g + + 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 + + + + 1.54 + Lays Paprika Oven Baked 150g + + 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 + + + 1.55 + Lays Paprika XXL 300g + + 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 + + + 1.48 + Lays Light Paprika 170g + + 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 + + + 1.48 + Lays Light Paprika 170g + + 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 + + + 0.39 + Lays Paprika 45g + + /9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQARQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APS9Y8X6NoV0ba/uSk2wOECk7h9emeK2p0JzV0S5JFG2+I/hu5Td9pkiH/TSPH8q0lg6i7CVRCn4jeG/N2LdOw7MsZwf6/pQsHVsJ1oomXx5oDHC3Mh9/Kal9UqB7WIw+P8AQg7KZJgF/iMfB/XNH1WfkHtUK/xA8NouTet9PLahYSr2B1ooSD4heG5m2/bHQ/7ULf0BoeEqroCrQfUkn8eeHIYi4vzKccLHE5J/TFJYWq3sP2ke5vRSCaKKUAgOAwBHIyK5akVzRv0f6Py0/DtfWztHB/EjTz9s0+9Cjy5QYJGK52kfMh9v4v0r08BPeJz19LM42HToZZJIRJvlP3gzcj8K73NLWxy2crq5vaf4eFvte6uFjixwJTjP51xYnHRijpoYWb7s2xZaRGoRXids5wXBzXi1s1n9lHbHCtbonktYJUV47eJzjAyM8V51bNcZTV42ZaoU+pFPptlOCk1sFbGAR0rfC59K9p6Cng4taGJfaHaQhjFsygBZM/MuemRX0OGxvtThq4blV7EWi6TFcXtuxVSHlCgAe+CT+tdVWpaL9DKmtT1b04rw5brTr+j/AK6fo+053x6jnwlcyoNxgKybcZ3YI/xz+FdeE/ipGOIdqbZ57oklrfZup4Xha1RpN5B6KM8HvXfi5OnFnPhEqsloanhRrpLXUtV1CSO6KpnlMdiT1/Cvn6Kvds+gxzSUIR0BNFhgksbaRDNdX3zSAPtEK9+xyf8AA0vZRTV+o3iptPltaK+8gGmrCdcuBD5cNn8luQ/VwOd2OvzYo9lD3geJqNU9rs0reGO3OlRTXUkVxdQs0h804Y4HyjPTr9eKUaNOLi7K5lUqSnz2WiZifbZbDXobO40dbJ5j5DsJy6y7zhSM++P/AK1VRn7OqlaxtWpe1w7kpc2na1jr/BFkrPNKwANq3l4x0bHNevi6nupdzw6MdfQ7A9V+teZUdpR83+j8v8vXo+lFDX1ifQL1ZwTF5LeZg4IXuR7gc10Um1NW3uZ1LcrueReH783FnexSSEzLbyhHJ6jaePrXp5hD927HNl9S81fuakMpuvAhtrK5ghu707sSTBCBuH/sq/rXhJfu9Gj25TX1lOSdkWPtutSX9tfLaaa1xEnlyyfbvvrzwBjC8nOeT2p3ldOy+8hKhaUeeVn5BYahNctd2N5Z2IsprkDfHcMwaQkHbnHznPpgDHpUxlzNqysOahGMZKbbXkZfi7W7ePxLJFcab9rSGFETbM0ZjY5YkEAjoV6jtWdeUVOzVzry3DzlRcoz5de17kNjPf8AirxFYyS27xw2jRlAGJ2qpzksep9/as41faVEjadGnhqM/eTbPTfC5XN6FAGZQ3H417GIWkT52G7N1uq/X+lcNVXnD/F+j+/+n0NV1KWuW73eg6hbRf6yW2kRfqVIFdNKSjNPzM6ivBryPCvDd19lvA7Y25wR6j0r3sRDng0eXhpqMzqNO0TT9IwUh3eax2TYzgdgT2r4TMsHiLPlbTv+B9KsW6iV3oaZW2TiWBB9UBr5tVa1NmnLzbDJ76OIwvDBHK8OTGGYqFJ74AOf0r1MHmfs4cs4Xs7r/gmcsNKT3KlrZ3NzM0ssrhnYvI4JXJP9O1TGpiMZWahu/uRtJ06MLOx08araaWgiOS4yxzyRX1uCwqoxUd7dTy6tRydyz4UYi8u0PdQw/OurFL3UY0/iZ0x6iuGSd16/ozYKsD562JBrFx5a4jimcIo9icCvpL3pL0PEgrVW/M6e21SWytoQcB5n/jbaAK8+dOM2z0YyaRcj8QWzxA3KDOTkjkYGeh79K4MTlNGu/ein+ZtCvKOwPq1lGzAWpEgUttbsB3+lcceG8Le9m/mzR42oRy6/G9oWVQBtBIUjAOMkZ9q9OhgYUVywSSMZ1XLc09Mu2ubER9SGwPxrWUeWQk7o6fw5brD556twCfzrnxMr2KpLc2zjI+tcVRR5o376fczZC1oI8qsbiNZLiKCJUVbhlJHVznkn8c14uNxdWrW5W9DrpUI04aI0v3d2QsqB1Q7lB/KnRxc6c/dfQmdJNamVdaDbSb3t5zlhzGXzn6ev0r2sJm7nZTVvM5KmH5dUZQRPOYkElgVOWJOD2r2b6HLfUmSCF3iOw4KeWSGI47D3rjxGPoUNJSV77dTanQqVNka2hsY7h4gcYAIHPUfWuaGaYfES5U2n5mrwtSmrtaHoOkou2SZDxKFOPQ80VnsiYI0CMkH0Nc04czi+z/Rr9et/vNEMuJPJt5JcZ2IWx64FaJXZLdkeJ6NqEUemPcTORiTc2OScnP8A8VXgY6hOni5QR2wrxdCM31RpQajFNpl1JbzqWWMDOfb5q5nSqU279S6VWFWSSKVhqbSSbEj8whtpz2OM9fzrWHNBX3OmtQUVduxcuJfMUg2y7gcF+4oWNrUk0pOPocShGpK/KmivKhWFdrEndnIrhjVbep3JK5f0WF21AvuJKpkiujDyTqXCTXKeheHnLWTBhjY5A+lfVympxjJdUeLy8smvM1akYyYboJFPdSP0oW4nsfPmmpbCzmiMbTStjuQATngfy/GtM+jGM4SUdXu/uOPC1L0+W+xXVXk1F5WLiK24ALcegX8+1eJiZctPl6s9XK6DqVubojb0bVbfS4WtZTtcne7EZGTjj6jA/WsqdR20PXxeGlWfMthdU1K3kUNaLJLdTEBURmOFB67emev860hRjWfLovPt5t+RzRg8PFylsvvb7ImPm2iq0iuXAztPQexrx2k5NGytPYvaLq6pctHK+3zQFDY/StqMFF+op0tND07RdhtNyYIPcd6+iwsZRpq55FZpzdjQroMxJEDxshJAYEEihAeLX+h/2Z4gljgCSQHEisrgeWSOmPxz9CK7MTRjjKcW7pryumcMYezm0rWZajtYTbeXHFGxyTsyCSxIH414WLw8oVGpH0WXyiqKt8zMv9Ejsx58oXHaIn5nP9BWVLCyqSUYLU7Z45RjdvT+vxGaGfst+8zuEMgwAR09BmuzMsolSpR5Hfv/AF2PMhjvrE2pWXb+u5ryiC4GZZ4s91DjNeB9UrbqL+43VVRe5VuLe2hw4kjUDn72cUlh66duV39DWNeNtWj07wjqEOo6DDJCwJUBW4xyB1/HmvqIUqlKnBTVnY8ac4znJxd1c26oRj+KtZi0TRJJ3yXlIiiVTgsx9PwyfwrSlBzlYmcrI4O300SIrSys08+ZHbsT3H6fpXcsQ1okYewvrcG0q2cI6mT5zgEHHPvUVKiqJc0UzSmp037smitJpiRzRbmLgzBGVh6n6+1aUJRjdRiloTWlOVnKTZsS6dEyMsrF7cxhVtmjG1WH8Wa+Yo5di1i1Ub1Ur81912sdU61J0eW3TYqHw9phkD/2XHGQOoYAGvpvrFTued7KNwuNGtjECmmwMVPHTpRCtO+7CdNNGl4f1GfStUS12RfYGHzOi4VM9BnOCcntXluvUrVuV+Z3QpRp0ro76qA88+Jctw+qaTHEGEdruuGKrkljwuPpg/nXoYGEXGV+uhz1m+ZGCut60yYWznkTOchMZ/T+VdH1einuZudRlmLWNbmZh/Zc5ZhyFUnP4bf5VHsKK+0PmqspXN3rs0sUc9vcbkbKqsYBHp2ya2hChG7RnP2st2S28Pi9JC66dM6McjdbEflxSf1Xv+JKhXTLaW3imU7V0efJ7mMKP1FZv6supqo1OxKNM8X4+XTpFB9WQUvaYbuP2c+w19F8UZy+nynPJUbGB/LFTzYe97lxjNI9C0F7ptHt1vIHgnjXYyv146H8q4K3LzuxvHY0KzGFABQAUAFABQAUAFABQAD/2Q== + + + + 1.54 + Lays Naturel Oven Baked 150g + + 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 + + + 1.55 + Lays Naturel XXL 300g + + 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 + + + 1.48 + Lays Light Naturel 170g + + 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 + + + 1.48 + Lays Light Naturel 170g + + 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 + + + 0.39 + Lays Naturel 45g + + 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 + + + + 7.60 + ijsboerke Chocolat 2.5L + + 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 + + + 7.60 + ijsboerke Moka 2.5L + + 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 + + + 7.40 + ijsboerke Vanille 2.5L + + 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 + + + 8.40 + ijsboerke Stracciatella 2.5L + + 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 + + + 7.60 + ijsboerke Dame Blanche 2.5L + + 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 + + From c95fc748a33a560b88556cbc74b8b8c56592a77e Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 11:51:29 +0530 Subject: [PATCH 054/510] [IMP] Purchase: Optimize purchase_order_cancel_draft.yml bzr revid: aag@tinyerp.com-20110825062129-g0kr3dmpkto5960s --- addons/purchase/test/purchase_order_cancel_draft.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index c31ba7ce68c..8b15b285948 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -101,13 +101,11 @@ !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'approved' - - I have to first cancel Picking of Approved Perchase order . + I have to first cancel Picking of Approved Purchase order . - !python {model: stock.picking}: | from tools.translate import _ - pur_ord=self.pool.get( 'purchase.order') - name = pur_ord.browse(cr, uid, ref("purchase_order_pendrive1")).name - search_ids=self.search(cr, uid, [('origin', '=', name) ]) + search_ids=self.search(cr, uid, [('purchase_id', '=', ref("purchase_order_pendrive1"))]) self.action_cancel(cr, uid, search_ids) - Now I have to cancel confirm purchase order for Pen Drive1. From 9c939e3024786b276b07a59a8651da4c5d202192 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 13:51:16 +0530 Subject: [PATCH 055/510] [IMP] Purchase: write on purchase order instead of manually calling _set_minimum_planned_date bzr revid: aag@tinyerp.com-20110825082116-iwo2zlhox65bsk8q --- addons/purchase/test/purchase_from_order.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/purchase/test/purchase_from_order.yml b/addons/purchase/test/purchase_from_order.yml index 4e72079b3be..5863483f2dc 100644 --- a/addons/purchase/test/purchase_from_order.yml +++ b/addons/purchase/test/purchase_from_order.yml @@ -56,11 +56,10 @@ - !python {model: purchase.order}: | from tools.translate import _ - import time from datetime import datetime from dateutil.relativedelta import relativedelta next_day = datetime.today() + relativedelta(days=1) - self._set_minimum_planned_date(cr, uid, ref("purchase_order_po0"), 'minimum_planned_date', next_day.strftime('%Y-%m-%d'),None ) + self.write(cr, uid, [ref("purchase_order_po0")], {'minimum_planned_date': next_day}) - I check that the order which was initially in the draft state has transit to confirm state. - From 5a382e6167823157c329e46ac0421bffa00fb354 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:00:50 +0530 Subject: [PATCH 056/510] [IMP] Purchase: Remove statement from yml bzr revid: aag@tinyerp.com-20110825083050-js34gvqlaijoku37 --- addons/purchase/test/purchase_order_cancel_draft.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 8b15b285948..14ab437110e 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -45,9 +45,7 @@ weight: 0.0 weight_net: 0.0 - - In order to test the purchase order flow,I create a new record where "invoice_method" is From Order. -- - I create first purchase order for Pen Drive1. + I create first purchase order for Pen Drive1 where "invoice_method" is From Order. - !record {model: purchase.order, id: purchase_order_pendrive1}: company_id: base.main_company From 293b63f4d8888abbee0d4940774d9341f1e13d44 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:04:49 +0530 Subject: [PATCH 057/510] [IMP] Purchase: Remove from tools.translate import _ bzr revid: aag@tinyerp.com-20110825083449-sx2xqf4rwimee0nh --- addons/purchase/test/purchase_order_cancel_draft.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 14ab437110e..1bdb5aaa578 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -109,7 +109,6 @@ Now I have to cancel confirm purchase order for Pen Drive1. - !python {model: purchase.order}: | - from tools.translate import _ self.action_cancel(cr, uid, [ref("purchase_order_pendrive1")]) - I check that the order which was in approved state has transmit to cancel state. From 03d68cc44b4d2b2e0745b033fdbdd102a9089dff Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:05:53 +0530 Subject: [PATCH 058/510] [IMP] Purchase: Remove from tools.translate import _ bzr revid: aag@tinyerp.com-20110825083553-3a6xrnpsbpp6wzgy --- addons/purchase/test/purchase_order_cancel_draft.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 1bdb5aaa578..2ce246bb7e4 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -119,7 +119,6 @@ Now again set purchase order for Pen Drive1 to draft state. - !python {model: purchase.order}: | - from tools.translate import _ self.action_cancel_draft(cr, uid, [ref("purchase_order_pendrive1")]) - I check that the order which was in cancel state has transmit to draft state. From bb6508040dfa8e70a1d4a74d17333e807aa8c638 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:20:38 +0530 Subject: [PATCH 059/510] [IMP] Purchase: change the tag bzr revid: aag@tinyerp.com-20110825085038-reiitbn3rjxz4y22 --- addons/purchase/test/purchase_order_cancel_draft.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 2ce246bb7e4..78208166e41 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -121,7 +121,7 @@ !python {model: purchase.order}: | self.action_cancel_draft(cr, uid, [ref("purchase_order_pendrive1")]) - - I check that the order which was in cancel state has transmit to draft state. + I check that the order is in draft state. - !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' From b6534076a3af746f2ca87013dae96288c7be33ca Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:33:19 +0530 Subject: [PATCH 060/510] [IMP] Purchase: Remove Duplicate Record bzr revid: aag@tinyerp.com-20110825090319-0scigeqn4beeehrk --- addons/purchase/test/purchase_order_cancel_draft.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 78208166e41..da4961d7ae7 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -130,6 +130,6 @@ - !python {model: purchase.order}: | from tools.translate import _ - self.copy(cr, uid, ref("purchase_order_pendrive1")) - self.unlink(cr, uid, [ref("purchase_order_pendrive1")]) + copy_id = self.copy(cr, uid, ref("purchase_order_pendrive1")) + self.unlink(cr, uid, [copy_id]) \ No newline at end of file From e4244b640518384443d6b6414dc48524ccb4774a Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:50:26 +0530 Subject: [PATCH 061/510] [IMP] Purchase: Add new optimize code for Merging PO bzr revid: aag@tinyerp.com-20110825092026-3vuc4x2x78s8ont2 --- .../test/purchase_order_cancel_draft.yml | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index da4961d7ae7..35872418f84 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -121,7 +121,7 @@ !python {model: purchase.order}: | self.action_cancel_draft(cr, uid, [ref("purchase_order_pendrive1")]) - - I check that the order is in draft state. + I check that the First purchase order is in draft state. - !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' @@ -132,4 +132,36 @@ from tools.translate import _ copy_id = self.copy(cr, uid, ref("purchase_order_pendrive1")) self.unlink(cr, uid, [copy_id]) +- + I create Second purchase order for Pen Drive1 where "invoice_method" is From Order. +- + !record {model: purchase.order, id: purchase_order_pendrive2}: + company_id: base.main_company + date_order: !eval time.strftime('%Y-%m-%d') + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: !eval time.strftime('%Y-%m-%d') + name: Pen Drive + price_unit: 100.0 + product_id: 'product_product_pendrive1' + product_qty: 10.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + Initially Second purchase order is in the draft state. +- + !assert {model: purchase.order, id: purchase_order_pendrive2}: + - state == 'draft' +- + I have merged first and second purchase order which are in draft state, belong to the same supplier,have same stock location, same pricelist. +- + !python {model: purchase.order.group}: | + ids = [ref("purchase_order_pendrive1"),ref("purchase_order_pendrive2")] + self.fields_view_get(cr, uid, context={'active_ids': ids}) + self.merge_orders(cr, uid, [1], context={'active_ids': ids}) + \ No newline at end of file From c0f3cc7a71b1e7e9ee06e7b499aeb3e0e571ef34 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 14:55:45 +0530 Subject: [PATCH 062/510] [REM] Purchase: Remove purchase/test/purchase_order_merge.yml file bzr revid: aag@tinyerp.com-20110825092545-on6o4ujyyn8g2cmc --- addons/purchase/__openerp__.py | 1 - addons/purchase/test/purchase_order_merge.yml | 80 ------------------- 2 files changed, 81 deletions(-) delete mode 100644 addons/purchase/test/purchase_order_merge.yml diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index 20efb26d3d2..cc009386f67 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -66,7 +66,6 @@ Dashboard for purchase management that includes: 'purchase_unit_test.xml', 'test/procurement_buy.yml', 'test/purchase_report.yml', - 'test/purchase_order_merge.yml', 'test/purchase_order_cancel_draft.yml' ], 'demo': ['purchase_demo.xml'], diff --git a/addons/purchase/test/purchase_order_merge.yml b/addons/purchase/test/purchase_order_merge.yml deleted file mode 100644 index 61555806d88..00000000000 --- a/addons/purchase/test/purchase_order_merge.yml +++ /dev/null @@ -1,80 +0,0 @@ -- - In order to test to merge two purchase order,I start by creating a new product 'Nokia3110c' -- - !record {model: product.product, id: product_product_nokia3110c}: - categ_id: 'product.product_category_3' - cost_method: standard - mes_type: fixed - name: NOKIA 3110c - price_margin: 1.0 - procure_method: make_to_order - property_stock_inventory: stock.location_inventory - property_stock_procurement: stock.location_procurement - property_stock_production: stock.location_production - seller_delay: '1' - standard_price: 5000.0 - supply_method: buy - type: product - uom_id: product.product_uom_unit - uom_po_id: product.product_uom_unit - volume: 0.0 - warranty: 0.0 - weight: 0.0 - weight_net: 0.0 -- - In order to test the merge purchase order flow,I create a new record where "invoice_method" is From Order. -- - I create first purchase order for Nokia3110c. -- - !record {model: purchase.order, id: purchase_order_po_nokia1}: - company_id: base.main_company - date_order: !eval time.strftime('%Y-%m-%d') - invoice_method: order - location_id: stock.stock_location_stock - order_line: - - date_planned: !eval time.strftime('%Y-%m-%d') - name: NOKIA 3110c - price_unit: 100.0 - product_id: 'product_product_nokia3110c' - product_qty: 10.0 - product_uom: product.product_uom_unit - state: draft - partner_address_id: base.res_partner_address_7 - partner_id: base.res_partner_4 - pricelist_id: purchase.list0 -- - Initially first purchase order is in the draft state. -- - !assert {model: purchase.order, id: purchase_order_po_nokia1}: - - state == 'draft' -- - I create second purchase order for Nokia3110c with same supplier,have same stock location, same pricelist as First Purchase order of Nokia3110. -- - !record {model: purchase.order, id: purchase_order_po_nokia2}: - company_id: base.main_company - date_order: !eval time.strftime('%Y-%m-%d') - invoice_method: order - location_id: stock.stock_location_stock - order_line: - - date_planned: !eval time.strftime('%Y-%m-%d') - name: NOKIA 3110c - price_unit: 100.0 - product_id: 'product_product_nokia3110c' - product_qty: 20.0 - product_uom: product.product_uom_unit - state: draft - partner_address_id: base.res_partner_address_7 - partner_id: base.res_partner_4 - pricelist_id: purchase.list0 -- - Initially second purchase order is in the draft state. -- - !assert {model: purchase.order, id: purchase_order_po_nokia2}: - - state == 'draft' -- - I have merged first and second purchase order which are in draft state, belong to the same supplier,have same stock location, same pricelist. -- - !python {model: purchase.order.group}: | - ids = [ref("purchase_order_po_nokia1"),ref("purchase_order_po_nokia2")] - self.fields_view_get(cr, uid, context={'active_ids': ids}) - self.merge_orders(cr, uid, [1], context={'active_ids': ids}) From 3d4e04d904a86d5f5294c60780ddadab4c4eb826 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 15:08:05 +0530 Subject: [PATCH 063/510] [REM] Purchase: Remove Onchange function call bzr revid: aag@tinyerp.com-20110825093805-5wptnyuya7n7qfzq --- .../test/purchase_order_cancel_draft.yml | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/addons/purchase/test/purchase_order_cancel_draft.yml b/addons/purchase/test/purchase_order_cancel_draft.yml index 35872418f84..1cd37b8d87f 100644 --- a/addons/purchase/test/purchase_order_cancel_draft.yml +++ b/addons/purchase/test/purchase_order_cancel_draft.yml @@ -68,27 +68,6 @@ - !assert {model: purchase.order, id: purchase_order_pendrive1}: - state == 'draft' -- - I test onchanged on Wharehouse ,Product, Uom, Destination Address . -- - !python {model: purchase.order}: | - from tools.translate import _ - self.onchange_warehouse_id(cr, uid, [ref("purchase_order_pendrive1")], 1) - part_obj = self.pool.get('res.partner') - price_obj = self.pool.get('product.pricelist') - product_obj = self.pool.get('product.product') - addrss_obj = self.pool.get('res.partner.address') - po_line_obj = self.pool.get('purchase.order.line') - uom_obj = self.pool.get('product.uom') - price_id = price_obj.search(cr, uid, [('name','=','Default Purchase Pricelist')]) - product_id = product_obj.search(cr, uid, [('name','=','Pen Drive 2')]) - uom_id = uom_obj.search(cr, uid, [('name','=','PCE')]) - part_ids = part_obj.search(cr, uid, [('name','=','Distrib PC')]) - line_id = po_line_obj.search(cr, uid, [('order_id','=',ref("purchase_order_pendrive1"))]) - po_line_obj.product_id_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) - po_line_obj.product_uom_change(cr, uid, line_id[0], price_id[0], product_id[0], 10, uom_id[0], part_ids[0]) - address_id = addrss_obj.search(cr, uid, [('partner_id','=',part_ids)]) - self.onchange_dest_address_id(cr, uid, [ref("purchase_order_pendrive1")], address_id[0]) - I confirm the purchase order for Pen Drive1. - From d8f1410505b154e7a99a40e77c9fefb35158fd7e Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 15:44:48 +0530 Subject: [PATCH 064/510] [IMP]: use datetime.timedelta instead of relativedelta bzr revid: aag@tinyerp.com-20110825101448-o3ndugu3zfduv0zf --- addons/purchase/test/purchase_from_order.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/purchase/test/purchase_from_order.yml b/addons/purchase/test/purchase_from_order.yml index 5863483f2dc..8e46899f8a0 100644 --- a/addons/purchase/test/purchase_from_order.yml +++ b/addons/purchase/test/purchase_from_order.yml @@ -55,10 +55,8 @@ I changed Expected Date to Next Day. - !python {model: purchase.order}: | - from tools.translate import _ - from datetime import datetime - from dateutil.relativedelta import relativedelta - next_day = datetime.today() + relativedelta(days=1) + import datetime + next_day = (datetime.date.today()+datetime.timedelta(days=1)) self.write(cr, uid, [ref("purchase_order_po0")], {'minimum_planned_date': next_day}) - I check that the order which was initially in the draft state has transit to confirm state. From a7c80240cb0d4380b56dd609dbf0db54fa4900e2 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 16:29:14 +0530 Subject: [PATCH 065/510] [REM] purchase_requisition: Remove Static code from yml bzr revid: aag@tinyerp.com-20110825105914-3aq90dc5h72g4z03 --- .../test/purchase_requisition_test.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml index 3cc0a4bb065..82bb3d86f89 100755 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -64,9 +64,7 @@ I confirm the purchase order of Axelor. - !python {model: purchase.order}: | - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('name','=','TE00009')]) - purchase_id= self.search(cr, uid, [('requisition_id','in',ids)]) + purchase_id= self.search(cr, uid, [('requisition_id','=',ref("purchase_requisition_te0"))]) import netsvc wf_service = netsvc.LocalService("workflow") if purchase_id: @@ -76,9 +74,7 @@ I check that Quotation of Axelor is Approved. - !python {model: purchase.order}: | - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid,[('name','=','TE00009')]) - purchase_id= self.search(cr, uid, [('requisition_id','in',ids)])[0] + purchase_id= self.search(cr, uid, [('requisition_id','=',ref("purchase_requisition_te0"))])[0] state=self.browse(cr,uid,purchase_id).state assert (state=='approved') - From d62df3ae923e090f8faeb104a68aecc0e8ef6e4c Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 16:35:35 +0530 Subject: [PATCH 066/510] [REM] purchase_requisition: Remove Static code from yml bzr revid: aag@tinyerp.com-20110825110535-rclb0ldd9dcj8l2r --- .../purchase_requisition/test/purchase_requisition_test.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml index 82bb3d86f89..385f93ae33d 100755 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -135,9 +135,7 @@ - !python {model: purchase.order}: | partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','ASUStek')])[0] - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('name','=','TE000010')]) - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)]) + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','=',ref("purchase_requisition_ex1"))]) import netsvc wf_service = netsvc.LocalService("workflow") if purchase_id: From ca82be04a99d2b0d98e9944c1199ea34fe056cb0 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 16:40:04 +0530 Subject: [PATCH 067/510] [REM] purchase_requisition: Remove Static code from yml bzr revid: aag@tinyerp.com-20110825111004-qqw4akeen0caiibz --- .../purchase_requisition/test/purchase_requisition_test.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml index 385f93ae33d..1ffd11a5ec1 100755 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -146,9 +146,7 @@ - !python {model: purchase.order}: | partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','ASUStek')])[0] - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid,[('name','=','TE000010')]) - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','=',ref("purchase_requisition_ex1"))])[0] state=self.browse(cr,uid,purchase_id).state assert (state=='approved') - From 53b441bb845e97d2836582149e206d02b7170c61 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 16:43:44 +0530 Subject: [PATCH 068/510] [REM] purchase_requisition: Remove Static code from yml bzr revid: aag@tinyerp.com-20110825111344-on8euk2slev36pmt --- .../purchase_requisition/test/purchase_requisition_test.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml index 1ffd11a5ec1..5aaa8e22123 100755 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -154,9 +154,7 @@ - !python {model: purchase.order}: | partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','Distrib PC')])[0] - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid,[('name','=','TE000010')]) - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] + purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','=',ref("purchase_requisition_ex1"))])[0] state=self.browse(cr,uid,purchase_id).state assert (state=='cancel') - From 4923de9a822c540647dcef62f1a732cedda778d7 Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 25 Aug 2011 17:25:19 +0530 Subject: [PATCH 069/510] [IMP]: purchase_requisition:Add code for copy ,confirm, Done requsitions bzr revid: aag@tinyerp.com-20110825115519-06mn72wvm30bg80s --- .../test/purchase_requisition_test.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml index 5aaa8e22123..1cab8ff8f2d 100755 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ b/addons/purchase_requisition/test/purchase_requisition_test.yml @@ -38,6 +38,15 @@ - !assert {model: purchase.requisition, id: purchase_requisition_te0}: - state == 'draft' +- + Copy purchase requisition which is in draft state than confirm and Done it. +- + !python {model: purchase.requisition}: | + copy_id = self.copy(cr, uid, ref("purchase_requisition_te0")) + self.tender_cancel(cr, uid, [copy_id], context=None) + self.tender_reset(cr, uid, [copy_id], context=None) + self.tender_in_progress(cr, uid, [copy_id], context=None) + self.tender_done(cr, uid, [copy_id], context=None) - I confirm the purchase requisition for MOB1. - From 2b0109060c081d9a2b80d6317b0d2fb8a925083b Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Mon, 29 Aug 2011 13:17:32 +0530 Subject: [PATCH 070/510] [IMP] ir.edi: improve edi_import_relation and edi_xml_id with better xml_id, uuid bzr revid: hmo@tinyerp.com-20110829074732-lq2q9k2wh2ywnooy --- openerp/addons/base/ir/ir_edi.py | 117 +++++++++++++++---------------- openerp/service/web_services.py | 2 + 2 files changed, 58 insertions(+), 61 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 9af5bb325f8..2fd11338ffb 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -29,8 +29,6 @@ import openerp.release as release from tools.translate import _ import netsvc -edi_module = 'edi_import' - def safe_unique_id(database_id, model, record_id): """Generate a unique string to represent a (database id,model,record_id) pair without being too long, without revealing the database id, and @@ -42,7 +40,7 @@ def safe_unique_id(database_id, model, record_id): # finally, use the b64-encoded folded digest as ID part of the unique ID: digest = base64.urlsafe_b64encode(digest) - return '%s-%s' % (model,digest) + return '%s-%s' % (model.replace('.','_'), digest) class ir_edi_document(osv.osv): _name = 'ir.edi.document' @@ -185,6 +183,15 @@ class edi(object): ``edi_import()`` and ``edi_export()`` methods to implement their specific behavior, based on the primitives provided by this superclass.""" + def record_xml_id(self, cr, uid, record, context=None): + model_data_pool = self.pool.get('ir.model.data') + data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) + if not data_ids: + return False + xml_record_id = data_ids[0] + xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context) + return xml_record.module, xml_record.name + def edi_xml_id(self, cr, uid, record, context=None): """ Generate a unique string to represent a pair of (the database's UUID, the XML ID). @@ -206,20 +213,21 @@ class edi(object): model_data_pool = self.pool.get('ir.model.data') db_uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid') - data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)]) - if len(data_ids): - xml_record_id = data_ids[0] - xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context) - uuid = '%s:%s' % (db_uuid, xml_record.name) + _record_xml = self.record_xml_id(cr, uid, record, context=context) + if _record_xml: + module, xml_id = _record_xml + xml_id = '%s:%s.%s' % (db_uuid, module, xml_id) else: - xml_id = safe_unique_id(db_uuid, record._name, record.id) - uuid = '%s:%s' % (db_uuid, xml_id) + uuid = safe_unique_id(db_uuid, record._name, record.id) + xml_id = '%s:%s.%s' % (db_uuid, record._module, uuid) + assert len(xml_id.split('.'))==2, _("'%s' contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id") % (xml_id) + module, xml_id2 = xml_id.split('.') xml_record_id = model_data_pool.create(cr, uid, { - 'name': xml_id, + 'name': xml_id2, 'model': record._name, - 'module': uuid, + 'module': module, 'res_id': record.id}, context=context) - return uuid + return xml_id def edi_metadata(self, cr, uid, records, context=None): """Return a list representing the boilerplate EDI structure for @@ -385,14 +393,29 @@ class edi(object): edi_dict_list.append(edi_dict) return edi_dict_list - def edi_import_relation(self, cr, uid, relation_model, relation_value, values={}, context=None): + def edi_import_relation(self, cr, uid, relation_model, relation_value, xml_id=None, context=None): + relation_id = False + model_data = self.pool.get('ir.model.data') relation_object = self.pool.get(relation_model) relation_ids = relation_object.name_search(cr, uid, relation_value, context=context) if relation_ids and len(relation_ids) == 1: relation_id = relation_ids[0][0] - else: - values.update({'name': relation_value}) + values = {relation_object._rec_name: relation_value} + if not relation_id: relation_id = relation_object.create(cr, uid, values, context=context) + + relation_record = relation_object.browse(cr, uid, relation_id, context=context) + record_xml = self.record_xml_id(cr, uid, relation_record, context=context) + if record_xml: + module, xml_id = record_xml + xml_id = '%s.%s' % (module, xml_id) + if not xml_id: + xml_id = self.edi_xml_id(cr, uid, relation_record, context=context) + if xml_id: + assert len(xml_id.split('.'))==2, _("'%s' contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id") % (xml_id) + module, xml_id2 = xml_id.split('.') + #TODO: update record from values + #relation_id = model_data._update(cr, uid, relation_model, module, values, xml_id=xml_id, context=context) return relation_id def edi_import(self, cr, uid, edi_document, context=None): @@ -443,24 +466,28 @@ class edi(object): connect it to the parent record via a write value like (4, db_id). """ # generic implementation! - fields = edi_document.keys() fields_to_import = [] data_line = [] model_data = self.pool.get('ir.model.data') _fields = self.fields_get(cr, uid, context=context) values = {} + xml_id = edi_document['__id'] + assert len(xml_id.split('.'))==2, _("'%s' contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id") % (xml_id) + module, xml_id2 = xml_id.split('.') for field in edi_document.keys(): if not field.startswith('__'): fields_to_import.append(field) edi_field_value = edi_document[field] + field_type = _fields[field]['type'] + relation_model = _fields[field].get('relation') if not edi_field_value: continue if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): # DO NOT IMPORT FUNCTION FIELD AND RELATED FIELD continue - elif _fields[field]['type'] in ('many2one', 'many2many'): - if _fields[field]['type'] == 'many2one': + elif field_type in ('many2one', 'many2many'): + if field_type == 'many2one': edi_parent_documents = [edi_field_value] else: edi_parent_documents = edi_field_value @@ -468,41 +495,19 @@ class edi(object): parent_lines = [] for edi_parent_document in edi_parent_documents: - #Look in ir.model.data for a record that matches the db_id. - #If found, replace the m2o value with the correct database ID and stop. - #If not found, continue to next step - xml_id = edi_parent_document[0] - data_ids = model_data.name_search(cr, uid, xml_id) - if data_ids: - for data in model_data.browse(cr, uid, [data_ids[0][0]], context=context): - parent_lines.append(data.res_id) - else: - #Perform name_search(name) to look for a record that matches the - #given m2o name. If only one record is found, create the missing - #ir.model.data record to link it to the db_id, and the replace the m2o - #value with the correct database ID, then stop. If zero result or - #multiple results are found, go to next step. - #Create the new record using the only field value that is known: the - #name, and create the ir.model.data entry to map to it. - relation_model = _fields[field]['relation'] - relation_id = self.edi_import_relation(cr, uid, relation_model, edi_parent_document[1], context=context) - relation_object = self.pool.get(relation_model) - relation_record = relation_object.browse(cr, uid, relation_id, context=context) - self.edi_xml_id(cr, uid, relation_record, context=context) - - parent_lines.append(relation_id) - + relation_id = self.edi_import_relation(cr, uid, relation_model, edi_parent_document[1], edi_parent_document[0], context=context) + parent_lines.append(relation_id) if len(parent_lines): - if _fields[field]['type'] == 'many2one': + if field_type == 'many2one': values[field] = parent_lines[0] else: many2many_ids = [] for m2m_id in parent_lines: - many2many_ids.append((4,m2m_id)) + many2many_ids.append((4, m2m_id)) values[field] = many2many_ids - elif _fields[field]['type'] == 'one2many': + elif field_type == 'one2many': #Look for a record that matches the db_id provided in the __id field. If #found, keep the corresponding database id, and connect it to the parent #using a write value like (4,db_id). @@ -511,22 +516,12 @@ class edi(object): #and use it to connect to the parent via a write value like (4, db_id). relations = [] - relation_object = self.pool.get(_fields[field]['relation']) + relation_object = self.pool.get(relation_model) for edi_relation_document in edi_field_value: - if edi_relation_document['__id'].find(':') != -1: - db_uuid, xml_id = tuple(edi_relation_document['__id'].split(':')) - data_ids = model_data.name_search(cr, uid, xml_id) - if data_ids: - for data in model_data.browse(cr,uid,[data_ids[0][0]]): - relations.append(data.res_id) - else: - r = relation_object.edi_import(cr, uid, edi_relation_document, context=context) - relations.append(r) - one2many_ids = [] - for o2m_id in relations: - one2many_ids.append((4,o2m_id)) - values[field] = one2many_ids + relation_id = relation_object.edi_import(cr, uid, edi_relation_document, context=context) + relations.append((4, relation_id)) + values[field] = relations else: values[field] = edi_field_value - return model_data._update(cr, uid, self._name, edi_module, values, context=context) + return model_data._update(cr, uid, self._name, module, values, xml_id=xml_id, context=context) # vim: ts=4 sts=4 sw=4 si et diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index f6b4ff23df0..5be6629bb49 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -63,6 +63,7 @@ class edi(netsvc.ExportService): res = edi_pool.import_edi(cr, uid, edi_document=edi_document, context=context) cr.commit() except: + print traceback.format_exc() cr.rollback() finally: cr.close() @@ -77,6 +78,7 @@ class edi(netsvc.ExportService): res = edi_pool.import_edi(cr, uid, edi_url=edi_url, context=context) cr.commit() except: + print traceback.format_exc() cr.rollback() finally: cr.close() From 75e0749542e51ce76fa29a9d2f4b6a02cb4067d1 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 1 Sep 2011 20:12:54 +0200 Subject: [PATCH 071/510] [IMP] ir.values: separated defaults and actions API, added different views This should prepare for a future split of the two parts currently composing ir.values entries: user defaults and action bindings to a model's UI. bzr revid: odo@openerp.com-20110901181254-g14lyeogs0wv23bz --- openerp/addons/base/ir/ir.xml | 130 +++-- openerp/addons/base/ir/ir_values.py | 511 ++++++++++++++------ openerp/addons/base/test/test_ir_values.yml | 3 + 3 files changed, 415 insertions(+), 229 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 011ad437cca..eda044336df 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -7,44 +7,50 @@ ir.values.form.action ir.values form - 20 -
- + + - + + - + - + + + + + +
- - + + ir.values.form.defaults + ir.values + form + +
+ + + + + + + - - - - + + + - - - - - - - - - - - +
@@ -53,11 +59,11 @@ ir.values tree - + - + @@ -73,7 +79,7 @@ - + @@ -81,23 +87,21 @@ - Client Events + Action Bindings ir.actions.act_window ir.values form tree,form [('key','=','action')] - {'read':'default','default_object':1} + {'default_object':1,'default_key':'action'} - tree - form @@ -105,54 +109,27 @@ - - - - - - - ir.values.form - ir.values - form - -
- - - - - - - - - - - - -
- - - ir.values.tree - ir.values - tree - - - - - - - - - - - - - - Client Actions Connections + + User-defined Defaults ir.actions.act_window ir.values form - - {'read':'default'} + tree,form + + [('key','=','default')] + {'default_object':0,'default_key':'default','default_key2':''} + + + + tree + + + + + + form + + @@ -342,6 +319,7 @@ + diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index c2a59ada55e..c75831f9c2f 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -28,7 +28,76 @@ EXCLUDED_FIELDS = set(( 'report_sxw_content', 'report_rml_content', 'report_sxw', 'report_rml', 'report_sxw_content_data', 'report_rml_content_data', 'search_view', )) +#: Possible slots to bind an action to with :meth:`~.set_action` +ACTION_SLOTS = [ + "client_action_multi", # sidebar wizard action + "client_print_multi", # sidebar report printing button + "client_action_relate", # sidebar related link + "tree_but_open", # double-click on item in tree view + "tree_but_action", # deprecated: same as tree_but_open + ] + + class ir_values(osv.osv): + """Holds internal model-specific action bindings and user-defined default + field values. definitions. This is a legacy internal model, mixing + two different concepts, and will likely be updated or replaced in a + future version by cleaner, separate models. You should not depend + explicitly on it. + + The purpose of each ``ir.values`` entry depends on its type, defined + by the ``key`` column: + + * 'default': user-defined default values, used when creating new + records of this model: + * 'action': binding of an action to a particular *action slot* of + this model, making the action easily available in the user + interface for this model. + + The ``key2`` column acts as a qualifier, further refining the type + of the entry. The possible values are: + + * for 'default' entries: an optional condition restricting the + cases where this particular default value will be applicable, + or ``False`` for no condition + * for 'action' entries: the ``key2`` qualifier is one of the available + action slots, defining how this action can be invoked: + + * ``'client_print_multi'`` for report printing actions that will + be available on views displaying items from this model + * ``'client_action_multi'`` for assistants (wizards) actions + that will be available in views displaying objects of this model + * ``'client_action_relate'`` for links towards related documents + that should be available in views displaying objects of this model + * ``'tree_but_open'`` for actions that will be triggered when + double-clicking an item from this model in a hierarchical tree view + + Each entry is specific to a model (``model`` column), and for ``'actions'`` + type, may even be made specific to a given record of that model when the + ``res_id`` column contains a record ID (``False`` means it's global for + all records). + + The content of the entry is defined by the ``value`` column, which may either + contain an arbitrary value (for default values - when the ``object`` column + is False), or a reference string defining the action that should be executed. + + .. rubric:: Usage: default values + + The ``'default'`` entries are usually defined manually by the + users, and set by their UI clients calling :meth:`~.set_default`. + These default values are then automatically used by the + ORM every time a new record is about to be created, i.e. when + :meth:`~openerp.osv.osv.osv.default_get` + or :meth:`~openerp.osv.osv.osv.create` are called. + + .. rubric:: Usage: action bindings + + Business applications will usually bind their actions during + installation, and OpenERP UI clients will apply them as defined, + based on the list of actions included in the result of + :meth:`~openerp.osv.osv.osv.fields_view_get`, + or directly returned by explicit calls to :meth:`~.get_actions`. + """ _name = 'ir.values' def _value_unpickle(self, cursor, user, ids, name, arg, context=None): @@ -38,7 +107,7 @@ class ir_values(osv.osv): if not report.object and value: try: value = str(pickle.loads(value)) - except: + except Exception: pass res[report.id] = value return res @@ -53,44 +122,69 @@ class ir_values(osv.osv): value = pickle.dumps(value) self.write(cursor, user, id, {name[:-9]: value}, context=ctx) - def onchange_object_id(self, cr, uid, ids, object_id, context={}): + def onchange_object_id(self, cr, uid, ids, object_id, context=None): if not object_id: return {} act = self.pool.get('ir.model').browse(cr, uid, object_id, context=context) return { 'value': {'model': act.model} } - def onchange_action_id(self, cr, uid, ids, action_id, context={}): + def onchange_action_id(self, cr, uid, ids, action_id, context=None): if not action_id: return {} act = self.pool.get('ir.actions.actions').browse(cr, uid, action_id, context=context) return { 'value': {'value_unpickle': act.type+','+str(act.id)} } + def onchange_key(self, cr, uid, ids, key, context=None): + return { + 'value': {'object': key == 'action'} + } + _columns = { - 'name': fields.char('Name', size=128), - 'model_id': fields.many2one('ir.model', 'Object', size=128, - help="This field is not used, it only helps you to select a good model."), - 'model': fields.char('Object Name', size=128, select=True), - 'action_id': fields.many2one('ir.actions.actions', 'Action', - help="This field is not used, it only helps you to select the right action."), - 'value': fields.text('Value'), + 'name': fields.char('Name', size=128, required=True), + 'model': fields.char('Model Name', size=128, select=True, required=True, + help="Model to which this entry applies"), + + # TODO: model_id and action_id should be read-write function fields + 'model_id': fields.many2one('ir.model', 'Model (change only)', size=128, + help="Model to which this entry applies - " + "helper field for setting a model, will " + "automatically set the correct model name"), + 'action_id': fields.many2one('ir.actions.actions', 'Action (change only)', + help="Action bound to this entry - " + "helper field for binding an action, will " + "automatically set the correct reference"), + + 'value': fields.text('Value', help="Default value (pickled) or reference to an action"), 'value_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle, - method=True, type='text', string='Value'), - 'object': fields.boolean('Is Object'), - 'key': fields.selection([('action','Action'),('default','Default')], 'Type', size=128, select=True), - 'key2' : fields.char('Event Type',help="The kind of action or button in the client side that will trigger the action.", size=128, select=True), - 'meta': fields.text('Meta Datas'), - 'meta_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle, - method=True, type='text', string='Metadata'), - 'res_id': fields.integer('Object ID', help="Keep 0 if the action must appear on all resources.", select=True), - 'user_id': fields.many2one('res.users', 'User', ondelete='cascade', select=True), - 'company_id': fields.many2one('res.company', 'Company', select=True) + type='text', + string='Default value or action reference'), + 'object': fields.boolean('No value serialization', help="Should be enabled when Type is Action"), + 'key': fields.selection([('action','Action'),('default','Default')], + 'Action Type', size=128, select=True, required=True, + help="- Action: an action attached to one slot of the given model\n" + "- Default: a default value for a model field"), + 'key2' : fields.char('Action Qualifier', size=128, select=True, + help="For actions, one of the possible action slots: \n" + " - client_action_multi\n" + " - client_print_multi\n" + " - client_action_relate\n" + " - tree_but_open\n" + "For defaults, an optional condition" + ,), + 'res_id': fields.integer('Record ID', select=True, + help="Database identifier of the record to which this applies." + "0 = for all records"), + 'user_id': fields.many2one('res.users', 'User', ondelete='cascade', select=True, + help="If set, action binding only applies for this user."), + 'company_id': fields.many2one('res.company', 'Company', ondelete='cascade', select=True, + help="If set, action binding only applies for this company") } _defaults = { - 'key': lambda *a: 'action', - 'key2': lambda *a: 'tree_but_open', - 'company_id': lambda *a: False + 'key': 'action', + 'key2': 'tree_but_open', + 'object': True, } def _auto_init(self, cr, context=None): @@ -99,140 +193,251 @@ class ir_values(osv.osv): if not cr.fetchone(): cr.execute('CREATE INDEX ir_values_key_model_key2_res_id_user_id_idx ON ir_values (key, model, key2, res_id, user_id)') - def set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=False, preserve_user=False, company=False): + def set_default(self, cr, uid, model, field_name, value, for_all_users=True, company_id=False, condition=False): + """Defines a default value for the given model and field_name. Any previous + default will be replaced and lost in the process. + + :param string model: model name + :param string field_name: field name to which the default applies + :param value: the default field value to set + :type value: any serializable Python value + :param bool for_all_users: whether the default should apply to everybody or only + the user calling the method + :param int company_id: optional ID of the company to which the default should + apply. If omitted, the default will be global. If True + is passed, the current user's company will be used. + :param string condition: optional condition specification that can be used to + restrict the applicability of the default values + (e.g. based on another field's value) + :return: id of the newly created ir.values entry + """ if isinstance(value, unicode): value = value.encode('utf8') - if not isobject: - value = pickle.dumps(value) - if meta: - meta = pickle.dumps(meta) - assert isinstance(models, (list, tuple)), models - ids_res = [] - for model in models: - if isinstance(model, (list, tuple)): - model,res_id = model - else: - res_id = False - if replace: - search_criteria = [ - ('key', '=', key), - ('key2', '=', key2), - ('model', '=', model), - ('res_id', '=', res_id), - ('user_id', '=', preserve_user and uid) - ] - if key in ('meta', 'default'): - search_criteria.append(('name', '=', name)) - else: - search_criteria.append(('value', '=', value)) + if company_id is True: + # should be company-specific, need to get company id + user = self.pool.get('res.users').browse(cr, uid, uid) + company_id = user.company_id.id - self.unlink(cr, uid, self.search(cr, uid, search_criteria)) - vals = { - 'name': name, - 'value': value, - 'model': model, - 'object': isobject, - 'key': key, - 'key2': key2 and key2[:200], - 'meta': meta, - 'user_id': preserve_user and uid, - } - if company: - cid = self.pool.get('res.users').browse(cr, uid, uid, context={}).company_id.id - vals['company_id']=cid - if res_id: - vals['res_id']= res_id - ids_res.append(self.create(cr, uid, vals)) - return ids_res + # remove existing defaults for the same scope + search_criteria = [ + ('key', '=', 'default'), + ('key2', '=', condition), + ('model', '=', model), + ('name', '=', field_name), + ('user_id', '=', False if for_all_users else uid), + ('company_id','=', company_id) + ] + self.unlink(cr, uid, self.search(cr, uid, search_criteria)) + + return self.create(cr, uid, { + 'name': field_name, + 'value': pickle.dumps(value), + 'model': model, + 'object': False, + 'key': 'default', + 'key2': condition and condition[:200], + 'user_id': False if for_all_users else uid, + 'company_id': company_id, + }) + + def get_defaults(self, cr, uid, model, condition=False): + """Returns any user-defined values registered for the given model. + This is not field-specific, but an optional ``condition`` can be + provided to query for default values that should be applied only + when the given condition is met (usually another field's value). + Defaults that have been set for the user herself will have higher + priority that those that have been set for everyone + (see :meth:`~.set_default`). + + :param string model: model name + :param string condition: optional condition specification that can be used to + restrict the applicability of the default values + (e.g. based on another field's value) + :return: list of default values tuples of the form ``(id, field_name, value)`` + (``id`` is the ID of the default entry, usually irrelevant) + """ + # use a direct SQL query for performance reasons, + # this is called very often + query = """SELECT v.id, v.name, v.value FROM ir_values v + LEFT JOIN res_users u ON (v.user_id = u.id) + WHERE v.key = %%s AND v.model = %%s + AND (v.user_id = %%s OR v.user_id IS NULL) + AND (u.company_id IS NULL OR + u.company_id = + (SELECT company_id from res_users where id = %%s) + ) + %s + ORDER BY v.user_id, u.company_id""" + query = query % ('AND v.key2 = %s' if condition else '') + params = ('default', model, uid, uid) + if condition: + params += (condition,) + cr.execute(query, params) + + # keep only the highest priority default for each field + defaults = {} + for row in cr.dictfetchall(): + defaults.setdefault(row['name'], + (row['id'], row['name'], pickle.loads(row['value'].encode('utf-8')))) + return defaults.values() + + def set_action(self, cr, uid, name, action_slot, model, action, res_id=False): + """Binds an the given action to the given model's action slot - for later + retrieval via :meth:`~.get_actions`. Any existing binding of the same action + to the same slot is first removed, allowing an update of the action's name. + See the class description for more details about the various action + slots: :class:`~ir_values`. + + :param string name: action label, usually displayed by UI client + :param string action_slot: the action slot to which the action should be + bound to - one of ``client_action_multi``, + ``client_print_multi``, ``client_action_relate``, + ``tree_but_open``. + :param string model: model name + :param string action: action reference, in the form ``'model,id'`` + :param int res_id: optional record id - will bind the action only to a + specific record of the model, not all records. + :return: id of the newly created ir.values entry + """ + assert isinstance(action, basestring) and ',' in action, \ + 'Action definition must be an action reference, e.g. "ir.actions.act_window,42"' + assert action_slot in ACTION_SLOTS, \ + 'Action slot (%s) must be one of: %r' % (action_slot, ACTION_SLOTS) + + # remove existing action definition of same slot and value + search_criteria = [ + ('key', '=', 'action'), + ('key2', '=', action_slot), + ('model', '=', model), + ('res_id', '=', res_id), + ('value', '=', action), + ] + self.unlink(cr, uid, self.search(cr, uid, search_criteria)) + + return self.create(cr, uid, { + 'key': 'action', + 'key2': action_slot, + 'object': True, + 'model': model, + 'res_id': res_id or False, + 'name': name, + 'value': action, + }) + + def get_actions(self, cr, uid, action_slot, model, res_id=False, context=None): + """Retrieves the list of actions bound to the given model's action slot. + See the class description for more details about the various action + slots: :class:`~.ir_values`. + + :param string action_slot: the action slot to which the actions should be + bound to - one of ``client_action_multi``, + ``client_print_multi``, ``client_action_relate``, + ``tree_but_open``. + :param string model: model name + :param int res_id: optional record id - will bind the action only to a + specific record of the model, not all records. + :return: list of action tuples of the form ``(id, name, action_def)``, + where ``id`` is the ID of the default entry, ``name`` is the + action label, and ``action_def`` is a dict containing the + action definition as obtained by calling + :meth:`~openerp.osv.osv.osv.read` on the action record. + """ + assert action_slot in ACTION_SLOTS, 'Illegal action slot value: %s' % action_slot + # use a direct SQL query for performance reasons, + # this is called very often + query = """SELECT v.id, v.name, v.value FROM ir_values v + WHERE v.key = %s AND v.key2 = %s + AND v.model = %s + AND (v.res_id = %s + OR v.res_id IS NULL + OR v.res_id = 0) + ORDER BY v.id""" + cr.execute(query, ('action', action_slot, model, res_id or None)) + results = {} + for action in cr.dictfetchall(): + action_model,id = action['value'].split(',') + fields = [ + field + for field in self.pool.get(action_model)._all_columns + if field not in EXCLUDED_FIELDS] + # FIXME: needs cleanup + try: + action_def = self.pool.get(action_model).read(cr, uid, int(id), fields, context) + if action_def: + if action_model in ('ir.actions.report.xml','ir.actions.act_window', + 'ir.actions.wizard'): + groups = action_def.get('groups_id') + if groups: + cr.execute('SELECT 1 FROM res_groups_users_rel WHERE gid IN %s AND uid=%s', + (tuple(groups), uid)) + if not cr.fetchone(): + if action['name'] == 'Menuitem': + raise osv.except_osv('Error !', + 'You do not have the permission to perform this operation !!!') + continue + # keep only the first action registered for each action name + results[action['name']] = (action['id'], action['name'], action_def) + except except_orm, e: + continue + return results.values() + + def _map_legacy_model_list(self, model_list, map_fn): + """Apply map_fn to the various models passed, according to + legacy way to specify models/records. + + :param model_list: list of models/records reference in the form ``[model,..]`` + or ``[(model,res_id), ...]`` + :param map_fn: the map function to apply - should expect 2 arguments: + ``model`` and ``res_id``. + """ + assert isinstance(model_list, (list, tuple)), \ + "model_list should be in the form [model,..] or [(model,res_id), ..]" + results = [] + for model in model_list: + res_id = False + if isinstance(model, (list, tuple)): + model, res_id = model + result = map_fn(model, res_id) + # some of the functions return one result at a time (tuple or id) + # and some return a list of many of them - care for both + if isinstance(result,list): + results.extend(result) + else: + results.append(result) + return results + + # Backards-compatibility adapter layer to retrofit into split API + def set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=False, preserve_user=False, company=False): + """Deprecated legacy method to set default values and bind actions to models' action slots. + Now dispatches to the newer API methods according to the value of ``key``: :meth:`~.set_default` + (``key=='default'``) or :meth:`~.set_action` (``key == 'action'``). + + :deprecated: As of v6.1, ``set_default()`` or ``set_action()`` should be used directly. + """ + assert key in ['default', 'action'], "ir.values entry keys must be in ['default','action']" + if key == 'default': + def do_set(model,res_id): + return self.set_default(cr, uid, model, field_name=name, value=value, + for_all_users=(not preserve_user), company_id=company, + condition=key2) + elif key == 'action': + def do_set(model,res_id): + return self.set_action(cr, uid, name, action_slot=key2, model=model, action=value, res_id=res_id) + return self._map_legacy_model_list(models, do_set) def get(self, cr, uid, key, key2, models, meta=False, context=None, res_id_req=False, without_user=True, key2_req=True): - if context is None: - context = {} - result = [] - assert isinstance(models, (list, tuple)), models + """Deprecated legacy method to get the list of default values or actions bound to models' action slots. + Now dispatches to the newer API methods according to the value of ``key``: :meth:`~.get_defaults` + (``key=='default'``) or :meth:`~.get_actions` (``key == 'action'``) - for m in models: - if isinstance(m, (list, tuple)): - m, res_id = m - else: - res_id = False + :deprecated: As of v6.1, ``get_defaults()`` or ``get_actions()`` should be used directly. - where = ['key=%s','model=%s'] - params = [key, str(m)] - if key2: - where.append('key2=%s') - params.append(key2[:200]) - elif key2_req and not meta: - where.append('key2 is null') - if res_id_req and (models[-1][0] == m): - if res_id: - where.append('res_id=%s') - params.append(res_id) - else: - where.append('(res_id is NULL)') - elif res_id: - if (models[-1][0]==m): - where.append('(res_id=%s or (res_id is null))') - params.append(res_id) - else: - where.append('res_id=%s') - params.append(res_id) - order = 'id' - if key == 'default': - # Make sure we get first the values for specific users, then - # the global values. The map/filter below will retain the first - # value for any given name. The 'order by' will put the null - # values last; this may be postgres specific (it is the - # behavior in postgres at least since 8.2). - order = 'user_id' - where.append('(user_id=%s or (user_id IS NULL)) order by '+ order) - params.append(uid) - clause = ' and '.join(where) - cr.execute('select id,name,value,object,meta, key from ir_values where ' + clause, params) - result = cr.fetchall() - if result: - break - - if not result: - return [] - - def _result_get(x, keys): - if x[1] in keys: - return False - keys.append(x[1]) - if x[3]: - model,id = x[2].split(',') - # FIXME: It might be a good idea to opt-in that kind of stuff - # FIXME: instead of arbitrarily removing random fields - fields = [ - field - for field in self.pool.get(model).fields_get_keys(cr, uid) - if field not in EXCLUDED_FIELDS] - - try: - datas = self.pool.get(model).read(cr, uid, [int(id)], fields, context) - except except_orm, e: - return False - datas = datas and datas[0] - if not datas: - return False - else: - datas = pickle.loads(x[2].encode('utf-8')) - if meta: - return (x[0], x[1], datas, pickle.loads(x[4])) - return (x[0], x[1], datas) - keys = [] - res = filter(None, map(lambda x: _result_get(x, keys), result)) - res2 = res[:] - for r in res: - if isinstance(r[2], dict) and r[2].get('type') in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'): - groups = r[2].get('groups_id') - if groups: - cr.execute('SELECT COUNT(1) FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',(tuple(groups), uid)) - cnt = cr.fetchone()[0] - if not cnt: - res2.remove(r) - if r[1] == 'Menuitem' and not res2: - raise osv.except_osv('Error !','You do not have the permission to perform this operation !!!') - return res2 -ir_values() + """ + assert key in ['default', 'action'], "ir.values entry keys must be in ['default','action']" + if key == 'default': + def do_get(model,res_id): + return self.get_defaults(cr, uid, model, condition=key2) + elif key == 'action': + def do_get(model,res_id): + return self.get_actions(cr, uid, action_slot=key2, model=model, res_id=res_id, context=context) + return self._map_legacy_model_list(models, do_get) diff --git a/openerp/addons/base/test/test_ir_values.yml b/openerp/addons/base/test/test_ir_values.yml index b4c08db31ff..da26b9837b5 100644 --- a/openerp/addons/base/test/test_ir_values.yml +++ b/openerp/addons/base/test/test_ir_values.yml @@ -21,5 +21,8 @@ - !python {model: ir.values }: | d = self.get(cr, uid, 'default', False, ['unexisting_model']) + assert len(d) == 1, "Only one default must be returned per field" assert d[0][1] == u'my_test_ir_value', "Can't retrieve the created default value." assert d[0][2] == 'specific value', "Can't retrieve the created default value." + +# TODO: ADD tests for action bindings too, the other half of ir_values. \ No newline at end of file From 38ddb76960c21af0bf097112abd1eca78316bea1 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 2 Sep 2011 12:15:30 +0200 Subject: [PATCH 072/510] [IMP] ir.values: minor cleanup/view improvements bzr revid: odo@openerp.com-20110902101530-13r328uwhwdpudn5 --- openerp/addons/base/ir/ir.xml | 3 +-- openerp/addons/base/ir/ir_values.py | 17 ++++++----------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index eda044336df..3f9c48b467f 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -42,7 +42,7 @@
- + @@ -63,7 +63,6 @@ - diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index c75831f9c2f..f3faacfd4d4 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -162,10 +162,10 @@ class ir_values(osv.osv): string='Default value or action reference'), 'object': fields.boolean('No value serialization', help="Should be enabled when Type is Action"), 'key': fields.selection([('action','Action'),('default','Default')], - 'Action Type', size=128, select=True, required=True, + 'Type', size=128, select=True, required=True, help="- Action: an action attached to one slot of the given model\n" "- Default: a default value for a model field"), - 'key2' : fields.char('Action Qualifier', size=128, select=True, + 'key2' : fields.char('Qualifier', size=128, select=True, help="For actions, one of the possible action slots: \n" " - client_action_multi\n" " - client_print_multi\n" @@ -174,7 +174,7 @@ class ir_values(osv.osv): "For defaults, an optional condition" ,), 'res_id': fields.integer('Record ID', select=True, - help="Database identifier of the record to which this applies." + help="Database identifier of the record to which this applies. " "0 = for all records"), 'user_id': fields.many2one('res.users', 'User', ondelete='cascade', select=True, help="If set, action binding only applies for this user."), @@ -381,14 +381,9 @@ class ir_values(osv.osv): continue return results.values() - def _map_legacy_model_list(self, model_list, map_fn): + def _map_legacy_model_list(self, model_list, map_fn, merge_results=False): """Apply map_fn to the various models passed, according to legacy way to specify models/records. - - :param model_list: list of models/records reference in the form ``[model,..]`` - or ``[(model,res_id), ...]`` - :param map_fn: the map function to apply - should expect 2 arguments: - ``model`` and ``res_id``. """ assert isinstance(model_list, (list, tuple)), \ "model_list should be in the form [model,..] or [(model,res_id), ..]" @@ -400,7 +395,7 @@ class ir_values(osv.osv): result = map_fn(model, res_id) # some of the functions return one result at a time (tuple or id) # and some return a list of many of them - care for both - if isinstance(result,list): + if merge_results: results.extend(result) else: results.append(result) @@ -440,4 +435,4 @@ class ir_values(osv.osv): elif key == 'action': def do_get(model,res_id): return self.get_actions(cr, uid, action_slot=key2, model=model, res_id=res_id, context=context) - return self._map_legacy_model_list(models, do_get) + return self._map_legacy_model_list(models, do_get, merge_results=True) From e0624cbc954b946bb962fc8da252eb1ffed80cc8 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 2 Sep 2011 14:40:38 +0200 Subject: [PATCH 073/510] [IMP] ir.values: smoke test for action bindings bzr revid: odo@openerp.com-20110902124038-36ip41ccytr2f9vt --- openerp/addons/base/test/test_ir_values.yml | 54 +++++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/test/test_ir_values.yml b/openerp/addons/base/test/test_ir_values.yml index da26b9837b5..a8912e0ad3b 100644 --- a/openerp/addons/base/test/test_ir_values.yml +++ b/openerp/addons/base/test/test_ir_values.yml @@ -2,27 +2,71 @@ Create some default value for some (non-existing) model, for all users. - !python {model: ir.values }: | - self.set(cr, uid, 'default', False, 'my_test_ir_value',['unexisting_model'], 'global value') + self.set(cr, uid, 'default', False, 'my_test_field',['unexisting_model'], 'global value') - Retrieve it. - !python {model: ir.values }: | # d is a list of triple (id, name, value) d = self.get(cr, uid, 'default', False, ['unexisting_model']) - assert d[0][1] == u'my_test_ir_value', "Can't retrieve the created default value." + assert d[0][1] == 'my_test_field', "Can't retrieve the created default value." assert d[0][2] == 'global value', "Can't retrieve the created default value." - Do it again but for a specific user. - !python {model: ir.values }: | - self.set(cr, uid, 'default', False, 'my_test_ir_value',['unexisting_model'], 'specific value', preserve_user=True) + self.set(cr, uid, 'default', False, 'my_test_field',['unexisting_model'], 'specific value', preserve_user=True) - Retrieve it and check it is the one for the current user. - !python {model: ir.values }: | d = self.get(cr, uid, 'default', False, ['unexisting_model']) assert len(d) == 1, "Only one default must be returned per field" - assert d[0][1] == u'my_test_ir_value', "Can't retrieve the created default value." + assert d[0][1] == 'my_test_field', "Can't retrieve the created default value." assert d[0][2] == 'specific value', "Can't retrieve the created default value." +- + Create some action bindings for a non-existing model +- + !python {model: ir.values }: | + self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) + self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action 2', ['unexisting_model'], 'ir.actions.act_window,11', isobject=True) + self.set(cr, uid, 'action', 'client_action_multi', 'Side Wizard', ['unexisting_model'], 'ir.actions.act_window,12', isobject=True) + self.set(cr, uid, 'action', 'client_print_multi', 'Nice Report', ['unexisting_model'], 'ir.actions.report.xml,2', isobject=True) + self.set(cr, uid, 'action', 'client_action_relate', 'Related Stuff', ['unexisting_model'], 'ir.actions.act_window,14', isobject=True) +- + Replace one action binding to set a new name +- + !python {model: ir.values }: | + self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action New', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) +- + Retrieve the action bindings and check they're correct +- + !python {model: ir.values }: | + actions = self.get(cr, uid, 'action', 'tree_but_open', ['unexisting_model']) + assert len(actions) == 2, "Mismatching number of bound actions" + #first action + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'OnDblClick Action 2', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 11, 'Bound action does not match definition' + #second action - this ones comes last because it was re-created with a different name + assert len(actions[1]) == 3, "Malformed action definition" + assert actions[1][1] == 'OnDblClick Action New', 'Re-Registering an action should replace it' + assert isinstance(actions[1][2], dict) and actions[1][2]['id'] == 10, 'Bound action does not match definition' -# TODO: ADD tests for action bindings too, the other half of ir_values. \ No newline at end of file + actions = self.get(cr, uid, 'action', 'client_action_multi', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Side Wizard', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 12, 'Bound action does not match definition' + + actions = self.get(cr, uid, 'action', 'client_print_multi', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Nice Report', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 2, 'Bound action does not match definition' + + actions = self.get(cr, uid, 'action', 'client_action_relate', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Related Stuff', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 14, 'Bound action does not match definition' From 32020e13531267301abb0e58711bed70c65ff8e7 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 2 Sep 2011 14:56:48 +0200 Subject: [PATCH 074/510] [FIX] ir.values: re-binding of actions should properly delete the previous one bzr revid: odo@openerp.com-20110902125648-x0cir5m7818h9ba6 --- openerp/addons/base/ir/ir_values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index f3faacfd4d4..acb0da72159 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -309,7 +309,7 @@ class ir_values(osv.osv): ('key', '=', 'action'), ('key2', '=', action_slot), ('model', '=', model), - ('res_id', '=', res_id), + ('res_id', '=', res_id or 0), # int field -> NULL == 0 ('value', '=', action), ] self.unlink(cr, uid, self.search(cr, uid, search_criteria)) @@ -319,7 +319,7 @@ class ir_values(osv.osv): 'key2': action_slot, 'object': True, 'model': model, - 'res_id': res_id or False, + 'res_id': res_id, 'name': name, 'value': action, }) From d0af2f830c933a5dab635170d45b79a8278b99aa Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 2 Sep 2011 17:14:42 +0200 Subject: [PATCH 075/510] [FIX] ir.values: get_defaults() should cut the condition at 200 chars to match the conditions that were set bzr revid: odo@openerp.com-20110902151442-rqrh62z67g8k921o --- openerp/addons/base/ir/ir_values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index acb0da72159..ca2973f948e 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -271,7 +271,7 @@ class ir_values(osv.osv): query = query % ('AND v.key2 = %s' if condition else '') params = ('default', model, uid, uid) if condition: - params += (condition,) + params += (condition[:200],) cr.execute(query, params) # keep only the highest priority default for each field From 083691b392b1f9556dd64787f46e7536e7d2f7c3 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 5 Sep 2011 14:37:56 +0200 Subject: [PATCH 076/510] [IMP] ir.values: improve security: users can only write to their personal defaults Administrator access is required to set defaults for everybody, as well as to alter the action bindings. bzr revid: odo@openerp.com-20110905123756-oqum5k2pnbyoa11r --- openerp/addons/base/security/base_security.xml | 7 +++++++ openerp/addons/base/security/ir.model.access.csv | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/security/base_security.xml b/openerp/addons/base/security/base_security.xml index 00aca6613d6..fe3a10fdaed 100644 --- a/openerp/addons/base/security/base_security.xml +++ b/openerp/addons/base/security/base_security.xml @@ -65,6 +65,13 @@ [('company_id','child_of',[user.company_id.id])] + + Defaults: alter personal values only + + [('key','=','default'),('user_id','=',user.id)] + + + diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 8949052f89b..6460c06d1f7 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -38,8 +38,7 @@ "access_ir_ui_view_custom_group_user","ir_ui_view_custom_group_user","model_ir_ui_view_custom",,1,0,0,0 "access_ir_ui_view_custom_group_system","ir_ui_view_custom_group_system","model_ir_ui_view_custom","group_system",1,1,1,1 "access_ir_ui_view_sc_group_user","ir_ui_view_sc group_user","model_ir_ui_view_sc",,1,1,1,1 -"access_ir_values_group_erp_manager","ir_values group_erp_manager","model_ir_values","group_erp_manager",1,1,1,1 -"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,0,1,0 +"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,1,1,1 "access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,1 "access_res_company_group_user","res_company group_user","model_res_company",,1,0,0,0 "access_res_country_group_all","res_country group_user_all","model_res_country",,1,0,0,0 From e333a2eb2e81763cb532b3cd514a80892f185fa1 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 5 Sep 2011 16:10:58 +0200 Subject: [PATCH 077/510] [IMP] ir.values: improved defaults doc + removed `object` column completely The `object` column actually directly depended on the value of the `key` column, so it can be totally removed with no side-effects. Docstrings updated following review comments. bzr revid: odo@openerp.com-20110905141058-xa01o77l1rto6hg9 --- openerp/addons/base/ir/ir.xml | 4 +- openerp/addons/base/ir/ir_values.py | 73 +++++++++++++++++++---------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 3f9c48b467f..3ab0bb3f167 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -93,7 +93,7 @@ tree,form [('key','=','action')] - {'default_object':1,'default_key':'action'} + {'default_key':'action'} @@ -116,7 +116,7 @@ tree,form [('key','=','default')] - {'default_object':0,'default_key':'default','default_key2':''} + {'default_key':'default','default_key2':''} diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index ca2973f948e..2eb7b97d18a 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -78,8 +78,8 @@ class ir_values(osv.osv): all records). The content of the entry is defined by the ``value`` column, which may either - contain an arbitrary value (for default values - when the ``object`` column - is False), or a reference string defining the action that should be executed. + contain an arbitrary value, or a reference string defining the action that + should be executed. .. rubric:: Usage: default values @@ -102,14 +102,15 @@ class ir_values(osv.osv): def _value_unpickle(self, cursor, user, ids, name, arg, context=None): res = {} - for report in self.browse(cursor, user, ids, context=context): - value = report[name[:-9]] - if not report.object and value: + for record in self.browse(cursor, user, ids, context=context): + value = record[name[:-9]] + if record.key == 'default' and value: + # default values are pickled on the fly try: value = str(pickle.loads(value)) except Exception: pass - res[report.id] = value + res[record.id] = value return res def _value_pickle(self, cursor, user, id, name, value, arg, context=None): @@ -118,7 +119,9 @@ class ir_values(osv.osv): ctx = context.copy() if self.CONCURRENCY_CHECK_FIELD in ctx: del ctx[self.CONCURRENCY_CHECK_FIELD] - if not self.browse(cursor, user, id, context=context).object: + record = self.browse(cursor, user, id, context=context) + if record.key == 'default': + # default values are pickled on the fly value = pickle.dumps(value) self.write(cursor, user, id, {name[:-9]: value}, context=ctx) @@ -136,11 +139,6 @@ class ir_values(osv.osv): 'value': {'value_unpickle': act.type+','+str(act.id)} } - def onchange_key(self, cr, uid, ids, key, context=None): - return { - 'value': {'object': key == 'action'} - } - _columns = { 'name': fields.char('Name', size=128, required=True), 'model': fields.char('Model Name', size=128, select=True, required=True, @@ -160,7 +158,6 @@ class ir_values(osv.osv): 'value_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle, type='text', string='Default value or action reference'), - 'object': fields.boolean('No value serialization', help="Should be enabled when Type is Action"), 'key': fields.selection([('action','Action'),('default','Default')], 'Type', size=128, select=True, required=True, help="- Action: an action attached to one slot of the given model\n" @@ -184,7 +181,6 @@ class ir_values(osv.osv): _defaults = { 'key': 'action', 'key2': 'tree_but_open', - 'object': True, } def _auto_init(self, cr, context=None): @@ -195,7 +191,17 @@ class ir_values(osv.osv): def set_default(self, cr, uid, model, field_name, value, for_all_users=True, company_id=False, condition=False): """Defines a default value for the given model and field_name. Any previous - default will be replaced and lost in the process. + default for the same scope (model, field_name, value, for_all_users, company_id, condition) + will be replaced and lost in the process. + + Defaults can be later retrieved via :meth:`~.get_defaults`, which will return + the highest priority default for any given field. Defaults that are more specific + have a higher priority, in the following order (highest to lowest): + + * specific to user and company + * specific to user only + * specific to company only + * global to everyone :param string model: model name :param string field_name: field name to which the default applies @@ -208,7 +214,13 @@ class ir_values(osv.osv): is passed, the current user's company will be used. :param string condition: optional condition specification that can be used to restrict the applicability of the default values - (e.g. based on another field's value) + (e.g. based on another field's value). This is an + opaque string as far as the API is concerned, but client + stacks typically use single-field conditions in the + form ``'key=stringified_value'``. + (Currently, the condition is trimmed to 200 characters, + so values that share the same first 200 characters always + match) :return: id of the newly created ir.values entry """ if isinstance(value, unicode): @@ -233,7 +245,6 @@ class ir_values(osv.osv): 'name': field_name, 'value': pickle.dumps(value), 'model': model, - 'object': False, 'key': 'default', 'key2': condition and condition[:200], 'user_id': False if for_all_users else uid, @@ -241,18 +252,29 @@ class ir_values(osv.osv): }) def get_defaults(self, cr, uid, model, condition=False): - """Returns any user-defined values registered for the given model. - This is not field-specific, but an optional ``condition`` can be - provided to query for default values that should be applied only - when the given condition is met (usually another field's value). - Defaults that have been set for the user herself will have higher - priority that those that have been set for everyone - (see :meth:`~.set_default`). + """Returns any default values that are defined for the current model and user, + (and match ``condition``, if specified), previously registered via + :meth:`~.set_default`. + + Defaults are global to a model, not field-specific, but an optional + ``condition`` can be provided to restrict matching default values + to those that were defined for the same condition (usually based + on another field's value). + + Default values also have priorities depending on whom they apply + to: only the highest priority value will be returned for any + field. See :meth:`~.set_default` for more details. :param string model: model name :param string condition: optional condition specification that can be used to restrict the applicability of the default values - (e.g. based on another field's value) + (e.g. based on another field's value). This is an + opaque string as far as the API is concerned, but client + stacks typically use single-field conditions in the + form ``'key=stringified_value'``. + (Currently, the condition is trimmed to 200 characters, + so values that share the same first 200 characters always + match) :return: list of default values tuples of the form ``(id, field_name, value)`` (``id`` is the ID of the default entry, usually irrelevant) """ @@ -317,7 +339,6 @@ class ir_values(osv.osv): return self.create(cr, uid, { 'key': 'action', 'key2': action_slot, - 'object': True, 'model': model, 'res_id': res_id, 'name': name, From 3ba75e5d50b95f6ba01400afcf1c31ce3ee0f10e Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 8 Sep 2011 15:15:46 +0530 Subject: [PATCH 078/510] [IMP] base.ir_edi: dont use fields_get or _columns to get the list of fields, use the new "self._all_columns" (map of column_info records) which also contains inherited fields and is already cached (see in ORM for the definition of the column_info object) bzr revid: hmo@tinyerp.com-20110908094546-4zy2dbqk8zyrzr26 --- openerp/addons/base/ir/ir_edi.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/ir/ir_edi.py b/openerp/addons/base/ir/ir_edi.py index 2fd11338ffb..5588e4d041f 100644 --- a/openerp/addons/base/ir/ir_edi.py +++ b/openerp/addons/base/ir/ir_edi.py @@ -366,26 +366,27 @@ class edi(object): context = {} if edi_struct is None: edi_struct = {} - _fields = self.fields_get(cr, uid, context=context) - fields_to_export = edi_struct and edi_struct.keys() or _fields.keys() + _columns = self._all_columns + fields_to_export = edi_struct and edi_struct.keys() or _columns.keys() edi_dict_list = [] value = None for row in records: edi_dict = {} edi_dict.update(self.edi_metadata(cr, uid, [row], context=context)[0]) for field in fields_to_export: - cols = _fields[field] + _column = _columns[field].column + _column_dict = fields.field_to_dict(self, cr, uid, context, _column) record = getattr(row, field) if not record: continue #if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): # # Do not Export Function Fields and related fields # continue - elif cols['type'] == 'many2one': + elif _column_dict['type'] == 'many2one': value = self.edi_m2o(cr, uid, record, context=context) - elif cols['type'] == 'many2many': + elif _column_dict['type'] == 'many2many': value = self.edi_m2m(cr, uid, record, context=context) - elif cols['type'] == 'one2many': + elif _column_dict['type'] == 'one2many': value = self.edi_o2m(cr, uid, record, edi_struct=edi_struct.get(field, {}), context=context ) else: value = record @@ -466,24 +467,26 @@ class edi(object): connect it to the parent record via a write value like (4, db_id). """ # generic implementation! - fields = edi_document.keys() fields_to_import = [] data_line = [] model_data = self.pool.get('ir.model.data') - _fields = self.fields_get(cr, uid, context=context) + _columns = self._all_columns values = {} xml_id = edi_document['__id'] assert len(xml_id.split('.'))==2, _("'%s' contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id") % (xml_id) module, xml_id2 = xml_id.split('.') for field in edi_document.keys(): if not field.startswith('__'): + _column = _columns[field].column + _column_dict = fields.field_to_dict(self, cr, uid, context, _column) + fields_to_import.append(field) edi_field_value = edi_document[field] - field_type = _fields[field]['type'] - relation_model = _fields[field].get('relation') + field_type = _column_dict['type'] + relation_model = _column_dict.get('relation') if not edi_field_value: continue - if _fields[field].has_key('function') or _fields[field].has_key('related_columns'): + if _column_dict.has_key('function') or _column_dict.has_key('related_columns'): # DO NOT IMPORT FUNCTION FIELD AND RELATED FIELD continue elif field_type in ('many2one', 'many2many'): From 72b6ac7daf626f4a2f00ce0c0b54bff82cd673fe Mon Sep 17 00:00:00 2001 From: "Purnendu Singh (OpenERP)" Date: Thu, 8 Sep 2011 16:19:21 +0530 Subject: [PATCH 079/510] [FIX] account_payment: account_payment not allowing selection of invoices for payment lp bug: https://launchpad.net/bugs/834091 fixed bzr revid: psi@tinyerp.com-20110908104921-70a4v56zxfyeh5al --- .../account_payment_create_order_view.xml | 3 +- .../wizard/account_payment_order.py | 29 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/account_payment/wizard/account_payment_create_order_view.xml b/addons/account_payment/wizard/account_payment_create_order_view.xml index 905baf7e118..10d437533f4 100644 --- a/addons/account_payment/wizard/account_payment_create_order_view.xml +++ b/addons/account_payment/wizard/account_payment_create_order_view.xml @@ -26,7 +26,8 @@ form
- + + diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py index d1137078c32..613b049a412 100644 --- a/addons/account_payment/wizard/account_payment_order.py +++ b/addons/account_payment/wizard/account_payment_order.py @@ -29,7 +29,7 @@ class payment_order_create(osv.osv_memory): Create a payment object with lines corresponding to the account move line to pay according to the date and the mode provided by the user. Hypothesis: - - Small number of non-reconcilied move line, payment mode and bank account type, + - Small number of non-reconciled move line, payment mode and bank account type, - Big number of partner and bank account. If a type is given, unsuitable account Entry lines are ignored. @@ -48,12 +48,11 @@ class payment_order_create(osv.osv_memory): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): res = super(payment_order_create, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=False) if context and 'line_ids' in context: - view_obj = etree.XML(res['arch']) - child = view_obj.getchildren()[0] - domain = '[("id", "in", '+ str(context['line_ids'])+')]' - field = etree.Element('field', attrib={'domain': domain, 'name':'entries', 'colspan':'4', 'height':'300', 'width':'800', 'nolabel':"1"}) - child.addprevious(field) - res['arch'] = etree.tostring(view_obj) + doc = etree.XML(res['arch']) + nodes = doc.xpath("//field[@name='entries']") + for node in nodes: + node.set('domain', '[("id", "in", '+ str(context['line_ids'])+')]') + res['arch'] = etree.tostring(doc) return res def create_payment(self, cr, uid, ids, context=None): @@ -81,14 +80,14 @@ class payment_order_create(osv.osv_memory): elif payment.date_prefered == 'fixed': date_to_pay = payment.date_scheduled payment_obj.create(cr, uid,{ - 'move_line_id': line.id, - 'amount_currency': line.amount_to_pay, - 'bank_id': line2bank.get(line.id), - 'order_id': payment.id, - 'partner_id': line.partner_id and line.partner_id.id or False, - 'communication': line.ref or '/', - 'date': date_to_pay, - 'currency': line.invoice and line.invoice.currency_id.id or False, + 'move_line_id': line.id, + 'amount_currency': line.amount_to_pay, + 'bank_id': line2bank.get(line.id), + 'order_id': payment.id, + 'partner_id': line.partner_id and line.partner_id.id or False, + 'communication': line.ref or '/', + 'date': date_to_pay, + 'currency': line.invoice and line.invoice.currency_id.id or False, }, context=context) return {'type': 'ir.actions.act_window_close'} From fbb6e5e56aaf36ff652edbec0181a0fcb95a3601 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 8 Sep 2011 13:38:33 +0200 Subject: [PATCH 080/510] [FIX] ir.values.get_defaults: typo in SQL query - spotted by Naresh, thanks! bzr revid: odo@openerp.com-20110908113833-z2cgkj093940usys --- openerp/addons/base/ir/ir_values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index 2eb7b97d18a..d908c2096b3 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -284,8 +284,8 @@ class ir_values(osv.osv): LEFT JOIN res_users u ON (v.user_id = u.id) WHERE v.key = %%s AND v.model = %%s AND (v.user_id = %%s OR v.user_id IS NULL) - AND (u.company_id IS NULL OR - u.company_id = + AND (v.company_id IS NULL OR + v.company_id = (SELECT company_id from res_users where id = %%s) ) %s From 09b63ae6ea0dfe2e173218097dde865d791ac529 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 16:15:41 +0200 Subject: [PATCH 081/510] [FIX] don't *eval* field names to get the field type associated with a function field bzr revid: xmo@openerp.com-20110909141541-p172s7jqu597sjc9 --- openerp/osv/orm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index b87672c012d..341f14e00e2 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -514,9 +514,9 @@ def get_pg_type(f): f_type = ('int4', 'INTEGER') else: f_type = ('varchar', 'VARCHAR(%d)' % f_size) - elif isinstance(f, fields.function) and eval('fields.'+(f._type), globals()) in type_dict: - t = eval('fields.'+(f._type), globals()) - f_type = (type_dict[t], type_dict[t]) + elif isinstance(f, fields.function) and getattr(fields, f._type, None) in type_dict: + t = type_dict[getattr(fields, f._type)] + f_type = (t, t) elif isinstance(f, fields.function) and f._type == 'float': if f.digits: f_type = ('numeric', 'NUMERIC') From cf44b49c939c7209111fea41b9a506d21b96dbee Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 16:33:49 +0200 Subject: [PATCH 082/510] [IMP] extract VARCHAR typing, if no size is provided (or the size is 0) don't put a limit on the varchar bzr revid: xmo@openerp.com-20110909143349-5sykc4lpsn3rxf5w --- openerp/osv/orm.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 341f14e00e2..8041628626d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -475,6 +475,18 @@ class browse_record(object): __repr__ = __str__ +def pg_varchar(size=0): + """ Returns the VARCHAR declaration for the provided size: + + * If no size (or an empty size is provided) return an 'infinite' VARCHAR + * Otherwise return a VARCHAR(n) + + :type int size: varchar size, optional + :rtype: str + """ + if size: + return 'VARCHAR(%d)' % size + return 'VARCHAR' def get_pg_type(f): """ @@ -501,19 +513,19 @@ def get_pg_type(f): else: f_type = ('float8', 'DOUBLE PRECISION') elif isinstance(f, (fields.char, fields.reference)): - f_type = ('varchar', 'VARCHAR(%d)' % (f.size,)) + f_type = ('varchar', pg_varchar(f.size)) elif isinstance(f, fields.selection): if isinstance(f.selection, list) and isinstance(f.selection[0][0], (str, unicode)): - f_size = reduce(lambda x, y: max(x, len(y[0])), f.selection, f.size or 16) + f_size = reduce(lambda x, y: max(x, len(y[0])), f.selection, f.size) elif isinstance(f.selection, list) and isinstance(f.selection[0][0], int): f_size = -1 else: - f_size = getattr(f, 'size', None) or 16 + f_size = getattr(f, 'size', None) if f_size == -1: f_type = ('int4', 'INTEGER') else: - f_type = ('varchar', 'VARCHAR(%d)' % f_size) + f_type = ('varchar', pg_varchar(f_size)) elif isinstance(f, fields.function) and getattr(fields, f._type, None) in type_dict: t = type_dict[getattr(fields, f._type)] f_type = (t, t) @@ -525,7 +537,7 @@ def get_pg_type(f): elif isinstance(f, fields.function) and f._type == 'selection': f_type = ('text', 'text') elif isinstance(f, fields.function) and f._type == 'char': - f_type = ('varchar', 'VARCHAR(%d)' % (f.size)) + f_type = ('varchar', pg_varchar(f.size)) else: logger = netsvc.Logger() logger.notifyChannel("init", netsvc.LOG_WARNING, '%s type not supported!' % (type(f))) @@ -2838,7 +2850,7 @@ class orm(orm_template): if f_obj_type: ok = False casts = [ - ('text', 'char', 'VARCHAR(%d)' % (f.size or 0,), '::VARCHAR(%d)'%(f.size or 0,)), + ('text', 'char', pg_varchar(f.size), '::%s' % pg_varchar(f.size), ('varchar', 'text', 'TEXT', ''), ('int4', 'float', get_pg_type(f)[1], '::'+get_pg_type(f)[1]), ('date', 'datetime', 'TIMESTAMP', '::TIMESTAMP'), @@ -2848,8 +2860,8 @@ class orm(orm_template): ] if f_pg_type == 'varchar' and f._type == 'char' and f_pg_size < f.size: cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO temp_change_size' % (self._table, k)) - cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" VARCHAR(%d)' % (self._table, k, f.size)) - cr.execute('UPDATE "%s" SET "%s"=temp_change_size::VARCHAR(%d)' % (self._table, k, f.size)) + cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, pg_varchar(f.size))) + cr.execute('UPDATE "%s" SET "%s"=temp_change_size::%s' % (self._table, k, pg_varchar(f.size))) cr.execute('ALTER TABLE "%s" DROP COLUMN temp_change_size CASCADE' % (self._table,)) cr.commit() self.__schema.debug("Table '%s': column '%s' (type varchar) changed size from %s to %s", From 8668ad7ed3d9d2b406c179f1e111b2d63c875ad6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 16:52:13 +0200 Subject: [PATCH 083/510] [IMP] have function fields delegate their pg_type discovery to get_pg_type * add a type override to get_pg_type, so the function field can pass itself as another field type * special-case the 'selection' role, not sure it's correct but it was pretty special last time around (I guess since we don't have the field's values available we can't just do the type/size inference of get_pg_type) bzr revid: xmo@openerp.com-20110909145213-y172z8eyfnond43w --- openerp/osv/orm.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 8041628626d..97c4ef89c60 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -488,11 +488,14 @@ def pg_varchar(size=0): return 'VARCHAR(%d)' % size return 'VARCHAR' -def get_pg_type(f): +def get_pg_type(f, type_override=None): """ - returns a tuple - (type returned by postgres when the column was created, type expression to create the column) + :param fields._column f: field to get a Postgres type for + :param type type_override: use the provided type for dispatching instead of the field's own type + :returns: (postgres_identification_type, postgres_type_specification) + :rtype: (str, str) """ + field_type = type_override or type(f) type_dict = { fields.boolean: 'bool', @@ -505,8 +508,8 @@ def get_pg_type(f): fields.binary: 'bytea', fields.many2one: 'int4', } - if type(f) in type_dict: - f_type = (type_dict[type(f)], type_dict[type(f)]) + if field_type in type_dict: + f_type = (type_dict[field_type], type_dict[field_type]) elif isinstance(f, fields.float): if f.digits: f_type = ('numeric', 'NUMERIC') @@ -526,21 +529,15 @@ def get_pg_type(f): f_type = ('int4', 'INTEGER') else: f_type = ('varchar', pg_varchar(f_size)) - elif isinstance(f, fields.function) and getattr(fields, f._type, None) in type_dict: - t = type_dict[getattr(fields, f._type)] - f_type = (t, t) - elif isinstance(f, fields.function) and f._type == 'float': - if f.digits: - f_type = ('numeric', 'NUMERIC') + + elif isinstance(f, fields.function): + if f._type = 'selection': + f_type = ('varchar', pg_varchar()) else: - f_type = ('float8', 'DOUBLE PRECISION') - elif isinstance(f, fields.function) and f._type == 'selection': - f_type = ('text', 'text') - elif isinstance(f, fields.function) and f._type == 'char': - f_type = ('varchar', pg_varchar(f.size)) + f_type = get_pg_type(f, getattr(fields, f._type)) else: logger = netsvc.Logger() - logger.notifyChannel("init", netsvc.LOG_WARNING, '%s type not supported!' % (type(f))) + logger.notifyChannel("init", netsvc.LOG_WARNING, '%s type not supported!' % (field_type)) f_type = None return f_type From 7a3960f736436bb395e237153207c54214aa8dd2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:23:07 +0200 Subject: [PATCH 084/510] [IMP] remove size inference for selection lists with str|unicode value choices, simplify selection pg_type selection * if the first element of the choices list is an integer, use int4 * if the field has a size, use that size * else use an unrestricted varchar bzr revid: xmo@openerp.com-20110909152307-ralzt1g8l1b3e46x --- openerp/osv/orm.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 97c4ef89c60..2892a32c440 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -518,18 +518,10 @@ def get_pg_type(f, type_override=None): elif isinstance(f, (fields.char, fields.reference)): f_type = ('varchar', pg_varchar(f.size)) elif isinstance(f, fields.selection): - if isinstance(f.selection, list) and isinstance(f.selection[0][0], (str, unicode)): - f_size = reduce(lambda x, y: max(x, len(y[0])), f.selection, f.size) - elif isinstance(f.selection, list) and isinstance(f.selection[0][0], int): - f_size = -1 - else: - f_size = getattr(f, 'size', None) - - if f_size == -1: + if isinstance(f.selection, list) and isinstance(f.selection[0][0], int): f_type = ('int4', 'INTEGER') else: - f_type = ('varchar', pg_varchar(f_size)) - + f_type = ('varchar', pg_varchar(getattr(f, 'size', None))) elif isinstance(f, fields.function): if f._type = 'selection': f_type = ('varchar', pg_varchar()) From b9ed013504639a536b0d5c419507985e9bf9ded4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:24:45 +0200 Subject: [PATCH 085/510] [IMP] use logging API in get_pg_types bzr revid: xmo@openerp.com-20110909152445-pol8ko3ckzc6p7s0 --- openerp/osv/orm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 2892a32c440..692368cd44d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -528,8 +528,7 @@ def get_pg_type(f, type_override=None): else: f_type = get_pg_type(f, getattr(fields, f._type)) else: - logger = netsvc.Logger() - logger.notifyChannel("init", netsvc.LOG_WARNING, '%s type not supported!' % (field_type)) + logging.getLogger('orm').warn('%s type not supported!', field_type) f_type = None return f_type From f74c55182a5371c88f64af326cbbb3f56958fbb0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:26:22 +0200 Subject: [PATCH 086/510] [IMP] lift mapping from field types to PGTYPES outside get_pg_type bzr revid: xmo@openerp.com-20110909152622-114y4401x6gw6a79 --- openerp/osv/orm.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 692368cd44d..f20b759f6f8 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -488,6 +488,17 @@ def pg_varchar(size=0): return 'VARCHAR(%d)' % size return 'VARCHAR' +FIELDS_TO_PGTYPES = { + fields.boolean: 'bool', + fields.integer: 'int4', + fields.integer_big: 'int8', + fields.text: 'text', + fields.date: 'date', + fields.time: 'time', + fields.datetime: 'timestamp', + fields.binary: 'bytea', + fields.many2one: 'int4', +} def get_pg_type(f, type_override=None): """ :param fields._column f: field to get a Postgres type for @@ -497,19 +508,8 @@ def get_pg_type(f, type_override=None): """ field_type = type_override or type(f) - type_dict = { - fields.boolean: 'bool', - fields.integer: 'int4', - fields.integer_big: 'int8', - fields.text: 'text', - fields.date: 'date', - fields.time: 'time', - fields.datetime: 'timestamp', - fields.binary: 'bytea', - fields.many2one: 'int4', - } - if field_type in type_dict: - f_type = (type_dict[field_type], type_dict[field_type]) + if field_type in FIELDS_TO_PGTYPES: + f_type = (FIELDS_TO_PGTYPES[field_type], FIELDS_TO_PGTYPES[field_type]) elif isinstance(f, fields.float): if f.digits: f_type = ('numeric', 'NUMERIC') From 4b8be3a051cc20f2079e146f583919b77e662e88 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:39:35 +0200 Subject: [PATCH 087/510] [IMP] use early returns instead of a single return point bzr revid: xmo@openerp.com-20110909153935-uk4cggyv78nfdjqt --- openerp/osv/orm.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index f20b759f6f8..977c3c3deb4 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -509,28 +509,23 @@ def get_pg_type(f, type_override=None): field_type = type_override or type(f) if field_type in FIELDS_TO_PGTYPES: - f_type = (FIELDS_TO_PGTYPES[field_type], FIELDS_TO_PGTYPES[field_type]) + return (FIELDS_TO_PGTYPES[field_type], FIELDS_TO_PGTYPES[field_type]) elif isinstance(f, fields.float): if f.digits: - f_type = ('numeric', 'NUMERIC') - else: - f_type = ('float8', 'DOUBLE PRECISION') + return ('numeric', 'NUMERIC') + return ('float8', 'DOUBLE PRECISION') elif isinstance(f, (fields.char, fields.reference)): - f_type = ('varchar', pg_varchar(f.size)) + return ('varchar', pg_varchar(f.size)) elif isinstance(f, fields.selection): if isinstance(f.selection, list) and isinstance(f.selection[0][0], int): - f_type = ('int4', 'INTEGER') - else: - f_type = ('varchar', pg_varchar(getattr(f, 'size', None))) + return ('int4', 'INTEGER') + return ('varchar', pg_varchar(getattr(f, 'size', None))) elif isinstance(f, fields.function): if f._type = 'selection': - f_type = ('varchar', pg_varchar()) - else: - f_type = get_pg_type(f, getattr(fields, f._type)) - else: - logging.getLogger('orm').warn('%s type not supported!', field_type) - f_type = None - return f_type + return ('varchar', pg_varchar()) + return get_pg_type(f, getattr(fields, f._type)) + logging.getLogger('orm').warn('%s type not supported!', field_type) + return class MetaModel(type): From cbaa36c8ccf31d960d497834f72a2a79b0edb014 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:42:42 +0200 Subject: [PATCH 088/510] [FIX] typo, might want to launch the software from time to time while changing stuff bzr revid: xmo@openerp.com-20110909154242-gve3dgsbmg6crkya --- openerp/osv/orm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 977c3c3deb4..4c592a53342 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -521,7 +521,7 @@ def get_pg_type(f, type_override=None): return ('int4', 'INTEGER') return ('varchar', pg_varchar(getattr(f, 'size', None))) elif isinstance(f, fields.function): - if f._type = 'selection': + if f._type == 'selection': return ('varchar', pg_varchar()) return get_pg_type(f, getattr(fields, f._type)) logging.getLogger('orm').warn('%s type not supported!', field_type) @@ -2833,7 +2833,7 @@ class orm(orm_template): if f_obj_type: ok = False casts = [ - ('text', 'char', pg_varchar(f.size), '::%s' % pg_varchar(f.size), + ('text', 'char', pg_varchar(f.size), '::%s' % pg_varchar(f.size)), ('varchar', 'text', 'TEXT', ''), ('int4', 'float', get_pg_type(f)[1], '::'+get_pg_type(f)[1]), ('date', 'datetime', 'TIMESTAMP', '::TIMESTAMP'), From 0d965c2fca76a73bc301da6769d34e1360a9e418 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 17:58:48 +0200 Subject: [PATCH 089/510] [FIX] if types can be overridden, type-checking against the overriden type instead of the non-overridden instance might be a good idea as well bzr revid: xmo@openerp.com-20110909155848-5no3pvtfugqmhm8q --- openerp/osv/orm.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 4c592a53342..92a22a29f9a 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -510,17 +510,17 @@ def get_pg_type(f, type_override=None): if field_type in FIELDS_TO_PGTYPES: return (FIELDS_TO_PGTYPES[field_type], FIELDS_TO_PGTYPES[field_type]) - elif isinstance(f, fields.float): + elif issubclass(field_type, fields.float): if f.digits: return ('numeric', 'NUMERIC') return ('float8', 'DOUBLE PRECISION') - elif isinstance(f, (fields.char, fields.reference)): + elif issubclass(field_type, (fields.char, fields.reference)): return ('varchar', pg_varchar(f.size)) - elif isinstance(f, fields.selection): + elif issubclass(field_type, fields.selection): if isinstance(f.selection, list) and isinstance(f.selection[0][0], int): return ('int4', 'INTEGER') return ('varchar', pg_varchar(getattr(f, 'size', None))) - elif isinstance(f, fields.function): + elif issubclass(field_type, fields.function): if f._type == 'selection': return ('varchar', pg_varchar()) return get_pg_type(f, getattr(fields, f._type)) From 9c83238f18dd651e0df0bde54c050cfc4a08a694 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 18:16:23 +0200 Subject: [PATCH 090/510] [FIX] reimplement quality selection field API a size attribute of -1 means the selection field is an int4, even if the selection is a callable bzr revid: xmo@openerp.com-20110909161623-nab218ea48ucj4qt --- openerp/osv/orm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 92a22a29f9a..6f794469529 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -517,7 +517,8 @@ def get_pg_type(f, type_override=None): elif issubclass(field_type, (fields.char, fields.reference)): return ('varchar', pg_varchar(f.size)) elif issubclass(field_type, fields.selection): - if isinstance(f.selection, list) and isinstance(f.selection[0][0], int): + if (isinstance(f.selection, list) and isinstance(f.selection[0][0], int))\ + or getattr(f, 'size', None) == -1: return ('int4', 'INTEGER') return ('varchar', pg_varchar(getattr(f, 'size', None))) elif issubclass(field_type, fields.function): From e575211116c099e24ae294e0e5c08f617ae3a9fb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 9 Sep 2011 18:29:29 +0200 Subject: [PATCH 091/510] [IMP] add a pair of assertions on the parameter to VARCHAR, just in case bzr revid: xmo@openerp.com-20110909162929-w1l328oh14ccn7f8 --- openerp/osv/orm.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 6f794469529..9492e3d812b 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -485,6 +485,12 @@ def pg_varchar(size=0): :rtype: str """ if size: + if not isinstance(size, int): + raise TypeError("VARCHAR parameter should be an int, got %s" + % type(size)) + if size < 0: + raise ValueError("VARCHAR parameter can not be negative, got %d" + % size) return 'VARCHAR(%d)' % size return 'VARCHAR' From 7627d736189d17f08d848c969e47b2dd29bcf09c Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Mon, 12 Sep 2011 12:34:17 +0530 Subject: [PATCH 092/510] [FIX] Account_payment: onchange partner for voucher creation argument mismatch due to change of name bzr revid: mra@tinyerp.com-20110912070417-sreyrs9ezxh51v51 --- .../wizard/account_payment_populate_statement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account_payment/wizard/account_payment_populate_statement.py b/addons/account_payment/wizard/account_payment_populate_statement.py index 16d8dc5a7e4..1ef6339d2f3 100644 --- a/addons/account_payment/wizard/account_payment_populate_statement.py +++ b/addons/account_payment/wizard/account_payment_populate_statement.py @@ -76,7 +76,7 @@ class account_payment_populate_statement(osv.osv_memory): statement.currency.id, line.amount_currency, context=ctx) context.update({'move_line_ids': [line.move_line_id.id]}) - result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), currency_id= statement.currency.id, ttype='payment', date=line.ml_maturity_date, context=context) + result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), voucher_currency_id= statement.currency.id, ttype='payment', date=line.ml_maturity_date, context=context) if line.move_line_id: voucher_res = { From 2d5e043413945657e2c09f74d9c1142f30bbfe42 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Mon, 12 Sep 2011 12:42:37 +0530 Subject: [PATCH 093/510] [FIX] Account_payment: fixed indentation bzr revid: mra@tinyerp.com-20110912071237-8ghzf91g6drp950t --- .../account_payment_create_order_view.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/account_payment/wizard/account_payment_create_order_view.xml b/addons/account_payment/wizard/account_payment_create_order_view.xml index 10d437533f4..0a0997176aa 100644 --- a/addons/account_payment/wizard/account_payment_create_order_view.xml +++ b/addons/account_payment/wizard/account_payment_create_order_view.xml @@ -8,15 +8,15 @@ form - - - - - - +
    +
+ + +
+

Minh Tran

+ +
+ + +
+ +
+
+ + + + + + + + + + + + +
ProductPriceDisc (%)QtyTotal
+
+
+
    +
  • Subtotal: 0
  • +
  • Tax: 0
  • +
  • Total: 0
  • +
+
+
+
+ + + +
+ + + +
+ + + +
+ + + +
+
+
+
+ +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + From 14528b600e2a48f8b056d9999a1e9d989bc3b56b Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 27 Sep 2011 17:47:25 +0200 Subject: [PATCH 184/510] [IMP] base_setup: add a new wizard bzr revid: stw@openerp.com-20110927154725-l2tazrlqbjhslm1j --- addons/base_setup/base_setup.py | 153 ++++++++++++++++++++++++- addons/base_setup/base_setup_views.xml | 12 ++ 2 files changed, 164 insertions(+), 1 deletion(-) diff --git a/addons/base_setup/base_setup.py b/addons/base_setup/base_setup.py index 5e0b5c7f13b..f5b07d83d53 100644 --- a/addons/base_setup/base_setup.py +++ b/addons/base_setup/base_setup.py @@ -20,15 +20,166 @@ ############################################################################## import pytz +import simplejson +import cgi import pooler import tools from osv import fields, osv from tools.translate import _ from lxml import etree -from osv import fields, osv + +class ir_module_category(osv.osv): + _inherit = 'ir.module.category' + + _columns = { + 'module_ids' : fields.one2many('ir.module.module', 'category_id', 'Modules'), + } +ir_module_category() #Application and feature chooser, this could be done by introspecting ir.modules +class base_setup_installer2(osv.osv_memory): + _name = 'base.setup.installer2' + + _inherit = 'res.config.installer' + + _columns = { + 'modules' : fields.text('Modules'), + } + + def fields_get(self, cr, uid, fields=None, context=None): + if context is None: + context = {} + if fields is None: + fields = {} + + fields = {} #super(base_setup_installer2, self).fields_get(cr, uid, fields, context=context) + category_proxy = self.pool.get('ir.module.category') + category_ids = category_proxy.search(cr, uid, [], context=context) + for category in category_proxy.browse(cr, uid, category_ids, context=context): + category_name = 'category_%d' % (category.id,) + fields[category_name] = { + 'type' : 'boolean', + 'string' : category.name, + 'name' : category_name, + } + + module_proxy = self.pool.get('ir.module.module') + module_ids = module_proxy.search(cr, uid, [], context=context) + for module in module_proxy.browse(cr, uid, module_ids, context=context): + module_name = 'module_%s' % (module.name,) + module_is_installed = module.state == 'installed' + fields[module_name] = { + 'type' : 'boolean', + 'string' : module.shortdesc, + 'name' : module_name, + 'help' : module.description, + } + + return fields + + def default_get(self, cr, uid, fields=None, context=None): + if context is None: + context = {} + if fields is None: + fields = {} + + result = {} + + if 'dont_compute_virtual_attributes' not in context: + module_proxy = self.pool.get('ir.module.module') + module_ids = module_proxy.search(cr, uid, [], context=context) + for module in module_proxy.browse(cr, uid, module_ids, context=context): + result['module_%s' % (module.name,)] = module.state == 'installed' + category_name = 'category_%d' % (module.category_id.id,) + if not result.get('category_name'): + result[category_name] = module.state == 'installed' + + return result + + def fields_view_get(self, cr, uid, view_id=None, view_type='from', context=None, toolbar=False, submenu=False): + result = super(base_setup_installer2, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) + + module_category_proxy = self.pool.get('ir.module.category') + module_category_ids = module_category_proxy.search(cr, uid, [('name', '!=', 'Base')], context=context, order='name asc') + arch = ['
'] + arch.append('') + for module_category in module_category_proxy.browse(cr, uid, module_category_ids, context=context): + readonly = False + for module in module_category.module_ids: + if module.state == 'installed': + readonly=True + + if readonly: + arch.append("""""" % (module_category.id, simplejson.dumps({'readonly' : True}),)) + else: + arch.append('' % (module_category.id,)) + + + for module_category in module_category_proxy.browse(cr, uid, module_category_ids, context=context): + if not module_category.module_ids: + continue + + modifiers = { + 'invisible' : [('category_%d' % (module_category.id), '=', False)], + 'readonly' : module.state == 'installed', + } + modifiers = simplejson.dumps(modifiers) + arch.append("""""" % (cgi.escape(module_category.name), modifiers)) + for module in module_category.module_ids: + arch.append("""""" % (module.name, modifiers)) + + arch.append( + '' + '' + '
@@ -134,18 +134,18 @@
From b04d607ec4d005a74bd13b38b172680e21e4933b Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 3 Oct 2011 17:40:08 +0200 Subject: [PATCH 326/510] [FIX] ir_values: missing trimming of the condition (as done elsewhere). bzr revid: vmt@openerp.com-20111003154008-k8dm2r3yhintm0ql --- openerp/addons/base/ir/ir_values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py index d908c2096b3..15e8f3bf3ce 100644 --- a/openerp/addons/base/ir/ir_values.py +++ b/openerp/addons/base/ir/ir_values.py @@ -233,7 +233,7 @@ class ir_values(osv.osv): # remove existing defaults for the same scope search_criteria = [ ('key', '=', 'default'), - ('key2', '=', condition), + ('key2', '=', condition and condition[:200]), ('model', '=', model), ('name', '=', field_name), ('user_id', '=', False if for_all_users else uid), From dd5f24517e6e4fea40bbeb9c3dd5dbdd05d437d5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 3 Oct 2011 18:28:33 +0200 Subject: [PATCH 327/510] [fix] some problem with web client api modified bzr revid: nicolas.vanhoren@openerp.com-20111003162833-j911gi9au934thh6 --- .../static/lib/backbone/backbone-0.5.3.min.js | 33 ------------------- addons/point_of_sale/static/src/js/pos.js | 23 ++++++++----- addons/point_of_sale/static/src/pos.html | 2 +- 3 files changed, 16 insertions(+), 42 deletions(-) delete mode 100644 addons/point_of_sale/static/lib/backbone/backbone-0.5.3.min.js diff --git a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.min.js b/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.min.js deleted file mode 100644 index 3f0d495dc39..00000000000 --- a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.min.js +++ /dev/null @@ -1,33 +0,0 @@ -// Backbone.js 0.5.3 -// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://documentcloud.github.com/backbone -(function(){var h=this,p=h.Backbone,e;e=typeof exports!=="undefined"?exports:h.Backbone={};e.VERSION="0.5.3";var f=h._;if(!f&&typeof require!=="undefined")f=require("underscore")._;var g=h.jQuery||h.Zepto;e.noConflict=function(){h.Backbone=p;return this};e.emulateHTTP=!1;e.emulateJSON=!1;e.Events={bind:function(a,b,c){var d=this._callbacks||(this._callbacks={});(d[a]||(d[a]=[])).push([b,c]);return this},unbind:function(a,b){var c;if(a){if(c=this._callbacks)if(b){c=c[a];if(!c)return this;for(var d= -0,e=c.length;d/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},has:function(a){return this.attributes[a]!=null},set:function(a,b){b||(b={});if(!a)return this;if(a.attributes)a=a.attributes;var c=this.attributes,d=this._escapedAttributes;if(!b.silent&&this.validate&&!this._performValidation(a,b))return!1;if(this.idAttribute in a)this.id=a[this.idAttribute]; -var e=this._changing;this._changing=!0;for(var g in a){var h=a[g];if(!f.isEqual(c[g],h))c[g]=h,delete d[g],this._changed=!0,b.silent||this.trigger("change:"+g,this,h,b)}!e&&!b.silent&&this._changed&&this.change(b);this._changing=!1;return this},unset:function(a,b){if(!(a in this.attributes))return this;b||(b={});var c={};c[a]=void 0;if(!b.silent&&this.validate&&!this._performValidation(c,b))return!1;delete this.attributes[a];delete this._escapedAttributes[a];a==this.idAttribute&&delete this.id;this._changed= -!0;b.silent||(this.trigger("change:"+a,this,void 0,b),this.change(b));return this},clear:function(a){a||(a={});var b,c=this.attributes,d={};for(b in c)d[b]=void 0;if(!a.silent&&this.validate&&!this._performValidation(d,a))return!1;this.attributes={};this._escapedAttributes={};this._changed=!0;if(!a.silent){for(b in c)this.trigger("change:"+b,this,void 0,a);this.change(a)}return this},fetch:function(a){a||(a={});var b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return!1;c&& -c(b,d)};a.error=i(a.error,b,a);return(this.sync||e.sync).call(this,"read",this,a)},save:function(a,b){b||(b={});if(a&&!this.set(a,b))return!1;var c=this,d=b.success;b.success=function(a,e,f){if(!c.set(c.parse(a,f),b))return!1;d&&d(c,a,f)};b.error=i(b.error,c,b);var f=this.isNew()?"create":"update";return(this.sync||e.sync).call(this,f,this,b)},destroy:function(a){a||(a={});if(this.isNew())return this.trigger("destroy",this,this.collection,a);var b=this,c=a.success;a.success=function(d){b.trigger("destroy", -b,b.collection,a);c&&c(b,d)};a.error=i(a.error,b,a);return(this.sync||e.sync).call(this,"delete",this,a)},url:function(){var a=k(this.collection)||this.urlRoot||l();if(this.isNew())return a;return a+(a.charAt(a.length-1)=="/"?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this)},isNew:function(){return this.id==null},change:function(a){this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes);this._changed=!1},hasChanged:function(a){if(a)return this._previousAttributes[a]!= -this.attributes[a];return this._changed},changedAttributes:function(a){a||(a=this.attributes);var b=this._previousAttributes,c=!1,d;for(d in a)f.isEqual(b[d],a[d])||(c=c||{},c[d]=a[d]);return c},previous:function(a){if(!a||!this._previousAttributes)return null;return this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},_performValidation:function(a,b){var c=this.validate(a);if(c)return b.error?b.error(this,c,b):this.trigger("error",this,c,b),!1;return!0}}); -e.Collection=function(a,b){b||(b={});if(b.comparator)this.comparator=b.comparator;f.bindAll(this,"_onModelEvent","_removeReference");this._reset();a&&this.reset(a,{silent:!0});this.initialize.apply(this,arguments)};f.extend(e.Collection.prototype,e.Events,{model:e.Model,initialize:function(){},toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c').hide().appendTo("body")[0].contentWindow,this.navigate(a); -this._hasPushState?g(window).bind("popstate",this.checkUrl):"onhashchange"in window&&!b?g(window).bind("hashchange",this.checkUrl):setInterval(this.checkUrl,this.interval);this.fragment=a;m=!0;a=window.location;b=a.pathname==this.options.root;if(this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;else if(this._wantsPushState&&this._hasPushState&&b&&a.hash)this.fragment=a.hash.replace(j,""),window.history.replaceState({}, -document.title,a.protocol+"//"+a.host+this.options.root+this.fragment);if(!this.options.silent)return this.loadUrl()},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.iframe.location.hash));if(a==this.fragment||a==decodeURIComponent(this.fragment))return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(window.location.hash)},loadUrl:function(a){var b=this.fragment=this.getFragment(a); -return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){var c=(a||"").replace(j,"");if(!(this.fragment==c||this.fragment==decodeURIComponent(c))){if(this._hasPushState){var d=window.location;c.indexOf(this.options.root)!=0&&(c=this.options.root+c);this.fragment=c;window.history.pushState({},document.title,d.protocol+"//"+d.host+c)}else if(window.location.hash=this.fragment=c,this.iframe&&c!=this.getFragment(this.iframe.location.hash))this.iframe.document.open().close(), -this.iframe.location.hash=c;b&&this.loadUrl(a)}}});e.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.delegateEvents();this.initialize.apply(this,arguments)};var u=/^(\S+)\s*(.*)$/,n=["model","collection","el","id","attributes","className","tagName"];f.extend(e.View.prototype,e.Events,{tagName:"div",$:function(a){return g(a,this.el)},initialize:function(){},render:function(){return this},remove:function(){g(this.el).remove();return this},make:function(a, -b,c){a=document.createElement(a);b&&g(a).attr(b);c&&g(a).html(c);return a},delegateEvents:function(a){if(a||(a=this.events))for(var b in f.isFunction(a)&&(a=a.call(this)),g(this.el).unbind(".delegateEvents"+this.cid),a){var c=this[a[b]];if(!c)throw Error('Event "'+a[b]+'" does not exist');var d=b.match(u),e=d[1];d=d[2];c=f.bind(c,this);e+=".delegateEvents"+this.cid;d===""?g(this.el).bind(e,c):g(this.el).delegate(d,e,c)}},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b= -0,c=n.length;b - + From ea019d556f341bf09f316bc7fb6409980dfd74cf Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 3 Oct 2011 19:13:02 +0200 Subject: [PATCH 328/510] [IMP] yaml_import: make !ref nodes work for m2o values bzr revid: odo@openerp.com-20111003171302-n1quzvs2pjyn7xr6 --- openerp/tools/yaml_import.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index bb4ce9db87d..91cdda1b896 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -340,6 +340,7 @@ class YamlInterpreter(object): return record_dict def process_ref(self, node, column=None): + assert node.search or node.id, '!ref node should have a `search` attribute or `id` attribute' if node.search: if node.model: model_name = node.model @@ -377,7 +378,10 @@ class YamlInterpreter(object): if column._type in ("many2many", "one2many"): value = [(6, 0, elements)] else: # many2one - value = self._get_first_result(elements) + if isinstance(elements, (list,tuple)): + value = self._get_first_result(elements) + else: + value = elements elif column._type == "many2one": value = self.get_id(expression) elif column._type == "one2many": From fd67e605f4f6ffb595c34e71cb697ec69fc0a000 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 3 Oct 2011 19:52:06 +0200 Subject: [PATCH 329/510] [FIX] packaging MANIFEST.in sdist includes everything bzr revid: al@openerp.com-20111003175206-afjurox08f55jafh --- MANIFEST.in | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 70715f18bc2..c864492136d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,12 +1,13 @@ +graft debian +graft doc +graft install +graft openerp +graft tests +graft win32 include README include LICENSE include MANIFEST.in -include setup.nsi -include setup.cfg -include setup_rpm.sh -recursive-include win32 *.py *.bat -recursive-include openerp *css *csv *html *png *po *pot *rml *rng *sql *sxw *xml *xsl *yml -graft install -graft debian -graft doc +include gunicorn.conf.py +include openerp-server +include setup* global-exclude *pyc *~ # Exclude possible garbage from previous graft. From 649d172a6436d5cd66f430ab1d0b0a28896ed2d0 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 3 Oct 2011 20:10:01 +0200 Subject: [PATCH 330/510] [IMP] packaging remove timestamp, use version bzr revid: al@openerp.com-20111003181001-bu4y5t8u937wb0a7 --- openerp/release.py | 1 - setup.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/openerp/release.py b/openerp/release.py index 23a764bc94c..babe0ca4806 100644 --- a/openerp/release.py +++ b/openerp/release.py @@ -36,6 +36,5 @@ url = 'http://www.openerp.com' author = 'OpenERP S.A.' author_email = 'info@openerp.com' license = 'AGPL-3' -timestamp = None # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/setup.py b/setup.py index 08c30faf737..9aabfb0a344 100755 --- a/setup.py +++ b/setup.py @@ -63,8 +63,6 @@ def py2exe_options(): return {} execfile(join(os.path.dirname(__file__), 'openerp', 'release.py')) -if timestamp: - version = version + "-" + timestamp setuptools.setup( name = 'openerp', From 0a85361db963355925be3ef41c5d06da7f7e0040 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 4 Oct 2011 05:02:04 +0000 Subject: [PATCH 331/510] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20111004050146-bi1cipzsk35qj5sq bzr revid: launchpad_translations_on_behalf_of_openerp-20111004050204-nabcu9izdjhcovhd --- addons/base_crypt/i18n/es_CL.po | 33 ++- addons/base_tools/i18n/es_CL.po | 32 +++ addons/board/i18n/es_CL.po | 395 ++++++++++++++++++++++++++++++ addons/stock/i18n/es_CL.po | 173 +++++++------ debian/po/es_CL.po | 15 +- openerp/addons/base/i18n/es_CL.po | 8 +- 6 files changed, 563 insertions(+), 93 deletions(-) create mode 100644 addons/base_tools/i18n/es_CL.po create mode 100644 addons/board/i18n/es_CL.po diff --git a/addons/base_crypt/i18n/es_CL.po b/addons/base_crypt/i18n/es_CL.po index fafe03b997b..98e08733973 100644 --- a/addons/base_crypt/i18n/es_CL.po +++ b/addons/base_crypt/i18n/es_CL.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-06-06 18:09+0000\n" -"Last-Translator: doingit.cl \n" +"PO-Revision-Date: 2011-10-03 17:17+0000\n" +"Last-Translator: David Acevedo Toledo \n" "Language-Team: Spanish (Chile) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:58+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-10-04 05:02+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: base_crypt #: sql_constraint:res.users:0 msgid "You can not have two users with the same login !" -msgstr "" +msgstr "¡No puede tener dos usuarios con el mismo nombre!" #. module: base_crypt #: model:ir.model,name:base_crypt.model_res_users @@ -31,18 +31,19 @@ msgstr "res.users" #: constraint:res.users:0 msgid "The chosen company is not in the allowed companies for this user" msgstr "" -"La compañía seleccionada no está autorizada como compañía para este usuario" +"La compañía seleccionada no está dentro de las compañías autorizadas para " +"este usuario" #. module: base_crypt #: code:addons/base_crypt/crypt.py:132 #, python-format msgid "Please specify the password !" -msgstr "" +msgstr "¡Por favor, escriba una contraseña!" #. module: base_crypt #: model:ir.module.module,shortdesc:base_crypt.module_meta_information msgid "Base - Password Encryption" -msgstr "" +msgstr "Base - Encriptación de la Contraseña" #. module: base_crypt #: code:addons/base_crypt/crypt.py:132 @@ -70,3 +71,19 @@ msgid "" "unless you are using a secure protocol such as XML-RPCS.\n" " " msgstr "" +"Este módulo sustituye la contraseña escrita en texto plano por una " +"codificada,\n" +"previniendo que alguien pueda leer la contraseña original.\n" +"Para un usuario existente, el sustitución de la contraseña en texto plano se " +"realiza la primera vez\n" +"que el usuario se conecte después de instalar base_crypt.\n" +"Después de instalar este módulo los usuarios no podrán recuperar su " +"contraseña olvidada,\n" +"un administrador tendrá que cambiarla por una nueva.\n" +"\n" +"Nota: instalar este módulo no significa que pueda ignorar las medidas " +"básicas de seguridad,\n" +"como la contraseña que es enviada por el cliente que sigue sin ser " +"codificada en la red,\n" +"a menos que utilice un protocolo seguro como XML-RPCS.\n" +" " diff --git a/addons/base_tools/i18n/es_CL.po b/addons/base_tools/i18n/es_CL.po new file mode 100644 index 00000000000..47ebd7bd625 --- /dev/null +++ b/addons/base_tools/i18n/es_CL.po @@ -0,0 +1,32 @@ +# Spanish (Chile) translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-10-03 16:53+0000\n" +"Last-Translator: David Acevedo Toledo \n" +"Language-Team: Spanish (Chile) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-10-04 05:02+0000\n" +"X-Generator: Launchpad (build 14071)\n" + +#. module: base_tools +#: model:ir.module.module,shortdesc:base_tools.module_meta_information +msgid "Common base for tools modules" +msgstr "Base común para módulos de herramientas" + +#. module: base_tools +#: model:ir.module.module,description:base_tools.module_meta_information +msgid "" +"\n" +" " +msgstr "" +"\n" +" " diff --git a/addons/board/i18n/es_CL.po b/addons/board/i18n/es_CL.po new file mode 100644 index 00000000000..1a603deddb1 --- /dev/null +++ b/addons/board/i18n/es_CL.po @@ -0,0 +1,395 @@ +# Spanish (Chile) translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-10-03 16:58+0000\n" +"Last-Translator: David Acevedo Toledo \n" +"Language-Team: Spanish (Chile) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-10-04 05:01+0000\n" +"X-Generator: Launchpad (build 14071)\n" + +#. module: board +#: view:res.log.report:0 +msgid " Year " +msgstr " Año " + +#. module: board +#: model:ir.model,name:board.model_board_menu_create +msgid "Menu Create" +msgstr "Crear menú" + +#. module: board +#: view:board.note:0 +#: field:board.note.type,name:0 +#: model:ir.model,name:board.model_board_note_type +msgid "Note Type" +msgstr "Tipo de nota" + +#. module: board +#: view:board.note:0 +#: field:board.note,user_id:0 +msgid "Author" +msgstr "Autor" + +#. module: board +#: model:ir.module.module,shortdesc:board.module_meta_information +msgid "Dashboard main module" +msgstr "Módulo principal de tableros" + +#. module: board +#: view:res.users:0 +msgid "Latest Connections" +msgstr "Últimas conexiones" + +#. module: board +#: code:addons/board/wizard/board_menu_create.py:45 +#, python-format +msgid "User Error!" +msgstr "¡Error de usuario!" + +#. module: board +#: view:board.board:0 +#: model:ir.actions.act_window,name:board.open_board_administration_form +#: model:ir.ui.menu,name:board.menu_board_admin +msgid "Administration Dashboard" +msgstr "Tablero de Administración" + +#. module: board +#: view:board.note:0 +#: field:board.note,note:0 +#: model:ir.model,name:board.model_board_note +msgid "Note" +msgstr "Nota" + +#. module: board +#: view:board.note:0 +#: view:res.log.report:0 +msgid "Group By..." +msgstr "Agrupar por..." + +#. module: board +#: model:ir.model,name:board.model_board_board +msgid "Board" +msgstr "Tablero" + +#. module: board +#: view:board.board:0 +#: model:ir.actions.act_window,name:board.board_weekly_res_log_report_action +#: view:res.log.report:0 +msgid "Weekly Global Activity" +msgstr "Actividad global semanal" + +#. module: board +#: field:board.board.line,name:0 +msgid "Title" +msgstr "Título" + +#. module: board +#: field:res.log.report,nbr:0 +msgid "# of Entries" +msgstr "Nº de entradas" + +#. module: board +#: view:res.log.report:0 +#: field:res.log.report,month:0 +msgid "Month" +msgstr "Mes" + +#. module: board +#: model:ir.actions.act_window,name:board.dashboard_open +msgid "Open Dashboard" +msgstr "Abrir tablero" + +#. module: board +#: view:board.board:0 +#: model:ir.actions.act_window,name:board.board_monthly_res_log_report_action +#: view:res.log.report:0 +msgid "Monthly Activity per Document" +msgstr "Actividad mensual por documento" + +#. module: board +#: view:res.log.report:0 +msgid "Log Analysis" +msgstr "Análisis de registro" + +#. module: board +#: model:ir.actions.act_window,name:board.action_view_board_list_form +#: model:ir.ui.menu,name:board.menu_view_board_form +msgid "Dashboard Definition" +msgstr "Definición de tablero" + +#. module: board +#: selection:res.log.report,month:0 +msgid "March" +msgstr "Marzo" + +#. module: board +#: selection:res.log.report,month:0 +msgid "August" +msgstr "Agosto" + +#. module: board +#: view:board.board:0 +#: model:ir.actions.act_window,name:board.action_user_connection_tree +msgid "User Connections" +msgstr "Conexiones de usuario" + +#. module: board +#: field:res.log.report,creation_date:0 +msgid "Creation Date" +msgstr "Fecha de Creación" + +#. module: board +#: model:ir.actions.act_window,name:board.action_view_board_note_form +#: model:ir.ui.menu,name:board.menu_view_board_note_form +msgid "Publish a note" +msgstr "Publicar una nota" + +#. module: board +#: view:board.menu.create:0 +msgid "Menu Information" +msgstr "Información del menú" + +#. module: board +#: selection:res.log.report,month:0 +msgid "June" +msgstr "Junio" + +#. module: board +#: field:board.note,type:0 +msgid "Note type" +msgstr "Tipo de nota" + +#. module: board +#: field:board.board,line_ids:0 +msgid "Action Views" +msgstr "Vistas de acciones" + +#. module: board +#: model:ir.model,name:board.model_res_log_report +msgid "Log Report" +msgstr "Informe de registro" + +#. module: board +#: view:board.note:0 +#: field:board.note,date:0 +msgid "Date" +msgstr "Fecha" + +#. module: board +#: selection:res.log.report,month:0 +msgid "July" +msgstr "Julio" + +#. module: board +#: view:res.log.report:0 +msgid "Extended Filters..." +msgstr "Filtros extendidos..." + +#. module: board +#: view:res.log.report:0 +#: field:res.log.report,day:0 +msgid "Day" +msgstr "Dia" + +#. module: board +#: view:board.menu.create:0 +msgid "Create Menu For Dashboard" +msgstr "Crear menú para tablero" + +#. module: board +#: selection:res.log.report,month:0 +msgid "February" +msgstr "Febrero" + +#. module: board +#: selection:res.log.report,month:0 +msgid "October" +msgstr "Octubre" + +#. module: board +#: model:ir.model,name:board.model_board_board_line +msgid "Board Line" +msgstr "Línea tablero" + +#. module: board +#: field:board.menu.create,menu_parent_id:0 +msgid "Parent Menu" +msgstr "Menú padre" + +#. module: board +#: view:res.log.report:0 +msgid " Month-1 " +msgstr " Mes-1 " + +#. module: board +#: selection:res.log.report,month:0 +msgid "January" +msgstr "Enero" + +#. module: board +#: view:board.note:0 +msgid "Notes" +msgstr "Notas" + +#. module: board +#: selection:res.log.report,month:0 +msgid "November" +msgstr "Noviembre" + +#. module: board +#: help:board.board.line,sequence:0 +msgid "" +"Gives the sequence order when displaying a list of " +"board lines." +msgstr "" +"Indica el orden de secuencia cuando se muestra una lista de líneas de " +"tablero." + +#. module: board +#: selection:res.log.report,month:0 +msgid "April" +msgstr "Abril" + +#. module: board +#: view:board.board:0 +#: field:board.board,name:0 +#: field:board.board.line,board_id:0 +#: model:ir.ui.menu,name:board.admin_menu_dasboard +#: model:ir.ui.menu,name:board.menu_dasboard +msgid "Dashboard" +msgstr "Tablero" + +#. module: board +#: model:ir.module.module,description:board.module_meta_information +msgid "Base module for all dashboards." +msgstr "Módulo base para todos los tableros." + +#. module: board +#: field:board.board.line,action_id:0 +msgid "Action" +msgstr "Acción." + +#. module: board +#: field:board.board.line,position:0 +msgid "Position" +msgstr "Posición" + +#. module: board +#: view:res.log.report:0 +msgid "Model" +msgstr "Modelo" + +#. module: board +#: field:board.menu.create,menu_name:0 +msgid "Menu Name" +msgstr "Nombre del menú" + +#. module: board +#: view:board.board:0 +#: model:ir.actions.act_window,name:board.action_latest_activities_tree +msgid "Latest Activities" +msgstr "Últimas actividades" + +#. module: board +#: selection:board.board.line,position:0 +msgid "Left" +msgstr "Izquieda" + +#. module: board +#: field:board.board,view_id:0 +msgid "Board View" +msgstr "Vista de tablero" + +#. module: board +#: selection:board.board.line,position:0 +msgid "Right" +msgstr "Derecha" + +#. module: board +#: field:board.board.line,width:0 +msgid "Width" +msgstr "Ancho" + +#. module: board +#: view:res.log.report:0 +msgid " Month " +msgstr " Mes " + +#. module: board +#: field:board.board.line,sequence:0 +msgid "Sequence" +msgstr "Secuencia" + +#. module: board +#: selection:res.log.report,month:0 +msgid "September" +msgstr "Septiembre" + +#. module: board +#: selection:res.log.report,month:0 +msgid "December" +msgstr "Diciembre" + +#. module: board +#: view:board.board:0 +#: view:board.menu.create:0 +msgid "Create Menu" +msgstr "Crear Menú" + +#. module: board +#: field:board.board.line,height:0 +msgid "Height" +msgstr "Alto" + +#. module: board +#: model:ir.actions.act_window,name:board.action_board_menu_create +msgid "Create Board Menu" +msgstr "Crear menú del tablero" + +#. module: board +#: selection:res.log.report,month:0 +msgid "May" +msgstr "Mayo" + +#. module: board +#: field:res.log.report,res_model:0 +msgid "Object" +msgstr "Objeto" + +#. module: board +#: view:res.log.report:0 +#: field:res.log.report,name:0 +msgid "Year" +msgstr "Año" + +#. module: board +#: view:board.menu.create:0 +msgid "Cancel" +msgstr "Cancelar" + +#. module: board +#: view:board.board:0 +msgid "Dashboard View" +msgstr "Vista de tablero" + +#. module: board +#: code:addons/board/wizard/board_menu_create.py:46 +#, python-format +msgid "Please Insert Dashboard View(s) !" +msgstr "¡Por favor inserte alguna vista de tablero!" + +#. module: board +#: view:board.note:0 +#: field:board.note,name:0 +msgid "Subject" +msgstr "Asunto" diff --git a/addons/stock/i18n/es_CL.po b/addons/stock/i18n/es_CL.po index ff898a8d261..2a33cd0c47f 100644 --- a/addons/stock/i18n/es_CL.po +++ b/addons/stock/i18n/es_CL.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:16+0000\n" -"PO-Revision-Date: 2011-01-14 04:42+0000\n" -"Last-Translator: Borja López Soilán (NeoPolus) \n" +"PO-Revision-Date: 2011-10-03 18:53+0000\n" +"Last-Translator: David Acevedo Toledo \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 04:57+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-10-04 05:01+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: stock #: field:product.product,track_outgoing:0 @@ -37,7 +37,7 @@ msgstr "" #. module: stock #: field:stock.location,chained_location_id:0 msgid "Chained Location If Fixed" -msgstr "Ubicación encadenada si fija" +msgstr "Encadenar Ubicación si es Fija" #. module: stock #: view:stock.inventory:0 @@ -70,20 +70,20 @@ msgstr "Hoy" #. module: stock #: field:stock.production.lot.revision,indice:0 msgid "Revision Number" -msgstr "Número revisión" +msgstr "Número de revisión" #. module: stock #: view:stock.move.memory.in:0 #: view:stock.move.memory.out:0 msgid "Product Moves" -msgstr "Movimientos productos" +msgstr "Movimientos de producto" #. module: stock #: model:ir.actions.act_window,name:stock.action_stock_move_report #: model:ir.ui.menu,name:stock.menu_action_stock_move_report #: view:report.stock.move:0 msgid "Moves Analysis" -msgstr "Análisis movimientos" +msgstr "Análisis de movimientos" #. module: stock #: help:stock.production.lot,ref:0 @@ -194,8 +194,8 @@ msgstr "" "de esta categoría, también puede indicarse directamente en cada producto." #. module: stock -#: code:addons/stock/stock.py:1170 -#: code:addons/stock/stock.py:2415 +#: code:addons/stock/stock.py:1190 +#: code:addons/stock/stock.py:2436 #, python-format msgid "Missing partial picking data for move #%s" msgstr "Faltan datos del albarán parcial para el movimiento #%s" @@ -260,8 +260,8 @@ msgid "Reference" msgstr "Referencia" #. module: stock -#: code:addons/stock/stock.py:666 -#: code:addons/stock/stock.py:1472 +#: code:addons/stock/stock.py:679 +#: code:addons/stock/stock.py:1492 #, python-format msgid "Products to Process" msgstr "Productos a procesar" @@ -286,7 +286,7 @@ msgid "Split lines" msgstr "Dividir líneas" #. module: stock -#: code:addons/stock/stock.py:1120 +#: code:addons/stock/stock.py:1139 #, python-format msgid "You cannot cancel picking because stock move is in done state !" msgstr "" @@ -294,9 +294,9 @@ msgstr "" "realizado!" #. module: stock -#: code:addons/stock/stock.py:2233 -#: code:addons/stock/stock.py:2274 -#: code:addons/stock/stock.py:2334 +#: code:addons/stock/stock.py:2253 +#: code:addons/stock/stock.py:2295 +#: code:addons/stock/stock.py:2355 #: code:addons/stock/wizard/stock_fill_inventory.py:53 #, python-format msgid "Warning!" @@ -506,7 +506,6 @@ msgstr "Filtro lotes de producto" #: report:lot.stock.overview:0 #: report:lot.stock.overview_all:0 #: report:stock.inventory.move:0 -#: report:stock.picking.list:0 msgid "[" msgstr "[" @@ -525,7 +524,7 @@ msgid "Move History (child moves)" msgstr "Historial movimientos (movimientos hijos)" #. module: stock -#: code:addons/stock/stock.py:2015 +#: code:addons/stock/stock.py:2033 #, python-format msgid "" "There is no stock output account defined for this product or its category: " @@ -547,7 +546,7 @@ msgid "Destination Location" msgstr "Ubicación destino" #. module: stock -#: code:addons/stock/stock.py:754 +#: code:addons/stock/stock.py:769 #, python-format msgid "You can not process picking without stock moves" msgstr "No puede procesar un albarán sin movimientos de stock" @@ -601,7 +600,7 @@ msgid "Location / Product" msgstr "Ubicación / Producto" #. module: stock -#: code:addons/stock/stock.py:1303 +#: code:addons/stock/stock.py:1323 #, python-format msgid "Reception" msgstr "Recepción" @@ -633,6 +632,11 @@ msgid "" "worker/team that should perform the operation. Examples of stock journals " "may be: quality control, pick lists, packing, etc." msgstr "" +"El sistema de existencias diarias le permite asignar cada operación de " +"existencias a un diario específico según el tipo de operación a realizar o " +"el trabajador / equipo que debe realizar la operación. Algunos ejemplos de " +"diarios de existencias pueden ser: control de calidad, listas de selección, " +"embalaje, etc." #. module: stock #: field:stock.location,complete_name:0 @@ -1094,7 +1098,7 @@ msgid "Author" msgstr "Autor" #. module: stock -#: code:addons/stock/stock.py:1302 +#: code:addons/stock/stock.py:1322 #, python-format msgid "Delivery Order" msgstr "Orden de entrega" @@ -1102,7 +1106,7 @@ msgstr "Orden de entrega" #. module: stock #: model:ir.model,name:stock.model_stock_move_memory_in msgid "stock.move.memory.in" -msgstr "" +msgstr "stock.move.memory.in" #. module: stock #: selection:stock.location,chained_auto_packing:0 @@ -1246,7 +1250,7 @@ msgstr "" "stock generados por las órdenes de producción." #. module: stock -#: code:addons/stock/stock.py:2006 +#: code:addons/stock/stock.py:2024 #, python-format msgid "" "Can not create Journal Entry, Output Account defined on this product and " @@ -1256,7 +1260,7 @@ msgstr "" "y la cuenta variante de la categoría de producto son la misma." #. module: stock -#: code:addons/stock/stock.py:1319 +#: code:addons/stock/stock.py:1339 #, python-format msgid "is in draft state." msgstr "está en estado borrador." @@ -1322,7 +1326,7 @@ msgid "Additional Info" msgstr "Información adicional" #. module: stock -#: code:addons/stock/stock.py:1619 +#: code:addons/stock/stock.py:1639 #, python-format msgid "Operation forbidden" msgstr "Operación prohibida" @@ -1469,7 +1473,7 @@ msgid "Downstream traceability" msgstr "Trazabilidad hacia abajo" #. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:101 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:106 #, python-format msgid "No Invoices were created" msgstr "No se han creado facturas" @@ -1533,7 +1537,7 @@ msgstr "" "compañías." #. module: stock -#: code:addons/stock/stock.py:2233 +#: code:addons/stock/stock.py:2253 #, python-format msgid "Please provide a positive quantity to scrap!" msgstr "¡Introduzca una cantidad positiva a desechar!" @@ -1564,6 +1568,13 @@ msgid "" " When the picking is done the state is 'Done'. \n" "The state is 'Waiting' if the move is waiting for another one." msgstr "" +"Cuando un movimiento de almacén es creado queda en estado 'Borrador'.\n" +" Luego, se establece en estado 'No Disponible' si el ... no ha encontrado " +"los productos.\n" +" Cuando los productos se han reservado es puesto en 'Disponible'.\n" +" Cuando el retiro es realizado el estado es puesto en 'Realizado'. " +" \n" +"El estado es puesto 'En Espera' si se está esperando por otro movimiento." #. module: stock #: selection:report.stock.inventory,location_type:0 @@ -1573,7 +1584,7 @@ msgid "Supplier Location" msgstr "Ubicación del proveedor" #. module: stock -#: code:addons/stock/stock.py:2254 +#: code:addons/stock/stock.py:2275 #, python-format msgid "were scrapped" msgstr "estaban desechados" @@ -1765,7 +1776,7 @@ msgid "Warehouse Dashboard" msgstr "Tablero almacén" #. module: stock -#: code:addons/stock/stock.py:512 +#: code:addons/stock/stock.py:525 #, python-format msgid "You can not remove a lot line !" msgstr "¡No puede eliminar una línea de lote!" @@ -1779,7 +1790,7 @@ msgid "Scrap Products" msgstr "Productos de desecho" #. module: stock -#: code:addons/stock/stock.py:1128 +#: code:addons/stock/stock.py:1147 #, python-format msgid "You cannot remove the picking which is in %s state !" msgstr "¡No puede eliminar el albarán que está en estado %s!" @@ -1842,7 +1853,7 @@ msgid "Provide the quantities of the returned products." msgstr "Indique las cantidades de los productos devueltos." #. module: stock -#: code:addons/stock/stock.py:2009 +#: code:addons/stock/stock.py:2027 #, python-format msgid "" "Can not create Journal Entry, Input Account defined on this product and " @@ -1931,7 +1942,7 @@ msgid "Quantity per lot" msgstr "Cantidad por lote" #. module: stock -#: code:addons/stock/stock.py:2012 +#: code:addons/stock/stock.py:2030 #, python-format msgid "" "There is no stock input account defined for this product or its category: " @@ -2040,7 +2051,6 @@ msgstr "_Aplicar" #: report:lot.stock.overview:0 #: report:lot.stock.overview_all:0 #: report:stock.inventory.move:0 -#: report:stock.picking.list:0 msgid "]" msgstr "]" @@ -2146,7 +2156,7 @@ msgid "Inventory loss" msgstr "Pérdidas de inventario" #. module: stock -#: code:addons/stock/stock.py:1311 +#: code:addons/stock/stock.py:1331 #, python-format msgid "Document" msgstr "Documento" @@ -2271,13 +2281,13 @@ msgid "Shipping Type" msgstr "Tipo de envío" #. module: stock -#: code:addons/stock/stock.py:2210 +#: code:addons/stock/stock.py:2230 #, python-format msgid "You can only delete draft moves." msgstr "Sólo puede eliminar movimientos borrador." #. module: stock -#: code:addons/stock/wizard/stock_partial_picking.py:97 +#: code:addons/stock/wizard/stock_partial_picking.py:98 #: model:ir.actions.act_window,name:stock.act_product_location_open #: model:ir.ui.menu,name:stock.menu_stock_products_menu #: view:stock.inventory:0 @@ -2448,7 +2458,7 @@ msgid "Source" msgstr "Origen" #. module: stock -#: code:addons/stock/stock.py:2589 +#: code:addons/stock/stock.py:2610 #: model:ir.model,name:stock.model_stock_inventory #: selection:report.stock.inventory,location_type:0 #: field:stock.inventory.line,inventory_id:0 @@ -2489,7 +2499,7 @@ msgstr "Seguimiento nº serie" #. module: stock #: code:addons/stock/report/report_stock.py:78 #: code:addons/stock/report/report_stock.py:135 -#: code:addons/stock/stock.py:754 +#: code:addons/stock/stock.py:769 #, python-format msgid "Error !" msgstr "¡Error!" @@ -2673,7 +2683,7 @@ msgstr "" "(id: %d)" #. module: stock -#: code:addons/stock/stock.py:2339 +#: code:addons/stock/stock.py:2361 #, python-format msgid "Can not consume a move with negative or zero quantity !" msgstr "" @@ -2736,7 +2746,7 @@ msgid "Quantity (UOS)" msgstr "Cantidad (UdV)" #. module: stock -#: code:addons/stock/stock.py:1664 +#: code:addons/stock/stock.py:1684 #, python-format msgid "" "You are moving %.2f %s products but only %.2f %s available in this lot." @@ -2777,7 +2787,7 @@ msgid "Properties" msgstr "Propiedades" #. module: stock -#: code:addons/stock/stock.py:974 +#: code:addons/stock/stock.py:994 #, python-format msgid "Error, no partner !" msgstr "¡Error, sin empresa!" @@ -2828,7 +2838,7 @@ msgid "Inventory Reference" msgstr "Referencia inventario" #. module: stock -#: code:addons/stock/stock.py:1304 +#: code:addons/stock/stock.py:1324 #, python-format msgid "Internal picking" msgstr "Albarán interno" @@ -2917,7 +2927,7 @@ msgid "Date done" msgstr "Fecha realización" #. module: stock -#: code:addons/stock/stock.py:975 +#: code:addons/stock/stock.py:995 #, python-format msgid "" "Please put a partner on the picking list if you want to generate invoice." @@ -3002,8 +3012,8 @@ msgid "Invoicing" msgstr "Facturación" #. module: stock -#: code:addons/stock/stock.py:2274 -#: code:addons/stock/stock.py:2334 +#: code:addons/stock/stock.py:2295 +#: code:addons/stock/stock.py:2355 #, python-format msgid "Please provide Proper Quantity !" msgstr "¡Indique cantidad correcta!" @@ -3030,7 +3040,7 @@ msgid "Consume Products" msgstr "Consumir productos" #. module: stock -#: code:addons/stock/stock.py:1663 +#: code:addons/stock/stock.py:1683 #, python-format msgid "Insufficient Stock in Lot !" msgstr "¡Stock insuficiente en el lote!" @@ -3130,7 +3140,9 @@ msgstr "Referencia paquete" #. module: stock #: view:report.stock.move:0 #: field:report.stock.move,location_id:0 +#: field:stock.inventory.line.split,location_id:0 #: field:stock.move,location_id:0 +#: field:stock.move.split,location_id:0 msgid "Source Location" msgstr "Ubicación origen" @@ -3183,7 +3195,7 @@ msgid "All at once" msgstr "Todo junto" #. module: stock -#: code:addons/stock/stock.py:1620 +#: code:addons/stock/stock.py:1640 #, python-format msgid "" "Quantities, UoMs, Products and Locations cannot be modified on stock moves " @@ -3234,7 +3246,7 @@ msgstr "Movimientos para este lote de producción" #. module: stock #: model:ir.model,name:stock.model_stock_move_memory_out msgid "stock.move.memory.out" -msgstr "" +msgstr "stock.move.memory.out" #. module: stock #: code:addons/stock/wizard/stock_fill_inventory.py:115 @@ -3286,8 +3298,8 @@ msgid "Icon" msgstr "Icono" #. module: stock -#: code:addons/stock/stock.py:2209 -#: code:addons/stock/stock.py:2617 +#: code:addons/stock/stock.py:2229 +#: code:addons/stock/stock.py:2638 #, python-format msgid "UserError" msgstr "Error de usuario" @@ -3314,13 +3326,13 @@ msgstr "Clientes no europeos" #: code:addons/stock/product.py:100 #: code:addons/stock/product.py:121 #: code:addons/stock/product.py:147 -#: code:addons/stock/stock.py:2006 -#: code:addons/stock/stock.py:2009 -#: code:addons/stock/stock.py:2012 -#: code:addons/stock/stock.py:2015 -#: code:addons/stock/stock.py:2018 -#: code:addons/stock/stock.py:2021 -#: code:addons/stock/stock.py:2339 +#: code:addons/stock/stock.py:2024 +#: code:addons/stock/stock.py:2027 +#: code:addons/stock/stock.py:2030 +#: code:addons/stock/stock.py:2033 +#: code:addons/stock/stock.py:2036 +#: code:addons/stock/stock.py:2039 +#: code:addons/stock/stock.py:2361 #: code:addons/stock/wizard/stock_fill_inventory.py:47 #: code:addons/stock/wizard/stock_splitinto.py:49 #: code:addons/stock/wizard/stock_splitinto.py:53 @@ -3329,7 +3341,7 @@ msgid "Error!" msgstr "¡Error!" #. module: stock -#: code:addons/stock/stock.py:2021 +#: code:addons/stock/stock.py:2039 #, python-format msgid "" "There is no inventory variation account defined on the product category: " @@ -3363,7 +3375,7 @@ msgid "It specifies goods to be delivered all at once or by direct delivery" msgstr "Indica si las mercancías se enviarán todas a la vez o directamente." #. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:85 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:90 #, python-format msgid "This picking list does not require invoicing." msgstr "Este albarán no requiere facturación." @@ -3389,6 +3401,16 @@ msgid "" "* Fixed Location: The chained location is taken from the next field: Chained " "Location if Fixed." msgstr "" +"Determina si esta ubicación está encadenada a otra, por ejemplo cualquier " +"producto que entre en esta ubicación \n" +"debe ir a la siguiente ubicación encadenada. La ubicación encadenada se " +"determina en función del tipo: \n" +"* Ninguna: No se encadena con ninguna.\n" +"* Cliente: Se utiliza la ubicación encadenada definida en el campo Ubicación " +"del Cliente del Formulario del Cliente especificado en la Guía de Despacho " +"(albaran) de los productos entrantes.\n" +"* Ubicación fija: Se utiliza la ubicación encadenada del campo: Ubicación " +"Encadenada si es Fija." #. module: stock #: code:addons/stock/wizard/stock_inventory_merge.py:43 @@ -3398,8 +3420,8 @@ msgid "Warning" msgstr "Advertencia" #. module: stock -#: code:addons/stock/stock.py:1318 -#: code:addons/stock/stock.py:2589 +#: code:addons/stock/stock.py:1338 +#: code:addons/stock/stock.py:2610 #, python-format msgid "is done." msgstr "está realizado." @@ -3505,7 +3527,7 @@ msgid "Reporting" msgstr "Informe" #. module: stock -#: code:addons/stock/stock.py:1313 +#: code:addons/stock/stock.py:1333 #, python-format msgid " for the " msgstr " para el " @@ -3559,7 +3581,7 @@ msgid "Chaining Journal" msgstr "Diario encadenamiento" #. module: stock -#: code:addons/stock/stock.py:732 +#: code:addons/stock/stock.py:746 #, python-format msgid "Not enough stock, unable to reserve the products." msgstr "No suficiente stock, no ha sido posible reservar los productos." @@ -3570,7 +3592,7 @@ msgid "Customers" msgstr "Clientes" #. module: stock -#: code:addons/stock/stock.py:1317 +#: code:addons/stock/stock.py:1337 #, python-format msgid "is cancelled." msgstr "está cancelado." @@ -3581,7 +3603,7 @@ msgid "Stock Inventory Lines" msgstr "Líneas regularización de inventario" #. module: stock -#: code:addons/stock/wizard/stock_partial_picking.py:97 +#: code:addons/stock/wizard/stock_partial_picking.py:98 #, python-format msgid "Process Document" msgstr "Procesar documento" @@ -3775,7 +3797,7 @@ msgstr "" "generados por los abastecimientos." #. module: stock -#: code:addons/stock/stock.py:1316 +#: code:addons/stock/stock.py:1336 #, python-format msgid "is ready to process." msgstr "preparado para procesar." @@ -3791,7 +3813,7 @@ msgid "Set to zero" msgstr "Inicializar a cero" #. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:87 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:92 #, python-format msgid "None of these picking lists require invoicing." msgstr "Ninguno de estos albaranes requiere facturación." @@ -3803,7 +3825,7 @@ msgstr "Noviembre" #. module: stock #: code:addons/stock/product.py:101 -#: code:addons/stock/stock.py:2018 +#: code:addons/stock/stock.py:2036 #, python-format msgid "There is no journal defined on the product category: \"%s\" (id: %d)" msgstr "" @@ -3856,10 +3878,10 @@ msgid "Future Stock" msgstr "Stock futuro" #. module: stock -#: code:addons/stock/stock.py:512 -#: code:addons/stock/stock.py:1120 -#: code:addons/stock/stock.py:1128 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:101 +#: code:addons/stock/stock.py:525 +#: code:addons/stock/stock.py:1139 +#: code:addons/stock/stock.py:1147 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:106 #, python-format msgid "Error" msgstr "Error" @@ -4124,10 +4146,11 @@ msgid "Invoiced date" msgstr "Fecha facturado" #. module: stock -#: code:addons/stock/stock.py:732 +#: code:addons/stock/stock.py:746 #: code:addons/stock/wizard/stock_fill_inventory.py:106 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:85 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:87 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:65 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:90 +#: code:addons/stock/wizard/stock_invoice_onshipping.py:92 #: code:addons/stock/wizard/stock_return_picking.py:77 #: code:addons/stock/wizard/stock_return_picking.py:92 #: code:addons/stock/wizard/stock_return_picking.py:194 diff --git a/debian/po/es_CL.po b/debian/po/es_CL.po index 454fa9705eb..9da94b6ce29 100644 --- a/debian/po/es_CL.po +++ b/debian/po/es_CL.po @@ -8,20 +8,20 @@ msgstr "" "Project-Id-Version: openobject-server\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-24 22:41+0300\n" -"PO-Revision-Date: 2011-01-19 14:33+0000\n" -"Last-Translator: Juan Pizarro \n" +"PO-Revision-Date: 2011-10-03 16:05+0000\n" +"Last-Translator: doingit.cl \n" "Language-Team: Spanish (Chile) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n" -"X-Generator: Launchpad (build 13827)\n" +"X-Launchpad-Export-Date: 2011-10-04 05:01+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. Type: string #. Description #: ../openerp-server.templates:1001 msgid "Dedicated system account for the Open ERP server:" -msgstr "" +msgstr "Cuenta del sistema dedicada para el servidor OpenERP" #. Type: string #. Description @@ -31,9 +31,12 @@ msgid "" "the system's security is not compromised by running it with superuser " "privileges." msgstr "" +"El servidor OpenERP debe utilizar una cuenta dedicada para su " +"funcionamiento, de tal modo que la seguridad del sistema no se vea " +"comprometida por su utilización con privilegios de administración." #. Type: string #. Description #: ../openerp-server.templates:1001 msgid "Please choose that account's username." -msgstr "" +msgstr "Elija un Nombre de Usuario para la cuenta" diff --git a/openerp/addons/base/i18n/es_CL.po b/openerp/addons/base/i18n/es_CL.po index 9a5dd8a395a..812eaf625e3 100644 --- a/openerp/addons/base/i18n/es_CL.po +++ b/openerp/addons/base/i18n/es_CL.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-07-26 01:09+0000\n" -"Last-Translator: Juano \n" +"PO-Revision-Date: 2011-10-03 16:01+0000\n" +"Last-Translator: Francisco Reyes Acuña \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-10-01 05:07+0000\n" +"X-Launchpad-Export-Date: 2011-10-04 05:01+0000\n" "X-Generator: Launchpad (build 14071)\n" #. module: base @@ -5726,7 +5726,7 @@ msgstr "Traducciones" #. module: base #: field:ir.sequence,padding:0 msgid "Number Padding" -msgstr "" +msgstr "Número(s) de relleno" #. module: base #: view:ir.actions.report.xml:0 From ad8ee9601c992f63230072fc4519721363e8d8da Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Tue, 4 Oct 2011 10:38:00 +0530 Subject: [PATCH 332/510] form view is not able to open of product'Take money out ' and 'Take money in' lp bug: https://launchpad.net/bugs/865296 fixed bzr revid: ara@tinyerp.com-20111004050800-e0fqsi2mkhtv527e --- addons/point_of_sale/point_of_sale_view.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index ba2d2c0214f..f5f03ebfa76 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -624,7 +624,6 @@ -
From 6ea640a433cfa588068914e3b9167ae453ef78b1 Mon Sep 17 00:00:00 2001 From: "Bharat (OpenERP)" Date: Tue, 4 Oct 2011 11:08:37 +0530 Subject: [PATCH 333/510] account : account_payment payment mode demo data lp bug: https://launchpad.net/bugs/865227 fixed bzr revid: bde@tinyerp.com-20111004053837-dhrsxe9u6qnd9tpg --- addons/account_payment/account_payment_demo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account_payment/account_payment_demo.xml b/addons/account_payment/account_payment_demo.xml index 65a8d341da4..02170c38fea 100644 --- a/addons/account_payment/account_payment_demo.xml +++ b/addons/account_payment/account_payment_demo.xml @@ -10,7 +10,7 @@
Direct Payment - + From be5bef72fa85d76d463c18d03d05635e0c25fb07 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Tue, 4 Oct 2011 12:49:45 +0530 Subject: [PATCH 334/510] [FIX] Need to Update Pager after delete record. lp bug: https://launchpad.net/bugs/849020 fixed bzr revid: vda@tinyerp.com-20111004071945-2fixgi12ozr6wm6g --- addons/web/static/src/js/view_list.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index c78adf769bd..cb03258081c 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -493,6 +493,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# _(ids).each(function (id) { self.records.remove(self.records.get(id)); }); + self.configure_pager(self.dataset); self.compute_aggregates(); }); }, From 8c1e052007456ae34d2b0e7fbe0887ada7100fef Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Tue, 4 Oct 2011 09:24:24 +0200 Subject: [PATCH 335/510] [fix] use a more solid selector to get $element bzr revid: valentin.lab@kalysto.org-20111004072424-uwx50578hhafe2xm --- addons/web/static/src/js/view_form.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 11ebad8d093..773cd882405 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -688,7 +688,10 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. this.width = this.node.attrs.width; }, start: function() { - this.$element = this.view.$element.find('.' + this.element_class); + // avoiding find('.' + this.element_class) form because it doesn't work + // if class contains some dots. + this.$element = this.view.$element + .find('[class~="' + this.element_class + '"]'); }, process_modifiers: function() { var compute_domain = openerp.web.form.compute_domain; From 2bb8cadb4dcf7311df7f056bda77332fe9d7955b Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Tue, 4 Oct 2011 09:43:21 +0200 Subject: [PATCH 336/510] [imp] notebookpage is now in registry also. bzr revid: valentin.lab@kalysto.org-20111004074321-b2z121y64yynt948 --- addons/web/static/src/js/view_form.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 11ebad8d093..19d9a5ee839 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -792,8 +792,7 @@ openerp.web.form.WidgetNotebook = openerp.web.form.Widget.extend({ for (var i = 0; i < node.children.length; i++) { var n = node.children[i]; if (n.tag == "page") { - var page = new openerp.web.form.WidgetNotebookPage( - this.view, n, this, this.pages.length); + var page = new (this.view.registry.get_object('notebookpage'))(this.view, n, this, this.pages.length); this.pages.push(page); } } @@ -2781,6 +2780,7 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'frame' : 'openerp.web.form.WidgetFrame', 'group' : 'openerp.web.form.WidgetFrame', 'notebook' : 'openerp.web.form.WidgetNotebook', + 'notebookpage' : 'openerp.web.form.WidgetNotebookPage', 'separator' : 'openerp.web.form.WidgetSeparator', 'label' : 'openerp.web.form.WidgetLabel', 'button' : 'openerp.web.form.WidgetButton', From e2b6e03c3c6ffe3c6e2ed34166b66f953ba35495 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 4 Oct 2011 09:50:39 +0200 Subject: [PATCH 337/510] [FIX] Save last search before triggering do_search bzr revid: fme@openerp.com-20111004075039-n8a30wnuueiwnbwt --- addons/web/static/src/js/views.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index a38825a35a5..28e9772da77 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -288,8 +288,8 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ }, function (results) { self.dataset.context = results.context; self.dataset.domain = results.domain; - controller.do_search(results.domain, results.context, results.group_by); self.last_search = [results.domain, results.context, results.group_by]; + controller.do_search(results.domain, results.context, results.group_by); }); } else if (this.last_search) { controller.do_search.apply(controller, this.last_search); From e6dd80d6b5f8fce6b62b5b9a1517e0239726cba0 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 4 Oct 2011 10:04:55 +0200 Subject: [PATCH 338/510] [fix] forgot some things bzr revid: nicolas.vanhoren@openerp.com-20111004080455-qyd2z0rfdxbi4ecf --- .../static/lib/backbone/backbone-0.5.3.js | 1158 +++++++++++++++++ addons/point_of_sale/static/src/js/pos.js | 1 - 2 files changed, 1158 insertions(+), 1 deletion(-) create mode 100644 addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js diff --git a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js b/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js new file mode 100644 index 00000000000..8958c798466 --- /dev/null +++ b/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js @@ -0,0 +1,1158 @@ +// Backbone.js 0.5.3 +// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc. +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://documentcloud.github.com/backbone + +(function(){ + + // Initial Setup + // ------------- + + // Save a reference to the global object. + var root = this; + + // Save the previous value of the `Backbone` variable. + var previousBackbone = root.Backbone; + + // The top-level namespace. All public Backbone classes and modules will + // be attached to this. Exported for both CommonJS and the browser. + var Backbone; + if (typeof exports !== 'undefined') { + Backbone = exports; + } else { + Backbone = root.Backbone = {}; + } + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '0.5.3'; + + // Require Underscore, if we're on the server, and it's not already present. + var _ = root._; + if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._; + + // For Backbone's purposes, jQuery or Zepto owns the `$` variable. + var $ = root.jQuery || root.Zepto; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will + // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a + // `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Backbone.Events + // ----------------- + + // A module that can be mixed in to *any object* in order to provide it with + // custom events. You may `bind` or `unbind` a callback function to an event; + // `trigger`-ing an event fires all callbacks in succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.bind('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + Backbone.Events = { + + // Bind an event, specified by a string name, `ev`, to a `callback` function. + // Passing `"all"` will bind the callback to all events fired. + bind : function(ev, callback, context) { + var calls = this._callbacks || (this._callbacks = {}); + var list = calls[ev] || (calls[ev] = []); + list.push([callback, context]); + return this; + }, + + // Remove one or many callbacks. If `callback` is null, removes all + // callbacks for the event. If `ev` is null, removes all bound callbacks + // for all events. + unbind : function(ev, callback) { + var calls; + if (!ev) { + this._callbacks = {}; + } else if (calls = this._callbacks) { + if (!callback) { + calls[ev] = []; + } else { + var list = calls[ev]; + if (!list) return this; + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] && callback === list[i][0]) { + list[i] = null; + break; + } + } + } + } + return this; + }, + + // Trigger an event, firing all bound callbacks. Callbacks are passed the + // same arguments as `trigger` is, apart from the event name. + // Listening for `"all"` passes the true event name as the first argument. + trigger : function(eventName) { + var list, calls, ev, callback, args; + var both = 2; + if (!(calls = this._callbacks)) return this; + while (both--) { + ev = both ? eventName : 'all'; + if (list = calls[ev]) { + for (var i = 0, l = list.length; i < l; i++) { + if (!(callback = list[i])) { + list.splice(i, 1); i--; l--; + } else { + args = both ? Array.prototype.slice.call(arguments, 1) : arguments; + callback[0].apply(callback[1] || this, args); + } + } + } + } + return this; + } + + }; + + // Backbone.Model + // -------------- + + // Create a new model, with defined attributes. A client id (`cid`) + // is automatically generated and assigned for you. + Backbone.Model = function(attributes, options) { + var defaults; + attributes || (attributes = {}); + if (defaults = this.defaults) { + if (_.isFunction(defaults)) defaults = defaults.call(this); + attributes = _.extend({}, defaults, attributes); + } + this.attributes = {}; + this._escapedAttributes = {}; + this.cid = _.uniqueId('c'); + this.set(attributes, {silent : true}); + this._changed = false; + this._previousAttributes = _.clone(this.attributes); + if (options && options.collection) this.collection = options.collection; + this.initialize(attributes, options); + }; + + // Attach all inheritable methods to the Model prototype. + _.extend(Backbone.Model.prototype, Backbone.Events, { + + // A snapshot of the model's previous attributes, taken immediately + // after the last `"change"` event was fired. + _previousAttributes : null, + + // Has the item been changed since the last `"change"` event? + _changed : false, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute : 'id', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize : function(){}, + + // Return a copy of the model's `attributes` object. + toJSON : function() { + return _.clone(this.attributes); + }, + + // Get the value of an attribute. + get : function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape : function(attr) { + var html; + if (html = this._escapedAttributes[attr]) return html; + var val = this.attributes[attr]; + return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has : function(attr) { + return this.attributes[attr] != null; + }, + + // Set a hash of model attributes on the object, firing `"change"` unless you + // choose to silence it. + set : function(attrs, options) { + + // Extract attributes and options. + options || (options = {}); + if (!attrs) return this; + if (attrs.attributes) attrs = attrs.attributes; + var now = this.attributes, escaped = this._escapedAttributes; + + // Run validation. + if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; + + // Check for changes of `id`. + if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; + + // We're about to start triggering change events. + var alreadyChanging = this._changing; + this._changing = true; + + // Update attributes. + for (var attr in attrs) { + var val = attrs[attr]; + if (!_.isEqual(now[attr], val)) { + now[attr] = val; + delete escaped[attr]; + this._changed = true; + if (!options.silent) this.trigger('change:' + attr, this, val, options); + } + } + + // Fire the `"change"` event, if the model has been changed. + if (!alreadyChanging && !options.silent && this._changed) this.change(options); + this._changing = false; + return this; + }, + + // Remove an attribute from the model, firing `"change"` unless you choose + // to silence it. `unset` is a noop if the attribute doesn't exist. + unset : function(attr, options) { + if (!(attr in this.attributes)) return this; + options || (options = {}); + var value = this.attributes[attr]; + + // Run validation. + var validObj = {}; + validObj[attr] = void 0; + if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; + + // Remove the attribute. + delete this.attributes[attr]; + delete this._escapedAttributes[attr]; + if (attr == this.idAttribute) delete this.id; + this._changed = true; + if (!options.silent) { + this.trigger('change:' + attr, this, void 0, options); + this.change(options); + } + return this; + }, + + // Clear all attributes on the model, firing `"change"` unless you choose + // to silence it. + clear : function(options) { + options || (options = {}); + var attr; + var old = this.attributes; + + // Run validation. + var validObj = {}; + for (attr in old) validObj[attr] = void 0; + if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; + + this.attributes = {}; + this._escapedAttributes = {}; + this._changed = true; + if (!options.silent) { + for (attr in old) { + this.trigger('change:' + attr, this, void 0, options); + } + this.change(options); + } + return this; + }, + + // Fetch the model from the server. If the server's representation of the + // model differs from its current attributes, they will be overriden, + // triggering a `"change"` event. + fetch : function(options) { + options || (options = {}); + var model = this; + var success = options.success; + options.success = function(resp, status, xhr) { + if (!model.set(model.parse(resp, xhr), options)) return false; + if (success) success(model, resp); + }; + options.error = wrapError(options.error, model, options); + return (this.sync || Backbone.sync).call(this, 'read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save : function(attrs, options) { + options || (options = {}); + if (attrs && !this.set(attrs, options)) return false; + var model = this; + var success = options.success; + options.success = function(resp, status, xhr) { + if (!model.set(model.parse(resp, xhr), options)) return false; + if (success) success(model, resp, xhr); + }; + options.error = wrapError(options.error, model, options); + var method = this.isNew() ? 'create' : 'update'; + return (this.sync || Backbone.sync).call(this, method, this, options); + }, + + // Destroy this model on the server if it was already persisted. Upon success, the model is removed + // from its collection, if it has one. + destroy : function(options) { + options || (options = {}); + if (this.isNew()) return this.trigger('destroy', this, this.collection, options); + var model = this; + var success = options.success; + options.success = function(resp) { + model.trigger('destroy', model, model.collection, options); + if (success) success(model, resp); + }; + options.error = wrapError(options.error, model, options); + return (this.sync || Backbone.sync).call(this, 'delete', this, options); + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url : function() { + var base = getUrl(this.collection) || this.urlRoot || urlError(); + if (this.isNew()) return base; + return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse : function(resp, xhr) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone : function() { + return new this.constructor(this); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew : function() { + return this.id == null; + }, + + // Call this method to manually fire a `change` event for this model. + // Calling this will cause all objects observing the model to update. + change : function(options) { + this.trigger('change', this, options); + this._previousAttributes = _.clone(this.attributes); + this._changed = false; + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged : function(attr) { + if (attr) return this._previousAttributes[attr] != this.attributes[attr]; + return this._changed; + }, + + // Return an object containing all the attributes that have changed, or false + // if there are no changed attributes. Useful for determining what parts of a + // view need to be updated and/or what attributes need to be persisted to + // the server. + changedAttributes : function(now) { + now || (now = this.attributes); + var old = this._previousAttributes; + var changed = false; + for (var attr in now) { + if (!_.isEqual(old[attr], now[attr])) { + changed = changed || {}; + changed[attr] = now[attr]; + } + } + return changed; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous : function(attr) { + if (!attr || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes : function() { + return _.clone(this._previousAttributes); + }, + + // Run validation against a set of incoming attributes, returning `true` + // if all is well. If a specific `error` callback has been passed, + // call that instead of firing the general `"error"` event. + _performValidation : function(attrs, options) { + var error = this.validate(attrs); + if (error) { + if (options.error) { + options.error(this, error, options); + } else { + this.trigger('error', this, error, options); + } + return false; + } + return true; + } + + }); + + // Backbone.Collection + // ------------------- + + // Provides a standard collection class for our sets of models, ordered + // or unordered. If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.comparator) this.comparator = options.comparator; + _.bindAll(this, '_onModelEvent', '_removeReference'); + this._reset(); + if (models) this.reset(models, {silent: true}); + this.initialize.apply(this, arguments); + }; + + // Define the Collection's inheritable methods. + _.extend(Backbone.Collection.prototype, Backbone.Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model : Backbone.Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize : function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON : function() { + return this.map(function(model){ return model.toJSON(); }); + }, + + // Add a model, or list of models to the set. Pass **silent** to avoid + // firing the `added` event for every new model. + add : function(models, options) { + if (_.isArray(models)) { + for (var i = 0, l = models.length; i < l; i++) { + this._add(models[i], options); + } + } else { + this._add(models, options); + } + return this; + }, + + // Remove a model, or a list of models from the set. Pass silent to avoid + // firing the `removed` event for every model removed. + remove : function(models, options) { + if (_.isArray(models)) { + for (var i = 0, l = models.length; i < l; i++) { + this._remove(models[i], options); + } + } else { + this._remove(models, options); + } + return this; + }, + + // Get a model from the set by id. + get : function(id) { + if (id == null) return null; + return this._byId[id.id != null ? id.id : id]; + }, + + // Get a model from the set by client id. + getByCid : function(cid) { + return cid && this._byCid[cid.cid || cid]; + }, + + // Get the model at the given index. + at: function(index) { + return this.models[index]; + }, + + // Force the collection to re-sort itself. You don't need to call this under normal + // circumstances, as the set will maintain sort order as each item is added. + sort : function(options) { + options || (options = {}); + if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); + this.models = this.sortBy(this.comparator); + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Pluck an attribute from each model in the collection. + pluck : function(attr) { + return _.map(this.models, function(model){ return model.get(attr); }); + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any `added` or `removed` events. Fires `reset` when finished. + reset : function(models, options) { + models || (models = []); + options || (options = {}); + this.each(this._removeReference); + this._reset(); + this.add(models, {silent: true}); + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `add: true` is passed, appends the + // models to the collection instead of resetting. + fetch : function(options) { + options || (options = {}); + var collection = this; + var success = options.success; + options.success = function(resp, status, xhr) { + collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); + if (success) success(collection, resp); + }; + options.error = wrapError(options.error, collection, options); + return (this.sync || Backbone.sync).call(this, 'read', this, options); + }, + + // Create a new instance of a model in this collection. After the model + // has been created on the server, it will be added to the collection. + // Returns the model, or 'false' if validation on a new model fails. + create : function(model, options) { + var coll = this; + options || (options = {}); + model = this._prepareModel(model, options); + if (!model) return false; + var success = options.success; + options.success = function(nextModel, resp, xhr) { + coll.add(nextModel, options); + if (success) success(nextModel, resp, xhr); + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse : function(resp, xhr) { + return resp; + }, + + // Proxy to _'s chain. Can't be proxied the same way the rest of the + // underscore methods are proxied because it relies on the underscore + // constructor. + chain: function () { + return _(this.models).chain(); + }, + + // Reset all internal state. Called when the collection is reset. + _reset : function(options) { + this.length = 0; + this.models = []; + this._byId = {}; + this._byCid = {}; + }, + + // Prepare a model to be added to this collection + _prepareModel: function(model, options) { + if (!(model instanceof Backbone.Model)) { + var attrs = model; + model = new this.model(attrs, {collection: this}); + if (model.validate && !model._performValidation(attrs, options)) model = false; + } else if (!model.collection) { + model.collection = this; + } + return model; + }, + + // Internal implementation of adding a single model to the set, updating + // hash indexes for `id` and `cid` lookups. + // Returns the model, or 'false' if validation on a new model fails. + _add : function(model, options) { + options || (options = {}); + model = this._prepareModel(model, options); + if (!model) return false; + var already = this.getByCid(model); + if (already) throw new Error(["Can't add the same model to a set twice", already.id]); + this._byId[model.id] = model; + this._byCid[model.cid] = model; + var index = options.at != null ? options.at : + this.comparator ? this.sortedIndex(model, this.comparator) : + this.length; + this.models.splice(index, 0, model); + model.bind('all', this._onModelEvent); + this.length++; + if (!options.silent) model.trigger('add', model, this, options); + return model; + }, + + // Internal implementation of removing a single model from the set, updating + // hash indexes for `id` and `cid` lookups. + _remove : function(model, options) { + options || (options = {}); + model = this.getByCid(model) || this.get(model); + if (!model) return null; + delete this._byId[model.id]; + delete this._byCid[model.cid]; + this.models.splice(this.indexOf(model), 1); + this.length--; + if (!options.silent) model.trigger('remove', model, this, options); + this._removeReference(model); + return model; + }, + + // Internal method to remove a model's ties to a collection. + _removeReference : function(model) { + if (this == model.collection) { + delete model.collection; + } + model.unbind('all', this._onModelEvent); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent : function(ev, model, collection, options) { + if ((ev == 'add' || ev == 'remove') && collection != this) return; + if (ev == 'destroy') { + this._remove(model, options); + } + if (model && ev === 'change:' + model.idAttribute) { + delete this._byId[model.previous(model.idAttribute)]; + this._byId[model.id] = model; + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect', + 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', + 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size', + 'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy']; + + // Mix in each Underscore method as a proxy to `Collection#models`. + _.each(methods, function(method) { + Backbone.Collection.prototype[method] = function() { + return _[method].apply(_, [this.models].concat(_.toArray(arguments))); + }; + }); + + // Backbone.Router + // ------------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var namedParam = /:([\w\d]+)/g; + var splatParam = /\*([\w\d]+)/g; + var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Backbone.Router.prototype, Backbone.Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize : function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route : function(route, name, callback) { + Backbone.history || (Backbone.history = new Backbone.History); + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + Backbone.history.route(route, _.bind(function(fragment) { + var args = this._extractParameters(route, fragment); + callback.apply(this, args); + this.trigger.apply(this, ['route:' + name].concat(args)); + }, this)); + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate : function(fragment, triggerRoute) { + Backbone.history.navigate(fragment, triggerRoute); + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes : function() { + if (!this.routes) return; + var routes = []; + for (var route in this.routes) { + routes.unshift([route, this.routes[route]]); + } + for (var i = 0, l = routes.length; i < l; i++) { + this.route(routes[i][0], routes[i][1], this[routes[i][1]]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp : function(route) { + route = route.replace(escapeRegExp, "\\$&") + .replace(namedParam, "([^\/]*)") + .replace(splatParam, "(.*?)"); + return new RegExp('^' + route + '$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted parameters. + _extractParameters : function(route, fragment) { + return route.exec(fragment).slice(1); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on URL fragments. If the + // browser does not support `onhashchange`, falls back to polling. + Backbone.History = function() { + this.handlers = []; + _.bindAll(this, 'checkUrl'); + }; + + // Cached regex for cleaning hashes. + var hashStrip = /^#*/; + + // Cached regex for detecting MSIE. + var isExplorer = /msie [\w.]+/; + + // Has the history handling already been started? + var historyStarted = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(Backbone.History.prototype, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Get the cross-browser normalized URL fragment, either from the URL, + // the hash, or the override. + getFragment : function(fragment, forcePushState) { + if (fragment == null) { + if (this._hasPushState || forcePushState) { + fragment = window.location.pathname; + var search = window.location.search; + if (search) fragment += search; + if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length); + } else { + fragment = window.location.hash; + } + } + return decodeURIComponent(fragment.replace(hashStrip, '')); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start : function(options) { + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + if (historyStarted) throw new Error("Backbone.history has already been started"); + this.options = _.extend({}, {root: '/'}, this.options, options); + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); + var fragment = this.getFragment(); + var docMode = document.documentMode; + var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); + if (oldIE) { + this.iframe = $('