The (almost same) bug is reproducible in trunk.

The problem as described in the bug report is the following:

Base are CRM installed. CRM (specifically crm.lead) makes a copy of Base
(specifically res.partner.address) _columns. Then a new module NEW is
installed, which modifies Base (adding a new column in
res.partner.address).

That new column is not present in database for the CRM (which is
correct, because it used an unmodified Base). The problem is that the
new column appears in CRM _columns. This happens because loading
installed modules and installing modules is done in a single pass. And
in this case CRM is loaded after the newly installed NEW module. Net
effect: CRM _columns have one more column than its database column.

In trunk:

In trunk, the problem is partially solved: installed modules are loaded
prior to any module to be installed. So CRM is loaded before NEW, and
its _columns and database column are in sync. But there is still a
problem: when restarting the server, the modules are loaded. If NEW is
loaded before CRM (i.e. opposite order of the installation time), CRM
will see a new column in Base. So its _columns have again a spurious
column w.r.t. the database.

Workaround:

The proposed workaround before we fix this, is to add an excplicit order
between modules: i.e. NEW should depends on the CRM to make sure the CRM
is loaded before (and thus unaffected by) NEW.

Possible solution:

We have to discuss this more in detail at the R&D but we think to store
the installation order of the installed modules so that we can later
load them in the same order. Each module will see its parent modules
exactly as they were at installation time (and thus keep their _columns
in sync with the database).

** Changed in: openobject-server
       Status: Fix Released => Triaged

-- 
You received this bug notification because you are a member of OpenERP
CTP, which is subscribed to OpenERP Server.
https://bugs.launchpad.net/bugs/799378

Title:
  Error reading fields of an object inherited by prototyping

Status in OpenERP Server:
  Triaged

Bug description:
  openobject-server/6.0 revno 3445

  Steps:

  1 - Install 'crm' module
  2 - Make a module that adds a field to 'res.partner.address' (for instance, 
you can use 'base_partner_surname' http://apps.openerp.com/addon/1526 or 
'l10n_it_base' http://apps.openerp.com/addon/4528) and install it
  3 - Try to create a new lead

  you get:

  [2011-06-19 14:16:01,056][test] ERROR:db.cursor:Programming error: column 
crm_lead.last_name does not exist
  LINE 1: SELECT crm_lead.date_closed,crm_lead.last_name,date_trunc('s...
                                      ^
  , in query SELECT 
crm_lead.date_closed,crm_lead.last_name,date_trunc('second', 
crm_lead.create_date) as 
create_date,crm_lead.probability,crm_lead.type_id,crm_lead.partner_address_id,crm_lead.date_action_last,crm_lead.day_close,crm_lead.street,crm_lead.day_open,crm_lead.contact_name,crm_lead.partner_id,crm_lead.date_action_next,crm_lead.city,crm_lead.first_name,crm_lead.user_id,crm_lead.zip,crm_lead.title,crm_lead.partner_name,crm_lead.planned_revenue,crm_lead.country_id,crm_lead.company_id,crm_lead.id,crm_lead.priority,crm_lead.state,crm_lead.email_cc,crm_lead.type,crm_lead.email,crm_lead.function,crm_lead.fax,crm_lead.optin,crm_lead.description,crm_lead.street2,crm_lead.ref2,crm_lead.section_id,crm_lead.title_action,crm_lead.phone,date_trunc('second',
 crm_lead.write_date) as 
write_date,crm_lead.active,crm_lead.date_action,crm_lead.categ_id,crm_lead.name,crm_lead.stage_id,crm_lead.date_open,crm_lead.date_deadline,crm_lead.optout,crm_lead.mobile,crm_lead.ref,crm_lead.birthdate,crm_lead.channel_id,crm_lead.state_id,crm_lead.email_from,crm_lead.referred,crm_lead.id
 FROM "crm_lead" WHERE crm_lead.id IN %s ORDER BY priority,date_action,id desc
  [2011-06-19 14:16:01,057][test] ERROR:web-services:Uncaught exception
  Traceback (most recent call last):
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 
122, in wrapper
      return f(self, dbname, *args, **kwargs)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 
176, in execute
      res = self.execute_cr(cr, uid, obj, method, *args, **kw)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/osv.py", line 
167, in execute_cr
      return getattr(object, method)(cr, uid, *args, **kw)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
3694, in create
      self.pool.get(object)._store_set_values(cr, user, ids, fields2, context)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
3788, in _store_set_values
      result = self._columns[val[0]].get(cr, self, ids, val, 1, context=context)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/fields.py", 
line 800, in get
      res = self._fnct(obj, cr, user, ids, name, self._arg, context)
    File 
"/home/elbati/workspace/openerp/openerp6/server/bin/addons/crm/crm_lead.py", 
line 69, in _compute_day
      if lead.date_closed:
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
292, in __getattr__
      return self[name]
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
194, in __getitem__
      fields_to_fetch = filter(lambda x: x[1]._classic_write, 
self._table._columns.items())
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
2942, in read
      result = self._read_flat(cr, user, select, fields, context, load)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/osv/orm.py", line 
3001, in _read_flat
      cr.execute(query, (tuple(sub_ids),))
    File "/home/elbati/workspace/openerp/openerp6/server/bin/sql_db.py", line 
78, in wrapper
      return f(self, *args, **kwargs)
    File "/home/elbati/workspace/openerp/openerp6/server/bin/sql_db.py", line 
131, in execute
      res = self._obj.execute(query, params)
  ProgrammingError: column crm_lead.last_name does not exist
  LINE 1: SELECT crm_lead.date_closed,crm_lead.last_name,date_trunc('s...
                                      ^

  
  This is because 'crm.lead' inherits 'res.partner.address' by prototyping, but 
the new module (base_partner_surname) has been installed after 'crm', so, when 
'crm' was installed, 'last_name' didn't exist.

  Investigating, I noticed that at line 194
  
http://bazaar.launchpad.net/~openerp/openobject-server/6.0/view/3445/bin/osv/orm.py#L190
  'self._table._columns' contains 'last_name' while that column, as mentioned 
above, is not present within the database.

To manage notifications about this bug go to:
https://bugs.launchpad.net/openobject-server/+bug/799378/+subscriptions

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to