XH_Digital_Management/tool/app_generator.py

211 lines
8.1 KiB
Python
Raw Normal View History

2024-06-04 16:50:30 +08:00
import json
import shutil
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def generate_view_code(view):
try:
module = view['module']
view_name = view['name']
view_func = view_name + '_view'
template = view['template']
model = view['model']
filter_order = view['filter_order']
form_action_url = view['form_action_url']
filters = view['filters']
breadcrumb_list = view['breadcrumb_list']
table_columns = view['table_columns']
show_modify_button = view['show_modify_button']
show_add_button = view['show_add_button']
show_download_button = view['show_download_button']
show_upload_button = view['show_upload_button']
modify_url = view['modify_url']
add_url = view['add_url']
delete_url = view['delete_url']
form_fields_config = view['form_fields_config']
template_name = view['template_name']
fields_map = view['template_name']
fields_preview_config = view['fields_preview_config']
filter_conditions = "\n ".join([
f"if request.GET.get('{f['name']}', ''):\n query_set = query_set.filter({f['name']}=request.GET.get('{f['name']}', ''))"
for f in filters])
query_params_assignments = "\n ".join([f"{f['name']} = request.GET.get('{f['name']}', '')" for f in filters])
query_params_string = " + ".join([f"'&{f['name']}={{}}'.format({f['name']})" for f in filters])
fields_json = json.dumps(form_fields_config, ensure_ascii=False)
filters_json = json.dumps(filters, ensure_ascii=False)
breadcrumb_list_json = json.dumps(breadcrumb_list, ensure_ascii=False)
table_columns_json = json.dumps(table_columns, ensure_ascii=False)
fields_map_json = json.dumps(fields_map, ensure_ascii=False)
fields_preview_config_json = json.dumps(fields_preview_config, ensure_ascii=False)
view_code = f"""
def {view_func}(request):
# 声明查询集
query_set = {model}.objects.filter().order_by('-{filter_order}')
# 获取查询参数
{query_params_assignments}
# 根据提供的参数进行筛选
{filter_conditions}
# 对查询结果进行分页每页10条记录
items = paginate_query_and_assign_numbers(
request=request,
queryset=query_set,
per_page=10
)
# 构建上下文查询参数字符串
query_params = {query_params_string}
fields = {fields_json}
# 构建上下文
context = {{
"items": items,
"list_key": "{filter_order}",
"filters": {filters_json},
"form_action_url": "{form_action_url}",
"breadcrumb_list": {breadcrumb_list_json},
"query_params": query_params,
"table_columns": {table_columns_json},
"show_modify_button": {show_modify_button},
"show_add_button": {show_add_button},
"show_download_button": {show_download_button},
"show_upload_button": {show_upload_button},
"modify_url": reverse("{modify_url}"),
"add_url": reverse("{add_url}"),
"delete_url": reverse("{delete_url}"),
"form_fields_config": {{"fields": fields}},
"excel_upload_config": {{
"template_url": reverse("download_excel_template", kwargs={{"template_name": '{template_name}', "fields": fields}}),
"parse_url": reverse("common_excel_parse"),
"save_url": reverse("save_excel_table_data"),
"fields_map": {fields_map_json},
"fields_preview_config": {fields_preview_config_json}
}}
}}
return render(request, '{module}/{template}', context)
"""
# Add view for adding data
add_view_code = f"""
def {add_url}(request):
if request.method == 'POST':
data = {{
{", ".join([f"'{col['field']}': request.POST.get('{col['field']}')" for col in table_columns if col['field'] != 'actions'])}
}}
{model}.objects.create(**data)
return JsonResponse({{"message": "添加成功"}})
return JsonResponse({{"message": "无效的请求方法"}}, status=405)
"""
# Add view for modifying data
modify_view_code = f"""
def {modify_url}(request):
if request.method == 'POST':
{filter_order} = request.POST.get('{filter_order}')
data = {{
{", ".join([f"'{col['field']}': request.POST.get('{col['field']}')" for col in table_columns if col['field'] != 'actions'])}
}}
{model}.objects.filter({filter_order}={filter_order}).update(**data)
return JsonResponse({{"message": "修改成功"}})
return JsonResponse({{"message": "无效的请求方法"}}, status=405)
"""
# Add view for deleting data
delete_view_code = f"""
def {delete_url}(request):
if request.method == 'GET':
{filter_order} = request.GET.get('{filter_order}')
{model}.objects.filter({filter_order}={filter_order}).delete()
return JsonResponse({{"message": "删除成功"}})
return JsonResponse({{"message": "无效的请求方法"}}, status=405)
"""
return view_code + add_view_code + modify_view_code + delete_view_code
except KeyError as e:
logging.error(f"Missing key in view configuration: {e}")
return None
def copy_template(path):
try:
source_html = 'comom_list.html' # 修改为实际模板文件路径
destination_html = path
shutil.copy(source_html, destination_html)
except IOError as e:
logging.error(f"Error copying template: {e}")
def add_url_pattern(view):
try:
view_name = view['name']
urls_path = view['urls_path']
view_def = view['name'] + '_view'
add_view_def = view['name'] + '_add'
modify_view_def = view['name'] + '_modify'
delete_view_def = view['name'] + '_delete'
url_patterns = f" path('{view_name}/', {view_def}, name='{view_name}'),\n"
url_patterns += f" path('{view_name}/add/', {add_view_def}, name='{add_view_def}'),\n"
url_patterns += f" path('{view_name}/modify/', {modify_view_def}, name='{modify_view_def}'),\n"
url_patterns += f" path('{view_name}/delete/', {delete_view_def}, name='{delete_view_def}'),\n"
modify_records = view.get('modify_records', {'isExist': 0})
if modify_records['isExist']:
modify_records_view_def = modify_records['url']
url_patterns += f" path('{modify_records_view_def}/', {modify_records_view_def}, name='{modify_records_view_def}'),\n"
with open(urls_path, 'r', encoding='utf-8') as file:
content = file.readlines()
for index, line in enumerate(content):
if line.strip() == "urlpatterns = [":
content.insert(index + 1, url_patterns)
break
with open(urls_path, 'w', encoding='utf-8') as file:
file.writelines(content)
except IOError as e:
logging.error(f"Error updating URL patterns: {e}")
def main_func():
config_file = 'app_config.json'
try:
with open(config_file, 'r', encoding='utf-8') as file:
config = json.load(file)
content = ['hrm_mgnt']
for key, value in config.items():
if key in content:
for view in value:
view_code = generate_view_code(view)
if view_code:
insert_file_path = view['insert_file_path']
try:
with open(insert_file_path, 'a', encoding='utf-8') as file:
file.write(view_code)
except IOError as e:
logging.error(f"Error writing view code to file: {e}")
# Copy template file and rename
html_file_path = view.get('html_file_path')
copy_template(html_file_path)
add_url_pattern(view)
except (IOError, json.JSONDecodeError) as e:
logging.error(f"Error reading configuration file: {e}")
if __name__ == '__main__':
main_func()