Browse Source

[IMP] mis_builder: improve docstrings

pull/90/head
Stéphane Bidoul 10 years ago
parent
commit
2f4ad25f03
  1. 24
      mis_builder/models/aep.py
  2. 26
      mis_builder/models/mis_builder.py

24
mis_builder/models/aep.py

@ -50,7 +50,7 @@ class AccountingExpressionProcessor(object):
Examples: Examples:
* bal[70]: variation of the balance of moves on account 70 * bal[70]: variation of the balance of moves on account 70
over the period (it is the same as balp[70]); over the period (it is the same as balp[70]);
* bali[70,60]: initial balance of accounts 70 and 60;
* bali[70,60]: balance of accounts 70 and 60 at the start of period;
* bale[1%]: balance of accounts starting with 1 at end of period. * bale[1%]: balance of accounts starting with 1 at end of period.
How to use: How to use:
@ -85,7 +85,7 @@ class AccountingExpressionProcessor(object):
def __init__(self, env): def __init__(self, env):
self.env = env self.env = env
# before done_parsing: {(domain, mode): set(account_codes)} # before done_parsing: {(domain, mode): set(account_codes)}
# after done_parsing: {(domain, mode): set(account_ids)}
# after done_parsing: {(domain, mode): list(account_ids)}
self._map_account_ids = defaultdict(set) self._map_account_ids = defaultdict(set)
self._account_ids_by_code = defaultdict(set) self._account_ids_by_code = defaultdict(set)
@ -140,7 +140,7 @@ class AccountingExpressionProcessor(object):
def _parse_match_object(self, mo): def _parse_match_object(self, mo):
"""Split a match object corresponding to an accounting variable """Split a match object corresponding to an accounting variable
Returns field, mode, [account codes], [domain expression].
Returns field, mode, [account codes], (domain expression).
""" """
field, mode, account_codes, domain = mo.groups() field, mode, account_codes, domain = mo.groups()
if not mode: if not mode:
@ -163,7 +163,8 @@ class AccountingExpressionProcessor(object):
"""Parse an expression, extracting accounting variables. """Parse an expression, extracting accounting variables.
Domains and accounts are extracted and stored in the map Domains and accounts are extracted and stored in the map
so when all expressions have been parsed, we know what to query.
so when all expressions have been parsed, we know which
account codes to query for each domain and mode.
""" """
for mo in self.ACC_RE.finditer(expr): for mo in self.ACC_RE.finditer(expr):
_, mode, account_codes, domain = self._parse_match_object(mo) _, mode, account_codes, domain = self._parse_match_object(mo)
@ -171,7 +172,8 @@ class AccountingExpressionProcessor(object):
self._map_account_ids[key].update(account_codes) self._map_account_ids[key].update(account_codes)
def done_parsing(self, root_account): def done_parsing(self, root_account):
# load account codes and replace account codes by account ids in _map
"""Load account codes and replace account codes by
account ids in map."""
for key, account_codes in self._map_account_ids.items(): for key, account_codes in self._map_account_ids.items():
self._load_account_codes(account_codes, root_account) self._load_account_codes(account_codes, root_account)
account_ids = set() account_ids = set()
@ -180,8 +182,9 @@ class AccountingExpressionProcessor(object):
self._map_account_ids[key] = list(account_ids) self._map_account_ids[key] = list(account_ids)
@classmethod @classmethod
def has_account_var(self, expr):
return bool(self.ACC_RE.search(expr))
def has_account_var(cls, expr):
"""Test if an string contains an accounting variable."""
return bool(cls.ACC_RE.search(expr))
def get_aml_domain_for_expr(self, expr, def get_aml_domain_for_expr(self, expr,
date_from, date_to, date_from, date_to,
@ -328,6 +331,11 @@ class AccountingExpressionProcessor(object):
def do_queries(self, date_from, date_to, period_from, period_to, def do_queries(self, date_from, date_to, period_from, period_to,
target_move): target_move):
"""Query sums of debit and credit for all accounts and domains
used in expressions.
This method must be executed after done_parsing().
"""
aml_model = self.env['account.move.line'] aml_model = self.env['account.move.line']
# {(domain, mode): {account_id: (debit, credit)}} # {(domain, mode): {account_id: (debit, credit)}}
self._data = defaultdict(dict) self._data = defaultdict(dict)
@ -352,7 +360,7 @@ class AccountingExpressionProcessor(object):
def replace_expr(self, expr): def replace_expr(self, expr):
"""Replace accounting variables in an expression by their amount. """Replace accounting variables in an expression by their amount.
Returns a new expression.
Returns a new expression string.
This method must be executed after do_queries(). This method must be executed after do_queries().
""" """

26
mis_builder/models/mis_builder.py

@ -72,7 +72,6 @@ def _is_valid_python_var(name):
class mis_report_kpi(orm.Model): class mis_report_kpi(orm.Model):
""" A KPI is an element (ie a line) of a MIS report. """ A KPI is an element (ie a line) of a MIS report.
In addition to a name and description, it has an expression In addition to a name and description, it has an expression
@ -80,6 +79,7 @@ class mis_report_kpi(orm.Model):
It also has various informations defining how to render it It also has various informations defining how to render it
(numeric or percentage or a string, a suffix, divider) and (numeric or percentage or a string, a suffix, divider) and
how to render comparison of two values of the KPI. how to render comparison of two values of the KPI.
KPI's have a sequence and are ordered inside the MIS report.
""" """
_name = 'mis.report.kpi' _name = 'mis.report.kpi'
@ -166,7 +166,9 @@ class mis_report_kpi(orm.Model):
def _render(self, cr, uid, lang_id, kpi, value, context=None): def _render(self, cr, uid, lang_id, kpi, value, context=None):
""" render a KPI value as a unicode string, ready for display """ """ render a KPI value as a unicode string, ready for display """
if kpi.type == 'num':
if value is None:
return '#N/A'
elif kpi.type == 'num':
return self._render_num(cr, uid, lang_id, value, kpi.divider, return self._render_num(cr, uid, lang_id, value, kpi.divider,
kpi.dp, kpi.suffix, context=context) kpi.dp, kpi.suffix, context=context)
elif kpi.type == 'pct': elif kpi.type == 'pct':
@ -227,8 +229,7 @@ class mis_report_kpi(orm.Model):
class mis_report_query(orm.Model): class mis_report_query(orm.Model):
""" A query to fetch data for a MIS report.
""" A query to fetch arbitrary data for a MIS report.
A query works on a model and has a domain and list of fields to fetch. A query works on a model and has a domain and list of fields to fetch.
At runtime, the domain is expanded with a "and" on the date/datetime field. At runtime, the domain is expanded with a "and" on the date/datetime field.
@ -302,11 +303,11 @@ class mis_report(orm.Model):
* a list of explicit queries; the result of each query is * a list of explicit queries; the result of each query is
stored in a variable with same name as a query, containing as list stored in a variable with same name as a query, containing as list
of data structures populated with attributes for each fields to fetch; of data structures populated with attributes for each fields to fetch;
when queries have the group by flag and no fields to group, it returns
a data structure with the summed fields
when queries have an aggregate method and no fields to group, it returns
a data structure with the aggregated fields
* a list of KPI to be evaluated based on the variables resulting * a list of KPI to be evaluated based on the variables resulting
from the balance and queries (KPI expressions can references queries
and accounting expression - see AccoutingExpressionProcessor)
from the accounting data and queries (KPI expressions can references
queries and accounting expression - see AccoutingExpressionProcessor)
""" """
_name = 'mis.report' _name = 'mis.report'
@ -326,7 +327,6 @@ class mis_report(orm.Model):
class mis_report_instance_period(orm.Model): class mis_report_instance_period(orm.Model):
""" A MIS report instance has the logic to compute """ A MIS report instance has the logic to compute
a report template for a given date period. a report template for a given date period.
@ -518,7 +518,8 @@ class mis_report_instance_period(orm.Model):
cr, uid, domain, field_names, [], context=context) cr, uid, domain, field_names, [], context=context)
s = AutoStruct(count=obj_datas[0]['__count']) s = AutoStruct(count=obj_datas[0]['__count'])
for field_name in field_names: for field_name in field_names:
setattr(s, field_name, obj_datas[0][field_name])
v = obj_datas[0][field_name]
setattr(s, field_name, v)
res[query.name] = s res[query.name] = s
else: else:
obj_ids = obj.search(cr, uid, domain, context=context) obj_ids = obj.search(cr, uid, domain, context=context)
@ -625,9 +626,8 @@ class mis_report_instance_period(orm.Model):
class mis_report_instance(orm.Model): class mis_report_instance(orm.Model):
""" The MIS report instance combines compute and
display a MIS report template for a set of periods """
"""The MIS report instance combines everything to compute
a MIS report template for a set of periods."""
def _get_pivot_date(self, cr, uid, ids, field_name, arg, context=None): def _get_pivot_date(self, cr, uid, ids, field_name, arg, context=None):
res = {} res = {}

Loading…
Cancel
Save