110 lines
2.8 KiB
Python
110 lines
2.8 KiB
Python
#!/usr/bin/env python
|
|||
|
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||
|
|
# this repository contains the full copyright notices and license terms.
|
||
|
|
import sys
|
||
|
|
from argparse import ArgumentParser
|
||
|
|
|
||
|
|
from proteus import Model, config
|
||
|
|
|
||
|
|
from trytond.pool import Pool
|
||
|
|
from trytond.transaction import Transaction
|
||
|
|
|
||
|
|
|
||
|
|
def allow_modify_party(database):
|
||
|
|
with Transaction().start(database, 'admin'):
|
||
|
|
pool = Pool()
|
||
|
|
Line = pool.get('account.move.line')
|
||
|
|
Line._check_modify_exclude.add('party')
|
||
|
|
try:
|
||
|
|
Line._reconciliation_modify_disallow.remove('party')
|
||
|
|
except KeyError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
def get_modules():
|
||
|
|
Module = Model.get('ir.module.module')
|
||
|
|
modules = Module.find([
|
||
|
|
('state', '=', 'installed'),
|
||
|
|
])
|
||
|
|
return [m.name for m in modules]
|
||
|
|
|
||
|
|
|
||
|
|
def get_empty_party():
|
||
|
|
Line = Model.get('account.move.line')
|
||
|
|
return Line.find([
|
||
|
|
('party', '=', None),
|
||
|
|
('account.party_required', '=', True),
|
||
|
|
])
|
||
|
|
|
||
|
|
|
||
|
|
def get_party(line, modules):
|
||
|
|
for module, getter in MODULES_PARTY.items():
|
||
|
|
if module not in modules:
|
||
|
|
continue
|
||
|
|
party = getter(line)
|
||
|
|
if party:
|
||
|
|
return party
|
||
|
|
|
||
|
|
|
||
|
|
def get_party_account_invoice(line):
|
||
|
|
Invoice = Model.get('account.invoice')
|
||
|
|
|
||
|
|
if isinstance(line.origin, Invoice):
|
||
|
|
return line.origin.party
|
||
|
|
|
||
|
|
|
||
|
|
def get_party_account_statement(line):
|
||
|
|
Statement = Model.get('account.statement')
|
||
|
|
|
||
|
|
if isinstance(line.origin, Statement):
|
||
|
|
for statement_line in line.origin.lines:
|
||
|
|
if statement_line.move == line.move:
|
||
|
|
return statement_line.party
|
||
|
|
|
||
|
|
MODULES_PARTY = {
|
||
|
|
'account_invoice': get_party_account_invoice,
|
||
|
|
'account_statement': get_party_account_statement,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def get_set_party():
|
||
|
|
Line = Model.get('account.move.line')
|
||
|
|
return Line.find([
|
||
|
|
('party', '!=', None),
|
||
|
|
('account.party_required', '=', False),
|
||
|
|
])
|
||
|
|
|
||
|
|
|
||
|
|
def main(database, config_file=None):
|
||
|
|
config.set_trytond(database, config_file=config_file)
|
||
|
|
|
||
|
|
allow_modify_party(database)
|
||
|
|
|
||
|
|
modules = get_modules()
|
||
|
|
|
||
|
|
Line = Model.get('account.move.line')
|
||
|
|
|
||
|
|
lines = get_empty_party()
|
||
|
|
for line in lines:
|
||
|
|
line.party = get_party(line, modules)
|
||
|
|
if not line.party:
|
||
|
|
print >> sys.stderr, 'Can not fix line: %s' % line.rec_name
|
||
|
|
Line.save(lines)
|
||
|
|
|
||
|
|
lines = get_set_party()
|
||
|
|
for line in lines:
|
||
|
|
line.party = None
|
||
|
|
Line.save(lines)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
parser = ArgumentParser()
|
||
|
|
parser.add_argument('-d', '--database', dest='database')
|
||
|
|
parser.add_argument('-c', '--config', dest='config_file',
|
||
|
|
help='the trytond config file')
|
||
|
|
|
||
|
|
args = parser.parse_args()
|
||
|
|
if not args.database:
|
||
|
|
parser.error('Missing database')
|
||
|
|
main(args.database, args.config_file)
|