Merge lp:~openerp-dev/openobject-addons/trunk-base_contact-stw into lp:openobject-addons

Proposed by Stephane Wirtel (OpenERP)
Status: Merged
Merged at revision: 6009
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-base_contact-stw
Merge into: lp:openobject-addons
Diff against target: 943 lines (+193/-441) (has conflicts)
12 files modified
base_contact/__init__.py (+0/-1)
base_contact/__openerp__.py (+0/-1)
base_contact/base_contact.py (+145/-183)
base_contact/base_contact_demo.xml (+2/-0)
base_contact/base_contact_installer.py (+0/-67)
base_contact/base_contact_installer_view.xml (+0/-59)
base_contact/base_contact_view.xml (+35/-99)
base_contact/process/base_contact_process.xml (+1/-26)
base_contact/security/ir.model.access.csv (+7/-0)
base_contact/test/base_contact00.yml (+0/-2)
event/__openerp__.py (+1/-1)
event/event.py (+2/-2)
Text conflict in base_contact/security/ir.model.access.csv
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-base_contact-stw
Reviewer Review Type Date Requested Status
Aline (OpenERP) Needs Fixing
Raphael Collet (OpenERP) (community) Needs Fixing
Christophe Simonis (OpenERP) Pending
Review via email: mp+83401@code.launchpad.net

Description of the change

this branch helps to fix some bugs with the base_contact module.

Regards,

To post a comment you must log in.
5789. By Stephane Wirtel (OpenERP)

[FIX] event: Remove the dependency to base_contact

5790. By Stephane Wirtel (OpenERP)

[FIX] base_contact: Add some missing features

Revision history for this message
Raphael Collet (OpenERP) (rco-openerp) wrote :

It breaks module stock.
I created a database, and installed base_contact, then sale. The following error occurs:

[2011-11-30 15:09:12,683][foo] INFO:init.load:module stock: loading test/stock_test.yml
[2011-11-30 15:09:15,241][foo] ERROR:db.cursor:bad query: insert into "stock_picking" (id,"address_id","name","auto_picking","move_type","company_id","invoice_state","state","date","type",create_uid,create_date) values (2,41,'test_picking','False','direct',1,'2binvoiced','draft','2011-11-30 15:09:15','out',1,now())
Traceback (most recent call last):
  File "/home/openerp/openerp/server/trunk/openerp/sql_db.py", line 215, in execute
    res = self._obj.execute(query, params)
IntegrityError: insert or update on table "stock_picking" violates foreign key constraint "stock_picking_address_id_fkey"
DETAIL: Key (address_id)=(41) is not present in table "res_partner_job".

review: Needs Fixing
Revision history for this message
Aline (OpenERP) (apr-tinyerp) wrote :

i tested and i confirm that it breaks some addons, i can't confirm SO
it is still in testing, i put other comments in related pad

review: Needs Fixing
5791. By Stephane Wirtel (OpenERP)

[FIX] base_contact: Review the algo

5792. By Stephane Wirtel (OpenERP)

[REVERT]

5793. By Stephane Wirtel (OpenERP)

[FIX] base_contact: Modify the migration script

5794. By Stephane Wirtel (OpenERP)

[REF] base_contact: Remove the old installer

5795. By Stephane Wirtel (OpenERP)

[IMP] base_contact: Add the migration script for the addresses
[FIX] base_contact: Add a name_get for the location and the address

5796. By Stephane Wirtel (OpenERP)

[FIX] base_contact: Assign a partner only if there is a location on the address for the creation
[IMP] base_contact: Add a view for the location

5797. By Stephane Wirtel (OpenERP)

[MERGE] Upstream

5798. By Stephane Wirtel (OpenERP)

[FIX] base_contact: Increment the last value of the sequence for the locationwq

5799. By Stephane Wirtel (OpenERP)

[IMP] base_contact: improve the form view if the use_existing_address field has been selected

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'base_contact/__init__.py'
--- base_contact/__init__.py 2011-01-14 00:11:01 +0000
+++ base_contact/__init__.py 2011-12-14 09:21:40 +0000
@@ -20,7 +20,6 @@
20##############################################################################20##############################################################################
2121
22import base_contact22import base_contact
23import base_contact_installer
2423
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2625
2726
=== modified file 'base_contact/__openerp__.py'
--- base_contact/__openerp__.py 2011-12-13 14:19:49 +0000
+++ base_contact/__openerp__.py 2011-12-14 09:21:40 +0000
@@ -47,7 +47,6 @@
47 'update_xml': [47 'update_xml': [
48 'security/ir.model.access.csv',48 'security/ir.model.access.csv',
49 'base_contact_view.xml',49 'base_contact_view.xml',
50 'base_contact_installer_view.xml',
51 'process/base_contact_process.xml'50 'process/base_contact_process.xml'
52 ],51 ],
53 'demo_xml': ['base_contact_demo.xml'],52 'demo_xml': ['base_contact_demo.xml'],
5453
=== modified file 'base_contact/base_contact.py'
--- base_contact/base_contact.py 2011-10-27 21:11:24 +0000
+++ base_contact/base_contact.py 2011-12-14 09:21:40 +0000
@@ -20,6 +20,7 @@
20##############################################################################20##############################################################################
2121
22from osv import fields, osv22from osv import fields, osv
23import addons
2324
24class res_partner_contact(osv.osv):25class res_partner_contact(osv.osv):
25 """ Partner Contact """26 """ Partner Contact """
@@ -27,27 +28,6 @@
27 _name = "res.partner.contact"28 _name = "res.partner.contact"
28 _description = "Contact"29 _description = "Contact"
2930
30 def _main_job(self, cr, uid, ids, fields, arg, context=None):
31 """
32 @param self: The object pointer
33 @param cr: the current row, from the database cursor,
34 @param uid: the current user’s ID for security checks,
35 @param ids: List of partner contact’s IDs
36 @fields: Get Fields
37 @param context: A standard dictionary for contextual values
38 @param arg: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...]. """
39 res = dict.fromkeys(ids, False)
40
41 res_partner_job_obj = self.pool.get('res.partner.job')
42 all_job_ids = res_partner_job_obj.search(cr, uid, [])
43 all_job_names = dict(zip(all_job_ids, res_partner_job_obj.name_get(cr, uid, all_job_ids, context=context)))
44
45 for contact in self.browse(cr, uid, ids, context=context):
46 if contact.job_ids:
47 res[contact.id] = all_job_names.get(contact.job_ids[0].id, False)
48
49 return res
50
51 _columns = {31 _columns = {
52 'name': fields.char('Last Name', size=64, required=True),32 'name': fields.char('Last Name', size=64, required=True),
53 'first_name': fields.char('First Name', size=64),33 'first_name': fields.char('First Name', size=64),
@@ -55,53 +35,32 @@
55 'title': fields.many2one('res.partner.title','Title'),35 'title': fields.many2one('res.partner.title','Title'),
56 'website': fields.char('Website', size=120),36 'website': fields.char('Website', size=120),
57 'lang_id': fields.many2one('res.lang', 'Language'),37 'lang_id': fields.many2one('res.lang', 'Language'),
58 'job_ids': fields.one2many('res.partner.job', 'contact_id', 'Functions and Addresses'),38 'job_ids': fields.one2many('res.partner.address', 'contact_id', 'Functions and Addresses'),
59 'country_id': fields.many2one('res.country','Nationality'),39 'country_id': fields.many2one('res.country','Nationality'),
60 'birthdate': fields.date('Birth Date'),40 'birthdate': fields.date('Birth Date'),
61 'active': fields.boolean('Active', help="If the active field is set to False,\41 'active': fields.boolean('Active', help="If the active field is set to False,\
62 it will allow you to hide the partner contact without removing it."),42 it will allow you to hide the partner contact without removing it."),
63 'partner_id': fields.related('job_ids', 'address_id', 'partner_id', type='many2one',\43 'partner_id': fields.related('job_ids', 'location_id', 'partner_id', type='many2one',\
64 relation='res.partner', string='Main Employer'),44 relation='res.partner', string='Main Employer'),
65 'function': fields.related('job_ids', 'function', type='char', \45 'function': fields.related('job_ids', 'function', type='char', \
66 string='Main Function'),46 string='Main Function'),
67 'job_id': fields.function(_main_job, type='many2one',\
68 relation='res.partner.job', string='Main Job'),
69 'email': fields.char('E-Mail', size=240),47 'email': fields.char('E-Mail', size=240),
70 'comment': fields.text('Notes', translate=True),48 'comment': fields.text('Notes', translate=True),
71 'photo': fields.binary('Image'),49 'photo': fields.binary('Photo'),
7250
73 }51 }
52
53 def _get_photo(self, cr, uid, context=None):
54 photo_path = addons.get_module_resource('base_contact', 'images', 'photo.png')
55 return open(photo_path, 'rb').read().encode('base64')
56
74 _defaults = {57 _defaults = {
58 'photo' : _get_photo,
75 'active' : lambda *a: True,59 'active' : lambda *a: True,
76 }60 }
7761
78 _order = "name,first_name"62 _order = "name,first_name"
7963
80 def name_get(self, cr, user, ids, context=None):
81
82 """ will return name and first_name.......
83 @param self: The object pointer
84 @param cr: the current row, from the database cursor,
85 @param user: the current user’s ID for security checks,
86 @param ids: List of create menu’s IDs
87 @return: name and first_name
88 @param context: A standard dictionary for contextual values
89 """
90
91 if not len(ids):
92 return []
93 res = []
94 for contact in self.browse(cr, user, ids, context=context):
95 _contact = ""
96 if contact.title:
97 _contact += "%s "%(contact.title.name)
98 _contact += contact.name or ""
99 if contact.name and contact.first_name:
100 _contact += " "
101 _contact += contact.first_name or ""
102 res.append((contact.id, _contact))
103 return res
104
105 def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=None):64 def name_search(self, cr, uid, name='', args=None, operator='ilike', context=None, limit=None):
106 if not args:65 if not args:
107 args = []66 args = []
@@ -112,151 +71,154 @@
112 else:71 else:
113 ids = self.search(cr, uid, args, limit=limit, context=context)72 ids = self.search(cr, uid, args, limit=limit, context=context)
114 return self.name_get(cr, uid, ids, context=context)73 return self.name_get(cr, uid, ids, context=context)
74
75 def name_get(self, cr, uid, ids, context=None):
76 return [
77 (obj.id, " ".join(filter(None, [obj.first_name, obj.name])),)
78 for obj in self.browse(cr, uid, ids, context=context)
79 ]
80
115 81
116res_partner_contact()82res_partner_contact()
11783
84class res_partner(osv.osv):
85 _inherit = 'res.partner'
86
87 _columns = {
88 'address': fields.one2many('res.partner.location', 'partner_id', 'Address')
89 }
90
91res_partner()
92
93class res_partner_location(osv.osv):
94 _name = 'res.partner.location'
95 _inherit = 'res.partner.address'
96 _columns = {
97 'job_ids': fields.one2many('res.partner.address', 'location2_id', 'Contacts'),
98 }
99
100 def _auto_init(self, cr, context=None):
101 def table_exists(view_name):
102 cr.execute('SELECT count(relname) FROM pg_class WHERE relname = %s', (view_name,))
103 value = cr.fetchone()[0]
104 return bool(value == 1)
105
106 exists = table_exists(self._table)
107 super(res_partner_location, self)._auto_init(cr, context)
108
109 if not exists:
110 sequence_name = self.pool.get('res.partner.address')._sequence
111 cr.execute("SELECT last_value FROM " + sequence_name)
112 last_sequence = cr.fetchone()[0]
113
114 cr.execute("INSERT INTO res_partner_location SELECT * FROM res_partner_address")
115 cr.execute("ALTER SEQUENCE " + self._sequence + " RESTART WITH " + str(last_sequence))
116
117
118res_partner_location()
118119
119class res_partner_address(osv.osv):120class res_partner_address(osv.osv):
120
121 #overriding of the name_get defined in base in order to remove the old contact name
122 def name_get(self, cr, user, ids, context=None):
123 """
124 @param self: The object pointer
125 @param cr: the current row, from the database cursor,
126 @param user: the current user,
127 @param ids: List of partner address’s IDs
128 @param context: A standard dictionary for contextual values
129 """
130
131 if not len(ids):
132 return []
133 res = []
134 if context is None:
135 context = {}
136 for r in self.read(cr, user, ids, ['zip', 'city', 'partner_id', 'street']):
137 if context.get('contact_display', 'contact')=='partner' and r['partner_id']:
138 res.append((r['id'], r['partner_id'][1]))
139 else:
140 addr = str('')
141 addr += "%s %s %s" % (r.get('street', '') or '', r.get('zip', '') \
142 or '', r.get('city', '') or '')
143 res.append((r['id'], addr.strip() or '/'))
144 return res
145
146 def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100):
147 if not args:
148 args=[]
149 ids = self.search(cr, user, [('name',operator,name)] + args, limit=limit, context=context)
150 jobs = self.pool.get('res.partner.job')
151 if name:
152 job_ids = jobs.search(cr, user, [('contact_id', operator, name)] + args, limit=limit, context=context)
153 for job in jobs.browse(cr, user, job_ids):
154 ids += [job.address_id.id]
155 return self.name_get(cr, user, ids, context)
156
157 _name = 'res.partner.address'121 _name = 'res.partner.address'
158 _inherit = 'res.partner.address'122 _inherits = { 'res.partner.location' : 'location_id' }
159 _description ='Partner Address'123
160124 def _get_use_existing_address(self, cr, uid, ids, fieldnames, args, context=None):
161 _columns = {125 result = dict.fromkeys(ids, 0)
162 'job_id': fields.related('job_ids','contact_id','job_id',type='many2one',\126 for obj in self.browse(cr, uid, ids, context=context):
163 relation='res.partner.job', string='Main Job'),127 result[obj.id] = 0
164 'job_ids': fields.one2many('res.partner.job', 'address_id', 'Contacts'),128 return result
165 }129
166res_partner_address()130 def _set_use_existing_address(self, cr, uid, ids, field, value, arg, context=None):
167131 if isinstance(ids, (int, long)):
168class res_partner_job(osv.osv):132 ids = [ids]
169 def name_get(self, cr, uid, ids, context=None):133
170 """134 return True
171 @param self: The object pointer135
172 @param cr: the current row, from the database cursor,136 _columns = {
173 @param user: the current user,137 'location_id' : fields.many2one('res.partner.location', 'Location'),
174 @param ids: List of partner address’s IDs138 'location2_id' : fields.many2one('res.partner.location', 'Location'),
175 @param context: A standard dictionary for contextual values139 'contact_id' : fields.many2one('res.partner.contact', 'Contact', required=True),
176 """140
177 if context is None:141 'partner_id' : fields.many2one('res.partner', 'Partner'),
178 context = {}142 'contact_firstname' : fields.related('contact_id', 'first_name', type='char', size=64, string='Firstname'),
179143 'contact_name' : fields.related('contact_id', 'name', type='char', size='64', string="Lastname"),
180 if not ids:
181 return []
182 res = []
183
184 jobs = self.browse(cr, uid, ids, context=context)
185
186 contact_ids = [rec.contact_id.id for rec in jobs]
187 contact_names = dict(self.pool.get('res.partner.contact').name_get(cr, uid, contact_ids, context=context))
188
189 for r in jobs:
190 function_name = r.function
191 funct = function_name and (", " + function_name) or ""
192 res.append((r.id, contact_names.get(r.contact_id.id, '') + funct))
193
194 return res
195
196 _name = 'res.partner.job'
197 _description ='Contact Partner Function'
198 _order = 'sequence_contact'
199
200 _columns = {
201 'name': fields.related('address_id', 'partner_id', type='many2one',\
202 relation='res.partner', string='Partner', help="You may\
203 enter Address first,Partner will be linked automatically if any."),
204 'address_id': fields.many2one('res.partner.address', 'Address', \
205 help='Address which is linked to the Partner'), # TO Correct: domain=[('partner_id', '=', name)]
206 'contact_id': fields.many2one('res.partner.contact','Contact', required=True, ondelete='cascade'),
207 'function': fields.char('Partner Function', size=64, help="Function of this contact with this partner"),144 'function': fields.char('Partner Function', size=64, help="Function of this contact with this partner"),
208 'sequence_contact': fields.integer('Contact Seq.',help='Order of\
209 importance of this address in the list of addresses of the linked contact'),
210 'sequence_partner': fields.integer('Partner Seq.',help='Order of importance\
211 of this job title in the list of job title of the linked partner'),
212 'email': fields.char('E-Mail', size=240, help="Job E-Mail"),
213 'phone': fields.char('Phone', size=64, help="Job Phone no."),
214 'fax': fields.char('Fax', size=64, help="Job FAX no."),
215 'extension': fields.char('Extension', size=64, help='Internal/External extension phone number'),
216 'other': fields.char('Other', size=64, help='Additional phone field'),
217 'date_start': fields.date('Date Start',help="Start date of job(Joining Date)"),145 'date_start': fields.date('Date Start',help="Start date of job(Joining Date)"),
218 'date_stop': fields.date('Date Stop', help="Last date of job"),146 'date_stop': fields.date('Date Stop', help="Last date of job"),
219 'state': fields.selection([('past', 'Past'),('current', 'Current')], \147 'state': fields.selection([('past', 'Past'),('current', 'Current')], \
220 'State', required=True, help="Status of Address"),148 'State', required=True, help="Status of Address"),
149 'use_existing_address' : fields.function(_get_use_existing_address, type="boolean",
150 fnct_inv=_set_use_existing_address,
151 string='Use Existing Address'),
221 }152 }
222153
154 def name_get(self, cr, uid, ids, context=None):
155 result = []
156
157 append_call = result.append
158 for obj in self.browse(cr, uid, ids, context=context):
159 append_call((obj.id, "%s, %s" % (obj.contact_id.name_get()[0][1], obj.location_id.name_get()[0][1],)))
160 return result
161
162
163 _description ='Contact Partner Function'
164
223 _defaults = {165 _defaults = {
224 'sequence_contact' : lambda *a: 0,166 'state': 'current',
225 'state': lambda *a: 'current',
226 }167 }
227 168
228 def onchange_name(self, cr, uid, ids, address_id='', name='', context=None): 169 def create(self, cr, uid, values, context=None):
229 return {'value': {'address_id': address_id}, 'domain':{'partner_id':'name'}} 170 record_id = super(res_partner_address, self).create(cr, uid, values, context=context)
230 171 record = self.browse(cr, uid, record_id, context=context)
231 def onchange_partner(self, cr, uid, _, partner_id, context=None):172 if not record.partner_id:
232 """173 record.write({'partner_id' : record.location2_id.partner_id.id}, context=context)
233 @param self: The object pointer174 return record_id
234 @param cr: the current row, from the database cursor,175
235 @param uid: the current user,176 def _auto_init(self, cr, context=None):
236 @param _: List of IDs,177 def column_exists(column):
237 @partner_id : ID of the Partner selected,178 cr.execute("select count(attname) from pg_attribute where attrelid = \
238 @param context: A standard dictionary for contextual values179 (select oid from pg_class where relname = %s) \
239 """180 and attname = %s", (self._table, column,))
240 return {'value': {'address_id': False}}181 value = cr.fetchone()[0]
241182 return bool(value == 1)
242 def onchange_address(self, cr, uid, _, address_id, context=None):183
243 """184 exists = column_exists('location_id')
244 @@param self: The object pointer185 super(res_partner_address, self)._auto_init(cr, context)
245 @param cr: the current row, from the database cursor,186
246 @param uid: the current user,187 if not exists:
247 @param _: List of IDs,188 cr.execute("UPDATE res_partner_address SET location_id = id, location2_id = id")
248 @address_id : ID of the Address selected,189
249 @param context: A standard dictionary for contextual values190 contact_proxy = self.pool.get('res.partner.contact')
250 """191 uid = 1
251 partner_id = False192
252 if address_id:193 cr.execute("SELECT id, name, mobile, country_id, partner_id, phone, email, street, street2, city, company_id, state_id, zip, location_id \
253 address = self.pool.get('res.partner.address')\194 FROM res_partner_address \
254 .browse(cr, uid, address_id, context=context)195 WHERE contact_id IS NULL AND name IS NOT NULL AND location_id IS NOT NULL")
255 partner_id = address.partner_id.id196 for item in cr.fetchall():
256 return {'value': {'name': partner_id}}197
257 198 values = {
258res_partner_job()199 'name' : item[1],
259200 'mobile' : item[2],
201 'country_id' : item[3],
202 'phone' : item[5],
203 'email' : item[6],
204 'company_id' : item[10],
205 }
206
207 contact_id = contact_proxy.create(cr, uid, values, context=context)
208 values = {
209 'street' : item[7],
210 'street2' : item[8],
211 'city' : item[9],
212 'country_id' : item[3],
213 'company_id' : item[10],
214 'state_id' : item[11],
215 'zip' : item[12],
216 }
217 location_id = self.pool.get('res.partner.location').create(cr, uid, values, context=context)
218
219 cr.execute("UPDATE res_partner_address SET location_id = %s, contact_id = %s, partner_id = %s WHERE id = %s",
220 (location_id, contact_id, item[4], item[0],))
221
222res_partner_address()
260223
261# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:224# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
262
263225
=== modified file 'base_contact/base_contact_demo.xml'
--- base_contact/base_contact_demo.xml 2011-11-28 16:04:32 +0000
+++ base_contact/base_contact_demo.xml 2011-12-14 09:21:40 +0000
@@ -180,6 +180,7 @@
180 </record>180 </record>
181181
182 <!-- Create the jobs -->182 <!-- Create the jobs -->
183 <!--
183 <record id="res_partner_job_0" model="res.partner.job">184 <record id="res_partner_job_0" model="res.partner.job">
184 <field name="address_id" ref="base.res_partner_address_1"/>185 <field name="address_id" ref="base.res_partner_address_1"/>
185 <field name="function">Salesman</field>186 <field name="function">Salesman</field>
@@ -334,5 +335,6 @@
334 <field name="function">CEO</field>335 <field name="function">CEO</field>
335 <field name="sequence_contact">1</field>336 <field name="sequence_contact">1</field>
336 </record>337 </record>
338 -->
337 </data>339 </data>
338</openerp>340</openerp>
339341
=== removed file 'base_contact/base_contact_installer.py'
--- base_contact/base_contact_installer.py 2011-01-17 09:36:23 +0000
+++ base_contact/base_contact_installer.py 1970-01-01 00:00:00 +0000
@@ -1,67 +0,0 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from osv import fields, osv
23
24class base_contact_installer(osv.osv_memory):
25 _name = 'base.contact.installer'
26 _inherit = 'res.config.installer'
27
28 _columns = {
29 'name': fields.char('Name', size=64),
30 'migrate': fields.boolean('Migrate', help="If you select this, all addresses will be migrated."),
31 }
32
33 def execute(self, cr, uid, ids, context=None):
34 """
35 This function is used to create contact and address from existing partner address
36 """
37 obj = self.pool.get("base.contact.installer").browse(cr, uid, uid, context=context)
38 if obj.migrate:
39 # Enable PL/pgSQL if not enabled yet in the database
40 cr.execute("SELECT 1 FROM pg_language WHERE lanname = 'plpgsql'")
41 if not cr.fetchone():
42 cr.execute("CREATE LANGUAGE plpgsql;")
43
44 cr.execute("""DROP TRIGGER IF EXISTS contactjob on res_partner_contact;
45 CREATE OR REPLACE FUNCTION add_to_job() RETURNS TRIGGER AS $contactjob$
46 DECLARE
47 new_name varchar;
48 new_phonenum varchar;
49 BEGIN
50 IF(TG_OP='INSERT') THEN
51 INSERT INTO res_partner_job(contact_id, address_id, function, state) VALUES(NEW.id, NEW.website::integer,NEW.first_name, 'current');
52 UPDATE res_partner_contact set first_name=Null, website=Null, active=True where id=NEW.id;
53 END IF;
54 RETURN NEW;
55 END;
56 $contactjob$ LANGUAGE plpgsql;
57 CREATE TRIGGER contactjob AFTER INSERT ON res_partner_contact FOR EACH ROW EXECUTE PROCEDURE add_to_job();""")
58
59 cr.execute("INSERT into res_partner_contact (name, title, email, first_name, website) (SELECT coalesce(name, 'Noname'), title, email, function , to_char(id, '99999999') from res_partner_address)")
60
61 cr.execute("DROP TRIGGER IF EXISTS contactjob on res_partner_contact")
62
63 cr.execute("DROP FUNCTION IF EXISTS add_to_job()")
64
65base_contact_installer()
66
67# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
680
=== removed file 'base_contact/base_contact_installer_view.xml'
--- base_contact/base_contact_installer_view.xml 2011-08-04 12:09:57 +0000
+++ base_contact/base_contact_installer_view.xml 1970-01-01 00:00:00 +0000
@@ -1,59 +0,0 @@
1<openerp>
2 <data>
3 <record id="view_base_contact_installer" model="ir.ui.view">
4 <field name="name">base.contact.installer.view</field>
5 <field name="model">base.contact.installer</field>
6 <field name="type">form</field>
7 <field name="inherit_id" ref="base.res_config_installer"/>
8 <field name="arch" type="xml">
9 <data>
10 <form position="attributes">
11 <attribute name="string">Address's Migration to Contacts</attribute>
12 </form>
13
14 <separator string="title" position="attributes">
15 <attribute name="string">Select the Option for Addresses Migration</attribute>
16 </separator>
17 <xpath expr="//label[@string='description']" position="attributes">
18 <attribute name="string">You can migrate Partner's current addresses to the contact.</attribute>
19 </xpath>
20 <xpath expr="//separator[@string=&quot;vsep&quot;]" position="attributes">
21 <attribute name="rowspan">13</attribute>
22 <attribute name="string"/>
23 </xpath>
24 <xpath expr="//button[@string='Install Modules']" position="attributes">
25 <attribute name="string">Configure</attribute>
26 </xpath>
27 <group colspan="8">
28 <group colspan="2" col="2">
29 <label string="Due to changes in Address and Partner's relation, some of the details from address are needed to be migrated into contact information." colspan="4"/>
30 <label string="Otherwise these details will not be visible from address/contact." colspan="4"/>
31 <label string="Do you want to migrate your Address data in Contact Data?" colspan="4"/>
32 <group colspan="6">
33 <field name="migrate" string="Migrate" colspan="1"/>
34 </group>
35 </group>
36 </group>
37 </data>
38 </field>
39 </record>
40
41 <record id="action_base_contact_installer" model="ir.actions.act_window">
42 <field name="name">Address Migration</field>
43 <field name="type">ir.actions.act_window</field>
44 <field name="res_model">base.contact.installer</field>
45 <field name="view_id" ref="view_base_contact_installer"/>
46 <field name="view_type">form</field>
47 <field name="view_mode">form</field>
48 <field name="target">new</field>
49 </record>
50
51 <record id="base_contact_installer_todo" model="ir.actions.todo">
52 <field name="action_id" ref="action_base_contact_installer"/>
53 <field name="category_id" ref="base.category_administration_config"/>
54 <field name="sequence">3</field>
55 <field name="type">automatic</field>
56 </record>
57
58 </data>
59</openerp>
600
=== modified file 'base_contact/base_contact_view.xml'
--- base_contact/base_contact_view.xml 2011-10-27 21:11:24 +0000
+++ base_contact/base_contact_view.xml 2011-12-14 09:21:40 +0000
@@ -51,10 +51,8 @@
51 <field name="job_ids" colspan="4" nolabel="1" mode="tree,form">51 <field name="job_ids" colspan="4" nolabel="1" mode="tree,form">
52 <form string="Functions and Addresses">52 <form string="Functions and Addresses">
53 <group colspan="4" col="4">53 <group colspan="4" col="4">
54 <field name="sequence_contact" />
55 <field name="function"/>54 <field name="function"/>
56 <field name="name" on_change="onchange_name(name,address_id)"/> 55 <field name="name" />
57 <field name="address_id"/>
58 <field name="date_start" />56 <field name="date_start" />
59 <field name="date_stop" />57 <field name="date_stop" />
60 <field name="state" />58 <field name="state" />
@@ -65,19 +63,13 @@
65 <field name="phone"/>63 <field name="phone"/>
66 <field name="fax"/>64 <field name="fax"/>
67 <field name="email" widget="email"/>65 <field name="email" widget="email"/>
68 <field name="extension"/>
69 <field name="other"/>
70 </group>66 </group>
71 </form>67 </form>
72 <tree string="Functions and Addresses">68 <tree string="Functions and Addresses">
73 <field name="sequence_contact" string="Seq."/>
74 <field name="function"/>69 <field name="function"/>
75 <field name="name" on_change="onchange_partner(name)"/> 70 <field name="name" on_change="onchange_partner(name)"/>
76 <field name="address_id" attrs="{'required': [('name', '!=', False)]}" on_change="onchange_address(address_id)"/>
77 <field name="phone"/>71 <field name="phone"/>
78 <field name="fax"/>72 <field name="fax"/>
79 <field name="extension"/>
80 <field name="other"/>
81 <field name="email"/>73 <field name="email"/>
82 <field name="state" />74 <field name="state" />
83 </tree>75 </tree>
@@ -173,29 +165,23 @@
173 </group>165 </group>
174 <field name="job_ids" mode="tree,form" nolabel="1" colspan="4">166 <field name="job_ids" mode="tree,form" nolabel="1" colspan="4">
175 <tree string="Contacts" editable="top">167 <tree string="Contacts" editable="top">
176 <field name="sequence_partner"/>
177 <field name="contact_id"/>168 <field name="contact_id"/>
178 <field name="function"/>169 <field name="function"/>
179 <field name="phone"/>170 <field name="phone"/>
180 <field name="fax"/>171 <field name="fax"/>
181 <field name="extension"/>
182 <field name="other"/>
183 <field name="email"/>172 <field name="email"/>
184 </tree>173 </tree>
185 <form string="Contacts">174 <form string="Contacts">
186 <group colspan="4" col="4">175 <group colspan="4" col="4">
187 <field name="sequence_partner"/>176 <field name="contact_id"/>
188 <field name="contact_id"/>177 <field name="function"/>
189 <field name="function"/>178 </group>
190 </group>179 <separator string="Communication" colspan="4"/>
191 <separator string="Communication" colspan="4"/>180 <group colspan="4" col="4">
192 <group colspan="4" col="4">181 <field name="phone"/>
193 <field name="phone"/>182 <field name="fax"/>
194 <field name="fax"/>183 <field name="email" widget="email"/>
195 <field name="extension"/>184 </group>
196 <field name="other"/>
197 <field name="email" widget="email"/>
198 </group>
199 </form>185 </form>
200 </field>186 </field>
201 </form>187 </form>
@@ -256,83 +242,29 @@
256242
257 <!-- Views for Addresses -->243 <!-- Views for Addresses -->
258244
259 <record model="ir.ui.view" id="view_partner_address_tree_inherited1">
260 <field name="name">Partner addresses inherited</field>
261 <field name="model">res.partner.address</field>
262 <field name="inherit_id" ref="base.view_partner_address_tree"/>
263 <field name="type">tree</field>
264 <field name="arch" type="xml">
265 <field name="name" position="replace">
266 <field name='job_ids' string='# of Contacts'/>
267 </field>
268 </field>
269 </record>
270
271 <record model="ir.ui.view" id="view_partner_address_form_inherited0">245 <record model="ir.ui.view" id="view_partner_address_form_inherited0">
272 <field name='name'>res.partner.address.form.inherited0</field>246 <field name='name'>res.partner.address.form.inherited0</field>
273 <field name='model'>res.partner.address</field>247 <field name='model'>res.partner.address</field>
274 <field name="inherit_id" ref="base.view_partner_address_form1"/>248 <field name="inherit_id" ref="base.view_partner_address_form1"/>
275 <field name='type'>form</field>249 <field name='type'>form</field>
276 <field name='arch' type='xml'>250 <field name='arch' type='xml'>
277 <field name="type" position="replace">251 <field name="type" position="replace" />
278 </field>252 <field name="title" position="replace" />
279 </field>253 <field name="function" position="replace" />
280 </record>254 <field name="name" position="replace" />
281255 <field name="active" position="after">
282 <record model="ir.ui.view" id="view_partner_address_form_inherited1">256 <separator string="Contact" colspan="6" />
283 <field name='name'>res.partner.address.form.inherited1</field>257 <group colspan="6" col="2">
284 <field name='model'>res.partner.address</field>258 <field name="title" />
285 <field name="inherit_id" ref="base.view_partner_address_form1"/>259 <field name="contact_id" />
286 <field name='type'>form</field>260 <field name="contact_firstname" />
287 <field name='arch' type='xml'>261 <field name="contact_name" />
288 <field name="name" position="replace">262 </group>
289 </field>263 </field>
290 </field>
291 </record>
292
293 <record id='view_partner_address_form_inherited2' model='ir.ui.view'>
294 <field name='name'>res.partner.address.form.inherited2</field>
295 <field name='model'>res.partner.address</field>
296 <field name="inherit_id" ref="base.view_partner_address_form1"/>
297 <field name='type'>form</field>
298 <field name='arch' type='xml'>
299 <field name="title" position="replace">
300 </field>
301 </field>
302 </record>
303
304 <record id='view_partner_address_form_inherited3' model='ir.ui.view'>
305 <field name='name'>res.partner.address.form.inherited3</field>
306 <field name='model'>res.partner.address</field>
307 <field name="inherit_id" ref="base.view_partner_address_form1"/>
308 <field name='type'>form</field>
309 <field name='arch' type='xml'>
310 <field name="function" position="replace">
311 </field>
312 </field>
313 </record>
314
315 <record id='view_partner_address_form_inherited4' model='ir.ui.view'>
316 <field name='name'>res.partner.address.form.inherited4</field>
317 <field name='model'>res.partner.address</field>
318 <field name="inherit_id" ref="base.view_partner_address_form1"/>
319 <field name='type'>form</field>
320 <field name='arch' type='xml'>
321 <field name='mobile' position="replace">
322 </field>
323 </field>
324 </record>
325
326 <record model="ir.ui.view" id="view_partner_address_form_inherited6">
327 <field name='name'>res.partner.address.form.inherited6</field>
328 <field name='model'>res.partner.address</field>
329 <field name="inherit_id" ref="base.view_partner_address_form1"/>
330 <field name='type'>form</field>
331 <field name='arch' type='xml'>
332 <field name="partner_id" position="replace">264 <field name="partner_id" position="replace">
333 <field name='partner_id' select='1'/>265 <field name='partner_id' select='1'/>
334 <field name='type' select='2'/>266 <field name='type' select='2' invisible="1"/>
335 <field name='job_id' invisible="1"/>267 <field name="function" />
336 </field>268 </field>
337 </field>269 </field>
338 </record>270 </record>
@@ -344,13 +276,14 @@
344 <field name="inherit_id" ref="base.view_res_partner_address_filter"/>276 <field name="inherit_id" ref="base.view_res_partner_address_filter"/>
345 <field name="arch" type="xml">277 <field name="arch" type="xml">
346 <search string="Search Contact">278 <search string="Search Contact">
347 <field name="job_ids"/>279 <field name="job_ids"/>
348 </search>280 </search>
349 </field>281 </field>
350 </record>282 </record>
351283
352 <!-- Views for partner job Tree view -->284 <!-- Views for partner job Tree view -->
353285
286 <!--
354 <record model="ir.ui.view" id="view_partner_job_tree">287 <record model="ir.ui.view" id="view_partner_job_tree">
355 <field name="name">res.partner.job.tree</field>288 <field name="name">res.partner.job.tree</field>
356 <field name="model">res.partner.job</field>289 <field name="model">res.partner.job</field>
@@ -364,14 +297,15 @@
364 <field name="email"/>297 <field name="email"/>
365 <field name="phone"/>298 <field name="phone"/>
366 <field name="fax"/>299 <field name="fax"/>
367 <field name="extension"/>
368 <field name="state" />300 <field name="state" />
369 </tree>301 </tree>
370 </field>302 </field>
371 </record>303 </record>
304 -->
372305
373<!-- Views for partner job Form view -->306<!-- Views for partner job Form view -->
374307
308 <!--
375 <record model="ir.ui.view" id="view_partner_job_form">309 <record model="ir.ui.view" id="view_partner_job_form">
376 <field name="name">res.partner.job.form</field>310 <field name="name">res.partner.job.form</field>
377 <field name="model">res.partner.job</field>311 <field name="model">res.partner.job</field>
@@ -385,18 +319,17 @@
385 <field name="email" widget="email"/>319 <field name="email" widget="email"/>
386 <field name="phone"/>320 <field name="phone"/>
387 <field name="fax"/>321 <field name="fax"/>
388 <field name="extension"/>
389 <field name="sequence_contact" groups="base.group_user"/>
390 <field name="sequence_partner" groups="base.group_user"/>
391 <field name="date_start" groups="base.group_user"/>322 <field name="date_start" groups="base.group_user"/>
392 <field name="date_stop" groups="base.group_user"/>323 <field name="date_stop" groups="base.group_user"/>
393 <field name="state" />324 <field name="state" />
394 </form>325 </form>
395 </field>326 </field>
396 </record>327 </record>
328 -->
397329
398 <!-- Menuitem for res.partner.job -->330 <!-- Menuitem for res.partner.job -->
399331
332 <!--
400 <record model="ir.actions.act_window" id="action_res_partner_job">333 <record model="ir.actions.act_window" id="action_res_partner_job">
401 <field name="name">Contact's Jobs</field>334 <field name="name">Contact's Jobs</field>
402 <field name="type">ir.actions.act_window</field>335 <field name="type">ir.actions.act_window</field>
@@ -409,9 +342,11 @@
409 res_model="res.partner.job"342 res_model="res.partner.job"
410 src_model="res.partner"343 src_model="res.partner"
411 />344 />
345 -->
412346
413 <!-- Act window defining a shorcut on partner address to open all his jobs -->347 <!-- Act window defining a shorcut on partner address to open all his jobs -->
414348
349 <!--
415 <act_window350 <act_window
416 id="act_res_partner_jobs" 351 id="act_res_partner_jobs"
417 name="Open Jobs"352 name="Open Jobs"
@@ -419,6 +354,7 @@
419 res_model="res.partner.job"354 res_model="res.partner.job"
420 src_model="res.partner.address"355 src_model="res.partner.address"
421 />356 />
357 -->
422358
423</data>359</data>
424</openerp>360</openerp>
425361
=== added file 'base_contact/images/photo.png'
426Binary files base_contact/images/photo.png 1970-01-01 00:00:00 +0000 and base_contact/images/photo.png 2011-12-14 09:21:40 +0000 differ362Binary files base_contact/images/photo.png 1970-01-01 00:00:00 +0000 and base_contact/images/photo.png 2011-12-14 09:21:40 +0000 differ
=== modified file 'base_contact/process/base_contact_process.xml'
--- base_contact/process/base_contact_process.xml 2011-01-14 00:11:01 +0000
+++ base_contact/process/base_contact_process.xml 2011-12-14 09:21:40 +0000
@@ -36,15 +36,6 @@
36 <field eval="1" name="flow_start"/>36 <field eval="1" name="flow_start"/>
37 </record>37 </record>
3838
39 <record id="process_node_function0" model="process.node">
40 <field name="model_id" ref="base_contact.model_res_partner_job"/>
41 <field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
42 <field eval="&quot;&quot;&quot;Jobs at a same partner address.&quot;&quot;&quot;" name="note"/>
43 <field eval="&quot;&quot;&quot;Function&quot;&quot;&quot;" name="name"/>
44 <field name="process_id" ref="process_process_basecontactprocess0"/>
45 <field eval="0" name="flow_start"/>
46 </record>
47
48 <record id="process_node_addresses0" model="process.node">39 <record id="process_node_addresses0" model="process.node">
49 <field name="menu_id" ref="base.menu_partner_address_form"/>40 <field name="menu_id" ref="base.menu_partner_address_form"/>
50 <field name="model_id" ref="base.model_res_partner_address"/>41 <field name="model_id" ref="base.model_res_partner_address"/>
@@ -59,22 +50,6 @@
59 Process Transition50 Process Transition
60 -->51 -->
6152
62 <record id="process_transition_contacttofunction0" model="process.transition">
63 <field eval="[(6,0,[])]" name="transition_ids"/>
64 <field eval="&quot;&quot;&quot;Contact to function&quot;&quot;&quot;" name="name"/>
65 <field eval="&quot;&quot;&quot;Defines contacts and functions.&quot;&quot;&quot;" name="note"/>
66 <field model="process.node" name="target_node_id" ref="process_node_function0"/>
67 <field model="process.node" name="source_node_id" ref="process_node_contacts0"/>
68 </record>
69
70 <record id="process_transition_functiontoaddress0" model="process.transition">
71 <field eval="[(6,0,[])]" name="transition_ids"/>
72 <field eval="&quot;&quot;&quot;Function to address&quot;&quot;&quot;" name="name"/>
73 <field eval="&quot;&quot;&quot;Define functions and address.&quot;&quot;&quot;" name="note"/>
74 <field model="process.node" name="target_node_id" ref="process_node_addresses0"/>
75 <field model="process.node" name="source_node_id" ref="process_node_function0"/>
76 </record>
77
78 <record id="process_transition_partnertoaddress0" model="process.transition">53 <record id="process_transition_partnertoaddress0" model="process.transition">
79 <field eval="[(6,0,[])]" name="transition_ids"/>54 <field eval="[(6,0,[])]" name="transition_ids"/>
80 <field eval="&quot;&quot;&quot;Partner to address&quot;&quot;&quot;" name="name"/>55 <field eval="&quot;&quot;&quot;Partner to address&quot;&quot;&quot;" name="name"/>
@@ -84,4 +59,4 @@
84 </record>59 </record>
8560
86 </data>61 </data>
87</openerp>
88\ No newline at end of file62\ No newline at end of file
63</openerp>
8964
=== modified file 'base_contact/security/ir.model.access.csv'
--- base_contact/security/ir.model.access.csv 2011-12-12 18:11:13 +0000
+++ base_contact/security/ir.model.access.csv 2011-12-14 09:21:40 +0000
@@ -1,3 +1,4 @@
1<<<<<<< TREE
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink2id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2access_res_partner_contact,res.partner.contact,model_res_partner_contact,base.group_partner_manager,1,1,1,13access_res_partner_contact,res.partner.contact,model_res_partner_contact,base.group_partner_manager,1,1,1,1
3access_res_partner_job,res.partner.job,model_res_partner_job,base.group_partner_manager,1,1,1,14access_res_partner_job,res.partner.job,model_res_partner_job,base.group_partner_manager,1,1,1,1
@@ -5,3 +6,9 @@
5access_res_partner_job_all,res.partner.job all,model_res_partner_job,base.group_user,1,0,0,06access_res_partner_job_all,res.partner.job all,model_res_partner_job,base.group_user,1,0,0,0
6access_group_sale_salesman,res.partner.contact.sale.salesman,model_res_partner_contact,base.group_sale_salesman,1,1,1,07access_group_sale_salesman,res.partner.contact.sale.salesman,model_res_partner_contact,base.group_sale_salesman,1,1,1,0
7access_res_partner_job_salesman,res.partner.job.salesman,model_res_partner_job,base.group_sale_salesman,1,1,1,08access_res_partner_job_salesman,res.partner.job.salesman,model_res_partner_job,base.group_sale_salesman,1,1,1,0
9=======
10"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
11"access_res_partner_contact","res.partner.contact","model_res_partner_contact","base.group_partner_manager",1,1,1,1
12"access_res_partner_contact_all","res.partner.contact all","model_res_partner_contact","base.group_user",1,0,0,0
13"access_group_sale_salesman","res.partner.contact.sale.salesman","model_res_partner_contact","base.group_sale_salesman",1,1,1,0
14>>>>>>> MERGE-SOURCE
815
=== modified file 'base_contact/test/base_contact00.yml'
--- base_contact/test/base_contact00.yml 2011-11-28 16:04:32 +0000
+++ base_contact/test/base_contact00.yml 2011-12-14 09:21:40 +0000
@@ -25,7 +25,6 @@
25 - email: lwilliams@mydomain.com25 - email: lwilliams@mydomain.com
26 function: PA26 function: PA
27 phone: (+32).10.45.18.7727 phone: (+32).10.45.18.77
28 sequence_contact: 1
29 state: current28 state: current
30 lang_id: res_lang_french029 lang_id: res_lang_french0
31 mobile: (+32).10.45.18.7730 mobile: (+32).10.45.18.77
@@ -45,7 +44,6 @@
45 - address_id: res_partner_address_144 - address_id: res_partner_address_1
46 function: CEO45 function: CEO
47 contact_id: res_partner_contact_williams046 contact_id: res_partner_contact_williams0
48 sequence_partner: 2
49 state: current47 state: current
50 lang: fr_BE48 lang: fr_BE
51 name: Laura's Company49 name: Laura's Company
5250
=== modified file 'event/__openerp__.py'
--- event/__openerp__.py 2011-12-13 14:19:49 +0000
+++ event/__openerp__.py 2011-12-14 09:21:40 +0000
@@ -39,7 +39,7 @@
39 Association / Configuration / Types of Events39 Association / Configuration / Types of Events
40""",40""",
41 'author': 'OpenERP SA',41 'author': 'OpenERP SA',
42 'depends': ['crm', 'base_contact', 'account', 'marketing', 'mail'],42 'depends': ['crm', 'account', 'marketing', 'mail'],
43 'init_xml': [],43 'init_xml': [],
44 'update_xml': [44 'update_xml': [
45 'security/ir.model.access.csv',45 'security/ir.model.access.csv',
4646
=== modified file 'event/event.py'
--- event/event.py 2011-11-14 22:08:36 +0000
+++ event/event.py 2011-12-14 09:21:40 +0000
@@ -303,7 +303,7 @@
303 'event_id': fields.many2one('event.event', 'Event', required=True, readonly=True, states={'draft': [('readonly', False)]}),303 'event_id': fields.many2one('event.event', 'Event', required=True, readonly=True, states={'draft': [('readonly', False)]}),
304 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),304 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
305 "partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),305 "partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),
306 "contact_id": fields.many2one('res.partner.contact', 'Partner Contact', readonly=False, states={'done': [('readonly', True)]}), #TODO: filter only the contacts that have a function into the selected partner_id306 "contact_id": fields.many2one('res.partner.address', 'Partner Contact', readonly=False, states={'done': [('readonly', True)]}), #TODO: filter only the contacts that have a function into the selected partner_id
307 "unit_price": fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),307 "unit_price": fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),
308 'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute=dp.get_precision('Sale Price'), store=True),308 'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute=dp.get_precision('Sale Price'), store=True),
309 "badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),309 "badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),
@@ -382,7 +382,7 @@
382 inv_lines_pool = self.pool.get('account.invoice.line')382 inv_lines_pool = self.pool.get('account.invoice.line')
383 inv_pool = self.pool.get('account.invoice')383 inv_pool = self.pool.get('account.invoice')
384 product_pool = self.pool.get('product.product')384 product_pool = self.pool.get('product.product')
385 contact_pool = self.pool.get('res.partner.contact')385 contact_pool = self.pool.get('res.partner.address')
386 if context is None:386 if context is None:
387 context = {}387 context = {}
388 # If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the388 # If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the

Subscribers

People subscribed via source and target branches

to all changes: