hyb
2025-12-23 10f3a1daddfbc7fa3dd2069197d83e8b6ef19176
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- 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