Holger Brunn
12 years ago
4 changed files with 179 additions and 0 deletions
-
22unserialize_field/__init__.py
-
36unserialize_field/__openerp__.py
-
101unserialize_field/ir_model_fields.py
-
20unserialize_field/ir_model_fields.xml
@ -0,0 +1,22 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>) |
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import ir_model_fields |
@ -0,0 +1,36 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>) |
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
{ |
||||
|
'name': 'Make database fields from fields that live in serialized fields', |
||||
|
'version': '1.0', |
||||
|
'description': """To be able to search for fields with standard methods, |
||||
|
they have to be database fields. This addon makes it possible to unserialize |
||||
|
them afterwards.""", |
||||
|
'author': 'Therp BV', |
||||
|
'website': 'http://www.therp.nl', |
||||
|
"category": "Tools", |
||||
|
"depends": [], |
||||
|
"data": ['ir_model_fields.xml'], |
||||
|
'installable': True, |
||||
|
'active': False, |
||||
|
} |
@ -0,0 +1,101 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# OpenERP, Open Source Management Solution |
||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>) |
||||
|
# All Rights Reserved |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from openerp.osv.orm import Model |
||||
|
from openerp.osv import fields |
||||
|
|
||||
|
|
||||
|
class ir_model_fields(Model): |
||||
|
_inherit = 'ir.model.fields' |
||||
|
|
||||
|
def action_unserialize_field(self, cr, uid, ids, context=None): |
||||
|
step = 1000 |
||||
|
offset = 0 |
||||
|
|
||||
|
for this in self.browse(cr, uid, ids, context=context): |
||||
|
pool_obj = self.pool.get(this.model_id.model) |
||||
|
self.create_database_column(cr, uid, pool_obj, this.name) |
||||
|
while True: |
||||
|
ids = pool_obj.search( |
||||
|
cr, uid, |
||||
|
[(this.serialization_field_id.name, '!=', '{}')], |
||||
|
offset=offset*step, limit=step, context=context) |
||||
|
if not ids: |
||||
|
break |
||||
|
for data in pool_obj.read(cr, uid, ids, |
||||
|
[this.serialization_field_id.name], |
||||
|
context=context): |
||||
|
self.unserialize_field(cr, uid, pool_obj, data, |
||||
|
this.serialization_field_id.name, |
||||
|
this.name) |
||||
|
offset += 1 |
||||
|
return True |
||||
|
|
||||
|
def create_database_column(self, cr, uid, pool_obj, field_name): |
||||
|
old = pool_obj._columns[field_name] |
||||
|
field_declaration_args = [] |
||||
|
field_declaration_kwargs = dict( |
||||
|
manual=False, |
||||
|
string=old.string, |
||||
|
required=old.required, |
||||
|
readonly=old.readonly, |
||||
|
domain=old._domain, |
||||
|
context=old._context, |
||||
|
states=old.states, |
||||
|
priority=old.priority, |
||||
|
change_default=old.change_default, |
||||
|
size=old.size, |
||||
|
ondelete=old.ondelete, |
||||
|
translate=old.translate, |
||||
|
select=old.select, |
||||
|
) |
||||
|
|
||||
|
if old._type == 'many2one': |
||||
|
field_declaration_args = [old._obj] |
||||
|
elif old._type == 'selection': |
||||
|
field_declaration_args = [old.selection] |
||||
|
elif old._type == 'one2many': |
||||
|
field_declaration_args = [old._obj, old._fields_id] |
||||
|
field_declaration_kwargs['limit'] = old._limit |
||||
|
elif old._type == 'many2many': |
||||
|
field_declaration_args = [old._obj] |
||||
|
field_declaration_kwargs['rel'] = old._rel |
||||
|
field_declaration_kwargs['id1'] = old._id1 |
||||
|
field_declaration_kwargs['id2'] = old._id2 |
||||
|
field_declaration_kwargs['limit'] = old._limit |
||||
|
|
||||
|
field_declaration = getattr(fields, old._type)( |
||||
|
*field_declaration_args, |
||||
|
**field_declaration_kwargs) |
||||
|
|
||||
|
pool_obj._columns[field_name] = field_declaration |
||||
|
pool_obj._auto_init(cr, {}) |
||||
|
|
||||
|
def unserialize_field(self, cr, uid, pool_obj, read_record, |
||||
|
serialization_field_name, field_name): |
||||
|
if not field_name in read_record[serialization_field_name]: |
||||
|
return False |
||||
|
pool_obj.write( |
||||
|
cr, uid, read_record['id'], |
||||
|
{ |
||||
|
field_name: |
||||
|
read_record[serialization_field_name][field_name], |
||||
|
}) |
@ -0,0 +1,20 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="view_model_fields_form" model="ir.ui.view"> |
||||
|
<field name="type">form</field> |
||||
|
<field name="model">ir.model.fields</field> |
||||
|
<field name="inherit_id" ref="base.view_model_fields_form" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<data> |
||||
|
<field name="serialization_field_id" position="after"> |
||||
|
<button type="object" name="action_unserialize_field" |
||||
|
string="Unserialize field" colspan="4" |
||||
|
attrs="{'invisible': [('serialization_field_id','=',False)]}" |
||||
|
/> |
||||
|
</field> |
||||
|
</data> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue