mirror of
https://github.com/camptocamp/odoo-cloud-platform.git
synced 2026-06-23 18:04:34 +00:00
run pre-commit
This commit is contained in:
@@ -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' }}
|
|
||||||
|
|||||||
@@ -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/|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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":
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["whool"]
|
||||||
|
build-backend = "whool.buildapi"
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["whool"]
|
||||||
|
build-backend = "whool.buildapi"
|
||||||
@@ -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"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["whool"]
|
||||||
|
build-backend = "whool.buildapi"
|
||||||
+6
-13
@@ -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
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["whool"]
|
||||||
|
build-backend = "whool.buildapi"
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user