details: https://code.tryton.org/tryton/commit/af492752ec79
branch: default
user: Cédric Krier <[email protected]>
date: Tue Jul 07 19:06:14 2026 +0200
description:
Replace open journal wizard by a context model
Closes #14937
diffstat:
modules/account/CHANGELOG | 1 +
modules/account/doc/design/move.inc.rst | 9 +
modules/account/doc/usage/create.inc.rst | 4 +-
modules/account/journal.xml | 39 +-----
modules/account/move.py | 173 +++++++---------------
modules/account/move.xml | 54 ++++--
modules/account/tryton.cfg | 3 +-
modules/account/view/move_line_context_form.xml | 11 +
modules/account/view/move_line_list_editable.xml | 24 +++
modules/account/view/move_line_tree.xml | 4 +-
modules/account/view/move_line_tree_move.xml | 1 +
modules/account/view/open_journal_ask_form.xml | 12 -
12 files changed, 147 insertions(+), 188 deletions(-)
diffs (537 lines):
diff -r 7f19398f3760 -r af492752ec79 modules/account/CHANGELOG
--- a/modules/account/CHANGELOG Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/CHANGELOG Tue Jul 07 19:06:14 2026 +0200
@@ -1,3 +1,4 @@
+* Replace open journal wizard by a context model
* Use also maturity date to calculate reconciliation date
Version 8.0.0 - 2026-04-20
diff -r 7f19398f3760 -r af492752ec79 modules/account/doc/design/move.inc.rst
--- a/modules/account/doc/design/move.inc.rst Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/doc/design/move.inc.rst Tue Jul 07 19:06:14 2026 +0200
@@ -83,6 +83,15 @@
`Company's <company:model-company.company>` accounts and the accounting reports
generated by Tryton.
+.. seealso::
+
+ Account move lines can be found by opening the main menu item:
+
+ |Financial --> Entries --> Lines|__
+
+ .. |Financial --> Entries --> Lines| replace:: :menuselection:`Financial
--> Entries --> Lines`
+ __ https://demo.tryton.org/model/account.move.line
+
Wizards
-------
diff -r 7f19398f3760 -r af492752ec79 modules/account/doc/usage/create.inc.rst
--- a/modules/account/doc/usage/create.inc.rst Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/doc/usage/create.inc.rst Tue Jul 07 19:06:14 2026 +0200
@@ -36,8 +36,8 @@
For entries that are only needed once, for example to set an account's
initial opening balance, you can manually create an *Account Move*.
-The [:menuselection:`Financial --> Entries --> Open Journal`] main menu item
-provides another way of entering the details of an account move.
+The [:menuselection:`Financial --> Entries --> Lines`] main menu item provides
+another way of entering the details of an account move.
It provides a list of individual
`Account Move Lines <model-account.move.line>`, which can be added to as
required.
diff -r 7f19398f3760 -r af492752ec79 modules/account/journal.xml
--- a/modules/account/journal.xml Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/journal.xml Tue Jul 07 19:06:14 2026 +0200
@@ -112,46 +112,9 @@
<field name="name">journal_period_list_close</field>
</record>
- <record model="ir.action.act_window" id="act_journal_period_tree">
- <field name="name">Journals - Periods</field>
- <field name="res_model">account.journal.period</field>
- <!-- Migration from 7.4: force empty domain for multi company -->
- <field name="domain" eval="None"/>
- </record>
- <record model="ir.action.act_window.view"
id="act_journal_period_tree_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="journal_period_view_tree"/>
- <field name="act_window" ref="act_journal_period_tree"/>
- </record>
- <menuitem
- parent="menu_reporting"
- action="act_journal_period_tree"
- sequence="50"
- id="menu_journal_period_tree"/>
-
- <record model="ir.action.act_window" id="act_journal_period_tree2">
+ <record model="ir.action.act_window"
id="act_journal_period_form_close">
<field name="name">Journals - Periods</field>
<field name="res_model">account.journal.period</field>
- <!-- Migration from 7.4: force empty domain for multi company -->
- <field name="domain" eval="None"/>
- <field name="search_value"
- eval="[('state', '=', 'open')]"
- pyson="1"/>
- </record>
- <record model="ir.action.act_window.view"
id="act_journal_period_tree2_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="journal_period_view_tree"/>
- <field name="act_window" ref="act_journal_period_tree2"/>
- </record>
- <menuitem
- parent="menu_entries"
- action="act_journal_period_tree2"
- sequence="20"
- id="menu_journal_period_tree2"/>
-
- <record model="ir.action.act_window"
id="act_journal_period_form_close">
- <field name="name">Close Journals - Periods</field>
- <field name="res_model">account.journal.period</field>
<field name="search_value"
eval="[('state', '=', 'open')]" pyson="1"/>
</record>
diff -r 7f19398f3760 -r af492752ec79 modules/account/move.py
--- a/modules/account/move.py Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/move.py Tue Jul 07 19:06:14 2026 +0200
@@ -1124,34 +1124,42 @@
})
@classmethod
+ def _last_move_line(cls):
+ "Last move line created by the current user"
+ transaction = Transaction()
+ context = transaction.context
+ domain = [
+ ('company', '=', context.get('company')),
+ ('create_uid', '=', transaction.user),
+ ('state', '=', 'draft'),
+ ]
+ if context.get('journal') is not None:
+ domain.append(('move.journal', '=', context['journal']))
+ if context.get('period') is not None:
+ domain.append(('move.period', '=', context['period']))
+ lines = cls.search(domain, order=[('id', 'DESC')], limit=1)
+ if lines:
+ line, = lines
+ return line
+
+ @classmethod
def default_date(cls):
- '''
- Return the date of the last line for journal, period
- or the starting date of the period
- or today
- '''
pool = Pool()
Period = pool.get('account.period')
Date = pool.get('ir.date')
context = Transaction().context
date = Date.today()
- lines = cls.search([
- ('company', '=', context.get('company')),
- ('journal', '=', context.get('journal')),
- ('period', '=', context.get('period')),
- ],
- order=[('date', 'DESC')], limit=1)
- if lines:
- line, = lines
+ if (context.get('default_last_move_line')
+ and (line := cls._last_move_line())):
date = line.date
- elif context.get('period'):
+ elif context.get('period') is not None:
period = Period(context['period'])
if period.start_date >= date:
date = period.start_date
else:
date = period.end_date
- if context.get('date'):
+ elif context.get('date'):
date = context['date']
return date
@@ -1159,21 +1167,15 @@
def default_move(cls):
transaction = Transaction()
context = transaction.context
- if context.get('journal') and context.get('period'):
- lines = cls.search([
- ('company', '=', context.get('company')),
- ('move.journal', '=', context['journal']),
- ('move.period', '=', context['period']),
- ('create_uid', '=', transaction.user),
- ('state', '=', 'draft'),
- ], order=[('id', 'DESC')], limit=1)
- if lines:
- line, = lines
- return line.move.id
+ if context.get('default_last_move_line'):
+ if line := cls._last_move_line():
+ return line.move
@fields.depends(
'move', 'debit', 'credit',
- '_parent_move.lines', '_parent_move.company')
+ 'company', 'period', 'journal',
+ '_parent_move.lines',
+ '_parent_move.company', '_parent_move.period', '_parent_move.journal')
def on_change_move(self):
if self.move:
if not self.debit and not self.credit:
@@ -1182,11 +1184,21 @@
self.debit = -total if total < 0 else Decimal(0)
self.credit = total if total > 0 else Decimal(0)
self.company = self.move.company
+ self.period = self.move.period
+ self.journal = self.move.journal
@classmethod
def default_company(cls):
return Transaction().context.get('company')
+ @classmethod
+ def default_journal(cls):
+ return Transaction().context.get('journal')
+
+ @classmethod
+ def default_period(cls):
+ return Transaction().context.get('period')
+
@staticmethod
def default_state():
return 'draft'
@@ -1502,6 +1514,10 @@
attributes.append(
('/tree', 'visual',
If(Bool(Eval('reconciliation')), 'muted', '')))
+ else:
+ attributes.append(
+ ('/tree', 'visual',
+ If(Eval('state') != 'valid', 'muted', '')))
return attributes
@classmethod
@@ -1565,13 +1581,10 @@
# Add a wizard entry for each templates
context = Transaction().context
- company = context.get('company')
- journal = context.get('journal')
- period = context.get('period')
- if company and journal and period:
+ if context.get('default_last_move_line'):
templates = Template.search([
- ('company', '=', company),
- ('journal', '=', journal),
+ ('company', '=', context.get('company')),
+ ('journal', '=', context.get('journal')),
])
toolbar = dict(toolbar)
action = list(toolbar['action'])
@@ -1959,15 +1972,16 @@
return Transaction().context.get('company')
-class OpenJournalAsk(ModelView):
- __name__ = 'account.move.open_journal.ask'
+class LineContext(ModelView):
+ __name__ = 'account.move.line.context'
company = fields.Many2One('company.company', "Company", required=True)
journal = fields.Many2One(
- 'account.journal', 'Journal', required=True,
+ 'account.journal', "Journal",
context={
'company': Eval('company', None),
})
- period = fields.Many2One('account.period', 'Period', required=True,
+ period = fields.Many2One(
+ 'account.period', "Period",
domain=[
('company', '=', Eval('company', -1)),
('state', '!=', 'closed'),
@@ -1978,87 +1992,20 @@
return Transaction().context.get('company')
@classmethod
+ def default_journal(cls):
+ return Transaction().context.get('journal')
+
+ @classmethod
def default_period(cls):
pool = Pool()
Period = pool.get('account.period')
- if company := cls.default_company():
+ if period := Transaction().context.get('period'):
+ return period
+ elif company := cls.default_company():
try:
- period = Period.find(company)
+ return Period.find(company)
except PeriodNotFoundError:
- return None
- return period.id
-
-
-class OpenJournal(Wizard):
- __name__ = 'account.move.open_journal'
- _readonly = True
- start = StateTransition()
- ask = StateView('account.move.open_journal.ask',
- 'account.open_journal_ask_view_form', [
- Button('Cancel', 'end', 'tryton-cancel'),
- Button('Open', 'open_', 'tryton-ok', default=True),
- ])
- open_ = StateAction('account.act_move_line_form')
-
- def transition_start(self):
- if (self.model
- and self.model.__name__ == 'account.journal.period'
- and self.record):
- return 'open_'
- return 'ask'
-
- def default_ask(self, fields):
- if (self.model
- and self.model.__name__ == 'account.journal.period'
- and self.record):
- return {
- 'company': self.record.company.id,
- 'journal': self.record.journal.id,
- 'period': self.record.period.id,
- }
- return {}
-
- def do_open_(self, action):
- JournalPeriod = Pool().get('account.journal.period')
-
- if (self.model
- and self.model.__name__ == 'account.journal.period'
- and self.record):
- journal = self.record.journal
- period = self.record.period
- else:
- journal = self.ask.journal
- period = self.ask.period
- journal_periods = JournalPeriod.search([
- ('journal', '=', journal.id),
- ('period', '=', period.id),
- ], limit=1)
- if not journal_periods:
- with Transaction().new_transaction():
- journal_period, = JournalPeriod.create([{
- 'journal': journal.id,
- 'period': period.id,
- }])
- name = journal_period.rec_name
- else:
- journal_period, = journal_periods
- name = journal_period.rec_name
-
- action['name'] += ' (%s)' % name
- action['pyson_domain'] = PYSONEncoder().encode([
- ('journal', '=', journal.id),
- ('period', '=', period.id),
- ('company', '=', period.company.id),
- ])
- action['pyson_context'] = PYSONEncoder().encode({
- 'journal': journal.id,
- 'period': period.id,
- 'company': period.company.id,
- })
- return action, {}
-
- def transition_open_(self):
- return 'end'
+ pass
class OpenAccount(Wizard):
diff -r 7f19398f3760 -r af492752ec79 modules/account/move.xml
--- a/modules/account/move.xml Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/move.xml Tue Jul 07 19:06:14 2026 +0200
@@ -191,6 +191,13 @@
<field name="name">move_line_tree</field>
</record>
+ <record model="ir.ui.view" id="move_line_view_list_editable">
+ <field name="model">account.move.line</field>
+ <field name="type">tree</field>
+ <field name="priority" eval="20"/>
+ <field name="name">move_line_list_editable</field>
+ </record>
+
<record model="ir.ui.view" id="move_line_view_tree_move">
<field name="model">account.move.line</field>
<field name="type">tree</field>
@@ -230,6 +237,31 @@
<field name="view" ref="move_line_view_form"/>
<field name="act_window" ref="act_move_line_form"/>
</record>
+
+ <record model="ir.action.act_window" id="act_move_line_form_editable">
+ <field name="name">Lines</field>
+ <field name="res_model">account.move.line</field>
+ <field name="context_model">account.move.line.context</field>
+ <field name="context_domain" eval="[('company', '=',
Eval('company', -1)), If(Eval('journal', None) != None, ('journal', '=',
Eval('journal', -1)), ()), If(Eval('period', None) != None, ('period', '=',
Eval('period', -1)), ())]" pyson="1"/>
+ <field name="context" eval="{'default_last_move_line': True}"
pyson="1"/>
+ </record>
+ <record model="ir.action.act_window.view"
id="act_move_line_form_editable_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="move_line_view_list_editable"/>
+ <field name="act_window" ref="act_move_line_form_editable"/>
+ </record>
+ <record model="ir.action.act_window.view"
id="act_move_line_form_editable_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="move_line_view_form"/>
+ <field name="act_window" ref="act_move_line_form_editable"/>
+ </record>
+
+ <menuitem
+ parent="menu_entries"
+ action="act_move_line_form_editable"
+ sequence="30"
+ id="menu_move_line_form_editable"/>
+
<record model="ir.action.wizard" id="act_open_account">
<field name="name">Open Move Account</field>
<field name="wiz_name">account.move.open_account</field>
@@ -282,27 +314,11 @@
<field
name="name">move_line_receivable_payable_context_form</field>
</record>
- <record model="ir.ui.view" id="open_journal_ask_view_form">
- <field name="model">account.move.open_journal.ask</field>
+ <record model="ir.ui.view" id="move_line_context_view_form">
+ <field name="model">account.move.line.context</field>
<field name="type">form</field>
- <field name="name">open_journal_ask_form</field>
- </record>
-
- <record model="ir.action.wizard" id="act_open_journal">
- <field name="name">Open Journal</field>
- <field name="wiz_name">account.move.open_journal</field>
+ <field name="name">move_line_context_form</field>
</record>
- <record model="ir.action.keyword" id="act_open_journal_keyword">
- <field name="keyword">tree_open</field>
- <field name="model">account.journal.period,-1</field>
- <field name="action" ref="act_open_journal"/>
- </record>
- <menuitem
- parent="menu_entries"
- action="act_open_journal"
- sequence="20"
- id="menu_open_journal"
- icon="tryton-list"/>
<record model="ir.ui.view" id="reconcile_lines_writeoff_view_form">
<field name="model">account.move.reconcile_lines.writeoff</field>
diff -r 7f19398f3760 -r af492752ec79 modules/account/tryton.cfg
--- a/modules/account/tryton.cfg Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/tryton.cfg Tue Jul 07 19:06:14 2026 +0200
@@ -69,7 +69,7 @@
move.Line
move.LineReceivablePayableContext
move.WriteOff
- move.OpenJournalAsk
+ move.LineContext
move.ReconcileLinesWriteOff
move.ReconcileStart
move.ReconcileShow
@@ -110,7 +110,6 @@
account.CreateChart
account.UpdateChart
account.OpenGeneralLedgerAccountParty
- move.OpenJournal
move.OpenAccount
move.ReconcileLines
move.UnreconcileLines
diff -r 7f19398f3760 -r af492752ec79
modules/account/view/move_line_context_form.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/account/view/move_line_context_form.xml Tue Jul 07 19:06:14
2026 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form col="6">
+ <label name="company"/>
+ <field name="company"/>
+ <label name="period"/>
+ <field name="period"/>
+ <label name="journal"/>
+ <field name="journal" widget="selection"/>
+</form>
diff -r 7f19398f3760 -r af492752ec79
modules/account/view/move_line_list_editable.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/account/view/move_line_list_editable.xml Tue Jul 07 19:06:14
2026 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree editable="1" on_write="on_written">
+ <field name="period" optional="1"/>
+ <field name="journal" optional="0"/>
+ <field name="date"/>
+ <field name="account" expand="1"/>
+ <field name="party" expand="1"/>
+ <field name="debit" sum="1"/>
+ <field name="credit" sum="1"/>
+ <field name="amount_second_currency" symbol="" optional="1"/>
+ <field name="second_currency" optional="1"/>
+ <field name="delegated_amount" optional="1"/>
+ <field name="tax_lines" optional="1"/>
+ <field name="move_description_used" expand="1" optional="1"/>
+ <field name="description_used" expand="1" optional="1"/>
+ <field name="reconciliation" optional="1"/>
+ <field name="origin" expand="1" optional="1"/>
+ <field name="move"/>
+ <field name="move_origin" expand="1" optional="1"/>
+ <field name="move_state" optional="0"/>
+ <field name="state" tree_invisible="1"/>
+</tree>
diff -r 7f19398f3760 -r af492752ec79 modules/account/view/move_line_tree.xml
--- a/modules/account/view/move_line_tree.xml Mon Jul 27 10:39:01 2026 +0200
+++ b/modules/account/view/move_line_tree.xml Tue Jul 07 19:06:14 2026 +0200
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
-<tree editable="1" on_write="on_written">
+<tree>
<field name="company" expand="1" optional="1"/>
<field name="move"/>
<field name="move_origin" expand="1" optional="1"/>
@@ -18,6 +18,6 @@
<field name="move_description_used" expand="1" optional="1"/>
<field name="description_used" expand="1" optional="1"/>
<field name="reconciliation" optional="1"/>
- <field name="state"/>
<field name="move_state" optional="0"/>
+ <field name="state" tree_invisible="1"/>
</tree>
diff -r 7f19398f3760 -r af492752ec79
modules/account/view/move_line_tree_move.xml
--- a/modules/account/view/move_line_tree_move.xml Mon Jul 27 10:39:01
2026 +0200
+++ b/modules/account/view/move_line_tree_move.xml Tue Jul 07 19:06:14
2026 +0200
@@ -12,4 +12,5 @@
<field name="tax_lines" optional="1"/>
<field name="description_used" expand="1" optional="1"/>
<field name="reconciliation" optional="1"/>
+ <field name="state" tree_invisible="1"/>
</tree>
diff -r 7f19398f3760 -r af492752ec79
modules/account/view/open_journal_ask_form.xml
--- a/modules/account/view/open_journal_ask_form.xml Mon Jul 27 10:39:01
2026 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
-this repository contains the full copyright notices and license terms. -->
-<form cursor="journal">
- <label name="company"/>
- <field name="company"/>
- <label name="period"/>
- <field name="period"/>
-
- <label name="journal"/>
- <field name="journal" widget="selection"/>
-</form>