X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=bin%2Fosv%2Ffields.py;h=652a4819d48575812c65993d5a60ecd6fcd8ca00;hb=c6b96e6cd5140ea91e88bab9864d9a419afaa587;hp=72df0e925ad3834861fc4766d25c8a392c49dbbf;hpb=570d35e8244f588b4ead88ed573e8cf73b073c8b;p=odoo%2Fodoo.git diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 72df0e9..652a481 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -38,6 +38,7 @@ import warnings import xmlrpclib from psycopg2 import Binary +import osv import netsvc import tools from tools.translate import _ @@ -63,7 +64,13 @@ class _column(object): _symbol_set = (_symbol_c, _symbol_f) _symbol_get = None - def __init__(self, string='unknown', required=False, readonly=False, domain=None, context=None, states=None, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, **args): + def __init__(self, string='unknown', required=False, readonly=False, domain=None, context=None, states=None, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, manual=False, **args): + """ + + The 'manual' keyword argument specifies if the field is a custom one. + It corresponds to the 'state' column in ir_model_fields. + + """ if domain is None: domain = [] if context is None: @@ -84,6 +91,7 @@ class _column(object): self.read = False self.view_load = 0 self.select = select + self.manual = manual self.selectable = True self.group_operator = args.get('group_operator', False) for a in args: @@ -141,9 +149,21 @@ class integer_big(_column): class reference(_column): _type = 'reference' + _classic_read = False def __init__(self, string, selection, size, **args): _column.__init__(self, string=string, size=size, selection=selection, **args) + def get(self, cr, obj, ids, name, uid=None, context=None, values=None): + result = {} + # copy initial values fetched previously. + for value in values: + result[value['id']] = value[name] + if value[name]: + model, res_id = value[name].split(',') + if not obj.pool.get(model).exists(cr, uid, [int(res_id)], context=context): + result[value['id']] = False + return result + class char(_column): _type = 'char' @@ -623,7 +643,7 @@ class many2many(_column): if not cr.fetchone(): cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s,%s)', (id, act[1])) elif act[0] == 5: - cr.execute('update '+self._rel+' set '+self._id2+'=null where '+self._id2+'=%s', (id,)) + cr.execute('delete from '+self._rel+' where ' + self._id1 + ' = %s', (id,)) elif act[0] == 6: d1, d2,tables = obj.pool.get('ir.rule').domain_get(cr, user, obj._name, context=context) @@ -1023,8 +1043,14 @@ class property(function): cr.execute('DELETE FROM ir_property WHERE id IN %s', (tuple(nids),)) default_val = self._get_default(obj, cr, uid, prop_name, context) - - if id_val is not default_val: + property_create = False + if isinstance(default_val, osv.orm.browse_record): + if default_val.id != id_val: + property_create = True + elif default_val != id_val: + property_create = True + + if property_create: def_id = self._field_get(cr, uid, obj._name, prop_name) company = obj.pool.get('res.company') cid = company._company_default_get(cr, uid, obj._name, def_id, @@ -1097,5 +1123,27 @@ class property(function): self.field_id = {} +class column_info(object): + """Struct containing details about an osv column, either one local to + its model, or one inherited via _inherits. + + :attr name: name of the column + :attr column: column instance, subclass of osv.fields._column + :attr parent_model: if the column is inherited, name of the model + that contains it, None for local columns. + :attr parent_column: the name of the column containing the m2o + relationship to the parent model that contains + this column, None for local columns. + :attr original_parent: if the column is inherited, name of the original + parent model that contains it i.e in case of multilevel + inheritence, None for local columns. + """ + def __init__(self, name, column, parent_model=None, parent_column=None, original_parent=None): + self.name = name + self.column = column + self.parent_model = parent_model + self.parent_column = parent_column + self.original_parent = original_parent + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: