Skip to content

Commit dbb7c5b

Browse files
Ernesto Tejedaschhatbar-initos
Ernesto Tejeda
authored andcommitted
[IMP] chained_swapper: black, isort, prettier
1 parent 58b7452 commit dbb7c5b

8 files changed

+285
-239
lines changed

chained_swapper/__manifest__.py

+14-16
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
# Copyright 2020 Tecnativa - Ernesto Tejeda
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33
{
4-
'name': 'Chained Swapper',
5-
'summary': 'Chained Swapper',
6-
'version': '12.0.1.0.1',
7-
'author': 'Tecnativa, Odoo Community Association (OCA)',
8-
'category': 'Tools',
9-
'website': 'https://github.com/OCA/server-ux',
10-
'license': 'AGPL-3',
11-
'depends': ['base'],
12-
'data': [
13-
'security/ir.model.access.csv',
14-
'views/chained_swapper_views.xml',
15-
'wizard/chained_swapper_wizard_views.xml',
4+
"name": "Chained Swapper",
5+
"summary": "Chained Swapper",
6+
"version": "12.0.1.0.1",
7+
"author": "Tecnativa, Odoo Community Association (OCA)",
8+
"category": "Tools",
9+
"website": "https://github.com/OCA/server-ux",
10+
"license": "AGPL-3",
11+
"depends": ["base"],
12+
"data": [
13+
"security/ir.model.access.csv",
14+
"views/chained_swapper_views.xml",
15+
"wizard/chained_swapper_wizard_views.xml",
1616
],
17-
"demo": [
18-
"demo/chained_swapper_demo.xml",
19-
],
20-
'uninstall_hook': 'uninstall_hook',
17+
"demo": ["demo/chained_swapper_demo.xml",],
18+
"uninstall_hook": "uninstall_hook",
2119
}
+19-14
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version="1.0" encoding="UTF-8" ?>
22
<!-- Copyright 2020 Tecnativa - Ernesto Tejeda
33
Copyright 2020 Tecnativa - Pedro M. Baeza
44
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
55
<odoo noupdate="1">
66
<!--Add a chained swapper-->
77
<record id="chained_swapper_demo" model="chained.swapper">
88
<field name="name">Language</field>
9-
<field name="model_id" ref="base.model_res_partner"/>
10-
<field name="field_id" ref="base.field_res_partner__lang"/>
9+
<field name="model_id" ref="base.model_res_partner" />
10+
<field name="field_id" ref="base.field_res_partner__lang" />
1111
</record>
1212
<record id="chained_swapper_sub_field_demo" model="chained.swapper.sub.field">
13-
<field name="chained_swapper_id" ref="chained_swapper_demo"/>
13+
<field name="chained_swapper_id" ref="chained_swapper_demo" />
1414
<field name="sub_field_chain">child_ids.lang</field>
1515
</record>
1616
<record id="chained_swapper_constraint_demo" model="chained.swapper.constraint">
17-
<field name="chained_swapper_id" ref="chained_swapper_demo"/>
17+
<field name="chained_swapper_id" ref="chained_swapper_demo" />
1818
<field name="name">Only parent company</field>
1919
<field name="expression">bool(records.mapped('parent_id'))</field>
2020
</record>
2121
<!--Add an action-->
22-
<act_window id="partner_chained_swap_lang_action_demo"
23-
name="Chained swap: Language"
24-
res_model="chained.swapper.wizard"
25-
src_model="res.partner"
26-
view_mode="form"
27-
context="{'chained_swapper_id': ref('chained_swapper_demo')}"
28-
key2="client_action_multi"
29-
target="new"/>
22+
<act_window
23+
id="partner_chained_swap_lang_action_demo"
24+
name="Chained swap: Language"
25+
res_model="chained.swapper.wizard"
26+
src_model="res.partner"
27+
view_mode="form"
28+
context="{'chained_swapper_id': ref('chained_swapper_demo')}"
29+
key2="client_action_multi"
30+
target="new"
31+
/>
3032
<record id="chained_swapper_demo" model="chained.swapper">
31-
<field name="ref_ir_act_window_id" ref="partner_chained_swap_lang_action_demo"/>
33+
<field
34+
name="ref_ir_act_window_id"
35+
ref="partner_chained_swap_lang_action_demo"
36+
/>
3237
</record>
3338
</odoo>

chained_swapper/hooks.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# Copyright 2020 Tecnativa - Ernesto Tejeda
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33

4-
from odoo.api import Environment, SUPERUSER_ID
4+
from odoo.api import SUPERUSER_ID, Environment
55

66

77
def uninstall_hook(cr, registry):
88
"""Delete the actions that were created with chained_swapper when
99
the module is uninstalled"""
1010
env = Environment(cr, SUPERUSER_ID, {})
11-
env['ir.actions.act_window'].search([
12-
('res_model', '=', 'chained.swapper.wizard')
13-
]).unlink()
11+
env["ir.actions.act_window"].search(
12+
[("res_model", "=", "chained.swapper.wizard")]
13+
).unlink()
1414
return True

chained_swapper/models/chained_swapper.py

+79-75
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,45 @@
22
# Copyright 2020 Tecnativa - Pedro M. Baeza
33
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
44

5-
from odoo import api, exceptions, fields, models, _
5+
from odoo import _, api, exceptions, fields, models
66
from odoo.tools.safe_eval import safe_eval
77

88

99
class ChainedSwapper(models.Model):
1010
_name = "chained.swapper"
1111
_description = "Chained Swapper"
1212

13-
name = fields.Char(
14-
required=True,
15-
translate=True,
16-
index=1,
17-
)
13+
name = fields.Char(required=True, translate=True, index=1,)
1814
model_id = fields.Many2one(
19-
comodel_name='ir.model',
15+
comodel_name="ir.model",
2016
required=True,
2117
help="Model is used for Selecting Field. This is editable "
22-
"until Contextual Action is not created.",
18+
"until Contextual Action is not created.",
2319
)
2420
allowed_field_ids = fields.Many2many(
25-
comodel_name='ir.model.fields',
26-
compute='_compute_allowed_field_ids'
21+
comodel_name="ir.model.fields", compute="_compute_allowed_field_ids"
2722
)
2823
field_id = fields.Many2one(
29-
comodel_name='ir.model.fields',
24+
comodel_name="ir.model.fields",
3025
required=True,
3126
domain="[('id', 'in', allowed_field_ids)]",
3227
)
3328
sub_field_ids = fields.One2many(
34-
comodel_name='chained.swapper.sub.field',
35-
inverse_name='chained_swapper_id',
36-
string='Sub-fields',
29+
comodel_name="chained.swapper.sub.field",
30+
inverse_name="chained_swapper_id",
31+
string="Sub-fields",
3732
)
3833
constraint_ids = fields.One2many(
39-
comodel_name='chained.swapper.constraint',
40-
inverse_name='chained_swapper_id',
41-
string='Constraints',
34+
comodel_name="chained.swapper.constraint",
35+
inverse_name="chained_swapper_id",
36+
string="Constraints",
4237
)
4338
ref_ir_act_window_id = fields.Many2one(
44-
comodel_name='ir.actions.act_window',
45-
string='Action',
39+
comodel_name="ir.actions.act_window",
40+
string="Action",
4641
readonly=True,
4742
help="Action to make this template available on records "
48-
"of the related document model.",
43+
"of the related document model.",
4944
)
5045
group_ids = fields.Many2many(
5146
comodel_name="res.groups",
@@ -56,39 +51,44 @@ class ChainedSwapper(models.Model):
5651
)
5752

5853
_sql_constraints = [
59-
('model_id_field_id_unique', 'unique (model_id, field_id)',
60-
'Model and Field must be unique!'),
54+
(
55+
"model_id_field_id_unique",
56+
"unique (model_id, field_id)",
57+
"Model and Field must be unique!",
58+
),
6159
]
6260

63-
@api.depends('model_id')
61+
@api.depends("model_id")
6462
def _compute_allowed_field_ids(self):
65-
model_obj = self.env['ir.model']
66-
field_obj = self.env['ir.model.fields']
63+
model_obj = self.env["ir.model"]
64+
field_obj = self.env["ir.model.fields"]
6765
for record in self:
6866
allowed_field_ids = False
6967
if record.model_id:
7068
all_models = record.model_id
7169
active_model_obj = self.env[record.model_id.model]
7270
if active_model_obj._inherits:
7371
keys = list(active_model_obj._inherits.keys())
74-
all_models |= model_obj.search([('model', 'in', keys)])
75-
allowed_field_ids = field_obj.search([
76-
('ttype', 'not in', ['reference', 'function', 'one2many']),
77-
('model_id', 'in', all_models.ids),
78-
])
72+
all_models |= model_obj.search([("model", "in", keys)])
73+
allowed_field_ids = field_obj.search(
74+
[
75+
("ttype", "not in", ["reference", "function", "one2many"]),
76+
("model_id", "in", all_models.ids),
77+
]
78+
)
7979
record.allowed_field_ids = allowed_field_ids
8080

81-
@api.constrains('model_id', 'field_id')
81+
@api.constrains("model_id", "field_id")
8282
def _check_sub_field_ids(self):
83-
self.mapped('sub_field_ids')._check_sub_field_chain()
83+
self.mapped("sub_field_ids")._check_sub_field_chain()
8484

85-
@api.onchange('model_id')
85+
@api.onchange("model_id")
8686
def _onchange_model_id(self):
8787
self.field_id = False
8888

8989
def write(self, vals):
9090
res = super().write(vals)
91-
if 'name' in vals:
91+
if "name" in vals:
9292
self.mapped("ref_ir_act_window_id").write({"name": vals["name"]})
9393
return res
9494

@@ -100,25 +100,27 @@ def unlink(self):
100100
@api.multi
101101
def add_action(self):
102102
self.ensure_one()
103-
action = self.env['ir.actions.act_window'].create({
104-
'name': _("Chained swap") + ": " + self.name,
105-
'type': 'ir.actions.act_window',
106-
'res_model': 'chained.swapper.wizard',
107-
'src_model': self.model_id.model,
108-
'groups_id': [(4, x.id) for x in self.group_ids],
109-
'view_type': 'form',
110-
'context': "{'chained_swapper_id': %d}" % (self.id),
111-
'view_mode': 'form',
112-
'target': 'new',
113-
'binding_model_id': self.model_id.id,
114-
'binding_type': 'action',
115-
})
116-
self.write({'ref_ir_act_window_id': action.id})
103+
action = self.env["ir.actions.act_window"].create(
104+
{
105+
"name": _("Chained swap") + ": " + self.name,
106+
"type": "ir.actions.act_window",
107+
"res_model": "chained.swapper.wizard",
108+
"src_model": self.model_id.model,
109+
"groups_id": [(4, x.id) for x in self.group_ids],
110+
"view_type": "form",
111+
"context": "{'chained_swapper_id': %d}" % (self.id),
112+
"view_mode": "form",
113+
"target": "new",
114+
"binding_model_id": self.model_id.id,
115+
"binding_type": "action",
116+
}
117+
)
118+
self.write({"ref_ir_act_window_id": action.id})
117119
return True
118120

119121
@api.multi
120122
def unlink_action(self):
121-
self.mapped('ref_ir_act_window_id').unlink()
123+
self.mapped("ref_ir_act_window_id").unlink()
122124
return True
123125

124126

@@ -127,59 +129,61 @@ class ChainedSwapperSubField(models.Model):
127129
_description = "Chained Swapper Sub-field"
128130

129131
chained_swapper_id = fields.Many2one(
130-
comodel_name='chained.swapper', ondelete="cascade"
132+
comodel_name="chained.swapper", ondelete="cascade"
131133
)
132134
sub_field_chain = fields.Char(
133135
required=True,
134136
help="You can specify here a field of related fields as "
135-
"dotted names. Ex.: 'child_ids.lang'."
137+
"dotted names. Ex.: 'child_ids.lang'.",
136138
)
137139

138-
@api.constrains('chained_swapper_id', 'sub_field_chain')
140+
@api.constrains("chained_swapper_id", "sub_field_chain")
139141
def _check_sub_field_chain(self):
140142
for rec in self:
141143
# Check sub-field exist
142144
try:
143-
chain_list = rec.sub_field_chain.split('.')
145+
chain_list = rec.sub_field_chain.split(".")
144146
chain_field_name = chain_list.pop()
145147
chain_model = self.env[rec.chained_swapper_id.model_id.model]
146148
for name in chain_list:
147149
chain_model = chain_model[name]
148150
chain_model[chain_field_name] # pylint: disable=W0104
149151
except KeyError:
150152
raise exceptions.ValidationError(
151-
_("Incorrect sub-field expression:") + " " +
152-
rec.sub_field_chain)
153+
_("Incorrect sub-field expression:") + " " + rec.sub_field_chain
154+
)
153155
# Check sub-field and original field are the same type
154156
swap_field = rec.chained_swapper_id.field_id
155-
chain_field = self.env['ir.model.fields'].search([
156-
('model_id', '=', rec.chained_swapper_id.model_id.id),
157-
('name', '=', chain_field_name),
158-
])
159-
if (chain_field.ttype != swap_field.ttype or
160-
chain_field.relation != swap_field.relation):
157+
chain_field = self.env["ir.model.fields"].search(
158+
[
159+
("model_id", "=", rec.chained_swapper_id.model_id.id),
160+
("name", "=", chain_field_name),
161+
]
162+
)
163+
if (
164+
chain_field.ttype != swap_field.ttype
165+
or chain_field.relation != swap_field.relation
166+
):
161167
raise exceptions.ValidationError(
162-
_("The sub-field '%s' is not compatible with the main"
163-
" field.") % rec.sub_field_chain)
168+
_("The sub-field '%s' is not compatible with the main" " field.")
169+
% rec.sub_field_chain
170+
)
164171

165172

166173
class ChainedSwapperConstraint(models.Model):
167174
_name = "chained.swapper.constraint"
168175
_description = "Chained Swapper Constraint"
169176

170177
chained_swapper_id = fields.Many2one(
171-
comodel_name='chained.swapper', ondelete="cascade"
172-
)
173-
name = fields.Char(
174-
required=True,
175-
translate=True,
178+
comodel_name="chained.swapper", ondelete="cascade"
176179
)
180+
name = fields.Char(required=True, translate=True,)
177181
expression = fields.Text(
178-
string='Constraint expression',
182+
string="Constraint expression",
179183
required=True,
180184
help="Boolean python expression. You can use the keyword "
181-
"'records' as the records selected to execute the "
182-
"contextual action. Ex.: bool(records.mapped('parent_id'))",
185+
"'records' as the records selected to execute the "
186+
"contextual action. Ex.: bool(records.mapped('parent_id'))",
183187
default="True",
184188
)
185189

@@ -188,8 +192,8 @@ def _check_expression(self):
188192
for record in self:
189193
model = self.env[record.chained_swapper_id.model_id.model]
190194
try:
191-
safe_eval(record.expression, {'records': model})
195+
safe_eval(record.expression, {"records": model})
192196
except Exception:
193-
raise exceptions.ValidationError(_(
194-
"Invalid constraint expression:" + " " + record.expression
195-
))
197+
raise exceptions.ValidationError(
198+
_("Invalid constraint expression:" + " " + record.expression)
199+
)

0 commit comments

Comments
 (0)