Skip to content
Snippets Groups Projects
Commit 948e0de4 authored by Jérémie Gavrel's avatar Jérémie Gavrel
Browse files

The number of analytic fields can be defined in the OpenERP configuration...

The number of analytic fields can be defined in the OpenERP configuration file, category [analytic], key analytic_size (default: 5).

The default behavior is unchanged.
parent b462c645
No related branches found
No related tags found
No related merge requests found
from openerp.osv import fields
from openerp.tools import config
from openerp.addons.oemetasl import OEMetaSL
class MetaAnalytic(OEMetaSL):
"""Generate analytic fields on a model, applying the required changes on
its class attributes and methods.
"""
def __new__(cls, name, bases, nmspc):
# Analytic fields should be defined in the _analytic attribute.
analytic = nmspc.get('_analytic', False)
if not analytic:
return super(MetaAnalytic, cls).__new__(cls, name, bases, nmspc)
# If it uses a shortcut, convert it into a prefix -> model mapping.
if analytic is True:
orm_model_name = nmspc.get('_name', False)
if orm_model_name is False:
orm_model_name = nmspc.get('_inherit')
analytic = {'a': orm_model_name}
elif isinstance(analytic, basestring):
analytic = {'a': analytic}
nmspc['_analytic'] = analytic
size = int(config.get_misc('analytic', 'analytic_size', 5))
columns = nmspc.get('_columns', False)
if columns is False:
columns = {}
nmspc['_columns'] = columns
# Generate the analytic fields directly into the _columns attribute.
for prefix, model_name in analytic.iteritems():
for n in xrange(1, size + 1):
col_name = '{pfx}{n}_id'.format(pfx=prefix, n=n)
domain_field = 'nd_id.ns{n}_id.model_name'.format(n=n)
columns[col_name] = fields.many2one(
'analytic.code',
u"Analysis Code 1",
domain=[(domain_field, '=', model_name)],
track_visibility='onchange',
)
# In order to preserve inheritance, possible overrides, and OEMetaSL's
# expected behavior, work on a new class that inherits the given bases,
# then make our model class inherit from this class.
superclass_name = '_{name}_SuperAnalytic'.format(name=name)
# Set _register to False in order to prevent its instantiation.
superclass = type(superclass_name, bases, {'_register': False})
def fields_get(
self, cr, uid, allfields=None, context=None, write_access=True
):
"""Override this method to rename analytic fields."""
res = super(superclass, self).fields_get(
cr, uid, allfields=allfields, context=context,
write_access=write_access
)
analytic_osv = self.pool.get('analytic.structure')
for prefix, model_name in analytic.iteritems():
res = analytic_osv.analytic_fields_get(
cr, uid, model_name, res, prefix=prefix, context=context
)
return res
def fields_view_get(
self, cr, uid, view_id=None, view_type='form', context=None,
toolbar=False, submenu=False
):
"""Override this method to hide unused analytic fields."""
res = super(superclass, self).fields_view_get(
cr, uid, view_id=view_id, view_type=view_type, context=context,
toolbar=toolbar, submenu=submenu
)
analytic_osv = self.pool.get('analytic.structure')
for prefix, model_name in analytic.iteritems():
res = analytic_osv.analytic_fields_view_get(
cr, uid, model_name, res, prefix=prefix, context=context
)
return res
setattr(superclass, 'fields_get', fields_get)
setattr(superclass, 'fields_view_get', fields_view_get)
new_bases = (superclass,)
return super(MetaAnalytic, cls).__new__(cls, name, new_bases, nmspc)
def __init__(self, name, bases, nmspc):
return super(MetaAnalytic, self).__init__(name, bases, nmspc)
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
# #
############################################################################## ##############################################################################
import MetaAnalytic
import analytic_code import analytic_code
import analytic_dimension import analytic_dimension
import analytic_structure import analytic_structure
...@@ -31,7 +31,10 @@ ...@@ -31,7 +31,10 @@
================================================================================== ==================================================================================
""", """,
'website': 'http://www.openerp-experts.com', 'website': 'http://www.openerp-experts.com',
"depends" : ['base'], "depends" : [
'base',
'oemetasl',
],
"data": [ "data": [
'security/security.xml', 'security/security.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
......
...@@ -20,6 +20,25 @@ ...@@ -20,6 +20,25 @@
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp.addons.oemetasl import OEMetaSL
from openerp.tools import config
class MetaDimension(OEMetaSL):
def __new__(cls, name, bases, nmspc):
columns = nmspc['_columns']
size = int(config.get_misc('analytic', 'analytic_size', 5))
for n in xrange(1, size + 1):
columns['ns{}_id'.format(n)] = fields.one2many(
'analytic.structure',
'nd_id',
u"Structures {}".format(n),
domain=[('ordering', '=', n)],
auto_join=True
)
return super(MetaDimension, cls).__new__(cls, name, bases, nmspc)
class analytic_dimension(osv.Model): class analytic_dimension(osv.Model):
...@@ -23,6 +42,8 @@ ...@@ -23,6 +42,8 @@
class analytic_dimension(osv.Model): class analytic_dimension(osv.Model):
__metaclass__ = MetaDimension
_name = "analytic.dimension" _name = "analytic.dimension"
_columns = dict( _columns = dict(
...@@ -30,41 +51,6 @@ ...@@ -30,41 +51,6 @@
validated=fields.boolean("Validated"), validated=fields.boolean("Validated"),
nc_ids=fields.one2many("analytic.code", "nd_id", "Codes"), nc_ids=fields.one2many("analytic.code", "nd_id", "Codes"),
ns_id=fields.one2many("analytic.structure", "nd_id", "Structures"), ns_id=fields.one2many("analytic.structure", "nd_id", "Structures"),
ns1_id=fields.one2many(
'analytic.structure',
'nd_id',
u"Structures 1",
domain=[('ordering', '=', 1)],
auto_join=True
),
ns2_id=fields.one2many(
'analytic.structure',
'nd_id',
u"Structures 2",
domain=[('ordering', '=', 2)],
auto_join=True
),
ns3_id=fields.one2many(
'analytic.structure',
'nd_id',
u"Structures 3",
domain=[('ordering', '=', 3)],
auto_join=True
),
ns4_id=fields.one2many(
'analytic.structure',
'nd_id',
u"Structures 4",
domain=[('ordering', '=', 4)],
auto_join=True
),
ns5_id=fields.one2many(
'analytic.structure',
'nd_id',
u"Structures 5",
domain=[('ordering', '=', 5)],
auto_join=True
),
) )
_sql_constraints = [ _sql_constraints = [
......
...@@ -19,8 +19,10 @@ ...@@ -19,8 +19,10 @@
############################################################################## ##############################################################################
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools import config
from openerp.tools.translate import _
import re import re
from lxml import etree from lxml import etree
import json import json
...@@ -22,18 +24,9 @@ ...@@ -22,18 +24,9 @@
import re import re
from lxml import etree from lxml import etree
import json import json
ORDER_SELECTION = (
('1', 'Analysis 1'),
('2', 'Analysis 2'),
('3', 'Analysis 3'),
('4', 'Analysis 4'),
('5', 'Analysis 5')
)
class analytic_structure(osv.Model): class analytic_structure(osv.Model):
_name = "analytic.structure" _name = "analytic.structure"
...@@ -36,7 +29,17 @@ ...@@ -36,7 +29,17 @@
class analytic_structure(osv.Model): class analytic_structure(osv.Model):
_name = "analytic.structure" _name = "analytic.structure"
def order_selection(self, cr, uid, context=None):
order_selection = getattr(self, '_order_selection', None)
if order_selection is None:
size = int(config.get_misc('analytic', 'analytic_size', 5))
order_selection = []
for n in xrange(1, size + 1):
order_selection.append((str(n), _(u"Analysis {}".format(n))))
setattr(self, '_order_selection', order_selection)
return order_selection
_columns = dict( _columns = dict(
model_name=fields.char("Object", size=128, required=True, select="1"), model_name=fields.char("Object", size=128, required=True, select="1"),
nd_id=fields.many2one( nd_id=fields.many2one(
...@@ -47,7 +50,7 @@ ...@@ -47,7 +50,7 @@
select="1" select="1"
), ),
ordering=fields.selection( ordering=fields.selection(
ORDER_SELECTION, order_selection,
'Analysis slot', 'Analysis slot',
required=True), required=True),
) )
...@@ -51,6 +54,7 @@ ...@@ -51,6 +54,7 @@
'Analysis slot', 'Analysis slot',
required=True), required=True),
) )
_sql_constraints = [ _sql_constraints = [
( (
'unique_ordering', 'unique_ordering',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment