Improve sorting of json and xml export attributes

This commit is contained in:
JonnyWong16 2020-10-11 16:03:16 -07:00
parent 270e07341a
commit a39c6c1047
No known key found for this signature in database
GPG key ID: B1F1F9807184697A
2 changed files with 30 additions and 2 deletions

View file

@ -1650,12 +1650,14 @@ class Export(object):
writer.writerows(csv_data) writer.writerows(csv_data)
elif self.file_format == 'json': elif self.file_format == 'json':
json_data = json.dumps(result, indent=4, ensure_ascii=False, sort_keys=True) json_data = json.dumps(helpers.sort_obj(result),
indent=4, ensure_ascii=False)
with open(filepath, 'w', encoding='utf-8') as outfile: with open(filepath, 'w', encoding='utf-8') as outfile:
outfile.write(json_data) outfile.write(json_data)
elif self.file_format == 'xml': elif self.file_format == 'xml':
xml_data = helpers.dict_to_xml({self.media_type: result}, root_node='export', indent=4) xml_data = helpers.dict_to_xml({self.media_type: helpers.sort_obj(result)},
root_node='export', indent=4)
with open(filepath, 'w', encoding='utf-8') as outfile: with open(filepath, 'w', encoding='utf-8') as outfile:
outfile.write(xml_data) outfile.write(xml_data)

View file

@ -27,6 +27,7 @@ import cloudinary
from cloudinary.api import delete_resources_by_tag from cloudinary.api import delete_resources_by_tag
from cloudinary.uploader import upload from cloudinary.uploader import upload
from cloudinary.utils import cloudinary_url from cloudinary.utils import cloudinary_url
from collections import OrderedDict
import datetime import datetime
from functools import reduce, wraps from functools import reduce, wraps
import hashlib import hashlib
@ -1244,6 +1245,31 @@ def sort_attrs(attr):
return len(a), a return len(a), a
def sort_obj(obj):
if isinstance(obj, list):
result_obj = []
for item in obj:
result_obj.append(sort_obj(item))
elif isinstance(obj, dict):
result_start = []
result_end = []
for k, v in obj.items():
if isinstance(v, list):
for item in v:
if isinstance(item, dict):
result_end.append([k, sort_obj(v)])
else:
result_start.append([k, sort_obj(v)])
else:
result_start.append([k, sort_obj(v)])
result_obj = OrderedDict(sorted(result_start) + sorted(result_end))
else:
result_obj = obj
return result_obj
def get_attrs_to_dict(obj, attrs): def get_attrs_to_dict(obj, attrs):
d = {} d = {}