aboutsummaryrefslogtreecommitdiff
path: root/modules/api
diff options
context:
space:
mode:
Diffstat (limited to 'modules/api')
-rw-r--r--modules/api/processing.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/modules/api/processing.py b/modules/api/processing.py
new file mode 100644
index 00000000..459a8f49
--- /dev/null
+++ b/modules/api/processing.py
@@ -0,0 +1,99 @@
+from inflection import underscore
+from typing import Any, Dict, Optional
+from pydantic import BaseModel, Field, create_model
+from modules.processing import StableDiffusionProcessing, Processed, StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images
+import inspect
+
+
+class ModelDef(BaseModel):
+ """Assistance Class for Pydantic Dynamic Model Generation"""
+
+ field: str
+ field_alias: str
+ field_type: Any
+ field_value: Any
+
+
+class pydanticModelGenerator:
+ """
+ Takes source_data:Dict ( a single instance example of something like a JSON node) and self generates a pythonic data model with Alias to original source field names. This makes it easy to popuate or export to other systems yet handle the data in a pythonic way.
+ Being a pydantic datamodel all the richness of pydantic data validation is available and these models can easily be used in FastAPI and or a ORM
+
+ It does not process full JSON data structures but takes simple JSON document with basic elements
+
+ Provide a model_name, an example of JSON data and a dict of type overrides
+
+ Example:
+
+ source_data = {'Name': '48 Rainbow Rd',
+ 'GroupAddressStyle': 'ThreeLevel',
+ 'LastModified': '2020-12-21T07:02:51.2400232Z',
+ 'ProjectStart': '2020-12-03T07:36:03.324856Z',
+ 'Comment': '',
+ 'CompletionStatus': 'Editing',
+ 'LastUsedPuid': '955',
+ 'Guid': '0c85957b-c2ae-4985-9752-b300ab385b36'}
+
+ source_overrides = {'Guid':{'type':uuid.UUID},
+ 'LastModified':{'type':datetime },
+ 'ProjectStart':{'type':datetime },
+ }
+ source_optionals = {"Comment":True}
+
+ #create Model
+ model_Project=pydanticModelGenerator(
+ model_name="Project",
+ source_data=source_data,
+ overrides=source_overrides,
+ optionals=source_optionals).generate_model()
+
+ #create instance using DynamicModel
+ project_instance=model_Project(**project_info)
+
+ """
+
+ def __init__(
+ self,
+ model_name: str = None,
+ source_data: str = None,
+ params: Dict = {},
+ overrides: Dict = {},
+ optionals: Dict = {},
+ ):
+ def field_type_generator(k, v, overrides, optionals):
+ print(k, v)
+ field_type = str if not overrides.get(k) else overrides[k]["type"]
+ if v is None:
+ field_type = Any
+ else:
+ field_type = type(v)
+
+ return Optional[field_type]
+
+ self._model_name = model_name
+ self._json_data = source_data
+ self._model_def = [
+ ModelDef(
+ field=underscore(k),
+ field_alias=k,
+ field_type=field_type_generator(k, v, overrides, optionals),
+ field_value=v
+ )
+ for (k,v) in source_data.items() if k in params
+ ]
+
+ def generate_model(self):
+ """
+ Creates a pydantic BaseModel
+ from the json and overrides provided at initialization
+ """
+ fields = {
+ d.field: (d.field_type, Field(default=d.field_value, alias=d.field_alias)) for d in self._model_def
+ }
+ DynamicModel = create_model(self._model_name, **fields)
+ DynamicModel.__config__.allow_population_by_field_name = True
+ return DynamicModel
+
+StableDiffusionProcessingAPI = pydanticModelGenerator("StableDiffusionProcessing",
+ StableDiffusionProcessing().__dict__,
+ inspect.signature(StableDiffusionProcessing.__init__).parameters).generate_model() \ No newline at end of file