Files
cdtestplant_v1/apps/dict/controllers/dict.py
2025-04-29 18:09:00 +08:00

172 lines
8.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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