Skip to content

Commit 0c192e7

Browse files
committed
No longer use blob file path to read files but use the zope api instaed.
This will fix an issue reading non existing files when using a non shared blobs dir: https://relstorage.readthedocs.io/en/latest/relstorage-options.html#blobs In this case, the blobs-directory only aces as a cache. File may be there but not necessarly. If using the zope api, files will be synced as soon as they're needed.
1 parent 4d53e06 commit 0c192e7

File tree

9 files changed

+37
-27
lines changed

9 files changed

+37
-27
lines changed

changes/TI-3545.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Properly check permissions for the transfer responsible ui listing action. [elioschmutz]

opengever/base/tests/test_utils.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,20 +144,20 @@ def test_escapes_none_returns_none(self):
144144
class TestChecksum(TestCase):
145145

146146
def test_md5_checksum(self):
147-
filename = os.path.join(os.path.dirname(__file__), 'data', 'test.txt')
148-
alg, chksum = file_checksum(filename)
147+
with open(os.path.join(os.path.dirname(__file__), 'data', 'test.txt'), 'rb') as file_:
148+
alg, chksum = file_checksum(file_)
149149
self.assertEqual(alg, u'MD5')
150150
self.assertEqual(chksum, 'a51445bd8ffce9a6b90199f3fd72715a')
151151

152152
def test_md5_checksum_with_multiple_chunks(self):
153-
filename = os.path.join(os.path.dirname(__file__), 'data', 'test.txt')
154-
alg, chksum = file_checksum(filename, chunksize=100)
153+
with open(os.path.join(os.path.dirname(__file__), 'data', 'test.txt'), 'rb') as file_:
154+
alg, chksum = file_checksum(file_, chunksize=100)
155155
self.assertEqual(alg, u'MD5')
156156
self.assertEqual(chksum, 'a51445bd8ffce9a6b90199f3fd72715a')
157157

158158
def test_sha256_checksum(self):
159-
filename = os.path.join(os.path.dirname(__file__), 'data', 'test.txt')
160-
alg, chksum = file_checksum(filename, algorithm=u'SHA256')
159+
with open(os.path.join(os.path.dirname(__file__), 'data', 'test.txt'), 'rb') as file_:
160+
alg, chksum = file_checksum(file_, algorithm=u'SHA256')
161161
self.assertEqual(alg, u'SHA256')
162162
self.assertEqual(chksum, '2cbe78150099d95789ceb5606818eeefccc7228cedd9bbe9cf7ce6af7071abd2')
163163

opengever/base/utils.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,17 @@ def to_html_xweb_intelligent(text):
149149
)
150150

151151

152-
def file_checksum(filename, chunksize=65536, algorithm=u'MD5'):
153-
"""Calculates a checksum for the given file."""
152+
def file_checksum(file_obj, chunksize=65536, algorithm=u'MD5'):
153+
"""Calculates a checksum for the given file object."""
154+
if not file_obj.mode == 'rb':
155+
raise Exception("Must read the file in byte mode")
156+
154157
h = getattr(hashlib, algorithm.lower())()
155-
with open(filename, 'rb') as f:
156-
chunk = f.read(chunksize)
157-
while len(chunk) > 0:
158-
h.update(chunk)
159-
chunk = f.read(chunksize)
160-
return algorithm, h.hexdigest()
158+
chunk = file_obj.read(chunksize)
159+
while len(chunk) > 0:
160+
h.update(chunk)
161+
chunk = file_obj.read(chunksize)
162+
return algorithm, h.hexdigest()
161163

162164

163165
def make_persistent(data):

opengever/disposition/ech0160/model/file.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ def binding(self):
2424
datei = arelda.dateiSIP(id=self.id)
2525
datei.name = self.name
2626
datei.originalName = self.filename
27-
datei.pruefalgorithmus, datei.pruefsumme = file_checksum(self.filepath)
27+
with self.file.open() as file_:
28+
datei.pruefalgorithmus, datei.pruefsumme = file_checksum(file_)
2829
return datei

opengever/disposition/ech0160/model/folder.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ def binding(self):
4545
return ordner
4646

4747
def add_to_zip(self, zipfile):
48-
for file_ in self.files:
49-
zipfile.write(file_.filepath, os.path.join(self.path, file_.name))
48+
for ech_0160_file in self.files:
49+
with ech_0160_file.file.open() as file_:
50+
zipfile.writestr(os.path.join(self.path, ech_0160_file.name), file_.read())
5051
for folder in self.folders:
5152
folder.add_to_zip(zipfile)

opengever/disposition/ech0160/sippackage.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,12 @@ def add_schema_files(self, zipfile):
136136
filename = os.path.join(schemas_path, schema)
137137
arcname = os.path.join(
138138
self.get_folder_name(), 'header', 'xsd', schema)
139+
139140
zipfile.write(filename, arcname)
140141

141-
checksum_alg, checksum = file_checksum(filename)
142+
with open(filename, 'rb') as file_:
143+
checksum_alg, checksum = file_checksum(file_)
144+
142145
self.xsd.append(arelda.dateiSIP(
143146
schema,
144147
schema,

opengever/ech0147/model.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ def add_to_zip(self, zipfile):
146146
for dossier in self.dossiers:
147147
dossier.add_to_zip(zipfile)
148148
for document in self.documents:
149-
zipfile.write(document.blobpath, document.path)
149+
with document.obj.get_file().open() as file_:
150+
zipfile.writestr(document.path, file_.read())
150151

151152

152153
class Dossier(object):
@@ -220,15 +221,15 @@ def add_to_zip(self, zipfile):
220221
for dossier in self.dossiers:
221222
dossier.add_to_zip(zipfile)
222223
for document in self.documents:
223-
zipfile.write(document.blobpath, document.path)
224+
with document.obj.get_file().open() as file_:
225+
zipfile.writestr(document.path, file_.read())
224226

225227

226228
class Document(object):
227229

228230
def __init__(self, obj, base_path):
229231
self.obj = obj
230232
self.path = os.path.join(base_path, self.obj.get_file().filename)
231-
self.blobpath = self.obj.get_file()._blob.committed()
232233

233234
def binding(self):
234235
d = ech0147t0.documentType()
@@ -242,7 +243,8 @@ def binding(self):
242243
f = ech0147t0.fileType()
243244
f.pathFileName = self.path
244245
f.mimeType = self.obj.get_file().contentType
245-
f.hashCodeAlgorithm, f.hashCode = file_checksum(self.blobpath)
246+
with self.obj.get_file().open() as file_:
247+
f.hashCodeAlgorithm, f.hashCode = file_checksum(file_)
246248
d.files.append(f)
247249

248250
c_obj = IClassification(self.obj)

opengever/ech0147/tests/test_model.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
class DummyZipFile(object):
1111
def __init__(self):
12-
self.filenames = []
12+
self.data = []
1313
self.arcnames = []
1414

15-
def write(self, filename, arcname):
16-
self.filenames.append(filename)
15+
def writestr(self, arcname, data):
16+
self.data.append(data)
1717
self.arcnames.append(arcname)
1818

1919

opengever/wopi/browser/wopi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ def check_file_info(self):
146146
modified_iso9601 = (
147147
modified_dt.replace(tzinfo=None) - modified_dt.utcoffset()
148148
).isoformat() + 'Z'
149-
_alg, sha256_checksum = file_checksum(
150-
self.obj.file._blob.committed(), algorithm=u'SHA256')
149+
with self.obj.get_file().open() as file_:
150+
_alg, sha256_checksum = file_checksum(file_, algorithm=u'SHA256')
151151
data = {
152152
'BaseFileName': self.obj.file.filename,
153153
'OwnerId': self.obj.Creator() or self.obj.getOwner().getId(),

0 commit comments

Comments
 (0)