run pre-commit

This commit is contained in:
Alexandre Fayolle
2024-06-24 11:58:48 +02:00
parent 451facfeb6
commit 61d30ef6ff
22 changed files with 60 additions and 54 deletions
-3
View File
@@ -77,6 +77,3 @@ jobs:
run: oca_init_test_database run: oca_init_test_database
- name: Run tests - name: Run tests
run: oca_run_tests run: oca_run_tests
- name: Update .pot files
run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }}
if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'camptocamp' }}
-4
View File
@@ -1,11 +1,7 @@
exclude: | exclude: |
(?x) (?x)
# NOT INSTALLABLE ADDONS # NOT INSTALLABLE ADDONS
^attachment_s3/|
^attachment_swift/|
^base_fileurl_field/| ^base_fileurl_field/|
^cloud_platform_exoscale/|
^cloud_platform_ovh/|
^monitoring_log_requests/| ^monitoring_log_requests/|
^monitoring_statsd/| ^monitoring_statsd/|
^test_base_fileurl_field/| ^test_base_fileurl_field/|
+6 -6
View File
@@ -32,7 +32,7 @@ class IrAttachment(models.Model):
_inherit = "ir.attachment" _inherit = "ir.attachment"
def _get_stores(self): def _get_stores(self):
return ["azure"] + super(IrAttachment, self)._get_stores() return ["azure"] + super()._get_stores()
@api.model @api.model
def _get_blob_service_client(self): def _get_blob_service_client(self):
@@ -111,7 +111,7 @@ class IrAttachment(models.Model):
@api.model @api.model
def _get_container_name(self): def _get_container_name(self):
# Container naming rules: # Container naming rules:
# https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names # noqa: B950 # https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names # noqa: E501
running_env = os.environ.get("RUNNING_ENV", "dev") running_env = os.environ.get("RUNNING_ENV", "dev")
storage_name = os.environ.get("AZURE_STORAGE_NAME", r"{env}-{db}") storage_name = os.environ.get("AZURE_STORAGE_NAME", r"{env}-{db}")
storage_name = storage_name.format(env=running_env, db=self.env.cr.dbname) storage_name = storage_name.format(env=running_env, db=self.env.cr.dbname)
@@ -162,14 +162,14 @@ class IrAttachment(models.Model):
_logger.info("Attachment '%s' missing on object storage", fname) _logger.info("Attachment '%s' missing on object storage", fname)
return read return read
else: else:
return super(IrAttachment, self)._store_file_read(fname, bin_size) return super()._store_file_read(fname, bin_size)
@api.model @api.model
def _store_file_write(self, key, bin_data): def _store_file_write(self, key, bin_data):
location = self.env.context.get("storage_location") or self._storage() location = self.env.context.get("storage_location") or self._storage()
if location == "azure": if location == "azure":
container_client = self._get_azure_container() container_client = self._get_azure_container()
filename = "azure://%s/%s" % (container_client.container_name, key) filename = f"azure://{container_client.container_name}/{key}"
with io.BytesIO() as file: with io.BytesIO() as file:
blob_client = container_client.get_blob_client(key.lower()) blob_client = container_client.get_blob_client(key.lower())
file.write(bin_data) file.write(bin_data)
@@ -189,7 +189,7 @@ class IrAttachment(models.Model):
_("The file could not be stored: %s") % str(error) _("The file could not be stored: %s") % str(error)
) from None ) from None
else: else:
_super = super(IrAttachment, self) _super = super()
filename = _super._store_file_write(key, bin_data) filename = _super._store_file_write(key, bin_data)
return filename return filename
@@ -215,4 +215,4 @@ class IrAttachment(models.Model):
# user # user
_logger.exception("Error during deletion of the file %s" % fname) _logger.exception("Error during deletion of the file %s" % fname)
else: else:
super(IrAttachment, self)._store_file_delete(fname) super()._store_file_delete(fname)
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
@@ -30,10 +30,6 @@ def clean_fs(files):
try: try:
os.unlink(full_path) os.unlink(full_path)
except OSError: except OSError:
_logger.info(
"_file_delete could not unlink %s", full_path, exc_info=True
)
except IOError:
# Harmless and needed for race conditions # Harmless and needed for race conditions
_logger.info( _logger.info(
"_file_delete could not unlink %s", full_path, exc_info=True "_file_delete could not unlink %s", full_path, exc_info=True
@@ -124,7 +120,7 @@ class IrAttachment(models.Model):
domain = [] domain = []
storage_config = self._get_storage_force_db_config() storage_config = self._get_storage_force_db_config()
for mimetype_key, limit in storage_config.items(): for mimetype_key, limit in storage_config.items():
part = [("mimetype", "=like", "{}%".format(mimetype_key))] part = [("mimetype", "=like", f"{mimetype_key}%")]
if limit: if limit:
part = AND([part, [("file_size", "<=", limit)]]) part = AND([part, [("file_size", "<=", limit)]])
domain = OR([domain, part]) domain = OR([domain, part])
@@ -207,15 +203,15 @@ class IrAttachment(models.Model):
def _store_file_read(self, fname): def _store_file_read(self, fname):
storage = fname.partition("://")[0] storage = fname.partition("://")[0]
raise NotImplementedError("No implementation for %s" % (storage,)) raise NotImplementedError(f"No implementation for {storage}")
def _store_file_write(self, key, bin_data): def _store_file_write(self, key, bin_data):
storage = self.storage() storage = self.storage()
raise NotImplementedError("No implementation for %s" % (storage,)) raise NotImplementedError(f"No implementation for {storage}")
def _store_file_delete(self, fname): def _store_file_delete(self, fname):
storage = fname.partition("://")[0] storage = fname.partition("://")[0]
raise NotImplementedError("No implementation for %s" % (storage,)) raise NotImplementedError(f"No implementation for {storage}")
@api.model @api.model
def _file_write(self, bin_data, checksum): def _file_write(self, bin_data, checksum):
@@ -249,7 +245,7 @@ class IrAttachment(models.Model):
for store_name in self._get_stores(): for store_name in self._get_stores():
if self.is_storage_disabled(store_name): if self.is_storage_disabled(store_name):
continue continue
uri = "{}://".format(store_name) uri = f"{store_name}://"
if fname.startswith(uri): if fname.startswith(uri):
return True return True
return False return False
@@ -339,7 +335,7 @@ class IrAttachment(models.Model):
( (
normalize_domain( normalize_domain(
[ [
("store_fname", "=like", "{}://%".format(storage)), ("store_fname", "=like", f"{storage}://%"),
# for res_field, see comment in # for res_field, see comment in
# _force_storage_to_object_storage # _force_storage_to_object_storage
"|", "|",
@@ -394,11 +390,11 @@ class IrAttachment(models.Model):
# is required! It's because of an override of _search in ir.attachment # is required! It's because of an override of _search in ir.attachment
# which adds ('res_field', '=', False) when the domain does not # which adds ('res_field', '=', False) when the domain does not
# contain 'res_field'. # contain 'res_field'.
# https://github.com/odoo/odoo/blob/9032617120138848c63b3cfa5d1913c5e5ad76db/odoo/addons/base/ir/ir_attachment.py#L344-L347 # noqa: B950 # https://github.com/odoo/odoo/blob/17.0/odoo/addons/base/models/ir_attachment.py#L523
domain = [ domain = [
"!", "!",
("store_fname", "=like", "{}://%".format(storage)), ("store_fname", "=like", f"{storage}://%"),
"|", "|",
("res_field", "=", False), ("res_field", "=", False),
("res_field", "!=", False), ("res_field", "!=", False),
@@ -18,4 +18,4 @@ def strtobool(value):
try: try:
return _MAP[str(value).lower()] return _MAP[str(value).lower()]
except KeyError as error: except KeyError as error:
raise ValueError('"{}" is not a valid bool value'.format(value)) from error raise ValueError(f'"{value}" is not a valid bool value') from error
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+3 -3
View File
@@ -70,7 +70,7 @@ class CloudPlatform(models.AbstractModel):
self.check() self.check()
if configs.filestore.location == "remote": if configs.filestore.location == "remote":
self.env["ir.attachment"].sudo().force_storage() self.env["ir.attachment"].sudo().force_storage()
_logger.info("cloud platform configured for {}".format(platform_kind)) _logger.info(f"cloud platform configured for {platform_kind}")
@api.model @api.model
def install(self): def install(self):
@@ -105,7 +105,7 @@ class CloudPlatform(models.AbstractModel):
prefix = os.environ["ODOO_SESSION_REDIS_PREFIX"] prefix = os.environ["ODOO_SESSION_REDIS_PREFIX"]
assert re.match(r"^[a-z-0-9]+-odoo-[a-z-0-9]+$", prefix), ( assert re.match(r"^[a-z-0-9]+-odoo-[a-z-0-9]+$", prefix), (
"ODOO_SESSION_REDIS_PREFIX must match '<client>-odoo-<env>'" "ODOO_SESSION_REDIS_PREFIX must match '<client>-odoo-<env>'"
", we got: '%s'" % (prefix,) f", we got: '{prefix}'"
) )
@api.model @api.model
@@ -126,5 +126,5 @@ class CloudPlatform(models.AbstractModel):
self._check_redis(environment_name) self._check_redis(environment_name)
def _register_hook(self): def _register_hook(self):
super(CloudPlatform, self)._register_hook() super()._register_hook()
self.sudo().check() self.sudo().check()
+1 -1
View File
@@ -18,4 +18,4 @@ def strtobool(value):
try: try:
return _MAP[str(value).lower()] return _MAP[str(value).lower()]
except KeyError as error: except KeyError as error:
raise ValueError('"{}" is not a valid bool value'.format(value)) from error raise ValueError(f'"{value}" is not a valid bool value') from error
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
@@ -19,13 +19,13 @@ class CloudPlatform(models.AbstractModel):
@api.model @api.model
def _filestore_kinds(self): def _filestore_kinds(self):
kinds = super(CloudPlatform, self)._filestore_kinds() kinds = super()._filestore_kinds()
kinds["azure"] = AZURE_STORE_KIND kinds["azure"] = AZURE_STORE_KIND
return kinds return kinds
@api.model @api.model
def _platform_kinds(self): def _platform_kinds(self):
kinds = super(CloudPlatform, self)._platform_kinds() kinds = super()._platform_kinds()
kinds.append("azure") kinds.append("azure")
return kinds return kinds
@@ -103,14 +103,14 @@ class CloudPlatform(models.AbstractModel):
if environment_name == "prod": if environment_name == "prod":
assert prod_bucket, ( assert prod_bucket, (
"AZURE_STORAGE_NAME should match '^[a-z]+\\-[a-z]+\\-\\d+$', " "AZURE_STORAGE_NAME should match '^[a-z]+\\-[a-z]+\\-\\d+$', "
"we got: '%s'" % (storage_name,) f"we got: '{storage_name}'"
) )
else: else:
# if we are using the prod bucket on another instance # if we are using the prod bucket on another instance
# such as an integration, we must be sure to be in read only! # such as an integration, we must be sure to be in read only!
assert not prod_bucket, ( assert not prod_bucket, (
"AZURE_STORAGE_NAME should not match '^[a-z]+\\-[a-z]+\\-\\d+$', " "AZURE_STORAGE_NAME should not match '^[a-z]+\\-[a-z]+\\-\\d+$', "
"we got: '%s'" % (storage_name,) f"we got: '{storage_name}'"
) )
elif environment_name == "test": elif environment_name == "test":
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+1 -1
View File
@@ -29,7 +29,7 @@ class OdooJsonFormatter(jsonlogger.JsonFormatter):
record.dbname = getattr(threading.currentThread(), "dbname", "?") record.dbname = getattr(threading.currentThread(), "dbname", "?")
record.request_id = getattr(threading.current_thread(), "request_uuid", None) record.request_id = getattr(threading.current_thread(), "request_uuid", None)
record.uid = getattr(threading.current_thread(), "uid", None) record.uid = getattr(threading.current_thread(), "uid", None)
_super = super(OdooJsonFormatter, self) _super = super()
return _super.add_fields(log_record, record, message_dict) return _super.add_fields(log_record, record, message_dict)
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+1 -1
View File
@@ -18,4 +18,4 @@ def strtobool(value):
try: try:
return _MAP[str(value).lower()] return _MAP[str(value).lower()]
except KeyError as error: except KeyError as error:
raise ValueError('"{}" is not a valid bool value'.format(value)) from error raise ValueError(f'"{value}" is not a valid bool value') from error
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+6 -13
View File
@@ -1,13 +1,6 @@
azure-storage-blob==12.17.0 # generated from manifests external_dependencies
azure-identity==1.13.0 azure-identity
boto3==1.26.7 azure-storage-blob
redis==4.3.4 prometheus_client
python-json-logger==2.0.4 python-json-logger
statsd==4.0.1 redis
python-swiftclient==4.1.0
python-keystoneclient==5.0.0
keystoneauth1==5.0.0
# error with 5.x (ConstructorError: could not determine a constructor for the tag '!record')
PyYAML==6.0
prometheus_client==0.15.0
pyopenssl==22.1.0
+1 -1
View File
@@ -27,7 +27,7 @@ class SessionDecoder(json.JSONDecoder):
"""Decode json, recomposing recordsets and date/datetime""" """Decode json, recomposing recordsets and date/datetime"""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(object_hook=self.object_hook, *args, **kwargs) super().__init__(*args, object_hook=self.object_hook, **kwargs)
def object_hook(self, obj): def object_hook(self, obj):
if "_type" not in obj: if "_type" not in obj:
+3
View File
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
+3 -3
View File
@@ -40,10 +40,10 @@ class RedisSessionStore(SessionStore):
self.anon_expiration = anon_expiration self.anon_expiration = anon_expiration
self.prefix = "session:" self.prefix = "session:"
if prefix: if prefix:
self.prefix = "%s:%s:" % (self.prefix, prefix) self.prefix = f"{self.prefix}:{prefix}:"
def build_key(self, sid): def build_key(self, sid):
return "%s%s" % (self.prefix, sid) return f"{self.prefix}{sid}"
def save(self, session): def save(self, session):
key = self.build_key(session.sid) key = self.build_key(session.sid)
@@ -56,7 +56,7 @@ class RedisSessionStore(SessionStore):
expiration = session.expiration or self.anon_expiration expiration = session.expiration or self.anon_expiration
if _logger.isEnabledFor(logging.DEBUG): if _logger.isEnabledFor(logging.DEBUG):
if session.uid: if session.uid:
user_msg = "user '%s' (id: %s)" % (session.login, session.uid) user_msg = f"user '{session.login}' (id: {session.uid})"
else: else:
user_msg = "anonymous user" user_msg = "anonymous user"
_logger.debug( _logger.debug(
+1 -1
View File
@@ -18,4 +18,4 @@ def strtobool(value):
try: try:
return _MAP[str(value).lower()] return _MAP[str(value).lower()]
except KeyError as error: except KeyError as error:
raise ValueError('"{}" is not a valid bool value'.format(value)) from error raise ValueError(f'"{value}" is not a valid bool value') from error