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