@@ -449,8 +449,39 @@ def sample(cls) -> dict:
449
449
"required" : required
450
450
}
451
451
452
+ def _get_meta_value (self , key : str , fallback : Any = None , locale : Any = None ):
453
+ value = getattr (self .Meta , key , fallback )
454
+ if locale is not None :
455
+ value = locale (value )
456
+ return value
457
+
458
+ def _get_metadata (self , field , key : str , locale : Any = None ):
459
+ value = field .metadata .get (key , None )
460
+ if locale is not None :
461
+ value = locale (value )
462
+ return value
463
+
464
+ def _get_field_schema (
465
+ self ,
466
+ type_info : str ,
467
+ field : object ,
468
+ description : str ,
469
+ locale : Any = None ,
470
+ ** kwargs
471
+ ) -> dict :
472
+ return {
473
+ "type" : type_info ,
474
+ "nullable" : field .metadata .get ('nullable' , False ),
475
+ "attrs" : {
476
+ "placeholder" : description ,
477
+ "format" : field .metadata .get ('format' , None ),
478
+ },
479
+ "readOnly" : field .metadata .get ('readonly' , False ),
480
+ ** kwargs
481
+ }
482
+
452
483
@classmethod
453
- def schema (cls , as_dict = False ):
484
+ def schema (cls , as_dict = False , locale : Any = None ):
454
485
"""Convert Model to JSON-Schema.
455
486
456
487
Args:
@@ -460,27 +491,47 @@ def schema(cls, as_dict=False):
460
491
Returns:
461
492
_type_: JSON-Schema version of Model.
462
493
"""
463
- title = getattr (cls .Meta , 'title' , cls .__name__ )
494
+ # description:
495
+ description = cls ._get_meta_value (
496
+ cls ,
497
+ 'description' ,
498
+ fallback = cls .__doc__ .strip ("\n " ).strip (),
499
+ locale = locale
500
+ )
501
+ title = cls ._get_meta_value (
502
+ cls ,
503
+ 'title' ,
504
+ fallback = cls .__name__ ,
505
+ locale = locale
506
+ )
464
507
try :
465
508
title = slugify_camelcase (title )
466
509
except Exception :
467
510
pass
468
511
512
+ # Table Name:
513
+ table = cls .Meta .name .lower () if cls .Meta .name else title .lower ()
469
514
endpoint = cls .Meta .endpoint
470
515
schema = cls .Meta .schema
471
- table = cls .Meta .name .lower () if cls .Meta .name else title .lower ()
472
516
columns = cls .get_columns ().items ()
473
- description = cls . Meta . description or cls . __doc__ . strip ( " \n " ). strip ()
517
+
474
518
fields = {}
475
519
required = []
476
520
defs = {}
477
521
478
522
# settings:
479
- settings = getattr (cls .Meta , 'settings' , {})
480
- if settings :
523
+ settings = cls ._get_meta_value (
524
+ cls ,
525
+ 'settings' ,
526
+ fallback = {},
527
+ locale = None
528
+ )
529
+ try :
481
530
settings = {
482
531
"settings" : settings
483
532
}
533
+ except TypeError :
534
+ settings = {}
484
535
485
536
for name , field in columns :
486
537
_type = field .type
@@ -494,7 +545,6 @@ def schema(cls, as_dict=False):
494
545
minimum = field .metadata .get ('min' , None )
495
546
maximum = field .metadata .get ('max' , None )
496
547
secret = field .metadata .get ('secret' , None )
497
-
498
548
# custom endpoint for every field:
499
549
custom_endpoint = field .metadata .get ('endpoint' , None )
500
550
@@ -507,22 +557,27 @@ def schema(cls, as_dict=False):
507
557
}
508
558
# schema_extra:
509
559
schema_extra = field .metadata .get ('schema_extra' , {})
510
-
511
- fields [name ] = {
512
- "type" : type_info ,
513
- "nullable" : field .metadata .get ('nullable' , False ),
514
- "attrs" : {
515
- "placeholder" : field .metadata .get ('description' , None ),
516
- "format" : field .metadata .get ('format' , None ),
517
- },
518
- "readOnly" : field .metadata .get ('readonly' , False ),
560
+ meta_description = cls ._get_metadata (
561
+ cls ,
562
+ field ,
563
+ key = 'description' ,
564
+ locale = locale
565
+ )
566
+ fields [name ] = cls ._get_field_schema (
567
+ cls ,
568
+ type_info ,
569
+ field ,
570
+ description = meta_description ,
571
+ locale = locale ,
519
572
** ui_objects ,
520
573
** schema_extra ,
521
574
** ref_info
522
- }
523
- label = field . metadata . get ( 'label' , None )
575
+ )
576
+ label = cls . _get_metadata ( cls , field , 'label' , locale = locale )
524
577
if label :
525
578
fields [name ]["label" ] = label
579
+ if meta_description :
580
+ fields [name ]["description" ] = meta_description
526
581
if custom_endpoint :
527
582
fields [name ]["endpoint" ] = custom_endpoint
528
583
@@ -578,7 +633,7 @@ def schema(cls, as_dict=False):
578
633
if defs :
579
634
base_schema ["$defs" ] = defs
580
635
581
- if as_dict :
636
+ if as_dict is True :
582
637
return base_schema
583
638
else :
584
639
return json_encoder (base_schema )
0 commit comments