mirror of
https://github.com/creyD/creyPY.git
synced 2026-04-15 04:40:36 +02:00
feat: added experimental init and annotation mixins
This commit is contained in:
35
creyPY/fastapi/models/mixins.py
Normal file
35
creyPY/fastapi/models/mixins.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from sqlalchemy import Column
|
||||
|
||||
|
||||
class AutoAnnotateMixin:
|
||||
@classmethod
|
||||
def __init_subclass__(cls) -> None:
|
||||
super().__init_subclass__()
|
||||
annotations = {}
|
||||
for key, value in cls.__dict__.items():
|
||||
if isinstance(value, Column):
|
||||
annotations[key] = value.type.python_type
|
||||
cls.__annotations__ = annotations
|
||||
|
||||
|
||||
class AutoInitMixin:
|
||||
@classmethod
|
||||
def __init_subclass__(cls) -> None:
|
||||
super().__init_subclass__()
|
||||
init_params = []
|
||||
for key, value in cls.__dict__.items():
|
||||
if isinstance(value, Column):
|
||||
if not value.nullable and not value.default and not value.server_default:
|
||||
init_params.append((key, value.type.python_type))
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(cls, self).__init__()
|
||||
for key, _ in init_params:
|
||||
if key not in kwargs:
|
||||
raise TypeError(f"Missing required argument: {key}")
|
||||
setattr(self, key, kwargs[key])
|
||||
for key, value in kwargs.items():
|
||||
if key not in init_params and hasattr(self.__class__, key):
|
||||
setattr(self, key, value)
|
||||
|
||||
cls.__init__ = __init__
|
||||
Reference in New Issue
Block a user