245 lines
10 KiB
Python
245 lines
10 KiB
Python
#!/bin/python
|
||
#coding: utf-8
|
||
# +-------------------------------------------------------------------
|
||
# | version:1.3
|
||
# +-------------------------------------------------------------------
|
||
# | Date: 2023-10-31
|
||
# +-------------------------------------------------------------------
|
||
# | django-vue-lyadmin
|
||
# +-------------------------------------------------------------------
|
||
# | Author: lybbn
|
||
# +-------------------------------------------------------------------
|
||
# | QQ: 1042594286
|
||
# +-------------------------------------------------------------------
|
||
# | EditDate: 2024-01-05
|
||
# +-------------------------------------------------------------------
|
||
|
||
# ------------------------------
|
||
# 代码生成--models模型
|
||
# ------------------------------
|
||
|
||
from django.template import Template,Context
|
||
from utils.models import get_all_models_objects
|
||
|
||
def lyGenerateModels(object):
|
||
# {
|
||
# "widgetList": [
|
||
# {
|
||
# "key": 47181,
|
||
# "type": "input",
|
||
# "icon": "lyicon-text-field",
|
||
# "formItemFlag": true,
|
||
# "displayName": "单行输入",
|
||
# "options": {
|
||
# "name": "input8200612",
|
||
# "isFormField": true,
|
||
# "crudField": {
|
||
# "field_name": "input8200612",
|
||
# "verbose_name": "测试",
|
||
# "field_type": "CharField",
|
||
# "foreign_key": {
|
||
# "class_name": "Users",
|
||
# "on_delete": "",
|
||
# "label" :'',//显示
|
||
# "value":'id',//主键
|
||
# "api_path":'',//前端api的去除api前缀的地址
|
||
# },
|
||
# "max_length": "100",
|
||
# "default": "200",
|
||
# "nullable": true,
|
||
# "unique": true,
|
||
# "can_edit": true,
|
||
# "edit_disabled":false,//编辑时禁用
|
||
# "can_list": true,
|
||
# "can_search": true,
|
||
# "can_export":false,//该字段是否可导出(导出功能使用)
|
||
# "search_type": "icontains",
|
||
# "width": 100,
|
||
# "db_index": true
|
||
# },
|
||
# "label": "测试",
|
||
# "labelAlign": "",
|
||
# "type": "text",
|
||
# "defaultValue": "",
|
||
# "placeholder": "",
|
||
# "columnWidth": "200px",
|
||
# "size": "",
|
||
# "labelWidth": "",
|
||
# "labelHidden": false,
|
||
# "readonly": false,
|
||
# "disabled": false,
|
||
# "hidden": false,
|
||
# "clearable": true,
|
||
# "showPassword": false,
|
||
# "required": false,
|
||
# "requiredHint": "",
|
||
# "validation": "",
|
||
# "validationHint": "",
|
||
# "customClass": [],
|
||
# "minLength": null,
|
||
# "maxLength": null,
|
||
# "showWordLimit": false,
|
||
# "prefixIcon": "",
|
||
# "suffixIcon": "",
|
||
# "prependSlot": "",
|
||
# "appendSlot": "",
|
||
# "onInput": "",
|
||
# "onChange": "",
|
||
# "onFocus": "",
|
||
# "onBlur": ""
|
||
# },
|
||
# "id": "input82006"
|
||
# }
|
||
# ],
|
||
# "formConfig": {
|
||
# "modelName": "formData",
|
||
# "refName": "lyFormBuilder",
|
||
# "rulesName": "rules",
|
||
# "modelDbTable": "tb_testmanage",
|
||
# "modelClassName": "classnnn",
|
||
# "modelVerboseName": "测试zz",
|
||
# "labelWidth": "auto",
|
||
# "labelPosition": "left",
|
||
# "size": "",
|
||
# "disabled": false,
|
||
# "cssCode": "",
|
||
# "customClass": "",
|
||
# "functions": "",
|
||
# "jsonVersion": 1,
|
||
# "onFormMounted": ""
|
||
# }
|
||
# }
|
||
if not object:
|
||
raise ValueError("传递参数错误")
|
||
if object['formConfig']['modelClassName'] in ["lyformbuilder","lyFormBuilder"]:
|
||
raise ValueError("models类名:%s已被系统暂用,请更换其他类名"%object['formConfig']['modelClassName'])
|
||
if object['formConfig']['modelDbTable'] in ["lyadmin_lyformbuilder","lyadmin_lyFormBuilder"]:
|
||
raise ValueError("数据表名:%s已被系统暂用,请更换其他表名"%object['formConfig']['modelDbTable'])
|
||
column = object['widgetList']
|
||
model_column = []
|
||
custom_ordering = ['-create_datetime']
|
||
ordering = []
|
||
import_extend = []
|
||
for t in column:
|
||
c = t['options']['crudField']
|
||
field_name = c['field_name']
|
||
field_type = c['field_type'] if c['field_type'] else "CharField"
|
||
foreign_key = c['foreign_key']
|
||
verbose_name = c['verbose_name']
|
||
max_length = c.get('max_length')
|
||
default = c.get('default')
|
||
unique = c['unique']
|
||
primary_key = c.get('primary_key')
|
||
nullable = c['nullable']
|
||
db_index = c['db_index']
|
||
codeline = field_name +" = models."+field_type+"("
|
||
if field_type == 'ForeignKey' or field_type == 'ManyToManyField' or field_type == 'OneToOneField':
|
||
f_class_name = foreign_key['class_name']
|
||
if not foreign_key or not f_class_name:
|
||
raise ValueError("%s没有设置外键项,请设置后重试"%field_name)
|
||
on_delete_item = foreign_key['on_delete']
|
||
|
||
if f_class_name == 'self':
|
||
f_class_name = "\'self\'"
|
||
else:
|
||
extend_import_path = get_all_models_objects(foreign_key['class_name'])
|
||
if not extend_import_path:
|
||
raise ValueError("%s没有找到该类的导入路径"%foreign_key['class_name'])
|
||
import_extend.append(extend_import_path['table']['import_path'])
|
||
on_delete_item = on_delete_item if on_delete_item else "CASCADE"
|
||
if field_type == 'ManyToManyField':
|
||
on_delete_item_str = ""
|
||
else:
|
||
on_delete_item_str = ", on_delete=models." + on_delete_item
|
||
if f_class_name == "Users":
|
||
related_name= "lyauto_"+object['formConfig']['modelClassName'].lower()+"_"+field_name.lower()+"_user"
|
||
codeline += f_class_name + on_delete_item_str +", related_name=\""+related_name+ "\", db_constraint=False, verbose_name=\"" + verbose_name + "\""
|
||
else:
|
||
if field_type == 'ForeignKey':#ForeignKey 判断关联了多个同一个外键时需要添加related_name
|
||
same_ForeignKey_keywords = "ForeignKey("+f_class_name+","
|
||
has_same_ForeignKey = [item for item in model_column if same_ForeignKey_keywords in item]
|
||
if has_same_ForeignKey:
|
||
related_name= "lyauto_"+object['formConfig']['modelClassName'].lower()+"_"+field_name.lower()
|
||
codeline += f_class_name + on_delete_item_str +", related_name=\""+related_name+ "\", db_constraint=False, verbose_name=\"" + verbose_name + "\""
|
||
else:
|
||
codeline += f_class_name + on_delete_item_str + ", db_constraint=False, verbose_name=\"" + verbose_name + "\""
|
||
else:
|
||
codeline += f_class_name + on_delete_item_str + ", db_constraint=False, verbose_name=\"" + verbose_name + "\""
|
||
else:
|
||
codeline += "verbose_name=\""+verbose_name+"\""
|
||
if field_type == 'CharField':
|
||
if not max_length:
|
||
max_length = "100"
|
||
codeline += ", max_length="+max_length
|
||
elif field_type == 'BooleanField':
|
||
codeline += f", default={default}"
|
||
elif field_type == 'DecimalField':
|
||
codeline += " , max_digits=10, decimal_places=2"
|
||
if db_index:
|
||
codeline += ", db_index=True"
|
||
if primary_key:
|
||
codeline += ", primary_key=True"
|
||
else:
|
||
if field_type in ['AutoField']:
|
||
codeline += ", primary_key=True"
|
||
|
||
if unique:
|
||
codeline += ", unique=True"
|
||
|
||
isnullable=""
|
||
blank=""
|
||
if nullable:
|
||
isnullable="True"
|
||
blank="True"
|
||
if field_type not in ['ManyToManyField']:
|
||
codeline += ", null=" + isnullable + ",blank=" + blank
|
||
else:
|
||
codeline += ",blank=" + blank
|
||
else:
|
||
isnullable="False"
|
||
blank="False"
|
||
if default is not None:
|
||
if 'default=' not in codeline and field_type not in ['ManyToManyField']:
|
||
if default == "":
|
||
codeline += f",default=''"
|
||
else:
|
||
if field_type in ['IntegerField','SmallIntegerField','PositiveIntegerField','PositiveSmallIntegerField','FloatField']:
|
||
codeline += f",default={default}"
|
||
else:
|
||
codeline += f",default='{default}'"
|
||
|
||
codeline += ")"
|
||
model_column.append(codeline)
|
||
|
||
# if c['sortable']:
|
||
# ordering.append(c['field_name'])
|
||
# ordering.append("-%s"%(c['field_name']))
|
||
|
||
ordering = ordering + custom_ordering
|
||
|
||
|
||
model_code = """# -*- coding: utf-8 -*-
|
||
#此文件请放在lyFormBuilder的models目录中
|
||
from django.db import models
|
||
from utils.models import CoreModel,BaseModel,SimpleCoreModel{% for i in import_extend %}
|
||
{{i}}{% endfor %}
|
||
|
||
class {{object.formConfig.modelClassName}}(CoreModel):
|
||
\"\"\"
|
||
{{ object.formConfig.modelVerboseName }}
|
||
\"\"\"{% for c in model_column %}
|
||
{{ c|safe }}{% endfor %}
|
||
|
||
class Meta:
|
||
db_table = \"{{ object.formConfig.modelDbTable}}\"
|
||
verbose_name = \"{{ object.formConfig.modelVerboseName }}\"
|
||
verbose_name_plural = verbose_name
|
||
ordering = {{ ordering | safe }}
|
||
app_label = 'lyFormBuilder'#不放在lyFormBuilder的app中此配置项可去掉
|
||
"""
|
||
|
||
context = Context({'model_column':model_column,'import_extend':import_extend,'object':object,'ordering':ordering})
|
||
data = Template(model_code).render(context)
|
||
return data
|
||
|