123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- import json
- import time
- from django.db import transaction
- from django.db.models import Q
- from django.views import View
- from Model.models import DictCategory, DictCategoryI18n, DictItemI18n, DictItem
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- class DataDictView(View):
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- request_dict = request.GET
- return self.validation(request_dict, request, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- request_dict = request.POST
- return self.validation(request_dict, request, operation)
- def validation(self, request_dict, request, operation):
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- tko = TokenObject(
- request.META.get('HTTP_AUTHORIZATION'),
- returntpye='pc')
- response.lang = tko.lang
- if operation == "getDictCategory":
- return self.get_dict_category(request_dict, response)
- elif operation == "getDictCategoryList":
- return self.dict_categories_list(request_dict, response)
- if tko.code != 0:
- return response.json(tko.code)
- else:
- response.lang = tko.lang
- userID = tko.userID
- if operation == 'addDictCategory':
- return self.add_dict_category(userID, request_dict, response)
- elif operation == 'editDictCategory':
- return self.edit_dict_category(userID, request_dict, response)
- elif operation == 'deleteDictCategory':
- return self.delete_dict_category(request_dict, response)
- else:
- return response.json(414)
- @staticmethod
- def dict_categories_list(request_dict, response):
- code = request_dict.get("typeCode", None)
- status = request_dict.get("status", None)
- scenes = request_dict.get("scenes", None)
- page = int(request_dict.get("page", 1))
- page_size = int(request_dict.get("pageSize", 10))
- try:
- query = Q()
- if code:
- query &= Q(code__icontains=code)
- if status:
- query &= Q(status=bool(int(status)))
- if scenes:
- query &= Q(scenes=int(scenes))
- category_qs = DictCategory.objects.filter(query).order_by("-id")
- total = category_qs.count()
- start = (page - 1) * page_size
- end = start + page_size
- categories = category_qs[start:end]
- result = []
- for category in categories:
- # 类别名称国际化
- i18n_name = (
- list(category.translations.values("lang_code", "name"))
- or []
- )
- # 子表字典项
- items = category.items.order_by("sort", "id")
- item_list = []
- for item in items:
- item_i18n_name = (
- list(item.translations.values("lang_code", "name"))
- or []
- )
- item_list.append({
- "id": item.id,
- "code": item.code,
- "sort": item.sort,
- "status": item.status,
- "remark": item.remark,
- "createdTime": item.created_time,
- "createdBy": item.created_by,
- "updatedTime": item.updated_time,
- "updatedBy": item.updated_by,
- "itemNames": item_i18n_name
- })
- result.append({
- "id": category.id,
- "code": category.code,
- "scenes": category.scenes,
- "status": category.status,
- "remark": category.remark,
- "extData": category.ext_data,
- "createdTime": category.created_time,
- "createdBy": category.created_by,
- "updatedTime": category.updated_time,
- "updatedBy": category.updated_by,
- "names": i18n_name,
- "items": item_list
- })
- return response.json(0, {
- "list": result,
- "total": total
- })
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def get_dict_category(request_dict, response):
- type_codes = request_dict.get("typeCodes", None)
- lang_code = request_dict.get("langCode", "cn")
- scenes = request_dict.get("scenes", 1)
- try:
- if not type_codes:
- return response.json(444)
- type_code_list = type_codes.split(",")
- category_qs = DictCategory.objects.filter(code__in=type_code_list, status=True, scenes=scenes)
- if not category_qs.exists():
- return response.json(0)
- result_list = []
- for category in category_qs:
- # 获取类别名称(国际化)
- category_name = (
- category.translations.filter(lang_code=lang_code).values_list("name", flat=True).first()
- or ""
- )
- # 构建返回结构
- result = {
- "typeCode": category.code,
- "scenes": category.scenes,
- "status": category.status,
- "remark": category.remark,
- "name": category_name,
- "items": []
- }
- # 获取字典项及其多语言名称
- items = category.items.filter(status=True).order_by("sort", "id")
- for item in items:
- item_name = (
- item.translations.filter(lang_code=lang_code).values_list("name", flat=True).first()
- or ""
- )
- result["items"].append({
- "code": item.code,
- "name": item_name,
- "remark": item.remark,
- "sort": item.sort
- })
- result_list.append(result)
- return response.json(0, result_list)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def add_dict_category(user_id, request_dict, response):
- type_code = request_dict.get('typeCode', None)
- scenes = request_dict.get("scenes", 1)
- status = request_dict.get("status", 1)
- remark = request_dict.get("remark", "")
- names = request_dict.get("names", [])
- items = request_dict.get("items", [])
- now_time = int(time.time())
- try:
- if not type_code or not names:
- return response.json(444)
- names = json.loads(names)
- items = json.loads(items)
- if DictCategory.objects.filter(code=type_code).exists():
- return response.json(174)
- with transaction.atomic():
- # 创建类别 数据
- category = DictCategory.objects.create(
- code=type_code,
- scenes=scenes,
- status=status,
- remark=remark,
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- # 添加多语言名称
- for name_entry in names:
- DictCategoryI18n.objects.create(
- category=category,
- lang_code=name_entry["lang"],
- name=name_entry["text"],
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- # 创建选项表数据
- for item in items:
- item_obj = DictItem.objects.create(
- category=category,
- code=item["code"],
- sort=item.get("sort", 0),
- status=item.get("status", True),
- remark=item.get("remark", ""),
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- for name_entry in item.get("names", []):
- DictItemI18n.objects.create(
- item=item_obj,
- lang_code=name_entry["lang"],
- name=name_entry["text"],
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- return response.json(0)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def edit_dict_category(user_id, request_dict, response):
- category_id = request_dict.get("categoryId", None)
- scenes = request_dict.get("scenes", 1)
- status = request_dict.get("status", 1)
- remark = request_dict.get("remark", "")
- names = request_dict.get("names", [])
- items = request_dict.get("items", [])
- now_time = int(time.time())
- try:
- if not category_id or not names:
- return response.json(444)
- names = json.loads(names)
- items = json.loads(items)
- category = DictCategory.objects.filter(id=category_id).first()
- if not category:
- return response.json(404, msg="字典类别不存在")
- with transaction.atomic():
- # 更新主表字段(不允许改 typeCode)
- category.status = status
- category.scenes = scenes
- category.remark = remark
- category.updated_time = now_time
- category.updated_by = user_id
- category.save()
- # 删除原有多语言并重新插入
- DictCategoryI18n.objects.filter(category=category).delete()
- for name_entry in names:
- DictCategoryI18n.objects.create(
- category=category,
- lang_code=name_entry["lang"],
- name=name_entry["text"],
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- # 删除原有子项及多语言
- old_items = DictItem.objects.filter(category=category)
- DictItemI18n.objects.filter(item__in=old_items).delete()
- old_items.delete()
- # 插入新子项及其国际化
- for item in items:
- item_obj = DictItem.objects.create(
- category=category,
- code=item["code"],
- sort=item.get("sort", 0),
- status=item.get("status", True),
- remark=item.get("remark", ""),
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- for name_entry in item.get("names", []):
- DictItemI18n.objects.create(
- item=item_obj,
- lang_code=name_entry["lang"],
- name=name_entry["text"],
- created_time=now_time,
- updated_time=now_time,
- created_by=user_id,
- updated_by=user_id
- )
- return response.json(0)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def delete_dict_category(request_dict, response):
- category_id = request_dict.get("categoryId", None)
- try:
- if not category_id:
- return response.json(444)
- category = DictCategory.objects.filter(id=category_id).first()
- if not category:
- return response.json(173)
- with transaction.atomic():
- # 删除子项和对应的国际化
- items = DictItem.objects.filter(category=category)
- DictItemI18n.objects.filter(item__in=items).delete()
- items.delete()
- # 删除类别国际化和主表记录
- DictCategoryI18n.objects.filter(category=category).delete()
- category.delete()
- return response.json(0)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|