diff --git a/attachment_s3/models/ir_attachment.py b/attachment_s3/models/ir_attachment.py index 09c357d..98d960c 100644 --- a/attachment_s3/models/ir_attachment.py +++ b/attachment_s3/models/ir_attachment.py @@ -106,6 +106,46 @@ class IrAttachment(models.Model): }) return bucket + @api.multi + def _store_file_set_acl(self, acl): + self.ensure_one() + fname = self.store_fname + if fname.startswith('s3://'): + s3uri = S3Uri(fname) + try: + bucket = self._get_s3_bucket(name=s3uri.bucket()) + except exceptions.UserError: + _logger.exception( + "error getting bucket from object storage" + ) + return False + key = s3uri.item() + try: + obj = bucket.Object(key=key) + obj.Acl().put(ACL=acl) + _logger.info( + "ACL %s successfully set on object %s" % (acl, fname) + ) + return True + except ClientError as e: + error_code = e.response['Error']['Code'] + if error_code == "NoSuchKey": + _logger.exception( + "Object %s does not exists on S3 bucket" % fname + ) + elif error_code == 'NotImplemented': + _logger.exception( + "S3 storage does not implement ACL" % fname + ) + else: + _logger.exception( + "Cannot set ACL %s on object %s" % (acl, fname) + ) + return False + else: + _logger.warning("Cannot set ACL on object not stored on S3") + return False + @api.model def _store_file_read(self, fname, bin_size=False): if fname.startswith('s3://'):