details:
https://code.tryton.org/contrib/tryton-filestore-cellar/commit/8e4bdd748cc6
branch: default
user: Cédric Krier <[email protected]>
date: Tue Oct 13 16:06:40 2026 +0200
description:
Upgrade dependency to boto3
Closes #1
diffstat:
CHANGELOG | 2 +
pyproject.toml | 3 +-
tryton_filestore_cellar.py | 53 +++++++++++++++++++++++++++++++--------------
3 files changed, 40 insertions(+), 18 deletions(-)
diffs (102 lines):
diff -r f4abc2812df5 -r 8e4bdd748cc6 CHANGELOG
--- a/CHANGELOG Sat Mar 21 11:38:37 2026 +0100
+++ b/CHANGELOG Tue Oct 13 16:06:40 2026 +0200
@@ -1,3 +1,5 @@
+* Upgrade dependency to boto3
+
Version 0.2.0 - 2026-03-21
* Upgrade to pyproject
diff -r f4abc2812df5 -r 8e4bdd748cc6 pyproject.toml
--- a/pyproject.toml Sat Mar 21 11:38:37 2026 +0100
+++ b/pyproject.toml Tue Oct 13 16:06:40 2026 +0200
@@ -6,7 +6,8 @@
name = 'tryton-filestore-cellar'
dynamic = ['version', 'authors']
dependencies = [
- 'boto',
+ 'boto3',
+ 'botocore',
'trytond > 6.0',
]
maintainers = [
diff -r f4abc2812df5 -r 8e4bdd748cc6 tryton_filestore_cellar.py
--- a/tryton_filestore_cellar.py Sat Mar 21 11:38:37 2026 +0100
+++ b/tryton_filestore_cellar.py Tue Oct 13 16:06:40 2026 +0200
@@ -3,8 +3,8 @@
import os
import uuid
-from boto.s3.connection import OrdinaryCallingFormat, S3Connection
-from boto.s3.key import Key
+import boto3
+from botocore.config import Config
from trytond.config import config
from trytond.filestore import FileStore
@@ -15,31 +15,50 @@
class FileStoreCellar(FileStore):
def __init__(self):
- self.__bucket = None
+ self.__s3 = None
+
+ @property
+ def s3(self):
+ if not self.__s3:
+ self.__s3 = boto3.client(
+ 's3',
+ region_name='default',
+ aws_access_key_id=os.getenv('CELLAR_ADDON_KEY_ID'),
+ aws_secret_access_key=os.getenv('CELLAR_ADDON_KEY_SECRET'),
+ endpoint_url='https://' + os.getenv('CELLAR_ADDON_HOST'),
+ config=Config(
+ signature_version='s3v4',
+ request_checksum_calculation='WHEN_REQUIRED',
+ response_checksum_validation='WHEN_REQUIRED',
+ ),
+ )
+ return self.__s3
@property
def bucket(self):
- if not self.__bucket:
- conn = S3Connection(
- aws_access_key_id=os.getenv('CELLAR_ADDON_KEY_ID'),
- aws_secret_access_key=os.getenv('CELLAR_ADDON_KEY_SECRET'),
- host=os.getenv('CELLAR_ADDON_HOST'),
- calling_format=OrdinaryCallingFormat())
- self.__bucket = conn.get_bucket(config.get('database', 'bucket'))
- return self.__bucket
+ return config.get('database', 'bucket')
def get(self, id, prefix=''):
- key = self.bucket.get_key(name(id, prefix))
- return key.get_contents_as_string()
+ response = self.s3.get_object(
+ Bucket=self.bucket,
+ Key=name(id, prefix),
+ )
+ return response['Body'].read()
def size(self, id, prefix=''):
- key = self.bucket.get_key(name(id, prefix))
- return key.size
+ response = self.s3.head_object(
+ Bucket=self.bucket,
+ Key=name(id, prefix),
+ )
+ return response['ContentLength']
def set(self, data, prefix=''):
id = uuid.uuid4().hex
- key = Key(self.bucket, name(id, prefix))
- key.set_contents_from_string(data)
+ self.s3.put_object(
+ Bucket=self.bucket,
+ Key=name(id, prefix),
+ Body=data,
+ )
return id