# -*- coding: utf-8 -*-
|
"""
|
@File : crud_helper.py
|
@Time : 2023/1/14 16:23
|
@Author : geekbing
|
@LastEditTime : -
|
@LastEditors : -
|
@Description : -
|
"""
|
|
import traceback
|
from typing import Dict, Tuple, TypeVar
|
|
from loguru import logger
|
|
from lunarlink.models import BaseTable
|
|
BModel = TypeVar("BModel", bound=BaseTable)
|
|
|
def create(creator: str, model: BModel, payload: Dict) -> None:
|
try:
|
logger.info(f"input: create={model.__name__}, payload={payload}")
|
obj = model.objects.create(creator=creator, **payload)
|
except Exception as e:
|
logger.warning(traceback.format_exc())
|
raise e
|
logger.info(f"create {model.__name__} success, id: {obj.id}")
|
|
|
def get_or_create(
|
model: BModel,
|
filter_kwargs: Dict,
|
defaults: Dict,
|
) -> Tuple[BaseTable, bool]:
|
"""
|
|
:param model:
|
:param filter_kwargs:
|
:param defaults:
|
:return:
|
"""
|
logger.info(
|
f"input get_or_create={model.__name__}, "
|
f"filter_kwargs={filter_kwargs}, "
|
f"defaults={defaults}"
|
)
|
obj, created = model.objects.get_or_create(
|
defaults=defaults,
|
**filter_kwargs,
|
)
|
|
return obj, created
|
|
|
def update(obj: BModel, updater: str, payload: Dict) -> BaseTable:
|
logger.info(
|
f"input: update model={obj.__class__.__name__}, id={obj.id}, payload={payload}"
|
)
|
if updater:
|
obj.updater = updater
|
for attr, value in payload.items():
|
if hasattr(obj, attr) is False:
|
logger.warning(f"{attr=} not in obj fields, it will not update")
|
setattr(obj, attr, value)
|
try:
|
obj.save()
|
except Exception as e:
|
logger.error(traceback.format_exc())
|
raise e
|
logger.info(f"update {obj.__class__.__name__} success, id: {obj.id}")
|
return obj
|