[IMP] pre-commit: first run on whole repo

This commit is contained in:
Kevin Khao
2021-11-26 18:54:38 +03:00
parent a04b8980e1
commit 167aefee13
289 changed files with 6020 additions and 4170 deletions

View File

@@ -3,22 +3,22 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Base Usability',
'version': '14.0.1.0.0',
'category': 'Partner',
'license': 'AGPL-3',
'summary': 'Better usability in base module',
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['base'],
'data': [
'security/group.xml',
'security/ir.model.access.csv',
'views/res_partner.xml',
'views/res_partner_bank.xml',
'views/res_country.xml',
'views/ir_module.xml',
'views/ir_sequence.xml',
],
'installable': True,
"name": "Base Usability",
"version": "14.0.1.0.0",
"category": "Partner",
"license": "AGPL-3",
"summary": "Better usability in base module",
"author": "Akretion",
"website": "https://github.com/OCA/odoo-usability",
"depends": ["base"],
"data": [
"security/group.xml",
"security/ir.model.access.csv",
"views/res_partner.xml",
"views/res_partner_bank.xml",
"views/res_country.xml",
"views/ir_module.xml",
"views/ir_sequence.xml",
],
"installable": True,
}

View File

@@ -16,4 +16,3 @@ index a3baf47c615..e546d450107 100644
+ user.partner_id.write({'company_id': False})
user.partner_id.active = user.active
return users

View File

@@ -2,10 +2,12 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
from odoo.addons.base.models.ir_mail_server import extract_rfc2822_addresses
import logging
from odoo import api, models
from odoo.addons.base.models.ir_mail_server import extract_rfc2822_addresses
logger = logging.getLogger(__name__)
@@ -14,23 +16,42 @@ class IrMailServer(models.Model):
@api.model
def send_email(
self, message, mail_server_id=None, smtp_server=None,
smtp_port=None, smtp_user=None, smtp_password=None,
smtp_encryption=None, smtp_debug=False, smtp_session=None):
self,
message,
mail_server_id=None,
smtp_server=None,
smtp_port=None,
smtp_user=None,
smtp_password=None,
smtp_encryption=None,
smtp_debug=False,
smtp_session=None,
):
# Start copy from native method
smtp_from = message['Return-Path'] or\
self._get_default_bounce_address() or message['From']
smtp_from = (
message["Return-Path"]
or self._get_default_bounce_address()
or message["From"]
)
from_rfc2822 = extract_rfc2822_addresses(smtp_from)
smtp_from = from_rfc2822[-1]
# End copy from native method
logger.info(
"Sending email from '%s' to '%s' Cc '%s' Bcc '%s' "
"with subject '%s'",
smtp_from, message.get('To'), message.get('Cc'),
message.get('Bcc'), message.get('Subject'))
"Sending email from '%s' to '%s' Cc '%s' Bcc '%s' " "with subject '%s'",
smtp_from,
message.get("To"),
message.get("Cc"),
message.get("Bcc"),
message.get("Subject"),
)
return super().send_email(
message, mail_server_id=mail_server_id,
smtp_server=smtp_server, smtp_port=smtp_port,
smtp_user=smtp_user, smtp_password=smtp_password,
smtp_encryption=smtp_encryption, smtp_debug=smtp_debug,
smtp_session=smtp_session)
message,
mail_server_id=mail_server_id,
smtp_server=smtp_server,
smtp_port=smtp_port,
smtp_user=smtp_user,
smtp_password=smtp_password,
smtp_encryption=smtp_encryption,
smtp_debug=smtp_debug,
smtp_session=smtp_session,
)

View File

@@ -6,11 +6,11 @@ from odoo import api, models
class IrModel(models.Model):
_inherit = 'ir.model'
_inherit = "ir.model"
@api.depends('name', 'model')
@api.depends("name", "model")
def name_get(self):
res = []
for rec in self:
res.append((rec.id, '%s (%s)' % (rec.name, rec.model)))
res.append((rec.id, "%s (%s)" % (rec.name, rec.model)))
return res

View File

@@ -2,14 +2,14 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models, _
from odoo import _, api, models
class ResCompany(models.Model):
_inherit = 'res.company'
_inherit = "res.company"
@api.model
def generate_line(self, fields, options, icon=True, separator=' - '):
def generate_line(self, fields, options, icon=True, separator=" - "):
assert fields
assert options
content = []
@@ -20,13 +20,13 @@ class ResCompany(models.Model):
label = field[1]
uicon = False
elif isinstance(field, str) and field in options:
value = options[field]['value']
label = options[field].get('label')
uicon = options[field].get('icon')
value = options[field]["value"]
label = options[field].get("label")
uicon = options[field].get("icon")
if value:
prefix = icon and uicon or label
if prefix:
content.append('%s %s' % (prefix, value))
content.append("%s %s" % (prefix, value))
else:
content.append(value)
line = separator.join(content)
@@ -35,46 +35,51 @@ class ResCompany(models.Model):
def _prepare_header_options(self):
self.ensure_one()
options = {
'phone': {
'value': self.phone,
"phone": {
"value": self.phone,
# http://www.fileformat.info/info/unicode/char/1f4de/index.htm
'icon': '\U0001F4DE',
'label': _('Tel:')},
'email': {
'value': self.email,
"icon": "\U0001F4DE",
"label": _("Tel:"),
},
"email": {
"value": self.email,
# http://www.fileformat.info/info/unicode/char/2709/index.htm
'icon': '\u2709',
'label': _('E-mail:')},
'website': {
'value': self.website,
'icon': '\U0001f310',
'label': _('Website:')},
'vat': {
'value': self.vat,
'label': _('VAT:')},
}
"icon": "\u2709",
"label": _("E-mail:"),
},
"website": {
"value": self.website,
"icon": "\U0001f310",
"label": _("Website:"),
},
"vat": {"value": self.vat, "label": _("VAT:")},
}
return options
def _report_company_legal_name(self):
'''Method inherited in the module base_company_extension'''
"""Method inherited in the module base_company_extension"""
self.ensure_one()
return self.name
# for reports
def _display_report_header(
self, line_details=[['phone', 'website'], ['vat']],
icon=True, line_separator=' - '):
self,
line_details=[["phone", "website"], ["vat"]],
icon=True,
line_separator=" - ",
):
self.ensure_one()
res = ''
res = ""
address = self.partner_id._display_address(without_company=True)
address = address.replace('\n', ' - ')
address = address.replace("\n", " - ")
line1 = '%s - %s' % (self._report_company_legal_name(), address)
line1 = "%s - %s" % (self._report_company_legal_name(), address)
lines = [line1]
options = self._prepare_header_options()
for details in line_details:
line = self.generate_line(
details, options, icon=icon, separator=line_separator)
details, options, icon=icon, separator=line_separator
)
lines.append(line)
res = '\n'.join(lines)
res = "\n".join(lines)
return res

View File

@@ -2,21 +2,20 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
from odoo import _, api, fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
_inherit = "res.partner"
# tracking=True is handled in the 'mail' module, and base_usability
# doesn't depend on 'mail', so adding tracking on res.partner fields
# has been moved to mail_usability
ref = fields.Char(copy=False)
# For reports
name_title = fields.Char(
compute='_compute_name_title', string='Name with Title')
name_title = fields.Char(compute="_compute_name_title", string="Name with Title")
@api.depends('name', 'title')
@api.depends("name", "title")
def _compute_name_title(self):
for partner in self:
name_title = partner.name
@@ -28,21 +27,22 @@ class ResPartner(models.Model):
if partner.lang:
partner_lg = partner.with_context(lang=partner.lang)
title = partner_lg.title.shortcut or partner_lg.title.name
name_title = ' '.join([title, name_title])
name_title = " ".join([title, name_title])
partner.name_title = name_title
def _display_address(self, without_company=False):
'''Remove empty lines'''
"""Remove empty lines"""
res = super()._display_address(without_company=without_company)
while "\n\n" in res:
res = res.replace('\n\n', '\n')
res = res.replace("\n\n", "\n")
return res
# for reports
def _display_full_address(
self,
details=['company', 'name', 'address', 'phone', 'mobile', 'email'],
icon=True):
self,
details=["company", "name", "address", "phone", "mobile", "email"],
icon=True,
):
self.ensure_one()
# To make the icons work with py3o with PDF export, on the py3o server:
# 1) sudo apt-get install fonts-symbola
@@ -54,85 +54,89 @@ class ResPartner(models.Model):
title = False
title_short = False
else:
company = self.parent_id and self.parent_id.is_company and\
self.parent_id.name or False
company = (
self.parent_id
and self.parent_id.is_company
and self.parent_id.name
or False
)
name = self.name_title
name_no_title = self.name
title = self.title.name
title_short = self.title.shortcut
options = {
'name': {
'value': name,
},
'company': {
'value': company,
},
'title': {
'value': title,
},
'title_short': {
'value': title_short,
},
'name_no_title': {
'value': name_no_title,
},
'phone': {
'value': self.phone,
"name": {
"value": name,
},
"company": {
"value": company,
},
"title": {
"value": title,
},
"title_short": {
"value": title_short,
},
"name_no_title": {
"value": name_no_title,
},
"phone": {
"value": self.phone,
# http://www.fileformat.info/info/unicode/char/1f4de/index.htm
'icon': '\U0001F4DE',
'label': _('Tel:'),
},
'mobile': {
'value': self.mobile,
"icon": "\U0001F4DE",
"label": _("Tel:"),
},
"mobile": {
"value": self.mobile,
# http://www.fileformat.info/info/unicode/char/1f4f1/index.htm
'icon': '\U0001F4F1',
'label': _('Mobile:'),
},
'email': {
'value': self.email,
"icon": "\U0001F4F1",
"label": _("Mobile:"),
},
"email": {
"value": self.email,
# http://www.fileformat.info/info/unicode/char/2709/index.htm
'icon': '\u2709',
'label': _('E-mail:'),
},
'website': {
'value': self.website,
"icon": "\u2709",
"label": _("E-mail:"),
},
"website": {
"value": self.website,
# http://www.fileformat.info/info/unicode/char/1f310/index.htm
'icon': '\U0001f310',
'label': _('Website:'),
},
'address': {
'value': self._display_address(without_company=True),
},
'vat': {
'value': self.commercial_partner_id.vat,
'label': _('VAT Number:'),
},
'commercial_ref': {
'value': self.commercial_partner_id.ref,
'label': _('Customer Number:'),
},
'ref': {
'value': self.ref,
'label': _('Customer Number:'),
},
"icon": "\U0001f310",
"label": _("Website:"),
},
"address": {
"value": self._display_address(without_company=True),
},
"vat": {
"value": self.commercial_partner_id.vat,
"label": _("VAT Number:"),
},
"commercial_ref": {
"value": self.commercial_partner_id.ref,
"label": _("Customer Number:"),
},
"ref": {
"value": self.ref,
"label": _("Customer Number:"),
},
# Same with 'supplier_' prefix, to change the label
'supplier_commercial_ref': {
'value': self.commercial_partner_id.ref,
'label': _('Supplier Number:'),
},
'supplier_ref': {
'value': self.ref,
'label': _('Supplier Number:'),
},
}
"supplier_commercial_ref": {
"value": self.commercial_partner_id.ref,
"label": _("Supplier Number:"),
},
"supplier_ref": {
"value": self.ref,
"label": _("Supplier Number:"),
},
}
res = []
for detail in details:
if options.get(detail) and options[detail]['value']:
if options.get(detail) and options[detail]["value"]:
entry = options[detail]
prefix = icon and entry.get('icon') or entry.get('label')
prefix = icon and entry.get("icon") or entry.get("label")
if prefix:
res.append('%s %s' % (prefix, entry['value']))
res.append("%s %s" % (prefix, entry["value"]))
else:
res.append('%s' % entry['value'])
res = '\n'.join(res)
res.append("%s" % entry["value"])
res = "\n".join(res)
return res

View File

@@ -6,9 +6,9 @@ from odoo import fields, models
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
_inherit = "res.partner.bank"
# In the 'base' module, they didn't put any string, so the bank name is
# displayed as 'Name', which the string of the related field it
# points to
bank_name = fields.Char(string='Bank Name')
bank_name = fields.Char(string="Bank Name")

View File

@@ -6,6 +6,6 @@ from odoo import fields, models
class ResPartnerCategory(models.Model):
_inherit = 'res.partner.category'
_inherit = "res.partner.category"
name = fields.Char(translate=False)

View File

@@ -2,26 +2,26 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models, SUPERUSER_ID
import logging
from odoo import SUPERUSER_ID, api, models
logger = logging.getLogger(__name__)
class ResUsers(models.Model):
_inherit = 'res.users'
_inherit = "res.users"
@api.model
def _script_partners_linked_to_users_no_company(self):
if self.env.user.id != SUPERUSER_ID:
self = self.sudo()
logger.info(
'START to set company_id=False on partners related to users')
logger.info("START to set company_id=False on partners related to users")
users = self.with_context(active_test=False).search([])
for user in users:
if user.partner_id.company_id:
user.partner_id.write({'company_id': False})
user.partner_id.write({"company_id": False})
logger.info(
'Wrote company_id=False on user %s ID %d',
user.login, user.id)
logger.info(
'END setting company_id=False on partners related to users')
"Wrote company_id=False on user %s ID %d", user.login, user.id
)
logger.info("END setting company_id=False on partners related to users")

View File

@@ -11,7 +11,7 @@ This module adds the following functions:
* Better search and form view for country and state
* Display technical name of modules in kanban view
* Change module filter to `installable`
* Add widget=handle on sequence of res.partner.bank
* Add widget=handle on sequence of res.partner.bank
* Add city and country in partner tree view
* Add widget="email" on email of contacts
* Add script to fix partners related to users in multi-company setup

View File

@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2016-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<!-- This group is used to hide menu entries to everybody,

View File

@@ -1,19 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_module_filter" model="ir.ui.view">
<field name="model">ir.module.module</field>
<field name="inherit_id" ref="base.view_module_filter"/>
<field name="inherit_id" ref="base.view_module_filter" />
<field name="arch" type="xml">
<xpath expr="//filter[@name='extra']" position="after">
<filter name="installable" string="Installable" domain="[('state', '!=', 'uninstallable')]"/>
<filter
name="installable"
string="Installable"
domain="[('state', '!=', 'uninstallable')]"
/>
</xpath>
</field>
</record>

View File

@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_sequence_search" model="ir.ui.view">
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.view_sequence_search"/>
<field name="inherit_id" ref="base.view_sequence_search" />
<field name="arch" type="xml">
<field name="name" position="after">
<field name="prefix"/>
<field name="prefix" />
</field>
</field>
</record>

View File

@@ -1,22 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_country_state_search" model="ir.ui.view">
<field name="name">base_usability.res.country.state.search</field>
<field name="model">res.country.state</field>
<field name="inherit_id" ref="base.view_country_state_search"/>
<field name="inherit_id" ref="base.view_country_state_search" />
<field name="arch" type="xml">
<field name="name" position="attributes">
<attribute name="filter_domain">['|', ('name', 'ilike', self), ('code', '=', self)]</attribute>
<attribute
name="filter_domain"
>['|', ('name', 'ilike', self), ('code', '=', self)]</attribute>
</field>
<field name="name" position="after">
<field name="code"/>
<field name="code" />
</field>
</field>
</record>
@@ -26,11 +27,19 @@
<field name="model">res.country</field>
<field name="arch" type="xml">
<search>
<field name="name" filter_domain="['|', ('name', 'ilike', self), ('code', '=', self)]" string="Name or Code"/>
<field name="code"/>
<field name="currency_id"/>
<field
name="name"
filter_domain="['|', ('name', 'ilike', self), ('code', '=', self)]"
string="Name or Code"
/>
<field name="code" />
<field name="currency_id" />
<group string="Group By" name="groupby">
<filter name="currency_groupby" string="Currency" context="{'group_by': 'currency_id'}"/>
<filter
name="currency_groupby"
string="Currency"
context="{'group_by': 'currency_id'}"
/>
</group>
</search>
</field>
@@ -39,10 +48,10 @@
<record id="view_country_form" model="ir.ui.view">
<field name="name">base_usability.res.country.form</field>
<field name="model">res.country</field>
<field name="inherit_id" ref="base.view_country_form"/>
<field name="inherit_id" ref="base.view_country_form" />
<field name="arch" type="xml">
<field name="code" position="after">
<field name="country_group_ids" widget="many2many_tags"/>
<field name="country_group_ids" widget="many2many_tags" />
</field>
</field>
</record>

View File

@@ -1,23 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
© 2014-2016 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">base_usability.title.on.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<!-- Show title not only on Contacts -->
<xpath expr="//field[@name='child_ids']/form//field[@name='title']" position="attributes">
<attribute name="attrs"></attribute>
<xpath
expr="//field[@name='child_ids']/form//field[@name='title']"
position="attributes"
>
<attribute name="attrs" />
</xpath>
<!-- Show double VAT partner even when not in editable mode -->
<div attrs="{'invisible': [('same_vat_partner_id', '=', False)]}" position="attributes">
<div
attrs="{'invisible': [('same_vat_partner_id', '=', False)]}"
position="attributes"
>
<attribute name="class">alert alert-warning</attribute>
</div>
</field>
@@ -26,10 +31,10 @@
<record id="view_partner_simple_form" model="ir.ui.view">
<field name="name">base_usability.title.on.partner.simplified.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_simple_form"/>
<field name="inherit_id" ref="base.view_partner_simple_form" />
<field name="arch" type="xml">
<field name="function" position="before">
<field name="title"/>
<field name="title" />
</field>
</field>
</record>
@@ -37,13 +42,13 @@
<record id="view_partner_tree" model="ir.ui.view">
<field name="name">base_usability.res.partner.tree</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_tree"/>
<field name="inherit_id" ref="base.view_partner_tree" />
<field name="arch" type="xml">
<field name="display_name" position="after">
<field name="ref" optional="hide"/>
<field name="ref" optional="hide" />
</field>
<field name="phone" position="after">
<field name="mobile" optional="show" widget="phone" class="o_force_ltr"/>
<field name="mobile" optional="show" widget="phone" class="o_force_ltr" />
</field>
</field>
</record>
@@ -51,12 +56,14 @@
<record id="view_res_partner_filter" model="ir.ui.view">
<field name="name">base_usability.partner.search.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="inherit_id" ref="base.view_res_partner_filter" />
<field name="arch" type="xml">
<field name="name" position="attributes">
<attribute name="string">Name or Email or Reference</attribute>
<!-- for 'ref', change '=' to 'start with' -->
<attribute name="filter_domain">['|','|',('display_name','ilike',self),('ref','=ilike',self + '%'),('email','ilike',self)]</attribute>
<attribute
name="filter_domain"
>['|','|',('display_name','ilike',self),('ref','=ilike',self + '%'),('email','ilike',self)]</attribute>
</field>
</field>
</record>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2018-2020 Akretion (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
@@ -8,13 +8,13 @@
<record id="view_partner_bank_tree" model="ir.ui.view">
<field name="name">base_usability.res.partner.bank.tree</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_tree"/>
<field name="inherit_id" ref="base.view_partner_bank_tree" />
<field name="arch" type="xml">
<field name="bank_name" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="bank_name" position="after">
<field name="bank_id"/>
<field name="bank_id" />
</field>
</field>
</record>