Skip to content

Commit 7bc809f

Browse files
Add validation for s3
1 parent 8cc9daa commit 7bc809f

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

storage_backend_s3/components/s3_adapter.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def _get_bucket(self):
4646
s3 = boto3.resource("s3", **params)
4747
bucket_name = self.collection.aws_bucket
4848
bucket = self._get_or_create_bucket(s3, bucket_name, **params)
49+
self.collection.validated = True
4950
return bucket
5051

5152
def _get_or_create_bucket(self, s3, bucket_name, **params):
@@ -60,9 +61,7 @@ def _get_or_create_bucket(self, s3, bucket_name, **params):
6061
return bucket
6162

6263
def _check_bucket_exists(self, s3, bucket_name, force=False):
63-
if self.env.context.get("force_s3_check"):
64-
force = True
65-
if force is False and self.collection.s3_bucket_exists:
64+
if force is False and self.collection.validated:
6665
return True
6766
# if test is ok, set the flag
6867
try:
@@ -142,3 +141,8 @@ def list(self, relative_path):
142141
def delete(self, relative_path):
143142
s3object = self._get_object(relative_path)
144143
s3object.delete()
144+
145+
def validate_config(self,**params):
146+
s3 = boto3.resource("s3", **params)
147+
bucket_name = self.collection.aws_bucket
148+
self.validated = self._check_bucket_exists(s3, bucket_name)

storage_backend_s3/models/storage_backend.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import logging
88

9-
from odoo import fields, models
9+
from odoo import _, fields, models
1010

1111
_logger = logging.getLogger(__name__)
1212

@@ -43,7 +43,7 @@ class StorageBackend(models.Model):
4343
"eg: Exoscale",
4444
)
4545
aws_bucket = fields.Char(string="Bucket")
46-
s3_bucket_exists = fields.Boolean(string="Bucket exists")
46+
validated = fields.Boolean(string="Bucket exists", compute="_compute_s3_validated")
4747
aws_access_key_id = fields.Char(string="Access Key ID")
4848
aws_secret_access_key = fields.Char(string="Secret Access Key")
4949
aws_region = fields.Selection(selection="_selection_aws_region", string="Region")
@@ -62,6 +62,12 @@ class StorageBackend(models.Model):
6262
]
6363
)
6464

65+
def _compute_s3_validated(self):
66+
for rec in self:
67+
if rec.backend_type == "amazon_s3":
68+
adapter = self._get_adapter()
69+
rec.validated = hasattr(adapter, "validate_config")
70+
6571
@property
6672
def _server_env_fields(self):
6773
env_fields = super()._server_env_fields
@@ -86,6 +92,26 @@ def _selection_aws_region(self):
8692
+ [("other", "Empty or Other (Manually specify below)")]
8793
)
8894

89-
def action_ensure_bucket_exists(self):
95+
def action_test_config(self):
96+
if not self.validated:
97+
raise AttributeError("Validation not supported!")
9098
adapter = self._get_adapter()
91-
adapter._get_bucket()
99+
try:
100+
adapter.validate_config()
101+
title = _("Connection Test Succeeded!")
102+
message = _("Everything seems properly set up!")
103+
msg_type = "success"
104+
except Exception as err:
105+
title = _("Connection Test Failed!")
106+
message = str(err)
107+
msg_type = "danger"
108+
return {
109+
"type": "ir.actions.client",
110+
"tag": "display_notification",
111+
"params": {
112+
"title": title,
113+
"message": message,
114+
"type": msg_type,
115+
"sticky": False,
116+
},
117+
}

storage_backend_s3/views/backend_storage_view.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
name="aws_bucket"
3434
attrs="{'required': [('backend_type', '=', 'amazon_s3')]}"
3535
/>
36-
<field name="s3_bucket_exists" />
36+
<field name="validated" />
3737
<field name="aws_cache_control" />
3838
<field name="aws_file_acl" />
3939
</group>

0 commit comments

Comments
 (0)