Files

172 lines
8.0 KiB
Python
Raw Permalink Normal View History

2025-04-29 18:09:00 +08:00
from ninja_extra import api_controller, ControllerBase, route
from ninja import Query
from apps.dict.models import Dict, DictItem
from ninja_jwt.authentication import JWTAuth
from ninja_extra.permissions import IsAuthenticated, IsAdminUser
from ninja.pagination import paginate
from ninja.errors import HttpError
from utils.chen_pagination import MyPagination
from django.db import transaction
from typing import List
from utils.chen_crud import multi_delete
from utils.chen_response import ChenResponse
from apps.dict.schema import DictOut, DictIndexInput, ChangeStautsSchemaInput, DictItemInput, DictItemOut, \
DictItemChangeSrotInput, DictItemCreateInputSchema, DictItemUpdateInputSchema, DeleteSchema, \
DictItemFastCreateInputSchema, DictStdItemCreateInputSchema
@api_controller("/system", tags=['字典相关'], auth=JWTAuth(), permissions=[IsAuthenticated])
class DictController(ControllerBase):
@route.get("/dataDict/list", response=List[DictItemOut], url_name="dict-list")
def get_dict(self, code: str):
"""传入code类型例如testType返回字典Item信息"""
dict_qs = Dict.objects.get(code=code)
items = dict_qs.dictItem.filter(status='1')
return items
@route.get("/dataDict/index", response=List[DictOut], url_name="dict-index")
@transaction.atomic
@paginate(MyPagination)
def get_dict_index(self, payload: DictIndexInput = Query(...)):
for attr, value in payload.__dict__.items():
if getattr(payload, attr) is None:
setattr(payload, attr, '')
# 处理时间
if payload.update_datetime_start == '':
payload.update_datetime_start = "2000-01-01"
if payload.update_datetime_end == '':
payload.update_datetime_end = '5000-01-01'
date_list = [payload.update_datetime_start, payload.update_datetime_end]
qs = Dict.objects.filter(name__icontains=payload.name, remark__icontains=payload.remark,
code__icontains=payload.code, status__icontains=payload.status,
update_datetime__range=date_list)
return qs
@route.put("/dataDict/changeStatus", url_name="dict-changeStatus", permissions=[IsAdminUser])
@transaction.atomic
def change_dict_status(self, data: ChangeStautsSchemaInput):
qs = Dict.objects.get(id=data.id)
qs.status = data.status
qs.save()
return ChenResponse(code=200, status=200, message="修改状态成功")
@route.put("/dataDict/changeItemStatus", url_name="dict-changeItemStatus", permissions=[IsAdminUser])
@transaction.atomic
def change_dict_item_status(self, data: ChangeStautsSchemaInput):
qs = DictItem.objects.get(id=data.id)
qs.status = data.status
qs.save()
return ChenResponse(code=200, status=200, message="修改状态成功")
# 有dict的id查询其中的dictItem数据
@route.get("/dataDict/dictItemAll", response=List[DictItemOut], url_name='dictitem-list')
@transaction.atomic
@paginate(MyPagination)
def get_dictItem_list(self, payload: DictItemInput = Query(...)):
for attr, value in payload.__dict__.items():
if getattr(payload, attr) is None:
setattr(payload, attr, '')
# 处理时间
if payload.update_datetime_start == '':
payload.update_datetime_start = "2000-01-01"
if payload.update_datetime_end == '':
payload.update_datetime_end = '5000-01-01'
date_list = [payload.update_datetime_start, payload.update_datetime_end]
# 先对dict_id进行查询
dict_qs = Dict.objects.get(id=payload.dict_id)
# 反向连接
qs = dict_qs.dictItem.filter(update_datetime__range=date_list, status__icontains=payload.status,
key__icontains=payload.key, title__icontains=payload.title,
show_title__icontains=payload.show_title).order_by('sort')
return qs
# 更改dictItem的sort字段接口
@route.put("/dataDict/numberOperation", url_name="dictitem-changesort")
@transaction.atomic
def change_item_sort(self, data: DictItemChangeSrotInput):
qs = DictItem.objects.get(id=data.id)
qs.sort = data.numberValue
qs.save()
return ChenResponse(code=200, status=200, message='排序序号更新成功')
# 新增dictItem
@route.post("/dataDict/saveitem", response=DictItemOut, url_name="dictitem-save")
@transaction.atomic
def save_item(self, payload: DictItemCreateInputSchema):
# 先根据dict_id查询出dict
dict_qs = Dict.objects.get(id=payload.dict_id)
qs1 = dict_qs.dictItem.filter(title=payload.title)
if len(qs1) > 0:
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
# 计算key值应该为多少
key_number = str(len(dict_qs.dictItem.all()) + 1)
asert_dict = payload.dict(exclude_none=True)
asert_dict.pop('dict_id')
asert_dict.update({'dict': dict_qs, 'key': key_number})
qs = DictItem.objects.create(**asert_dict)
return qs
# 更新dictitem数据
@route.put("/dataDict/update/{id}", response=DictItemOut, url_name='dictitem-update')
@transaction.atomic
def update(self, id: int, payload: DictItemUpdateInputSchema):
dictitem_qs = DictItem.objects.get(id=id)
for attr, value in payload.dict().items():
setattr(dictitem_qs, attr, value)
dictitem_qs.save()
return dictitem_qs
# 删除dictItem数据
@route.delete("/dictType/realDeleteItem", url_name="dictitem-delete", permissions=[IsAdminUser])
@transaction.atomic
def delete_dictitem(self, data: DeleteSchema):
# 根据其中一个id查询出dict的id
dictItem_single = DictItem.objects.filter(id=data.ids[0])[0]
dict_id = dictItem_single.dict.id
multi_delete(data.ids, DictItem)
index = 1
qs = Dict.objects.get(id=dict_id).dictItem.all()
for qs_item in qs:
qs_item.key = str(index)
index = index + 1
qs_item.save()
return ChenResponse(message="字典条目删除成功!")
# 快速新增dictItem数据
@route.post("/dataDict/fastSave", url_name="dictitem-save-fast", permissions=[IsAuthenticated])
@transaction.atomic
def save_fast_dictitem(self, data: DictItemFastCreateInputSchema):
# 首先根据data.code查询出是哪个Dict
dict_single = Dict.objects.filter(code=data.code).first()
# 判断是否有该dict
if dict_single:
# 再判断是否dictItem重复
qs = dict_single.dictItem.filter(title=data.title)
if len(qs) > 0:
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
# 查看key值应该为多少了
key_number = str(len(dict_single.dictItem.all()) + 1)
DictItem.objects.create(title=data.title,
key=key_number,
show_title=data.title,
dict=dict_single)
else:
raise HttpError(404, "未查询到字典,请创建字典数据后进行")
return ChenResponse(message="新增成功")
# 快速新增依据标准dictItem数据 - 输入更变为code
@route.post("/dataDict/saveStdItem", response=DictItemOut, url_name="dictitem-save")
@transaction.atomic
def save(self, payload: DictStdItemCreateInputSchema):
# 先根据dict_id查询出dict
dict_qs = Dict.objects.get(code=payload.code)
qs1 = dict_qs.dictItem.filter(title=payload.title)
if len(qs1) > 0:
return ChenResponse(code=400, status=400, message='字典标签重复,请检查')
# 计算key值应该为多少
key_number = str(len(dict_qs.dictItem.all()) + 1)
asert_dict = payload.dict(exclude_none=True)
asert_dict.pop('code')
asert_dict.update({'dict': dict_qs, 'key': key_number})
qs=DictItem.objects.create(**asert_dict)
return qs