Skip to content

Commit 09d860b

Browse files
pedrobaezasbejaoui
authored andcommitted
[FIX+IMP+MIG] contract: Several refinements:
* Remove incorrect oldname attributes. * Add filter on partners for running contracts (+ a support o2m field for that). * Cover more tables in model renaming + cleaner code using a loop. * Don't copy contract lines, but rename table + copy contract records on pre. * Contract code is now populated to "Reference/Description" field in invoice. * Order on new contract model has been restored to the same as old analytic accounts.
1 parent d93139d commit 09d860b

File tree

8 files changed

+122
-268
lines changed

8 files changed

+122
-268
lines changed

contract/migrations/12.0.4.0.0/post-migration.py

Lines changed: 0 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -8,164 +8,6 @@
88

99
_logger = logging.getLogger(__name__)
1010

11-
CONTRACT_FIELDS = [
12-
'id',
13-
'name',
14-
'partner_id',
15-
'pricelist_id',
16-
'contract_type',
17-
'journal_id',
18-
'company_id',
19-
'active',
20-
'code',
21-
'group_id',
22-
'contract_template_id',
23-
'user_id',
24-
'recurring_next_date',
25-
'date_end',
26-
'message_main_attachment_id',
27-
'create_uid',
28-
'create_date',
29-
'write_uid',
30-
'write_date',
31-
'payment_term_id',
32-
'fiscal_position_id',
33-
'invoice_partner_id',
34-
]
35-
36-
CONTRACT_LINE_FIELDS = [
37-
'id',
38-
'product_id',
39-
'name',
40-
'quantity',
41-
'uom_id',
42-
'automatic_price',
43-
'specific_price',
44-
'discount',
45-
'recurring_rule_type',
46-
'recurring_invoicing_type',
47-
'recurring_interval',
48-
'sequence',
49-
'date_start',
50-
'date_end',
51-
'recurring_next_date',
52-
'last_date_invoiced',
53-
'termination_notice_date',
54-
'successor_contract_line_id',
55-
'predecessor_contract_line_id',
56-
'manual_renew_needed',
57-
'create_uid',
58-
'create_date',
59-
'write_uid',
60-
'write_date',
61-
]
62-
63-
64-
def _get_contract_field_name(cr):
65-
"""
66-
Contract field changed the name from analytic_account_id to contract_id
67-
in 12.0.2.0.0. This method used to get the contract field name in
68-
account_analytic_invoice_line"""
69-
return (
70-
'contract_id'
71-
if openupgrade.column_exists(
72-
cr, 'account_analytic_invoice_line', 'contract_id'
73-
)
74-
else 'analytic_account_id'
75-
)
76-
77-
78-
def _copy_contract_table(cr):
79-
contract_fields = []
80-
for field in CONTRACT_FIELDS:
81-
if openupgrade.column_exists(cr, 'account_analytic_account', field):
82-
contract_fields.append(field)
83-
contract_field_name = _get_contract_field_name(cr)
84-
openupgrade.logged_query(
85-
cr,
86-
"INSERT INTO contract_contract ("
87-
+ ', '.join(contract_fields)
88-
+ ") "
89-
+ "SELECT "
90-
+ ', '.join(contract_fields)
91-
+ " FROM account_analytic_account "
92-
+ "WHERE id in ( SELECT DISTINCT "
93-
+ contract_field_name
94-
+ " FROM "
95-
+ "account_analytic_invoice_line)",
96-
)
97-
if openupgrade.column_exists(cr, 'account_invoice', 'old_contract_id_tmp'):
98-
openupgrade.logged_query(
99-
cr,
100-
"""
101-
UPDATE account_invoice
102-
SET old_contract_id = old_contract_id_tmp
103-
""",
104-
)
105-
106-
# Move contract attachments
107-
openupgrade.logged_query(
108-
cr,
109-
"UPDATE ir_attachment SET res_model='contract.contract'"
110-
+ "WHERE res_model='account.analytic.account' "
111-
+ "AND res_id IN ( SELECT DISTINCT "
112-
+ contract_field_name
113-
+ " FROM account_analytic_invoice_line)",
114-
)
115-
# Move contract messages
116-
openupgrade.logged_query(
117-
cr,
118-
"UPDATE mail_message SET model='contract.contract'"
119-
+ "WHERE model='account.analytic.account' "
120-
+ "AND res_id IN ( SELECT DISTINCT "
121-
+ contract_field_name
122-
+ " FROM account_analytic_invoice_line)",
123-
)
124-
# Move contract followers
125-
openupgrade.logged_query(
126-
cr,
127-
"UPDATE mail_followers SET res_model='contract.contract'"
128-
+ "WHERE res_model='account.analytic.account' "
129-
+ "AND res_id IN ( SELECT DISTINCT "
130-
+ contract_field_name
131-
+ " FROM account_analytic_invoice_line)",
132-
)
133-
134-
135-
def _copy_contract_line_table(cr):
136-
contract_line_fields = []
137-
contract_field_name = _get_contract_field_name(cr)
138-
for field in CONTRACT_LINE_FIELDS:
139-
if openupgrade.column_exists(
140-
cr, 'account_analytic_invoice_line', field
141-
):
142-
contract_line_fields.append(field)
143-
account_analytic_invoice_line_fields = contract_line_fields.copy()
144-
contract_line_fields.append('contract_id')
145-
account_analytic_invoice_line_fields.append(contract_field_name)
146-
contract_line_fields.append('analytic_account_id')
147-
account_analytic_invoice_line_fields.append(contract_field_name)
148-
contract_line_fields.append('active')
149-
account_analytic_invoice_line_fields.append('true')
150-
151-
openupgrade.logged_query(
152-
cr,
153-
"INSERT INTO contract_line ("
154-
+ ', '.join(contract_line_fields)
155-
+ ") "
156-
+ "SELECT "
157-
+ ', '.join(account_analytic_invoice_line_fields)
158-
+ " FROM account_analytic_invoice_line ",
159-
)
160-
161-
openupgrade.logged_query(
162-
cr,
163-
"""
164-
UPDATE account_invoice_line
165-
SET contract_line_id = contract_line_id_tmp
166-
""",
167-
)
168-
16911

17012
def _update_no_update_ir_cron(env):
17113
# Update ir.cron
@@ -196,12 +38,7 @@ def _init_invoicing_partner_id_on_contracts(env):
19638

19739
@openupgrade.migrate()
19840
def migrate(env, version):
199-
cr = env.cr
200-
201-
_copy_contract_table(cr)
202-
_copy_contract_line_table(cr)
20341
_update_no_update_ir_cron(env)
204-
20542
if parse_version(version) < parse_version('12.0.2.0.0'):
20643
# We check the version here as this post-migration script was in
20744
# 12.0.2.0.0 and already done for those who used the module when
Lines changed: 97 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,113 @@
11
# Copyright 2019 ACSONE SA/NV
2+
# Copyright 2019 Tecnativa 2019 - Pedro M. Baeza
23
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
34

45
import logging
56

67
from openupgradelib import openupgrade
8+
from psycopg2 import sql
79

810
_logger = logging.getLogger(__name__)
911

12+
models_to_rename = [
13+
# Contract Line Wizard
14+
('account.analytic.invoice.line.wizard', 'contract.line.wizard'),
15+
# Abstract Contract
16+
('account.abstract.analytic.contract', 'contract.abstract.contract'),
17+
# Abstract Contract Line
18+
(
19+
'account.abstract.analytic.contract.line',
20+
'contract.abstract.contract.line',
21+
),
22+
# Contract Line
23+
('account.analytic.invoice.line', 'contract.line'),
24+
# Contract Template
25+
('account.analytic.contract', 'contract.template'),
26+
# Contract Template Line
27+
('account.analytic.contract.line', 'contract.template.line'),
28+
]
29+
tables_to_rename = [
30+
# Contract Line
31+
('account_analytic_invoice_line', 'contract_line'),
32+
# Contract Template
33+
('account_analytic_contract', 'contract_template'),
34+
# Contract Template Line
35+
('account_analytic_contract_line', 'contract_template_line'),
36+
]
37+
columns_to_copy = {
38+
'contract_line': [
39+
('analytic_account_id', 'contract_id', None),
40+
],
41+
}
42+
xmlids_to_rename = [
43+
(
44+
'contract.account_analytic_cron_for_invoice',
45+
'contract.contract_cron_for_invoice',
46+
),
47+
(
48+
'contract.account_analytic_contract_manager',
49+
'contract.contract_template_manager',
50+
),
51+
(
52+
'contract.account_analytic_contract_user',
53+
'contract.contract_template_user',
54+
),
55+
(
56+
'contract.account_analytic_invoice_line_manager',
57+
'contract.contract_line_manager',
58+
),
59+
(
60+
'contract.account_analytic_invoice_line_user',
61+
'contract.contract_line_user',
62+
),
63+
(
64+
'contract.account_analytic_contract_line_manager',
65+
'contract.contract_template_line_manager',
66+
),
67+
(
68+
'contract.account_analytic_contract_line_user',
69+
'contract.contract_template_line_user',
70+
),
71+
]
72+
73+
74+
def _get_contract_field_name(cr):
75+
"""
76+
Contract field changed the name from analytic_account_id to contract_id
77+
in 12.0.2.0.0. This method used to get the contract field name in
78+
account_analytic_invoice_line"""
79+
return (
80+
'contract_id'
81+
if openupgrade.column_exists(
82+
cr, 'account_analytic_invoice_line', 'contract_id'
83+
)
84+
else 'analytic_account_id'
85+
)
86+
87+
88+
def create_contract_records(cr):
89+
contract_field_name = _get_contract_field_name(cr)
90+
openupgrade.logged_query(
91+
cr, """
92+
CREATE TABLE contract_contract
93+
(LIKE account_analytic_account INCLUDING ALL)""",
94+
)
95+
openupgrade.logged_query(
96+
cr, sql.SQL("""
97+
INSERT INTO contract_contract
98+
SELECT * FROM account_analytic_account
99+
WHERE id IN (SELECT DISTINCT {} FROM contract_line)
100+
""").format(
101+
sql.Identifier(contract_field_name),
102+
),
103+
)
104+
10105

11106
@openupgrade.migrate()
12107
def migrate(env, version):
13-
_logger.info(">> Pre-Migration 12.0.4.0.0")
14108
cr = env.cr
15-
16-
models_to_rename = [
17-
# Contract Line Wizard
18-
('account.analytic.invoice.line.wizard', 'contract.line.wizard'),
19-
# Abstract Contract
20-
('account.abstract.analytic.contract', 'contract.abstract.contract'),
21-
# Abstract Contract Line
22-
(
23-
'account.abstract.analytic.contract.line',
24-
'contract.abstract.contract.line',
25-
),
26-
# Contract Line
27-
('account.analytic.invoice.line', 'contract.line'),
28-
# Contract Template
29-
('account.analytic.contract', 'contract.template'),
30-
# Contract Template Line
31-
('account.analytic.contract.line', 'contract.template.line'),
32-
]
33-
tables_to_rename = [
34-
# Contract Template
35-
('account_analytic_contract', 'contract_template'),
36-
# Contract Template Line
37-
('account_analytic_contract_line', 'contract_template_line'),
38-
]
39-
xmlids_to_rename = [
40-
(
41-
'contract.account_analytic_cron_for_invoice',
42-
'contract.contract_cron_for_invoice',
43-
),
44-
(
45-
'contract.account_analytic_contract_manager',
46-
'contract.contract_template_manager',
47-
),
48-
(
49-
'contract.account_analytic_contract_user',
50-
'contract.contract_template_user',
51-
),
52-
(
53-
'contract.account_analytic_invoice_line_manager',
54-
'contract.contract_line_manager',
55-
),
56-
(
57-
'contract.account_analytic_invoice_line_user',
58-
'contract.contract_line_user',
59-
),
60-
(
61-
'contract.account_analytic_contract_line_manager',
62-
'contract.contract_template_line_manager',
63-
),
64-
(
65-
'contract.account_analytic_contract_line_user',
66-
'contract.contract_template_line_user',
67-
),
68-
]
69109
openupgrade.rename_models(cr, models_to_rename)
70110
openupgrade.rename_tables(cr, tables_to_rename)
71111
openupgrade.rename_xmlids(cr, xmlids_to_rename)
72-
# A temporary column is needed to avoid breaking the foreign key constraint
73-
# The temporary column is dropped in the post-migration script
74-
openupgrade.logged_query(
75-
cr,
76-
"""
77-
ALTER TABLE account_invoice_line
78-
ADD COLUMN contract_line_id_tmp INTEGER
79-
""",
80-
)
81-
if openupgrade.column_exists(
82-
cr, 'account_invoice_line', 'contract_line_id'
83-
):
84-
openupgrade.logged_query(
85-
cr,
86-
"""
87-
UPDATE account_invoice_line
88-
SET contract_line_id_tmp = contract_line_id
89-
""",
90-
)
91-
openupgrade.logged_query(
92-
cr,
93-
"""
94-
UPDATE account_invoice_line SET contract_line_id = NULL
95-
""",
96-
)
97-
if not openupgrade.column_exists(
98-
cr, 'account_invoice', 'old_contract_id'
99-
):
100-
openupgrade.logged_query(
101-
cr,
102-
"""
103-
ALTER TABLE account_invoice
104-
ADD COLUMN old_contract_id_tmp INTEGER
105-
""",
106-
)
107-
openupgrade.logged_query(
108-
cr,
109-
"""
110-
UPDATE account_invoice
111-
SET old_contract_id_tmp = contract_id
112-
""",
113-
)
112+
openupgrade.copy_columns(cr, columns_to_copy)
113+
create_contract_records(cr)

contract/models/abstract_contract_line.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ class ContractAbstractContractLine(models.AbstractModel):
113113
comodel_name='contract.abstract.contract',
114114
required=True,
115115
ondelete='cascade',
116-
oldname='analytic_account_id',
117116
)
118117

119118
@api.depends(

0 commit comments

Comments
 (0)