2025-03-18 08:46:50 +08:00

245 lines
10 KiB
Python
Raw Permalink 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.

#!/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