I have three different types of schema possibilities as below:
obj_1 = {
'title': 'deposit-test-schema',
'type': 'object',
'properties': {
'title': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}},
'date': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}},
'test': {
'type': 'array',
'items': {
'properties': {
'title': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}},
'date': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}}
},
"type": "object"
},
}
},
}
obj_2 = {
'title': 'deposit-test-schema-one',
'type': 'array',
'items': {
'properties': {
'title': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}},
'date': {'type': 'string', 'x-cap-permission': {"users": ['[email protected]']}}
},
"type": "object"
},
}
obj_3 = {
'title': 'deposit-test-schema-two',
'type': 'string',
'x-cap-permission': {"users": ['[email protected]']}
}
I want the output to be the nested structure with x-cap-fields
. The expected output is:
{
"title":{
"users":[
"[email protected]"
]
},
"date":{
"users":[
"[email protected]"
]
},
"test.items.properties.title":{
"users":[
"[email protected]"
]
},
"test.items.properties.date":{
"users":[
"[email protected]"
]
{
"items.title":{
"users":[
"[email protected]"
]
},
"items.date":{
"users":[
"[email protected]"
]
}
}
{'.': {'users': ['[email protected]']}}
I have implemented the following solution to have the expected output:
def parse_schema_permission_info(schema):
x_cap_fields = {}
def extract_permission_field(field, parent_field):
for field, value in field.items():
if field == 'x-cap-permission':
x_cap_fields.update({parent_field: value})
if isinstance(value, dict):
key = parent_field + '.' + field
if value.get('x-cap-permission'):
x_cap_fields.update(
{key: value.get('x-cap-permission')}
)
extract_permission_field(value, key)
schema_type = schema.get("type")
pre_field = ''
if schema_type == 'object':
schema = schema.get('properties', {})
elif schema_type == 'array':
schema = schema.get('items',{}).get('properties', {})
pre_field = 'items'
elif schema_type == 'string':
extract_permission_field(schema, '.')
print(x_cap_fields)
return
for field in schema:
p_field = pre_field + '.' + field if pre_field else field
extract_permission_field(schema.get(field), p_field)
print(x_cap_fields)
What can be improved here to have the same expected output from the above method?