From 15536f1ce3d9e60cb54faa29f386834c7a15601d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 10 Nov 2015 11:02:45 +0100 Subject: [PATCH] Issue 3468: Export project then import destroyed the attachments --- taiga/export_import/serializers.py | 15 ++++++++++++++- taiga/export_import/service.py | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index 7b329e60..b04ce346 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -66,7 +66,20 @@ class AttachedFileField(serializers.WritableField): def from_native(self, data): if not data: return None - return ContentFile(base64.b64decode(data['data']), name=data['name']) + + # Each sequence of 3 octets is represented by 4 characters in base64. + # The file was encoded in chunks of 8190 (multiple of three) so the proper way of decoding it is: + # - split the encoded data in multiple of four chars blocks + # - decode each block + decoded_data = b'' + pending_data = data['data'] + chunk_size = 8192 + while pending_data: + decoding_data = pending_data[0:chunk_size] + decoded_data += base64.b64decode(decoding_data) + pending_data = pending_data[chunk_size:] + + return ContentFile(decoded_data, name=data['name']) class RelatedNoneSafeField(serializers.RelatedField): diff --git a/taiga/export_import/service.py b/taiga/export_import/service.py index 27d88d33..5e45a6e4 100644 --- a/taiga/export_import/service.py +++ b/taiga/export_import/service.py @@ -56,7 +56,7 @@ def add_errors(section, errors): _errors_log[section] = [errors] -def render_project(project, outfile, chunk_size = 8192): +def render_project(project, outfile, chunk_size = 8190): serializer = serializers.ProjectExportSerializer(project) outfile.write('{\n')