diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index 525c7e2e334..70ade7133a9 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1058,15 +1058,15 @@ Your Company - + - + @@ -1102,9 +1102,9 @@ - + diff --git a/openerp/addons/base/base_demo.xml b/openerp/addons/base/base_demo.xml index 3d1eae3c4bc..3ba951618cf 100644 --- a/openerp/addons/base/base_demo.xml +++ b/openerp/addons/base/base_demo.xml @@ -2,7 +2,7 @@ - + Fabien Dupont Chaussee de Namur 1367 diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py index f04e28832a0..b22800bfb94 100644 --- a/openerp/addons/base/res/res_company.py +++ b/openerp/addons/base/res/res_company.py @@ -77,13 +77,12 @@ class res_company(osv.osv): """ Read the 'address' functional fields. """ result = {} part_obj = self.pool.get('res.partner') - address_obj = self.pool.get('res.partner.address') for company in self.browse(cr, uid, ids, context=context): result[company.id] = {}.fromkeys(field_names, False) if company.partner_id: address_data = part_obj.address_get(cr, uid, [company.partner_id.id], adr_pref=['default']) if address_data['default']: - address = address_obj.read(cr, uid, address_data['default'], field_names, context=context) + address = part_obj.read(cr, uid, address_data['default'], field_names, context=context) for field in field_names: result[company.id][field] = address[field] or False return result @@ -105,13 +104,12 @@ class res_company(osv.osv): company = self.browse(cr, uid, company_id, context=context) if company.partner_id: part_obj = self.pool.get('res.partner') - address_obj = self.pool.get('res.partner.address') address_data = part_obj.address_get(cr, uid, [company.partner_id.id], adr_pref=['default']) address = address_data['default'] if address: - address_obj.write(cr, uid, [address], {name: value or False}) + part_obj.write(cr, uid, [address], {name: value or False}) else: - address_obj.create(cr, uid, {name: value or False, 'partner_id': company.partner_id.id}, context=context) + part_obj.create(cr, uid, {name: value or False, 'partner_id': company.partner_id.id}, context=context) return True diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f4a36b46b77..f2152aeaa55 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -134,23 +134,32 @@ class res_partner(osv.osv): 'bank_ids': fields.one2many('res.partner.bank', 'partner_id', 'Banks'), 'website': fields.char('Website',size=64, help="Website of Partner."), 'comment': fields.text('Notes'), - 'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), 'category_id': fields.many2many('res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', 'Categories'), 'events': fields.one2many('res.partner.event', 'partner_id', 'Events'), 'credit_limit': fields.float(string='Credit Limit'), 'ean13': fields.char('EAN13', size=13), - 'active': fields.boolean('Active'), 'customer': fields.boolean('Customer', help="Check this box if the partner is a customer."), 'supplier': fields.boolean('Supplier', help="Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."), - 'city': fields.related('address', 'city', type='char', string='City'), - 'function': fields.related('address', 'function', type='char', string='function'), - 'subname': fields.related('address', 'name', type='char', string='Contact Name'), - 'phone': fields.related('address', 'phone', type='char', string='Phone'), - 'mobile': fields.related('address', 'mobile', type='char', string='Mobile'), - 'country': fields.related('address', 'country_id', type='many2one', relation='res.country', string='Country'), 'employee': fields.boolean('Employee', help="Check this box if the partner is an Employee."), - 'email': fields.related('address', 'email', type='char', size=240, string='E-mail'), - 'company_id': fields.many2one('res.company', 'Company', select=1), + 'color': fields.integer('Color Index'), + 'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."), + 'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."), + 'function': fields.char('Function', size=128), + 'street': fields.char('Street', size=128), + 'street2': fields.char('Street2', size=128), + 'zip': fields.char('Zip', change_default=True, size=24), + 'city': fields.char('City', size=128), + 'state_id': fields.many2one("res.country.state", 'Fed. State', domain="[('country_id','=',country_id)]"), + 'country_id': fields.many2one('res.country', 'Country'), + 'email': fields.char('E-Mail', size=240), + 'phone': fields.char('Phone', size=64), + 'fax': fields.char('Fax', size=64), + 'mobile': fields.char('Mobile', size=64), + 'birthdate': fields.char('Birthdate', size=64), + 'active': fields.boolean('Active', help="Uncheck the active field to hide the contact."), +# 'company_id': fields.related('partner_id','company_id',type='many2one',relation='res.company',string='Company', store=True), + 'company_id': fields.many2one('res.company', 'Company',select=1), + 'is_company': fields.boolean('Company', help="Check if you want to create company"), 'color': fields.integer('Color Index'), } def _default_category(self, cr, uid, context=None): @@ -166,6 +175,8 @@ class res_partner(osv.osv): '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), 'color': 0, + 'is_company': lambda *a: 0, + 'type': 'default', } def copy(self, cr, uid, id, default=None, context=None): @@ -243,9 +254,8 @@ class res_partner(osv.osv): def address_get(self, cr, uid, ids, adr_pref=None): if adr_pref is None: adr_pref = ['default'] - address_obj = self.pool.get('res.partner.address') - address_ids = address_obj.search(cr, uid, [('partner_id', 'in', ids)]) - address_rec = address_obj.read(cr, uid, address_ids, ['type']) + address_ids = self.search(cr, uid, [('partner_id', 'in', ids)]) + address_rec = self.read(cr, uid, address_ids, ['type']) res = list((addr['type'],addr['id']) for addr in address_rec) adr = dict(res) # get the id of the (first) default address if there is one, @@ -293,107 +303,6 @@ class res_partner(osv.osv): ).res_id res_partner() -class res_partner_address(osv.osv): - _description ='Partner Addresses' - _name = 'res.partner.address' - _order = 'type, name' - _columns = { - 'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."), - 'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."), - 'function': fields.char('Function', size=128), - 'title': fields.many2one('res.partner.title','Title'), - 'name': fields.char('Contact Name', size=64, select=1), - 'street': fields.char('Street', size=128), - 'street2': fields.char('Street2', size=128), - 'zip': fields.char('Zip', change_default=True, size=24), - 'city': fields.char('City', size=128), - 'state_id': fields.many2one("res.country.state", 'Fed. State', domain="[('country_id','=',country_id)]"), - 'country_id': fields.many2one('res.country', 'Country'), - 'email': fields.char('E-Mail', size=240), - 'phone': fields.char('Phone', size=64), - 'fax': fields.char('Fax', size=64), - 'mobile': fields.char('Mobile', size=64), - 'birthdate': fields.char('Birthdate', size=64), - 'is_customer_add': fields.related('partner_id', 'customer', type='boolean', string='Customer'), - 'is_supplier_add': fields.related('partner_id', 'supplier', type='boolean', string='Supplier'), - 'active': fields.boolean('Active', help="Uncheck the active field to hide the contact."), -# 'company_id': fields.related('partner_id','company_id',type='many2one',relation='res.company',string='Company', store=True), - 'company_id': fields.many2one('res.company', 'Company',select=1), - 'color': fields.integer('Color Index'), - } - _defaults = { - 'active': lambda *a: 1, - 'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'res.partner.address', context=c), - } - def name_get(self, cr, user, ids, context=None): - if context is None: - context = {} - if not len(ids): - return [] - res = [] - for r in self.read(cr, user, ids, ['name','zip','country_id', 'city','partner_id', 'street']): - if context.get('contact_display', 'contact')=='partner' and r['partner_id']: - res.append((r['id'], r['partner_id'][1])) - else: - # make a comma-separated list with the following non-empty elements - elems = [r['name'], r['country_id'] and r['country_id'][1], r['city'], r['street']] - addr = ', '.join(filter(bool, elems)) - if (context.get('contact_display', 'contact')=='partner_address') and r['partner_id']: - res.append((r['id'], "%s: %s" % (r['partner_id'][1], addr or '/'))) - else: - res.append((r['id'], addr or '/')) - return res - - def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): - if not args: - args=[] - if not context: - context={} - if context.get('contact_display', 'contact')=='partner ' or context.get('contact_display', 'contact')=='partner_address ' : - ids = self.search(cr, user, [('partner_id',operator,name)], limit=limit, context=context) - else: - if not name: - ids = self.search(cr, user, args, limit=limit, context=context) - else: - ids = self.search(cr, user, [('zip','=',name)] + args, limit=limit, context=context) - if not ids: - ids = self.search(cr, user, [('city',operator,name)] + args, limit=limit, context=context) - if name: - ids += self.search(cr, user, [('name',operator,name)] + args, limit=limit, context=context) - ids += self.search(cr, user, [('partner_id',operator,name)] + args, limit=limit, context=context) - return self.name_get(cr, user, ids, context=context) - - def get_city(self, cr, uid, id): - return self.browse(cr, uid, id).city - - def _display_address(self, cr, uid, address, context=None): - ''' - The purpose of this function is to build and return an address formatted accordingly to the - standards of the country where it belongs. - - :param address: browse record of the res.partner.address to format - :returns: the address formatted in a display that fit its country habits (or the default ones - if not country is specified) - :rtype: string - ''' - # get the address format - address_format = address.country_id and address.country_id.address_format or \ - '%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s' - # get the information that will be injected into the display format - args = { - 'state_code': address.state_id and address.state_id.code or '', - 'state_name': address.state_id and address.state_id.name or '', - 'country_code': address.country_id and address.country_id.code or '', - 'country_name': address.country_id and address.country_id.name or '', - } - address_field = ['title', 'street', 'street2', 'zip', 'city'] - for field in address_field : - args[field] = getattr(address, field) or '' - - return address_format % args - -res_partner_address() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index d38a6a68511..de7a318cc08 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -294,7 +294,7 @@ Resource: res.partner.address --> - + Bruxelles Michel Schumacher 1000 @@ -305,7 +305,7 @@ default - + Avignon CEDEX 09 Laurent Jacot 84911 @@ -316,7 +316,7 @@ default - + Champs sur Marne Laith Jubair 77420 @@ -327,7 +327,7 @@ default - + Louvain-la-Neuve Thomas Passot 1348 @@ -336,7 +336,7 @@ Rue de l'Angelique, 1 - + Taiwan Tang 23410 @@ -347,7 +347,7 @@ default - + Hong Kong Wong 23540 @@ -358,7 +358,7 @@ default - + Brussels Etienne Lacarte 2365 @@ -369,7 +369,7 @@ + 32 025 897 456 - + Namur Jean Guy Lavente 2541 @@ -380,7 +380,7 @@ + 32 081256987 - + Wavre Sylvie Lelitre 5478 @@ -392,7 +392,7 @@ - + Wavre Paul Lelitre 5478 @@ -404,7 +404,7 @@ - + Wavre Serge Lelitre 5478 @@ -416,7 +416,7 @@ - + Paris Arthur Grosbonnet 75016 @@ -428,7 +428,7 @@ - + Alencon Sebastien LANGE 61000 @@ -439,7 +439,7 @@ default - + Liege Karine Lesbrouffe 6985 @@ -450,7 +450,7 @@ default - + Shanghai Zen 478552 @@ -461,7 +461,7 @@ +86-751-64845671 - + default Grenoble Loïc Dupont @@ -473,7 +473,7 @@ +33-658-256545 - + default Carl François Bruxelles @@ -484,7 +484,7 @@ +32-258-256545 - + default Lucien Ferguson 89 Chaussée de Liège @@ -494,7 +494,7 @@ +32-621-568978 - + default Marine Leclerc rue Grande @@ -504,7 +504,7 @@ +33-298.334558 - + invoice Claude Leclerc rue Grande @@ -515,7 +515,7 @@ - + default Martine Ohio Place du 20Août @@ -525,7 +525,7 @@ +32-45895245 - + Lausanne Luc Maurer 1015 @@ -535,7 +535,7 @@ default - + Cupertino Seagate Technology 95014 @@ -546,7 +546,7 @@ default - + Buenos Aires Jack Daniels 1659 @@ -558,7 +558,7 @@ default - + Boston Tiny Work 5501 @@ -574,7 +574,7 @@ Resource: res.partner.address for Training --> - + @@ -586,34 +586,34 @@ - + - + - + - + - + @@ -621,7 +621,7 @@ - + @@ -634,7 +634,7 @@ - + @@ -643,7 +643,7 @@ - + @@ -651,7 +651,7 @@ - + @@ -662,7 +662,7 @@ - + @@ -672,7 +672,7 @@ - + @@ -684,7 +684,7 @@ - + diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml index 1f0e8f88b1c..28338f863c0 100644 --- a/openerp/addons/base/res/res_partner_view.xml +++ b/openerp/addons/base/res/res_partner_view.xml @@ -20,7 +20,7 @@ ===================== --> - + - + @@ -341,11 +341,10 @@ - + + + @@ -413,8 +412,8 @@ - - + + @@ -465,7 +464,7 @@
, - +
diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 59ebafb2f99..838ecb2c3d4 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -55,8 +55,8 @@ "access_res_lang_group_user","res_lang group_user","model_res_lang","group_system",1,1,1,1 "access_res_partner_group_partner_manager","res_partner group_partner_manager","model_res_partner","group_partner_manager",1,1,1,1 "access_res_partner_group_user","res_partner group_user","model_res_partner","group_user",1,0,0,0 -"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner_address","group_partner_manager",1,1,1,1 -"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address","group_user",1,0,0,0 +"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner","group_partner_manager",1,1,1,1 +"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner","group_user",1,0,0,0 "access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank","group_user",1,0,0,0 "access_res_partner_bank_group_partner_manager","res_partner_bank group_partner_manager","model_res_partner_bank","group_partner_manager",1,1,1,1 "access_res_partner_bank_type_group_partner_manager","res_partner_bank_type group_partner_manager","model_res_partner_bank_type","group_partner_manager",1,1,1,1 @@ -117,7 +117,7 @@ "access_ir_filter all","ir_filters all","model_ir_filters",,1,0,0,0 "access_ir_filter employee","ir_filters employee","model_ir_filters","group_user",1,1,1,1 "access_ir_filters","ir_filters_all","model_ir_filters",,1,1,1,1 -"access_res_partner_address","res.partner.address","model_res_partner_address","group_system",1,1,1,1 +"access_res_partner_address","res.partner.address","model_res_partner","group_system",1,1,1,1 "access_res_widget","res.widget","model_res_widget","group_erp_manager",1,1,1,1 "access_res_widget_user","res.widget.user","model_res_widget",,1,0,0,0 "access_res_log_all","res.log","model_res_log",,1,1,1,1 diff --git a/openerp/addons/base/test/test_osv_expression.yml b/openerp/addons/base/test/test_osv_expression.yml index d9a1b215000..852647b540b 100644 --- a/openerp/addons/base/test/test_osv_expression.yml +++ b/openerp/addons/base/test/test_osv_expression.yml @@ -68,19 +68,19 @@ - Testing that some domain expressions work - - !python {model: res.partner.address }: | + !python {model: res.partner }: | ids = self.search(cr, uid, [('partner_id','=','Agrolait')]) assert len(ids) >= 1, ids - Trying the "in" operator, for scalar value - - !python {model: res.partner.address }: | + !python {model: res.partner }: | ids = self.search(cr, uid, [('partner_id','in','Agrolait')]) assert len(ids) >= 1, ids - Trying the "in" operator for list value - - !python {model: res.partner.address }: | + !python {model: res.partner }: | ids = self.search(cr, uid, [('partner_id','in',['Agrolait','ASUStek'])]) assert len(ids) >= 1, ids - @@ -89,15 +89,6 @@ !python {model: ir.ui.menu }: | ids = self.search(cr, uid, [('sequence','in',[1, 2, 10, 20])]) assert len(ids) >= 1, ids -- - Test one2many operator with empty search list -- - !assert {model: res.partner, search: "[('address', 'in', [])]", count: 0, string: "Ids should be empty"} -- - Test one2many operator with False -- - !assert {model: res.partner, search: "[('address', '=', False)]"}: - - address in (False, None, []) - Test many2many operator with empty search list - @@ -107,10 +98,6 @@ - !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"} - Check if many2one works with empty search list - @@ -525,15 +512,7 @@ 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." - diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index 4a713ac3df8..9764a64a3f6 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -321,7 +321,7 @@ class rml_parse(object): return res def display_address(self, address_browse_record): - return self.pool.get('res.partner.address')._display_address(self.cr, self.uid, address_browse_record) + return self.pool.get('res.partner')._display_address(self.cr, self.uid, address_browse_record) def repeatIn(self, lst, name,nodes_parent=False): ret_lst = [] diff --git a/openerp/tests/test_orm.py b/openerp/tests/test_orm.py index c11d4cd19d2..3640fd17f78 100644 --- a/openerp/tests/test_orm.py +++ b/openerp/tests/test_orm.py @@ -19,7 +19,7 @@ class TestO2MSerialization(unittest2.TestCase): def setUp(self): self.cr = openerp.modules.registry.RegistryManager.get(DB).db.cursor() self.partner = openerp.modules.registry.RegistryManager.get(DB)['res.partner'] - self.address = openerp.modules.registry.RegistryManager.get(DB)['res.partner.address'] +# self.address = openerp.modules.registry.RegistryManager.get(DB)['res.partner.address'] def tearDown(self): self.cr.rollback() diff --git a/openerp/tools/import_email.py b/openerp/tools/import_email.py index b597dab5722..d73c50865a2 100644 --- a/openerp/tools/import_email.py +++ b/openerp/tools/import_email.py @@ -86,8 +86,8 @@ class ReceiverEmail2Event(object): def get_partners(self, headers, msg): alladdresses = self.get_addresses(headers, msg) - address_ids = self.rpc(('res.partner.address', 'search', [('email', 'in', alladdresses)])) - addresses = self.rpc(('res.partner.address', 'read', address_ids)) + address_ids = self.rpc(('res.partner', 'search', [('email', 'in', alladdresses)])) + addresses = self.rpc(('res.partner', 'read', address_ids)) return [x['partner_id'][0] for x in addresses] def __call__(self, request):