Coverage for formkit_ninja / services / schema_import.py: 22.22%

28 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-03-06 04:12 +0000

1""" 

2Schema import services to keep model methods thin. 

3""" 

4 

5from __future__ import annotations 

6 

7from typing import Iterable, cast 

8 

9from formkit_ninja import formkit_schema, models 

10 

11 

12class SchemaImportService: 

13 """Service for importing schemas and options into the database.""" 

14 

15 @staticmethod 

16 def import_options( 

17 options: list[str | models.OptionDict], 

18 group: models.OptionGroup | None = None, 

19 ) -> Iterable[models.Option]: 

20 for option in options: 

21 if isinstance(option, str): 

22 opt = models.Option(value=option, group=group) 

23 opt.save() 

24 opt.refresh_from_db() 

25 models.OptionLabel.objects.create(option=opt, lang="en", label=option) 

26 elif isinstance(option, dict) and option.keys() == {"value", "label"}: 

27 opt = models.Option(value=option["value"], group=group) 

28 models.OptionLabel.objects.create(option=opt, lang="en", label=option["label"]) 

29 else: 

30 models.console.log(f"[red]Could not format the given object {option}") 

31 continue 

32 yield opt 

33 

34 @staticmethod 

35 def import_schema( 

36 input_model: formkit_schema.FormKitSchema, 

37 label: str | None = None, 

38 ) -> models.FormKitSchema: 

39 instance = models.FormKitSchema.objects.create(label=label) 

40 nodes: Iterable[models.FormKitSchemaNode] = models.FormKitSchemaNode.from_pydantic(cast(Iterable[formkit_schema.FormKitSchemaProps], input_model.__root__)) 

41 for node in nodes: 

42 models.log(f"[yellow]Saving {node}") 

43 node.save() 

44 models.FormComponents.objects.create( 

45 schema=instance, 

46 node=node, 

47 label=str(f"{str(instance)} {str(node)}"), 

48 ) 

49 models.logger.info("Schema load from JSON done") 

50 return instance