Merge pull request #518 from taigaio/issue-3468-export-import-project-break-attachments

Issue 3468: Export project then import destroyed the attachments
remotes/origin/logger
David Barragán Merino 2015-11-10 14:38:35 +01:00
commit af2dae5f3b
2 changed files with 15 additions and 2 deletions

View File

@ -66,7 +66,20 @@ class AttachedFileField(serializers.WritableField):
def from_native(self, data): def from_native(self, data):
if not data: if not data:
return None 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): class RelatedNoneSafeField(serializers.RelatedField):

View File

@ -56,7 +56,7 @@ def add_errors(section, errors):
_errors_log[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) serializer = serializers.ProjectExportSerializer(project)
outfile.write('{\n') outfile.write('{\n')