XH_Digital_Management/tool/app_generator.py

211 lines
8.1 KiB
Python
Raw 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.

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()