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
 
 

Reply via email to