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
|