| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- from .manager import manager
- from .single_set_model import single_set_model
- class single_set_manager(manager):
- def __init_subclass__(
- cls,
- target_model: type,
- related_models: str | tuple | list
- ) -> None:
- super().__init_subclass__()
- if not issubclass(target_model, single_set_model):
- raise TypeError("Target must be subclass of single_set_model.")
- if type(related_models) is str:
- related_models = tuple([ related_models ])
- if type(related_models) is list:
- related_models = tuple(related_models)
- if type(related_models) is not tuple:
- raise TypeError("Related model must be str, list or tuple.")
- cls.__related_models = related_models
- cls.__target_model = target_model
- @classmethod
- def _get_related_models(cls) -> tuple:
- return cls.__related_models
-
- @classmethod
- def _get_model(cls) -> type:
- return cls.__target_model
-
- @classmethod
- async def add(cls, target: str) -> single_set_model:
- target_model = cls._get_model()
-
- result = await target_model \
- .filter(target_model.content == target) \
- .first()
- if result is None:
- return await cls._create(target)
- return result
- @classmethod
- async def _create(cls, content: str) -> single_set_model:
- result = self \
- ._get_target_model() \
- .get_proxy() \
- .create(content) \
- .result()
- await result.save()
- return result
- @classmethod
- async def clean(cls, target: str) -> None:
- target_model = cls._get_model()
- related_models = cls._get_related_models()
- target = await target_model \
- .filter(target_model.content == target) \
- .first()
- await target.fetch_related(*related_models)
- for count in related_models:
- if len(target.__getattribute__(count)) > 1:
- return
- await target.delete()
- has_
|