271 lines
11 KiB
Python
271 lines
11 KiB
Python
import re
|
||
from io import BytesIO
|
||
from ZeroCodeMain.settings import BASE_DIR
|
||
from django.http import JsonResponse
|
||
from rest_framework import status
|
||
from users.models import Permissions
|
||
from users.serializers import PermissionsSerializer
|
||
from django.db.models import Q
|
||
from rest_framework.response import Response
|
||
from rest_framework.views import APIView
|
||
import requests
|
||
import os
|
||
from ZeroCodeMain.settings import BASE_DIR
|
||
from depend_main.functions.abstractFactoryFunction import create_class, create_class_from_db
|
||
from BaseApi.models import *
|
||
from dependency.base.utils import *
|
||
from .permission import NormalPermissionCheck
|
||
|
||
config_file_path = os.path.join(BASE_DIR, 'dependency', 'api_config', 'project_info.json')
|
||
with open(config_file_path, "r") as config_file:
|
||
config = json.load(config_file)
|
||
|
||
# 运行前检查
|
||
# 检测并确认所有数据库中的model都已经注册并且创建
|
||
# TODO 队列检查初始化,若已经存在剔除队列
|
||
try:
|
||
instance = Model.objects.all()
|
||
for item in instance:
|
||
model_instance = item.get_django_model()
|
||
except Exception as e:
|
||
print(e)
|
||
|
||
|
||
# Create your views here.
|
||
class GetAllModelList(APIView):
|
||
|
||
def get(self, request):
|
||
instance_in = Model.objects.all()
|
||
get_serializers = build_serializers(Model.__name__, Model, {}, False)
|
||
datas = get_serializers(instance_in, many=True).data
|
||
return Response({
|
||
"datas": datas,
|
||
})
|
||
|
||
|
||
class GetModelDetail(APIView):
|
||
def get(self, request):
|
||
instance_in = ModelField.objects.filter(model_id=request.GET["id"])
|
||
get_serializers = build_serializers(ModelField.__name__, ModelField, {}, False)
|
||
datas = get_serializers(instance_in, many=True).data
|
||
return Response({
|
||
"datas": datas,
|
||
})
|
||
|
||
def post(self, request):
|
||
for add_item in request.data:
|
||
if "id" not in add_item:
|
||
add_item["model"] = Model.objects.get(pk=add_item["model"])
|
||
ModelField.objects.create(**add_item)
|
||
else:
|
||
add_item["model"] = add_item["model"]["id"]
|
||
ins = ModelField.objects.get(pk=add_item["id"])
|
||
get_serializers = build_serializers(ModelField.__name__, ModelField, {}, False)
|
||
serializers = get_serializers(ins, data=add_item, partial=True)
|
||
if serializers.is_valid():
|
||
serializers.save()
|
||
return Response({"msg": "success"})
|
||
|
||
|
||
class GetModelSettingList(APIView):
|
||
def get(self, request):
|
||
settings_list = []
|
||
instance_in = ModelField.objects.filter(model_id=request.GET["id"])
|
||
get_serializers = build_serializers(ModelField.__name__, ModelField, {}, False)
|
||
datas = get_serializers(instance_in, many=True).data
|
||
for items in datas:
|
||
settings_item = ModelSetting.objects.filter(field_id=items["id"])
|
||
settings_serializers = build_serializers(ModelSetting.__name__, ModelSetting, {}, False)
|
||
settings_datas = settings_serializers(settings_item, many=True).data
|
||
settings_list.extend(settings_datas)
|
||
return Response({"datas": settings_list})
|
||
|
||
def post(self, request):
|
||
model_id = None
|
||
for add_item in request.data:
|
||
if "id" not in add_item:
|
||
add_item["field"] = ModelField.objects.get(pk=add_item["field"]["id"])
|
||
created_instance = ModelSetting.objects.create(**add_item)
|
||
model_id = ModelField.objects.filter(pk=created_instance.field_id).first().model_id
|
||
else:
|
||
model_id = ModelField.objects.filter(pk=add_item["field"]["id"]).first().model_id
|
||
add_item["field"] = add_item["field"]["id"]
|
||
ins = ModelSetting.objects.get(pk=add_item["id"])
|
||
get_serializers = build_serializers(ModelSetting.__name__, ModelSetting, {}, False)
|
||
serializers = get_serializers(ins, data=add_item, partial=True)
|
||
if serializers.is_valid():
|
||
serializers.save()
|
||
if model_id is None:
|
||
return Response({"msg": "没有获取到model_id"})
|
||
else:
|
||
Model.objects.get(pk=model_id).get_django_model()
|
||
return Response({"msg": "success"})
|
||
|
||
|
||
class CreateModel(APIView):
|
||
def post(self, request):
|
||
model_ins = Model.objects.create(**request.data)
|
||
model_ins.get_django_model()
|
||
return Response({
|
||
"msg": "success",
|
||
"model": request.data
|
||
})
|
||
|
||
|
||
class GetAppList(APIView):
|
||
def get(self, request):
|
||
data_ins = App.objects.all()
|
||
get_serializers = build_serializers(App.__name__, App, {}, False)
|
||
serializers = get_serializers(data_ins, many=True).data
|
||
return Response({
|
||
"msg": "success",
|
||
"data": serializers
|
||
})
|
||
|
||
|
||
class UseAPI(APIView):
|
||
# permission_classes = [NormalPermissionCheck]
|
||
|
||
def post(self, request):
|
||
# TODO 提取数据库部分进入依赖类、加入元数据元对象,元数据元对象逻辑优化
|
||
instance_in = Model.objects.all()
|
||
get_serializers = build_serializers(Model.__name__, Model, {}, False)
|
||
datas = get_serializers(instance_in, many=True).data
|
||
# get api信息
|
||
model_instance = get_model(request.data['model'])
|
||
model_instance_info = get_model_status(request.data['model'])
|
||
get_serializers = build_serializers(model_instance._meta.model_name, model_instance, {}, False)
|
||
self.check_object_permissions(self.request, model_instance_info)
|
||
data = get_serializers(model_instance.objects.get(api_name_en=request.data['api_name'])).data
|
||
with open(os.path.join(BASE_DIR, "api_django.json")) as f:
|
||
port = json.load(f)["port"]
|
||
# 请求api
|
||
if request.content_type.startswith('multipart/form-data'):
|
||
zip_file = request.FILES['zip']
|
||
files = {
|
||
'zip': (zip_file.name, zip_file, 'application/zip') # 关键修正!
|
||
}
|
||
post_data = {
|
||
"api_info": json.dumps(data),
|
||
}
|
||
del request.data["model"]
|
||
del request.data["zip"]
|
||
for k, v in request.data.items():
|
||
post_data[k] = v
|
||
res = requests.post(f'http://127.0.0.1:{port}/ApiClass/base_api_control/api_url/', files=files,
|
||
data=post_data)
|
||
else:
|
||
headers = {'Content-Type': 'application/json'}
|
||
post_data = {
|
||
"api_info": data,
|
||
"process_data": request.data["process_data"],
|
||
}
|
||
post_data = json.dumps(post_data)
|
||
res = requests.post(f'http://127.0.0.1:{port}/ApiClass/base_api_control/api_url/', data=post_data,
|
||
headers=headers)
|
||
"""
|
||
对于api返回的信息做出以下规定:
|
||
1、键 data -- 直接显示返回
|
||
2、键 add_data -- 传入对应的model内中进行添加或者修改
|
||
3、键 search_data -- 查询对应的表
|
||
"""
|
||
|
||
return_data = copy.deepcopy(res.json())
|
||
if 'add_data' in return_data:
|
||
# 添加结束后删除
|
||
for add_item in return_data['add_data']:
|
||
if add_item['model'] == "permission":
|
||
for add_p in add_item['data']:
|
||
serializer = PermissionsSerializer(data=add_p)
|
||
if serializer.is_valid(raise_exception=True):
|
||
serializer.save()
|
||
else:
|
||
reverse_add_sub_data(add_item["data"], sub_model_instance=get_model(add_item['model']))
|
||
del return_data['add_data']
|
||
return Response(return_data)
|
||
|
||
|
||
class RelatedRecord(APIView):
|
||
def post(self, request):
|
||
model_name = request.data["model"]["name"]
|
||
ser = []
|
||
for items in get_model(model_name)._meta.get_fields():
|
||
if items.name == request.data["name"]:
|
||
model_ins = items.remote_field.model
|
||
target_data = model_ins.objects.all()
|
||
serializers_re = build_serializers(model_ins._meta.model_name,
|
||
model_ins, {},
|
||
False)
|
||
ser = serializers_re(target_data, many=True).data
|
||
return Response({"msg": "success", "data": ser})
|
||
|
||
|
||
class RecordOperate(APIView):
|
||
def get(self, request):
|
||
return_data = {}
|
||
active_related = False
|
||
return_data_columns = []
|
||
for search_item in request.GET.getlist('search_data[]'):
|
||
if "related" in json.loads(search_item)["Q"]:
|
||
active_related = True
|
||
search_item_model_instance = get_model(json.loads(search_item)['model'])
|
||
search_item_get_serializers = build_serializers(search_item_model_instance._meta.model_name,
|
||
search_item_model_instance, {},
|
||
active_related)
|
||
return_data_columns = get_model_fields(json.loads(search_item)['model'])
|
||
if json.loads(search_item)["Q"] == {}:
|
||
target_data = search_item_model_instance.objects.all()
|
||
datas = search_item_get_serializers(target_data, many=True).data
|
||
return_data = datas
|
||
else:
|
||
filter_data = copy.deepcopy(json.loads(search_item)["Q"])
|
||
if filter_data["Q_obj"] != "":
|
||
filter_data["Q_obj"] = eval(filter_data["Q_obj"])
|
||
else:
|
||
del filter_data["Q_obj"]
|
||
if 'id' in filter_data:
|
||
target_data = search_item_model_instance.objects.get(id=filter_data["id"])
|
||
datas = search_item_get_serializers(target_data).data
|
||
elif 'uuid' in filter_data:
|
||
target_data = search_item_model_instance.objects.get(uuid=filter_data["uuid"])
|
||
datas = search_item_get_serializers(target_data).data
|
||
else:
|
||
target_data = search_item_model_instance.objects.filter(**filter_data)
|
||
datas = search_item_get_serializers(target_data, many=True).data
|
||
return_data = datas
|
||
return Response({"msg": "success", "data": {
|
||
"return_data": return_data,
|
||
"return_data_columns": return_data_columns
|
||
}})
|
||
|
||
def post(self, request):
|
||
reverse_add_sub_data(request.data['add_data'])
|
||
return Response({"msg": "success", "data": {}})
|
||
|
||
def put(self, request):
|
||
pass
|
||
|
||
def delete(self, request):
|
||
search_item_model_instance = get_model(request.data['model'])
|
||
filter_data = copy.deepcopy(request.data['Q'])
|
||
if 'id' in filter_data:
|
||
search_item_model_instance.objects.get(id=filter_data["id"]).delete()
|
||
elif 'uuid' in filter_data:
|
||
search_item_model_instance.objects.get(uuid=filter_data["uuid"]).delete()
|
||
return Response({"msg": "success", "data": "删除成功"})
|
||
|
||
|
||
blacklist_ips = {
|
||
|
||
}
|
||
|
||
|
||
class Blacklist(APIView):
|
||
def get(self, request):
|
||
# SQL 注入检测规则
|
||
|
||
# 放行请求
|
||
response = JsonResponse({"status": "allowed"})
|
||
response['apache-status'] = 'allowed'
|
||
return response
|