1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
20 ##############################################################################
22 from osv import osv,fields
23 from tools.misc import attrgetter
26 # -------------------------------------------------------------------------
28 # -------------------------------------------------------------------------
30 class ir_property(osv.osv):
33 def _models_field_get(self, cr, uid, field_key, field_value, context=None):
34 get = attrgetter(field_key, field_value)
35 obj = self.pool.get('ir.model.fields')
36 ids = obj.search(cr, uid, [('view_load','=',1)], context=context)
38 for o in obj.browse(cr, uid, ids, context=context):
42 def _models_get(self, cr, uid, context=None):
43 return self._models_field_get(cr, uid, 'model', 'model_id.name', context)
45 def _models_get2(self, cr, uid, context=None):
46 return self._models_field_get(cr, uid, 'relation', 'relation', context)
50 'name': fields.char('Name', size=128, select=1),
52 'res_id': fields.reference('Resource', selection=_models_get, size=128,
53 help="If not set, acts as a default value for new resources", select=1),
54 'company_id': fields.many2one('res.company', 'Company', select=1),
55 'fields_id': fields.many2one('ir.model.fields', 'Field', ondelete='cascade', required=True, select=1),
57 'value_float' : fields.float('Value'),
58 'value_integer' : fields.integer_big('Value'), # will contain (int, bigint)
59 'value_text' : fields.text('Value'), # will contain (char, text)
60 'value_binary' : fields.binary('Value'),
61 'value_reference': fields.reference('Value', selection=_models_get2, size=128),
62 'value_datetime' : fields.datetime('Value'),
64 'type' : fields.selection([('char', 'Char'),
66 ('boolean', 'Boolean'),
67 ('integer', 'Integer'),
68 ('integer_big', 'Integer Big'),
71 ('many2one', 'Many2One'),
73 ('datetime', 'DateTime'),
84 def _update_values(self, cr, uid, ids, values):
85 value = values.pop('value', None)
90 type_ = values.get('type')
93 prop = self.browse(cr, uid, ids[0])
96 type_ = self._defaults['type']
100 'float': 'value_float',
101 'boolean' : 'value_integer',
102 'integer': 'value_integer',
103 'integer_big': 'value_integer',
104 'text': 'value_text',
105 'binary': 'value_binary',
106 'many2one': 'value_reference',
107 'date' : 'value_datetime',
108 'datetime' : 'value_datetime',
110 field = type2field.get(type_)
112 raise osv.except_osv('Error', 'Invalid type')
114 if field == 'value_reference':
115 if isinstance(value, osv.orm.browse_record):
116 value = '%s,%d' % (value._name, value.id)
117 elif isinstance(value, (int, long)):
118 field_id = values.get('fields_id')
122 field_id = prop.fields_id
124 field_id = self.pool.get('ir.model.fields').browse(cr, uid, field_id)
126 value = '%s,%d' % (field_id.relation, value)
128 values[field] = value
132 def write(self, cr, uid, ids, values, context=None):
133 return super(ir_property, self).write(cr, uid, ids, self._update_values(cr, uid, ids, values), context=context)
135 def create(self, cr, uid, values, context=None):
136 return super(ir_property, self).create(cr, uid, self._update_values(cr, uid, None, values), context=context)
138 def get_by_record(self, cr, uid, record, context=None):
139 if record.type in ('char', 'text'):
140 return record.value_text
141 elif record.type == 'float':
142 return record.value_float
143 elif record.type == 'boolean':
144 return bool(record.value_integer)
145 elif record.type in ('integer', 'integer_big'):
146 return record.value_integer
147 elif record.type == 'binary':
148 return record.value_binary
149 elif record.type == 'many2one':
150 return record.value_reference
151 elif record.type == 'datetime':
152 return record.value_datetime
153 elif record.type == 'date':
154 if not record.value_datetime:
156 return time.strftime('%Y-%m-%d', time.strptime(record.value_datetime, '%Y-%m-%d %H:%M:%S'))
159 def get(self, cr, uid, name, model, res_id=False, context=None):
160 domain = self._get_domain(cr, uid, name, model, context=context)
161 if domain is not None:
162 domain = [('res_id', '=', res_id)] + domain
163 nid = self.search(cr, uid, domain, context=context)
164 if not nid: return False
165 record = self.browse(cr, uid, nid[0], context=context)
166 return self.get_by_record(cr, uid, record, context=context)
169 def _get_domain_default(self, cr, uid, prop_name, model, context=None):
170 domain = self._get_domain(cr, uid, prop_name, model, context=context)
173 return ['&', ('res_id', '=', False)] + domain
175 def _get_domain(self, cr, uid, prop_name, model, context=None):
176 context = context or {}
177 cr.execute('select id from ir_model_fields where name=%s and model=%s', (prop_name, model))
182 if 'force_company' in context and context['force_company']:
183 cid = context['force_company']
185 company = self.pool.get('res.company')
186 cid = company._company_default_get(cr, uid, model, res[0], context=context)
188 domain = ['&', ('fields_id', '=', res[0]),
189 '|', ('company_id', '=', cid), ('company_id', '=', False)]
196 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: