changeset 9f4fabb78e30 in modules/account:default
details: https://hg.tryton.org/modules/account?cmd=changeset&node=9f4fabb78e30
description:
Add account_move_line_grouping module
issue10318
review334221002
diffstat:
__init__.py | 4 +
move.py | 185 +++++++++++++++++++++++++++-------------------------
view/move_form.xml | 8 +-
3 files changed, 106 insertions(+), 91 deletions(-)
diffs (251 lines):
diff -r 3555b5d8194c -r 9f4fabb78e30 __init__.py
--- a/__init__.py Mon Oct 11 15:35:46 2021 +0200
+++ b/__init__.py Mon Oct 11 23:21:55 2021 +0200
@@ -13,6 +13,10 @@
from . import period
from . import tax
+from .move import MoveLineMixin
+
+__all__ = ['register', 'MoveLineMixin']
+
def register():
Pool.register(
diff -r 3555b5d8194c -r 9f4fabb78e30 move.py
--- a/move.py Mon Oct 11 15:35:46 2021 +0200
+++ b/move.py Mon Oct 11 23:21:55 2021 +0200
@@ -605,7 +605,96 @@
credit=credit))
-class Line(ModelSQL, ModelView):
+class MoveLineMixin:
+ __slots__ = ()
+
+ @classmethod
+ def get_move_origin(cls):
+ Move = Pool().get('account.move')
+ return Move.get_origin()
+
+ @classmethod
+ def get_move_states(cls):
+ pool = Pool()
+ Move = pool.get('account.move')
+ return Move.fields_get(['state'])['state']['selection']
+
+ def get_move_field(self, name):
+ field = getattr(self.__class__, name)
+ if name.startswith('move_'):
+ name = name[5:]
+ value = getattr(self.move, name)
+ if isinstance(value, ModelSQL):
+ if field._type == 'reference':
+ return str(value)
+ return value.id
+ return value
+
+ @classmethod
+ def set_move_field(cls, lines, name, value):
+ pool = Pool()
+ Move = pool.get('account.move')
+ if name.startswith('move_'):
+ name = name[5:]
+ if not value:
+ return
+ moves = {line.move for line in lines}
+ moves = Move.browse(moves)
+ with Transaction().set_context(_skip_validate_move=True):
+ Move.write(moves, {
+ name: value,
+ })
+
+ @classmethod
+ def search_move_field(cls, name, clause):
+ nested = clause[0].lstrip(name)
+ if name.startswith('move_'):
+ name = name[5:]
+ return [('move.' + name + nested,) + tuple(clause[1:])]
+
+ @staticmethod
+ def _order_move_field(name):
+ def order_field(cls, tables):
+ pool = Pool()
+ Move = pool.get('account.move')
+ field = Move._fields[name]
+ table, _ = tables[None]
+ move_tables = tables.get('move')
+ if move_tables is None:
+ move = Move.__table__()
+ move_tables = {
+ None: (move, move.id == table.move),
+ }
+ tables['move'] = move_tables
+ return field.convert_order(name, move_tables, Move)
+ return classmethod(order_field)
+
+ def get_amount(self, name):
+ sign = -1 if self.account.type.statement == 'income' else 1
+ if self.amount_second_currency is not None:
+ return self.amount_second_currency * sign
+ else:
+ return (self.debit - self.credit) * sign
+
+ def get_amount_currency(self, name):
+ if self.second_currency:
+ currency = self.second_currency
+ else:
+ currency = self.account.currency
+ return currency.id
+
+ def get_rec_name(self, name):
+ if self.debit > self.credit:
+ return self.account.rec_name
+ else:
+ return '(%s)' % self.account.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('account.rec_name',) + tuple(clause[1:])]
+
+
+class Line(MoveLineMixin, ModelSQL, ModelView):
'Account Move Line'
__name__ = 'account.move.line'
@@ -867,11 +956,6 @@
models = cls._get_origin()
return [(None, '')] + [(m, get_name(m)) for m in models]
- @classmethod
- def get_move_origin(cls):
- Move = Pool().get('account.move')
- return Move.get_origin()
-
@fields.depends('debit', 'credit', 'amount_second_currency')
def on_change_debit(self):
if self.debit:
@@ -913,99 +997,22 @@
return self.account.party_required
return False
- def get_move_field(self, name):
- field = getattr(self.__class__, name)
- if name.startswith('move_'):
- name = name[5:]
- value = getattr(self.move, name)
- if isinstance(value, ModelSQL):
- if field._type == 'reference':
- return str(value)
- return value.id
- return value
-
@fields.depends('move', '_parent_move.date')
def on_change_with_date(self, name=None):
if self.move:
return self.move.date
- @classmethod
- def set_move_field(cls, lines, name, value):
- if name.startswith('move_'):
- name = name[5:]
- if not value:
- return
- Move = Pool().get('account.move')
- moves = {line.move for line in lines}
- moves = Move.browse(moves)
- with Transaction().set_context(_skip_validate_move=True):
- Move.write(moves, {
- name: value,
- })
-
- @classmethod
- def search_move_field(cls, name, clause):
- nested = clause[0].lstrip(name)
- if name.startswith('move_'):
- name = name[5:]
- return [('move.' + name + nested,) + tuple(clause[1:])]
-
- @classmethod
- def get_move_states(cls):
- pool = Pool()
- Move = pool.get('account.move')
- return Move.fields_get(['state'])['state']['selection']
-
@fields.depends('move', '_parent_move.state')
def on_change_with_move_state(self, name=None):
if self.move:
return self.move.state
- def _order_move_field(name):
- def order_field(tables):
- pool = Pool()
- Move = pool.get('account.move')
- field = Move._fields[name]
- table, _ = tables[None]
- move_tables = tables.get('move')
- if move_tables is None:
- move = Move.__table__()
- move_tables = {
- None: (move, move.id == table.move),
- }
- tables['move'] = move_tables
- return field.convert_order(name, move_tables, Move)
- return staticmethod(order_field)
- order_journal = _order_move_field('journal')
- order_period = _order_move_field('period')
- order_company = _order_move_field('company')
- order_date = _order_move_field('date')
- order_move_origin = _order_move_field('origin')
- order_move_state = _order_move_field('state')
-
- def get_amount(self, name):
- sign = -1 if self.account.type.statement == 'income' else 1
- if self.amount_second_currency is not None:
- return self.amount_second_currency * sign
- else:
- return (self.debit - self.credit) * sign
-
- def get_amount_currency(self, name):
- if self.second_currency:
- currency = self.second_currency
- else:
- currency = self.account.currency
- return currency.id
-
- def get_rec_name(self, name):
- if self.debit > self.credit:
- return self.account.rec_name
- else:
- return '(%s)' % self.account.rec_name
-
- @classmethod
- def search_rec_name(cls, name, clause):
- return [('account.rec_name',) + tuple(clause[1:])]
+ order_journal = MoveLineMixin._order_move_field('journal')
+ order_period = MoveLineMixin._order_move_field('period')
+ order_company = MoveLineMixin._order_move_field('company')
+ order_date = MoveLineMixin._order_move_field('date')
+ order_move_origin = MoveLineMixin._order_move_field('origin')
+ order_move_state = MoveLineMixin._order_move_field('state')
@classmethod
def query_get(cls, table):
diff -r 3555b5d8194c -r 9f4fabb78e30 view/move_form.xml
--- a/view/move_form.xml Mon Oct 11 15:35:46 2021 +0200
+++ b/view/move_form.xml Mon Oct 11 23:21:55 2021 +0200
@@ -21,8 +21,12 @@
<field name="origin" colspan="3"/>
<label name="description"/>
<field name="description" colspan="3"/>
- <field name="lines" colspan="4"
-
view_ids="account.move_line_view_tree_move,account.move_line_view_form_move"/>
+ <notebook>
+ <page name="lines">
+ <field name="lines" colspan="4"
+
view_ids="account.move_line_view_tree_move,account.move_line_view_form_move"/>
+ </page>
+ </notebook>
<label name="state"/>
<field name="state"/>
<button name="post" icon="tryton-ok" colspan="2"/>