fixed api client generation

This commit is contained in:
vabene1111
2024-04-22 19:33:09 +02:00
parent c47e46263c
commit 12cf9da8fc
145 changed files with 914 additions and 175 deletions

View File

@@ -1,11 +1,39 @@
from drf_spectacular.types import OpenApiTypes
# custom processing for schema
# reason: DRF writable nested needs ID's to decide if a nested object should be created or updated
# the API schema/client make ID's read only by default and strips them entirely in request objects (with COMPONENT_SPLIT_REQUEST enabled)
# change request objects (schema ends with Request) and response objects (just model name) to the following:
# response objects: id field is required but read only
# request objects: id field is optional but writable/included
# WARNING: COMPONENT_SPLIT_REQUEST must be enabled, if not schemas might be wrong
def custom_postprocessing_hook(result, generator, request, public):
for c in result['components']['schemas'].keys():
if 'properties' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['properties']:
print('setting non read only for ', c)
result['components']['schemas'][c]['properties']['id']['readOnly'] = False
if 'required' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['required']:
result['components']['schemas'][c]['required'].remove('id')
return result
# handle schemas used by the client to do requests on the server
if c.strip().endswith('Request'):
# check if request schema has a corresponding response schema to avoid changing request schemas for models that end with the word Request
response_schema = None
if c.strip().replace('Request', '') in result['components']['schemas'].keys():
response_schema = c.strip().replace('Request', '')
elif c.strip().startswith('Patched') and c.strip().replace('Request', '').replace('Patched', '', 1) in result['components']['schemas'].keys():
response_schema = c.strip().replace('Request', '').replace('Patched', '', 1)
# if response schema exist update request schema to include writable, optional id
if response_schema and 'id' in result['components']['schemas'][response_schema]['properties']:
if 'id' not in result['components']['schemas'][c]['properties']:
result['components']['schemas'][c]['properties']['id'] = {'readOnly': False, 'type': 'integer'}
# this is probably never the case but make sure ID is not required anyway
if 'required' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['required']:
result['components']['schemas'][c]['required'].remove('id')
# handle all schemas returned by the server to the client
else:
if 'properties' in result['components']['schemas'][c] and 'id' in result['components']['schemas'][c]['properties']:
# make ID field not read only so it's not stripped from the request on the client
result['components']['schemas'][c]['properties']['id']['readOnly'] = True
# make ID field required because if an object has an id it should also always be returned
if 'required' not in result['components']['schemas'][c]:
result['components']['schemas'][c]['required'] = ['id']
else:
result['components']['schemas'][c]['required'].append('id')
return result