diff --git a/statement.py b/statement.py index 699bdea9b9..a44bcc1285 100644 --- a/statement.py +++ b/statement.py @@ -651,6 +651,20 @@ class Statement(Workflow, ModelSQL, ModelView): def reconcile(cls, statements): pass + @classmethod + def copy(cls, statements, default=None): + default = default.copy() if default is not None else {} + new_statements = [] + for origins, sub_statements in groupby( + statements, key=lambda s: bool(s.origins)): + sub_statements = list(sub_statements) + sub_default = default.copy() + if origins: + sub_default.setdefault('lines') + new_statements.extend(super().copy( + statements, default=sub_default)) + return new_statements + def origin_mixin(_states, _depends): class Mixin: @@ -1125,6 +1139,12 @@ class Origin(origin_mixin(_states, _depends), ModelSQL, ModelView): group_by=table.id)) return [('id', 'in', query)] + @classmethod + def copy(cls, origins, default=None): + default = default.copy() if default is not None else {} + default.setdefault('lines') + return super().copy(origins, default=default) + del _states, _depends diff --git a/tests/scenario_statement_origin.rst b/tests/scenario_statement_origin.rst index 5376c82c69..259f180cf2 100644 --- a/tests/scenario_statement_origin.rst +++ b/tests/scenario_statement_origin.rst @@ -98,3 +98,7 @@ Test statement report:: >>> report = Report('account.statement') >>> _ = report.execute([statement], {}) + +Test copy statement:: + + >>> _ = statement.duplicate()