OCA/pylint-odoo

W8301 fires all the time

Closed this issue · 3 comments

I have this code:

def _validation_cost(self):
    product = self.env['product.product'].search([('id', '=', self.product_id.id)])
    if product and product.qty_available == 0:
        message = _("The cost must be greater than zero for [%(code)s] %(name)s.") % {
            'code': product.default_code,
            'name': product.name
        }
        raise ValidationError(message)

vscode always reports the warning W8301

Describe the bug

I don't know another way of writing the code that doesn't trigger the warning. I also don't want to disable the warning.

Which is the error W8301?

Apart from that, I see this code weird:

product = self.env['product.product'].search([('id', '=', self.product_id.id)])

Do

product = self.env['product.product'].browse(self.product_id.id)

but even better just do product = self.product_id, as you have already the recordset there (unless you need a rebrowse by any reason).

The warning I get is: Use lazy % formatting in odoo._ functionsPylintW8301:translation-not-lazy

Really odd. Still get the warning after testing both of your suggestions:

image

I work through docker containers. I wonder if I am missing a pip package?? I base my image from the odoo/docker

Upgrade pip wheel and install pip packages

RUN pip3 install --upgrade pip
&& pip3 install --upgrade wheel
&& pip3 install cryptography==3.3.2
paramiko==2.10.1
pysftp==0.2.8
ipython
pydevd-odoo
pylint_odoo
html5lib==1.1
pandas==1.3.5
numpy==1.21.5
odoo-test-helper==2.1.1
importlib-metadata

If I go to other modules from the app store, the warning gets fired too. I see that others are formatting similarly to how it's been written.

The vscode settings is set like this:

"pylint.importStrategy": "useBundled",
"pylint.interpreter": [
  "/usr/bin/python3"
],
"pylint.args": [
  "--load-plugins",
  "pylint_odoo"
],

Just include the dictionary in the _ call:

        message = _(
            "The cost must be greater than zero for [%(code)s] %(name)s.",
            {
                'code': product.default_code,
                'name': product.name
            }
        )

and it's better to use product.display_name to get the same, and also the attribute values if it's a variant with them.