[ADD, IMP]: res.company: Added new field in company for paper format which is used...
[odoo/odoo.git] / openerp / addons / base / res / ir_property.py
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
22 from osv import osv,fields
23 from tools.misc import attrgetter
24 import time
25
26 # -------------------------------------------------------------------------
27 # Properties
28 # -------------------------------------------------------------------------
29
30 class ir_property(osv.osv):
31     _name = 'ir.property'
32
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)
37         res = set()
38         for o in obj.browse(cr, uid, ids, context=context):
39             res.add(get(o))
40         return list(res)
41
42     def _models_get(self, cr, uid, context=None):
43         return self._models_field_get(cr, uid, 'model', 'model_id.name', context)
44
45     def _models_get2(self, cr, uid, context=None):
46         return self._models_field_get(cr, uid, 'relation', 'relation', context)
47
48
49     _columns = {
50         'name': fields.char('Name', size=128, select=1),
51
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),
56
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'),
63
64         'type' : fields.selection([('char', 'Char'),
65                                    ('float', 'Float'),
66                                    ('boolean', 'Boolean'),
67                                    ('integer', 'Integer'),
68                                    ('integer_big', 'Integer Big'),
69                                    ('text', 'Text'),
70                                    ('binary', 'Binary'),
71                                    ('many2one', 'Many2One'),
72                                    ('date', 'Date'),
73                                    ('datetime', 'DateTime'),
74                                   ],
75                                   'Type',
76                                   required=True,
77                                   select=1),
78     }
79
80     _defaults = {
81         'type': 'many2one',
82     }
83
84     def _update_values(self, cr, uid, ids, values):
85         value = values.pop('value', None)
86         if not value:
87             return values
88
89         prop = None
90         type_ = values.get('type')
91         if not type_:
92             if ids:
93                 prop = self.browse(cr, uid, ids[0])
94                 type_ = prop.type
95             else:
96                 type_ = self._defaults['type']
97
98         type2field = {
99             'char': 'value_text',
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',
109         }
110         field = type2field.get(type_)
111         if not field:
112             raise osv.except_osv('Error', 'Invalid type')
113
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')
119                 if not field_id:
120                     if not prop:
121                         raise ValueError()
122                     field_id = prop.fields_id
123                 else:
124                     field_id = self.pool.get('ir.model.fields').browse(cr, uid, field_id)
125
126                 value = '%s,%d' % (field_id.relation, value)
127
128         values[field] = value
129         return values
130
131
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)
134
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)
137
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:
155                 return False
156             return time.strftime('%Y-%m-%d', time.strptime(record.value_datetime, '%Y-%m-%d %H:%M:%S'))
157         return False
158
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)
167         return False
168
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)
171         if domain is None:
172             return None
173         return ['&', ('res_id', '=', False)] + domain
174
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))
178         res = cr.fetchone()
179         if not res:
180             return None
181
182         if 'force_company' in context and context['force_company']:
183             cid = context['force_company']
184         else:
185             company = self.pool.get('res.company')
186             cid = company._company_default_get(cr, uid, model, res[0], context=context)
187
188         domain = ['&', ('fields_id', '=', res[0]),
189                   '|', ('company_id', '=', cid), ('company_id', '=', False)]
190         return domain
191
192 ir_property()
193
194
195
196 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
197