Merge lp:~openerp-dev/openobject-server/trunk-res-country-state-cleaning-mme into lp:openobject-server

Proposed by Thibault Delavallée (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-server/trunk-res-country-state-cleaning-mme
Merge into: lp:openobject-server
Diff against target: 584 lines (+29/-139)
21 files modified
doc/03_module_dev_02.rst (+0/-1)
doc/03_module_dev_03.rst (+1/-1)
doc/form-view-guidelines.rst (+1/-1)
openerp/addons/base/__openerp__.py (+0/-1)
openerp/addons/base/report/corporate_defaults.xml (+1/-1)
openerp/addons/base/res/res_bank.py (+6/-8)
openerp/addons/base/res/res_bank_view.xml (+1/-1)
openerp/addons/base/res/res_company.py (+2/-15)
openerp/addons/base/res/res_company_view.xml (+1/-1)
openerp/addons/base/res/res_country.py (+0/-16)
openerp/addons/base/res/res_country_view.xml (+0/-42)
openerp/addons/base/res/res_partner.py (+7/-15)
openerp/addons/base/res/res_partner_demo.xml (+0/-6)
openerp/addons/base/res/res_partner_report_address.xml (+1/-1)
openerp/addons/base/res/res_partner_view.xml (+2/-2)
openerp/addons/base/res/res_users.py (+0/-4)
openerp/addons/base/security/ir.model.access.csv (+0/-2)
openerp/addons/base/tests/test_expression.py (+0/-4)
openerp/addons/base/tests/test_mail_examples.py (+1/-1)
openerp/addons/base/tests/test_search.py (+5/-6)
openerp/osv/expression.py (+0/-10)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/trunk-res-country-state-cleaning-mme
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+208115@code.launchpad.net

Description of the change

[Fix] remove res.country.state model and replace all many2one state by a char field

To post a comment you must log in.
5092. By Mehul Mehta(OpenERP)

[IMP] improvement in code

Unmerged revisions

5092. By Mehul Mehta(OpenERP)

[IMP] improvement in code

5091. By Mehul Mehta(OpenERP)

[MERGE] Merged lp:openobject-server

5090. By Mehul Mehta(OpenERP)

[Fix] remove res.country.state model and replace all many2one state by a char field

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'doc/03_module_dev_02.rst'
--- doc/03_module_dev_02.rst 2013-06-19 09:13:32 +0000
+++ doc/03_module_dev_02.rst 2014-02-26 13:35:37 +0000
@@ -600,7 +600,6 @@
600 the Country from a City, you can define a field as below in the City object::600 the Country from a City, you can define a field as below in the City object::
601601
602 'country_id': fields.related(602 'country_id': fields.related(
603 'state_id',
604 'country_id', 603 'country_id',
605 type="many2one",604 type="many2one",
606 relation="res.country",605 relation="res.country",
607606
=== modified file 'doc/03_module_dev_03.rst'
--- doc/03_module_dev_03.rst 2013-09-04 12:58:42 +0000
+++ doc/03_module_dev_03.rst 2014-02-26 13:35:37 +0000
@@ -878,7 +878,7 @@
878 <field name="city" select="2"/>878 <field name="city" select="2"/>
879 <newline/>879 <newline/>
880 <field completion="1" name="country_id" select="2"/>880 <field completion="1" name="country_id" select="2"/>
881 <field name="state_id" select="2"/>881 <field name="state" select="2"/>
882 <newline/>882 <newline/>
883 <field name="phone"/>883 <field name="phone"/>
884 <field name="fax"/>884 <field name="fax"/>
885885
=== modified file 'doc/form-view-guidelines.rst'
--- doc/form-view-guidelines.rst 2013-03-28 16:30:59 +0000
+++ doc/form-view-guidelines.rst 2014-02-26 13:35:37 +0000
@@ -228,7 +228,7 @@
228 <field name="zip" class="oe_inline" placeholder="ZIP"/>228 <field name="zip" class="oe_inline" placeholder="ZIP"/>
229 <field name="city" class="oe_inline" placeholder="City"/>229 <field name="city" class="oe_inline" placeholder="City"/>
230 </div>230 </div>
231 <field name="state_id" placeholder="State"/>231 <field name="state" placeholder="State"/>
232 <field name="country_id" placeholder="Country"/>232 <field name="country_id" placeholder="Country"/>
233 </div>233 </div>
234 </group>234 </group>
235235
=== modified file 'openerp/addons/base/__openerp__.py'
--- openerp/addons/base/__openerp__.py 2014-02-09 00:37:45 +0000
+++ openerp/addons/base/__openerp__.py 2014-02-26 13:35:37 +0000
@@ -41,7 +41,6 @@
41 'base_menu.xml',41 'base_menu.xml',
42 'res/res_security.xml',42 'res/res_security.xml',
43 'res/res_config.xml',43 'res/res_config.xml',
44 'res/res.country.state.csv',
45 'ir/ir_actions.xml',44 'ir/ir_actions.xml',
46 'ir/ir_config_parameter_view.xml',45 'ir/ir_config_parameter_view.xml',
47 'ir/ir_cron_view.xml',46 'ir/ir_cron_view.xml',
4847
=== modified file 'openerp/addons/base/report/corporate_defaults.xml'
--- openerp/addons/base/report/corporate_defaults.xml 2012-08-20 10:20:22 +0000
+++ openerp/addons/base/report/corporate_defaults.xml 2014-02-26 13:35:37 +0000
@@ -8,7 +8,7 @@
8 <street type="field" name="street"/>8 <street type="field" name="street"/>
9 <zip type="field" name="zip"/>9 <zip type="field" name="zip"/>
10 <city type="field" name="city"/>10 <city type="field" name="city"/>
11 <state type="field" name="state_id.name"/>11 <state type="field" name="state"/>
12 <country type="field" name="country_id.name"/>12 <country type="field" name="country_id.name"/>
13 <phone type="field" name="phone"/>13 <phone type="field" name="phone"/>
14 <email type="field" name="email"/>14 <email type="field" name="email"/>
1515
=== modified file 'openerp/addons/base/res/res_bank.py'
--- openerp/addons/base/res/res_bank.py 2013-04-12 13:30:08 +0000
+++ openerp/addons/base/res/res_bank.py 2014-02-26 13:35:37 +0000
@@ -32,8 +32,7 @@
32 'street2': fields.char('Street2', size=128),32 'street2': fields.char('Street2', size=128),
33 'zip': fields.char('Zip', change_default=True, size=24),33 'zip': fields.char('Zip', change_default=True, size=24),
34 'city': fields.char('City', size=128),34 'city': fields.char('City', size=128),
35 'state': fields.many2one("res.country.state", 'Fed. State',35 'state': fields.char('Fed. State'),
36 domain="[('country_id', '=', country)]"),
37 'country': fields.many2one('res.country', 'Country'),36 'country': fields.many2one('res.country', 'Country'),
38 'email': fields.char('Email', size=64),37 'email': fields.char('Email', size=64),
39 'phone': fields.char('Phone', size=64),38 'phone': fields.char('Phone', size=64),
@@ -102,7 +101,7 @@
102101
103 def _default_value(self, cursor, user, field, context=None):102 def _default_value(self, cursor, user, field, context=None):
104 if context is None: context = {}103 if context is None: context = {}
105 if field in ('country_id', 'state_id'):104 if field in ('country_id'):
106 value = False105 value = False
107 else:106 else:
108 value = ''107 value = ''
@@ -130,8 +129,7 @@
130 'city': fields.char('City', size=128),129 'city': fields.char('City', size=128),
131 'country_id': fields.many2one('res.country', 'Country',130 'country_id': fields.many2one('res.country', 'Country',
132 change_default=True),131 change_default=True),
133 'state_id': fields.many2one("res.country.state", 'Fed. State',132 'state': fields.char('Fed. State'),
134 change_default=True, domain="[('country_id','=',country_id)]"),
135 'company_id': fields.many2one('res.company', 'Company',133 'company_id': fields.many2one('res.company', 'Company',
136 ondelete='cascade', help="Only if this bank account belong to your company"),134 ondelete='cascade', help="Only if this bank account belong to your company"),
137 'partner_id': fields.many2one('res.partner', 'Account Owner', required=True,135 'partner_id': fields.many2one('res.partner', 'Account Owner', required=True,
@@ -153,8 +151,8 @@
153 cursor, user, 'zip', context=context),151 cursor, user, 'zip', context=context),
154 'country_id': lambda obj, cursor, user, context: obj._default_value(152 'country_id': lambda obj, cursor, user, context: obj._default_value(
155 cursor, user, 'country_id', context=context),153 cursor, user, 'country_id', context=context),
156 'state_id': lambda obj, cursor, user, context: obj._default_value(154 'state': lambda obj, cursor, user, context: obj._default_value(
157 cursor, user, 'state_id', context=context),155 cursor, user, 'state', context=context),
158 'name': '/'156 'name': '/'
159 }157 }
160158
@@ -231,7 +229,7 @@
231 result['city'] = part.city or False229 result['city'] = part.city or False
232 result['zip'] = part.zip or False230 result['zip'] = part.zip or False
233 result['country_id'] = part.country_id.id231 result['country_id'] = part.country_id.id
234 result['state_id'] = part.state_id.id232 result['state'] = part.state
235 return {'value': result}233 return {'value': result}
236234
237res_partner_bank()235res_partner_bank()
238236
=== modified file 'openerp/addons/base/res/res_bank_view.xml'
--- openerp/addons/base/res/res_bank_view.xml 2013-06-13 17:54:53 +0000
+++ openerp/addons/base/res/res_bank_view.xml 2014-02-26 13:35:37 +0000
@@ -112,7 +112,7 @@
112 <field name="zip" class="oe_inline" placeholder="ZIP"/>112 <field name="zip" class="oe_inline" placeholder="ZIP"/>
113 <field name="city" class="oe_inline" placeholder="City"/>113 <field name="city" class="oe_inline" placeholder="City"/>
114 </div>114 </div>
115 <field name="state_id" placeholder="State" options='{"no_open": True}'/>115 <field name="state" placeholder="State"/>
116 <field name="country_id" placeholder="Country" options='{"no_open": True}'/>116 <field name="country_id" placeholder="Country" options='{"no_open": True}'/>
117 </div>117 </div>
118 </group>118 </group>
119119
=== modified file 'openerp/addons/base/res/res_company.py'
--- openerp/addons/base/res/res_company.py 2014-02-20 16:05:48 +0000
+++ openerp/addons/base/res/res_company.py 2014-02-26 13:35:37 +0000
@@ -139,7 +139,7 @@
139 'street2': fields.function(_get_address_data, fnct_inv=_set_address_data, size=128, type='char', string="Street2", multi='address'),139 'street2': fields.function(_get_address_data, fnct_inv=_set_address_data, size=128, type='char', string="Street2", multi='address'),
140 'zip': fields.function(_get_address_data, fnct_inv=_set_address_data, size=24, type='char', string="Zip", multi='address'),140 'zip': fields.function(_get_address_data, fnct_inv=_set_address_data, size=24, type='char', string="Zip", multi='address'),
141 'city': fields.function(_get_address_data, fnct_inv=_set_address_data, size=24, type='char', string="City", multi='address'),141 'city': fields.function(_get_address_data, fnct_inv=_set_address_data, size=24, type='char', string="City", multi='address'),
142 'state_id': fields.function(_get_address_data, fnct_inv=_set_address_data, type='many2one', relation='res.country.state', string="Fed. State", multi='address'),142 'state': fields.function(_get_address_data, fnct_inv=_set_address_data, type='char', string="Fed. State", multi='address'),
143 'bank_ids': fields.one2many('res.partner.bank','company_id', 'Bank Accounts', help='Bank accounts related to this company'),143 'bank_ids': fields.one2many('res.partner.bank','company_id', 'Bank Accounts', help='Bank accounts related to this company'),
144 'country_id': fields.function(_get_address_data, fnct_inv=_set_address_data, type='many2one', relation='res.country', string="Country", multi='address'),144 'country_id': fields.function(_get_address_data, fnct_inv=_set_address_data, type='many2one', relation='res.country', string="Country", multi='address'),
145 'email': fields.related('partner_id', 'email', size=64, type='char', string="Email", store=True),145 'email': fields.related('partner_id', 'email', size=64, type='char', string="Email", store=True),
@@ -176,11 +176,7 @@
176 res += '\n%s: %s' % (title, ', '.join(name for id, name in account_names))176 res += '\n%s: %s' % (title, ', '.join(name for id, name in account_names))
177177
178 return {'value': {'rml_footer': res, 'rml_footer_readonly': res}}178 return {'value': {'rml_footer': res, 'rml_footer_readonly': res}}
179 def onchange_state(self, cr, uid, ids, state_id, context=None):179
180 if state_id:
181 return {'value':{'country_id': self.pool.get('res.country.state').browse(cr, uid, state_id, context).country_id.id }}
182 return {}
183
184 def onchange_font_name(self, cr, uid, ids, font, rml_header, rml_header2, rml_header3, context=None):180 def onchange_font_name(self, cr, uid, ids, font, rml_header, rml_header2, rml_header3, context=None):
185 """ To change default header style of all <para> and drawstring. """181 """ To change default header style of all <para> and drawstring. """
186182
@@ -199,15 +195,6 @@
199 'rml_header3':_change_header(rml_header3, fontname)195 'rml_header3':_change_header(rml_header3, fontname)
200 }}196 }}
201197
202 def on_change_country(self, cr, uid, ids, country_id, context=None):
203 res = {'domain': {'state_id': []}}
204 currency_id = self._get_euro(cr, uid, context=context)
205 if country_id:
206 currency_id = self.pool.get('res.country').browse(cr, uid, country_id, context=context).currency_id.id
207 res['domain'] = {'state_id': [('country_id','=',country_id)]}
208 res['value'] = {'currency_id': currency_id}
209 return res
210
211 def _search(self, cr, uid, args, offset=0, limit=None, order=None,198 def _search(self, cr, uid, args, offset=0, limit=None, order=None,
212 context=None, count=False, access_rights_uid=None):199 context=None, count=False, access_rights_uid=None):
213 if context is None:200 if context is None:
214201
=== modified file 'openerp/addons/base/res/res_company_view.xml'
--- openerp/addons/base/res/res_company_view.xml 2014-02-20 16:05:48 +0000
+++ openerp/addons/base/res/res_company_view.xml 2014-02-26 13:35:37 +0000
@@ -48,7 +48,7 @@
48 <field name="street2"/>48 <field name="street2"/>
49 <div>49 <div>
50 <field name="city" placeholder="City" style="width: 40%%"/>50 <field name="city" placeholder="City" style="width: 40%%"/>
51 <field name="state_id" class="oe_no_button" placeholder="State" on_change="onchange_state(state_id)" style="width: 24%%" options='{"no_open": True}'/>51 <field name="state" placeholder="State" style="width: 24%%"/>
52 <field name="zip" placeholder="ZIP" style="width: 34%%"/>52 <field name="zip" placeholder="ZIP" style="width: 34%%"/>
53 </div>53 </div>
54 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' on_change="on_change_country(country_id)"/>54 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' on_change="on_change_country(country_id)"/>
5555
=== modified file 'openerp/addons/base/res/res_country.py'
--- openerp/addons/base/res/res_country.py 2014-01-07 14:15:24 +0000
+++ openerp/addons/base/res/res_country.py 2014-02-26 13:35:37 +0000
@@ -82,21 +82,5 @@
82 return super(Country, self).write(cursor, user, ids, vals,82 return super(Country, self).write(cursor, user, ids, vals,
83 context=context)83 context=context)
8484
85
86class CountryState(osv.osv):
87 _description="Country state"
88 _name = 'res.country.state'
89 _columns = {
90 'country_id': fields.many2one('res.country', 'Country',
91 required=True),
92 'name': fields.char('State Name', size=64, required=True,
93 help='Administrative divisions of a country. E.g. Fed. State, Departement, Canton'),
94 'code': fields.char('State Code', size=3,
95 help='The state code in max. three chars.', required=True),
96 }
97 _order = 'code'
98
99 name_search = location_name_search
100
101# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:85# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
10286
10387
=== modified file 'openerp/addons/base/res/res_country_view.xml'
--- openerp/addons/base/res/res_country_view.xml 2012-10-26 06:51:43 +0000
+++ openerp/addons/base/res/res_country_view.xml 2014-02-26 13:35:37 +0000
@@ -47,47 +47,5 @@
47 <menuitem id="menu_localisation" name="Localization" parent="menu_config_address_book" sequence="1" groups="base.group_no_one"/>47 <menuitem id="menu_localisation" name="Localization" parent="menu_config_address_book" sequence="1" groups="base.group_no_one"/>
4848
49 <menuitem action="action_country" id="menu_country_partner" parent="menu_localisation" sequence="0" groups="base.group_no_one"/>49 <menuitem action="action_country" id="menu_country_partner" parent="menu_localisation" sequence="0" groups="base.group_no_one"/>
50
51 <!--
52 State
53 -->
54
55 <record id="view_country_state_tree" model="ir.ui.view">
56 <field name="name">res.country.state.tree</field>
57 <field name="model">res.country.state</field>
58 <field name="arch" type="xml">
59 <tree string="State">
60 <field name="name"/>
61 <field name="code"/>
62 <field name="country_id"/>
63 </tree>
64 </field>
65 </record>
66
67 <record id="view_country_state_form" model="ir.ui.view">
68 <field name="name">res.country.state.form</field>
69 <field name="model">res.country.state</field>
70 <field name="arch" type="xml">
71 <form string="State" version="7.0">
72 <group>
73 <field name="name"/>
74 <field name="code"/>
75 <field name="country_id" options='{"no_open": True}'/>
76 </group>
77 </form>
78 </field>
79 </record>
80
81 <record id="action_country_state" model="ir.actions.act_window">
82 <field name="name">Fed. States</field>
83 <field name="type">ir.actions.act_window</field>
84 <field name="res_model">res.country.state</field>
85 <field name="view_type">form</field>
86 <field name="view_id" ref="view_country_state_tree"/>
87 <field name="help">If you are working on the American market, you can manage the different federal states you are working on from here. Each state is attached to one country.</field>
88 </record>
89
90 <menuitem action="action_country_state" id="menu_country_state_partner" parent="menu_localisation" sequence="1" groups="base.group_no_one"/>
91
92 </data>50 </data>
93</openerp>51</openerp>
9452
=== modified file 'openerp/addons/base/res/res_partner.py'
--- openerp/addons/base/res/res_partner.py 2014-02-12 08:03:31 +0000
+++ openerp/addons/base/res/res_partner.py 2014-02-26 13:35:37 +0000
@@ -36,10 +36,10 @@
36 fmt = user_obj.browse(cr, SUPERUSER_ID, uid, context).company_id.country_id36 fmt = user_obj.browse(cr, SUPERUSER_ID, uid, context).company_id.country_id
37 fmt = fmt and fmt.address_format37 fmt = fmt and fmt.address_format
38 layouts = {38 layouts = {
39 '%(city)s %(state_code)s\n%(zip)s': """39 '%(city)s\n%(zip)s': """
40 <div class="address_format">40 <div class="address_format">
41 <field name="city" placeholder="City" style="width: 50%%"/>41 <field name="city" placeholder="City" style="width: 50%%"/>
42 <field name="state_id" class="oe_no_button" placeholder="State" style="width: 47%%" options='{"no_open": true}'/>42 <field name="state" placeholder="State" style="width: 47%%"/>
43 <br/>43 <br/>
44 <field name="zip" placeholder="ZIP"/>44 <field name="zip" placeholder="ZIP"/>
45 </div>45 </div>
@@ -49,13 +49,13 @@
49 <field name="zip" placeholder="ZIP" style="width: 40%%"/>49 <field name="zip" placeholder="ZIP" style="width: 40%%"/>
50 <field name="city" placeholder="City" style="width: 57%%"/>50 <field name="city" placeholder="City" style="width: 57%%"/>
51 <br/>51 <br/>
52 <field name="state_id" class="oe_no_button" placeholder="State" options='{"no_open": true}'/>52 <field name="state" placeholder="State"/>
53 </div>53 </div>
54 """,54 """,
55 '%(city)s\n%(state_name)s\n%(zip)s': """55 '%(city)s\n%(zip)s': """
56 <div class="address_format">56 <div class="address_format">
57 <field name="city" placeholder="City"/>57 <field name="city" placeholder="City"/>
58 <field name="state_id" class="oe_no_button" placeholder="State" options='{"no_open": true}'/>58 <field name="state" placeholder="State"/>
59 <field name="zip" placeholder="ZIP"/>59 <field name="zip" placeholder="ZIP"/>
60 </div>60 </div>
61 """61 """
@@ -262,7 +262,7 @@
262 'street2': fields.char('Street2', size=128),262 'street2': fields.char('Street2', size=128),
263 'zip': fields.char('Zip', change_default=True, size=24),263 'zip': fields.char('Zip', change_default=True, size=24),
264 'city': fields.char('City', size=128),264 'city': fields.char('City', size=128),
265 'state_id': fields.many2one("res.country.state", 'State', ondelete='restrict'),265 'state_id': fields.char('State'),
266 'country_id': fields.many2one('res.country', 'Country', ondelete='restrict'),266 'country_id': fields.many2one('res.country', 'Country', ondelete='restrict'),
267 'country': fields.related('country_id', type='many2one', relation='res.country', string='Country',267 'country': fields.related('country_id', type='many2one', relation='res.country', string='Country',
268 deprecated="This field will be removed as of OpenERP 7.1, use country_id instead"),268 deprecated="This field will be removed as of OpenERP 7.1, use country_id instead"),
@@ -384,12 +384,6 @@
384 result['value'] = {'use_parent_address': False}384 result['value'] = {'use_parent_address': False}
385 return result385 return result
386386
387 def onchange_state(self, cr, uid, ids, state_id, context=None):
388 if state_id:
389 country_id = self.pool['res.country.state'].browse(cr, uid, state_id, context).country_id.id
390 return {'value':{'country_id':country_id}}
391 return {}
392
393 def _check_ean_key(self, cr, uid, ids, context=None):387 def _check_ean_key(self, cr, uid, ids, context=None):
394 for partner_o in self.pool['res.partner'].read(cr, uid, ids, ['ean13',]):388 for partner_o in self.pool['res.partner'].read(cr, uid, ids, ['ean13',]):
395 thisean=partner_o['ean13']389 thisean=partner_o['ean13']
@@ -749,10 +743,8 @@
749 # get the information that will be injected into the display format743 # get the information that will be injected into the display format
750 # get the address format744 # get the address format
751 address_format = address.country_id and address.country_id.address_format or \745 address_format = address.country_id and address.country_id.address_format or \
752 "%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s"746 "%(street)s\n%(street2)s\n%(city)s %(zip)s\n%(country_name)s"
753 args = {747 args = {
754 'state_code': address.state_id and address.state_id.code or '',
755 'state_name': address.state_id and address.state_id.name or '',
756 'country_code': address.country_id and address.country_id.code or '',748 'country_code': address.country_id and address.country_id.code or '',
757 'country_name': address.country_id and address.country_id.name or '',749 'country_name': address.country_id and address.country_id.name or '',
758 'company_name': address.parent_id and address.parent_id.name or '',750 'company_name': address.parent_id and address.parent_id.name or '',
759751
=== modified file 'openerp/addons/base/res/res_partner_demo.xml'
--- openerp/addons/base/res/res_partner_demo.xml 2014-01-16 09:17:16 +0000
+++ openerp/addons/base/res/res_partner_demo.xml 2014-02-26 13:35:37 +0000
@@ -118,7 +118,6 @@
118 <field name="city">Fremont</field>118 <field name="city">Fremont</field>
119 <field name="zip">94538</field>119 <field name="zip">94538</field>
120 <field name="country_id" ref="base.us"/>120 <field name="country_id" ref="base.us"/>
121 <field model="res.country.state" name="state_id" search="[('code','ilike','ca')]"/>
122 <field name="street">3661 Station Street</field>121 <field name="street">3661 Station Street</field>
123 <field name="email">deltapc@yourcompany.example.com</field>122 <field name="email">deltapc@yourcompany.example.com</field>
124 <field name="phone">+1 510 340 2385</field>123 <field name="phone">+1 510 340 2385</field>
@@ -132,7 +131,6 @@
132 <field name="is_company">1</field>131 <field name="is_company">1</field>
133 <field eval="0" name="customer"/>132 <field eval="0" name="customer"/>
134 <field name="country_id" ref="base.us"/>133 <field name="country_id" ref="base.us"/>
135 <field model="res.country.state" name="state_id" search="[('code','ilike','il')]"/>
136 <field name="zip">60610</field>134 <field name="zip">60610</field>
137 <field name="city">Chicago</field>135 <field name="city">Chicago</field>
138 <field name="email">epic@yourcompany.example.com</field>136 <field name="email">epic@yourcompany.example.com</field>
@@ -150,7 +148,6 @@
150 <field name="zip">90001</field>148 <field name="zip">90001</field>
151 <field name="city">Los Angeles</field>149 <field name="city">Los Angeles</field>
152 <field name="country_id" ref="base.us"/>150 <field name="country_id" ref="base.us"/>
153 <field model="res.country.state" name="state_id" search="[('code','ilike','ca')]"/>
154 <field name="street">23 Rockwell Lane</field>151 <field name="street">23 Rockwell Lane</field>
155 <field name="email">openelecapplications@yourcompany.example.com</field>152 <field name="email">openelecapplications@yourcompany.example.com</field>
156 <field name="phone">+1 312 349 2121</field>153 <field name="phone">+1 312 349 2121</field>
@@ -209,7 +206,6 @@
209 <field name="city">Miami</field>206 <field name="city">Miami</field>
210 <field name="zip">33169</field>207 <field name="zip">33169</field>
211 <field name="country_id" ref="base.us"/>208 <field name="country_id" ref="base.us"/>
212 <field model="res.country.state" name="state_id" search="[('code','=','FL')]"/>
213 <field name="email">jackson@yourcompany.example.com</field>209 <field name="email">jackson@yourcompany.example.com</field>
214 <field name="phone">+1 786 525 0724</field>210 <field name="phone">+1 786 525 0724</field>
215 <field name="street">3203 Lamberts Branch Road</field>211 <field name="street">3203 Lamberts Branch Road</field>
@@ -274,7 +270,6 @@
274 <field name="city">Detroit</field>270 <field name="city">Detroit</field>
275 <field name="zip">48212</field>271 <field name="zip">48212</field>
276 <field name="country_id" ref="base.us"/>272 <field name="country_id" ref="base.us"/>
277 <field model="res.country.state" name="state_id" search="[('code','ilike','mi')]"/>
278 <field name="street">60, Rosewood Court</field>273 <field name="street">60, Rosewood Court</field>
279 <field name="email">chamberworks@yourcompany.example.com</field>274 <field name="email">chamberworks@yourcompany.example.com</field>
280 <field name="phone">+1 313 222 3456</field>275 <field name="phone">+1 313 222 3456</field>
@@ -349,7 +344,6 @@
349 <field name="city">Cupertino</field>344 <field name="city">Cupertino</field>
350 <field name="zip">95014</field>345 <field name="zip">95014</field>
351 <field name="country_id" ref="base.us"/>346 <field name="country_id" ref="base.us"/>
352 <field model="res.country.state" name="state_id" search="[('code','ilike','ca')]"/>
353 <field name="street">10200 S. De Anza Blvd</field>347 <field name="street">10200 S. De Anza Blvd</field>
354 <field name="email">seagate@yourcompany.example.com</field>348 <field name="email">seagate@yourcompany.example.com</field>
355 <field name="phone">+1 800 732 4283</field>349 <field name="phone">+1 800 732 4283</field>
356350
=== modified file 'openerp/addons/base/res/res_partner_report_address.xml'
--- openerp/addons/base/res/res_partner_report_address.xml 2013-10-06 14:40:20 +0000
+++ openerp/addons/base/res/res_partner_report_address.xml 2014-02-26 13:35:37 +0000
@@ -8,7 +8,7 @@
8 <street2 type="field" name="street2"/>8 <street2 type="field" name="street2"/>
9 <zip type="field" name="zip"/>9 <zip type="field" name="zip"/>
10 <city type="field" name="city"/>10 <city type="field" name="city"/>
11 <state type="field" name="state_id.name"/>11 <state type="field" name="state"/>
12 <country type="field" name="country_id.name"/>12 <country type="field" name="country_id.name"/>
13 </address>13 </address>
14</addresses>14</addresses>
1515
=== modified file 'openerp/addons/base/res/res_partner_view.xml'
--- openerp/addons/base/res/res_partner_view.xml 2014-02-03 16:30:52 +0000
+++ openerp/addons/base/res/res_partner_view.xml 2014-02-26 13:35:37 +0000
@@ -166,7 +166,7 @@
166 <field name="street2" attrs="{'readonly': [('use_parent_address','=',True)]}"/>166 <field name="street2" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
167 <div class="address_format">167 <div class="address_format">
168 <field name="city" placeholder="City" style="width: 40%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>168 <field name="city" placeholder="City" style="width: 40%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
169 <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)" attrs="{'readonly': [('use_parent_address','=',True)]}"/>169 <field name="state_id" placeholder="State" style="width: 37%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
170 <field name="zip" placeholder="ZIP" style="width: 20%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>170 <field name="zip" placeholder="ZIP" style="width: 20%%" attrs="{'readonly': [('use_parent_address','=',True)]}"/>
171 </div>171 </div>
172 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' attrs="{'readonly': [('use_parent_address','=',True)]}"/>172 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}' attrs="{'readonly': [('use_parent_address','=',True)]}"/>
@@ -281,7 +281,7 @@
281 <field name="street2"/>281 <field name="street2"/>
282 <div class="address_format">282 <div class="address_format">
283 <field name="city" placeholder="City" style="width: 40%%"/>283 <field name="city" placeholder="City" style="width: 40%%"/>
284 <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>284 <field name="state_id" placeholder="State" style="width: 37%%"/>
285 <field name="zip" placeholder="ZIP" style="width: 20%%"/>285 <field name="zip" placeholder="ZIP" style="width: 20%%"/>
286 </div>286 </div>
287 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>287 <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>
288288
=== modified file 'openerp/addons/base/res/res_users.py'
--- openerp/addons/base/res/res_users.py 2014-02-19 14:06:17 +0000
+++ openerp/addons/base/res/res_users.py 2014-02-26 13:35:37 +0000
@@ -172,10 +172,6 @@
172 v = {'email': login} if tools.single_email_re.match(login) else {}172 v = {'email': login} if tools.single_email_re.match(login) else {}
173 return {'value': v}173 return {'value': v}
174174
175 def onchange_state(self, cr, uid, ids, state_id, context=None):
176 partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)]
177 return self.pool.get('res.partner').onchange_state(cr, uid, partner_ids, state_id, context=context)
178
179 def onchange_type(self, cr, uid, ids, is_company, context=None):175 def onchange_type(self, cr, uid, ids, is_company, context=None):
180 """ Wrapper on the user.partner onchange_type, because some calls to the176 """ Wrapper on the user.partner onchange_type, because some calls to the
181 partner form view applied to the user may trigger the177 partner form view applied to the user may trigger the
182178
=== modified file 'openerp/addons/base/security/ir.model.access.csv'
--- openerp/addons/base/security/ir.model.access.csv 2014-01-16 14:06:21 +0000
+++ openerp/addons/base/security/ir.model.access.csv 2014-02-26 13:35:37 +0000
@@ -44,9 +44,7 @@
44"access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,144"access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,1
45"access_res_company_group_user","res_company group_user","model_res_company",,1,0,0,045"access_res_company_group_user","res_company group_user","model_res_company",,1,0,0,0
46"access_res_country_group_all","res_country group_user_all","model_res_country",,1,0,0,046"access_res_country_group_all","res_country group_user_all","model_res_country",,1,0,0,0
47"access_res_country_state_group_all","res_country_state group_user_all","model_res_country_state",,1,0,0,0
48"access_res_country_group_user","res_country group_user","model_res_country","group_partner_manager",1,1,1,147"access_res_country_group_user","res_country group_user","model_res_country","group_partner_manager",1,1,1,1
49"access_res_country_state_group_user","res_country_state group_user","model_res_country_state","group_partner_manager",1,1,1,1
50"access_res_currency_group_all","res_currency group_all","model_res_currency",,1,0,0,048"access_res_currency_group_all","res_currency group_all","model_res_currency",,1,0,0,0
51"access_res_currency_rate_group_all","res_currency_rate group_all","model_res_currency_rate",,1,0,0,049"access_res_currency_rate_group_all","res_currency_rate group_all","model_res_currency_rate",,1,0,0,0
52"access_res_currency_rate_type_group_all","res_currency_rate_type group_all","model_res_currency_rate_type",,1,0,0,050"access_res_currency_rate_type_group_all","res_currency_rate_type group_all","model_res_currency_rate_type",,1,0,0,0
5351
=== modified file 'openerp/addons/base/tests/test_expression.py'
--- openerp/addons/base/tests/test_expression.py 2014-02-09 00:37:45 +0000
+++ openerp/addons/base/tests/test_expression.py 2014-02-26 13:35:37 +0000
@@ -127,13 +127,10 @@
127127
128 # Get models128 # Get models
129 partner_obj = registry('res.partner')129 partner_obj = registry('res.partner')
130 state_obj = registry('res.country.state')
131 bank_obj = registry('res.partner.bank')130 bank_obj = registry('res.partner.bank')
132131
133 # Get test columns132 # Get test columns
134 partner_state_id_col = partner_obj._columns.get('state_id') # many2one on res.partner to res.country.state
135 partner_parent_id_col = partner_obj._columns.get('parent_id') # many2one on res.partner to res.partner133 partner_parent_id_col = partner_obj._columns.get('parent_id') # many2one on res.partner to res.partner
136 state_country_id_col = state_obj._columns.get('country_id') # many2one on res.country.state on res.country
137 partner_child_ids_col = partner_obj._columns.get('child_ids') # one2many on res.partner to res.partner134 partner_child_ids_col = partner_obj._columns.get('child_ids') # one2many on res.partner to res.partner
138 partner_bank_ids_col = partner_obj._columns.get('bank_ids') # one2many on res.partner to res.partner.bank135 partner_bank_ids_col = partner_obj._columns.get('bank_ids') # one2many on res.partner to res.partner.bank
139 category_id_col = partner_obj._columns.get('category_id') # many2many on res.partner to res.partner.category136 category_id_col = partner_obj._columns.get('category_id') # many2many on res.partner to res.partner.category
@@ -142,7 +139,6 @@
142 bank_type = bank_obj._bank_type_get(cr, uid)[0]139 bank_type = bank_obj._bank_type_get(cr, uid)[0]
143 # Get country/state data140 # Get country/state data
144 country_us_id = registry('res.country').search(cr, uid, [('code', 'like', 'US')])[0]141 country_us_id = registry('res.country').search(cr, uid, [('code', 'like', 'US')])[0]
145 state_ids = registry('res.country.state').search(cr, uid, [('country_id', '=', country_us_id)], limit=2)
146142
147 # Create demo data: partners and bank object143 # Create demo data: partners and bank object
148 p_a = partner_obj.create(cr, uid, {'name': 'test__A', 'state_id': state_ids[0]})144 p_a = partner_obj.create(cr, uid, {'name': 'test__A', 'state_id': state_ids[0]})
149145
=== modified file 'openerp/addons/base/tests/test_mail_examples.py'
--- openerp/addons/base/tests/test_mail_examples.py 2014-02-09 00:37:45 +0000
+++ openerp/addons/base/tests/test_mail_examples.py 2014-02-26 13:35:37 +0000
@@ -49,7 +49,7 @@
49 ${object.company_id.street}<br/>49 ${object.company_id.street}<br/>
50 ${object.company_id.street2}<br/>50 ${object.company_id.street2}<br/>
51 ${object.company_id.zip} ${object.company_id.city}<br/>51 ${object.company_id.zip} ${object.company_id.city}<br/>
52 ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}<br/>52 ${object.company_id.state}<br/>
53 </span>53 </span>
54 <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">54 <div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
55 Phone:&nbsp; ${object.company_id.phone}55 Phone:&nbsp; ${object.company_id.phone}
5656
=== modified file 'openerp/addons/base/tests/test_search.py'
--- openerp/addons/base/tests/test_search.py 2012-12-07 15:58:25 +0000
+++ openerp/addons/base/tests/test_search.py 2014-02-26 13:35:37 +0000
@@ -68,14 +68,13 @@
6868
69 # Get country/state data69 # Get country/state data
70 country_us_id = registry('res.country').search(cr, uid, [('code', 'like', 'US')])[0]70 country_us_id = registry('res.country').search(cr, uid, [('code', 'like', 'US')])[0]
71 state_ids = registry('res.country.state').search(cr, uid, [('country_id', '=', country_us_id)], limit=2)
72 country_be_id = registry('res.country').search(cr, uid, [('code', 'like', 'BE')])[0]71 country_be_id = registry('res.country').search(cr, uid, [('code', 'like', 'BE')])[0]
7372
74 # Create test users73 # Create test users
75 search_user = users_obj.create(cr, uid, {'name': '__search', 'login': '__search', 'groups_id': [(6, 0, [group_employee_id])]})74 search_user = users_obj.create(cr, uid, {'name': '__search', 'login': '__search', 'groups_id': [(6, 0, [group_employee_id])]})
76 a = users_obj.create(cr, uid, {'name': '__test_A', 'login': '__test_A', 'country_id': country_be_id, 'state_id': country_be_id})75 a = users_obj.create(cr, uid, {'name': '__test_A', 'login': '__test_A', 'country_id': country_be_id})
77 b = users_obj.create(cr, uid, {'name': '__test_B', 'login': '__a_test_B', 'country_id': country_us_id, 'state_id': state_ids[1]})76 b = users_obj.create(cr, uid, {'name': '__test_B', 'login': '__a_test_B', 'country_id': country_us_id})
78 c = users_obj.create(cr, uid, {'name': '__test_B', 'login': '__z_test_B', 'country_id': country_us_id, 'state_id': state_ids[0]})77 c = users_obj.create(cr, uid, {'name': '__test_B', 'login': '__z_test_B', 'country_id': country_us_id})
7978
80 # Do: search on res.users, order on a field on res.partner to try inherits'd fields, then res.users79 # Do: search on res.users, order on a field on res.partner to try inherits'd fields, then res.users
81 user_ids = users_obj.search(cr, search_user, [], order='name asc, login desc')80 user_ids = users_obj.search(cr, search_user, [], order='name asc, login desc')
@@ -84,13 +83,13 @@
84 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')83 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')
8584
86 # Do: order on many2one and inherits'd fields85 # Do: order on many2one and inherits'd fields
87 user_ids = users_obj.search(cr, search_user, [], order='state_id asc, country_id desc, name asc, login desc')86 user_ids = users_obj.search(cr, search_user, [], order='country_id desc, name asc, login desc')
88 expected_ids = [c, b, a, search_user]87 expected_ids = [c, b, a, search_user]
89 test_user_ids = filter(lambda x: x in expected_ids, user_ids)88 test_user_ids = filter(lambda x: x in expected_ids, user_ids)
90 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')89 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')
9190
92 # Do: order on many2one and inherits'd fields91 # Do: order on many2one and inherits'd fields
93 user_ids = users_obj.search(cr, search_user, [], order='country_id desc, state_id desc, name asc, login desc')92 user_ids = users_obj.search(cr, search_user, [], order='country_id desc, name asc, login desc')
94 expected_ids = [search_user, b, c, a]93 expected_ids = [search_user, b, c, a]
95 test_user_ids = filter(lambda x: x in expected_ids, user_ids)94 test_user_ids = filter(lambda x: x in expected_ids, user_ids)
96 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')95 self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order')
9796
=== modified file 'openerp/osv/expression.py'
--- openerp/osv/expression.py 2014-02-06 11:04:23 +0000
+++ openerp/osv/expression.py 2014-02-26 13:35:37 +0000
@@ -445,25 +445,20 @@
445 # running examples:445 # running examples:
446 # - res_users.name, like, foo: name is on res_partner, not on res_users446 # - res_users.name, like, foo: name is on res_partner, not on res_users
447 # - res_partner.bank_ids.name, like, foo: bank_ids is a one2many with _auto_join447 # - res_partner.bank_ids.name, like, foo: bank_ids is a one2many with _auto_join
448 # - res_partner.state_id.name, like, foo: state_id is a many2one with _auto_join
449 # A join:448 # A join:
450 # - link between src_table and dst_table, using src_field and dst_field449 # - link between src_table and dst_table, using src_field and dst_field
451 # i.e.: inherits: res_users.partner_id = res_partner.id450 # i.e.: inherits: res_users.partner_id = res_partner.id
452 # i.e.: one2many: res_partner.id = res_partner_bank.partner_id451 # i.e.: one2many: res_partner.id = res_partner_bank.partner_id
453 # i.e.: many2one: res_partner.state_id = res_country_state.id
454 # - done in the context of a field452 # - done in the context of a field
455 # i.e.: inherits: 'partner_id'453 # i.e.: inherits: 'partner_id'
456 # i.e.: one2many: 'bank_ids'454 # i.e.: one2many: 'bank_ids'
457 # i.e.: many2one: 'state_id'
458 # - table names use aliases: initial table followed by the context field455 # - table names use aliases: initial table followed by the context field
459 # names, joined using a '__'456 # names, joined using a '__'
460 # i.e.: inherits: res_partner as res_users__partner_id457 # i.e.: inherits: res_partner as res_users__partner_id
461 # i.e.: one2many: res_partner_bank as res_partner__bank_ids458 # i.e.: one2many: res_partner_bank as res_partner__bank_ids
462 # i.e.: many2one: res_country_state as res_partner__state_id
463 # - join condition use aliases459 # - join condition use aliases
464 # i.e.: inherits: res_users.partner_id = res_users__partner_id.id460 # i.e.: inherits: res_users.partner_id = res_users__partner_id.id
465 # i.e.: one2many: res_partner.id = res_partner__bank_ids.parr_id461 # i.e.: one2many: res_partner.id = res_partner__bank_ids.parr_id
466 # i.e.: many2one: res_partner.state_id = res_partner__state_id.id
467 # Variables explanation:462 # Variables explanation:
468 # - src_table: working table before the join463 # - src_table: working table before the join
469 # -> res_users, res_partner, res_partner464 # -> res_users, res_partner, res_partner
@@ -473,7 +468,6 @@
473 # necessarily a field (because 'id' is not a field instance)468 # necessarily a field (because 'id' is not a field instance)
474 # i.e.: inherits: 'partner_id', found in the inherits of the current table469 # i.e.: inherits: 'partner_id', found in the inherits of the current table
475 # i.e.: one2many: 'id', not a field470 # i.e.: one2many: 'id', not a field
476 # i.e.: many2one: 'state_id', the current field name
477 # - dst_table_link_name: field name used to link the dst table, not471 # - dst_table_link_name: field name used to link the dst table, not
478 # necessarily a field (because 'id' is not a field instance)472 # necessarily a field (because 'id' is not a field instance)
479 # i.e.: inherits: 'id', not a field473 # i.e.: inherits: 'id', not a field
@@ -482,7 +476,6 @@
482 # - context_field_name: field name used as a context to make the alias476 # - context_field_name: field name used as a context to make the alias
483 # i.e.: inherits: 'partner_id': found in the inherits of the current table477 # i.e.: inherits: 'partner_id': found in the inherits of the current table
484 # i.e.: one2many: 'bank_ids': current field name478 # i.e.: one2many: 'bank_ids': current field name
485 # i.e.: many2one: 'state_id': current field name
486 # --------------------------------------------------479 # --------------------------------------------------
487480
488 def __init__(self, leaf, model, join_context=None):481 def __init__(self, leaf, model, join_context=None):
@@ -624,8 +617,6 @@
624617
625 :attr list result: list that will hold the result of the parsing618 :attr list result: list that will hold the result of the parsing
626 as a list of ExtendedLeaf619 as a list of ExtendedLeaf
627 :attr list joins: list of join conditions, such as
628 (res_country_state."id" = res_partner."state_id")
629 :attr root_model: base model for the query620 :attr root_model: base model for the query
630 :attr list expression: the domain expression, that will be normalized621 :attr list expression: the domain expression, that will be normalized
631 and prepared622 and prepared
@@ -818,7 +809,6 @@
818 # ----------------------------------------809 # ----------------------------------------
819810
820 elif len(field_path) > 1 and field._type == 'many2one' and field._auto_join:811 elif len(field_path) > 1 and field._type == 'many2one' and field._auto_join:
821 # res_partner.state_id = res_partner__state_id.id
822 leaf.add_join_context(relational_model, field_path[0], 'id', field_path[0])812 leaf.add_join_context(relational_model, field_path[0], 'id', field_path[0])
823 push(create_substitution_leaf(leaf, (field_path[1], operator, right), relational_model))813 push(create_substitution_leaf(leaf, (field_path[1], operator, right), relational_model))
824814