From 71ded58b0adbd3f8ec4a10923e02b937cb3fdee7 Mon Sep 17 00:00:00 2001 From: Away <010109ali@gmail.com> Date: Tue, 1 Apr 2025 09:41:32 +0000 Subject: [PATCH] added script for subtab field --- custom_subtabs/hooks.py | 2 +- custom_subtabs/patches/add_parent_field.py | 105 +++++++++++++++------ 2 files changed, 78 insertions(+), 29 deletions(-) diff --git a/custom_subtabs/hooks.py b/custom_subtabs/hooks.py index d130f90..884494c 100644 --- a/custom_subtabs/hooks.py +++ b/custom_subtabs/hooks.py @@ -247,7 +247,7 @@ fixtures = [ ] after_migrate = [ - "custom_subtabs.patches.add_parent_field.execute" + "custom_subtabs.patches.add_parent_field.add_field_to_docfield_json" ] boot_session = "custom_subtabs.custom_subtabs.boot_session_handler" diff --git a/custom_subtabs/patches/add_parent_field.py b/custom_subtabs/patches/add_parent_field.py index 7217bf9..56b40a1 100644 --- a/custom_subtabs/patches/add_parent_field.py +++ b/custom_subtabs/patches/add_parent_field.py @@ -1,30 +1,79 @@ -import frappe +import json +import os +import sys +import shutil +from frappe.utils import get_bench_path -def execute(): - # Проверяем, существует ли такое свойство в Custom Field - if frappe.db.exists("Custom Field", {"fieldname": "js_parent_subtab", "dt": "DocField"}): - frappe.msgprint("Свойство 'js_parent_subtab' уже существует как Custom Field. Пропускаем создание.") - return +def add_field_to_docfield_json(): + """ + Добавляет поле js_parent_subtab в JSON-определение DocField, + используя автоматическое определение пути к bench + """ + try: + # Автоматически определяем путь к bench и к файлу docfield.json + bench_path = get_bench_path() + docfield_json_path = os.path.join(bench_path, "apps", "frappe", "frappe", "core", "doctype", "docfield", "docfield.json") + + # Проверяем, существует ли файл + if not os.path.exists(docfield_json_path): + print(f"Ошибка: Файл {docfield_json_path} не найден.") + return False + + # Создаем резервную копию файла + backup_path = docfield_json_path + '.bak.' + str(int(os.path.getmtime(docfield_json_path))) + shutil.copy2(docfield_json_path, backup_path) + print(f"Создана резервная копия: {backup_path}") + + # Новое поле, которое нужно добавить + new_field = { + "fieldname": "js_parent_subtab", + "fieldtype": "Data", + "label": "JS Parent Subtab", + "description": "Укажите имя родительского таба", + "in_list_view": 0, + "in_standard_filter": 0, + "in_preview": 0, + "allow_in_quick_entry": 0, + "permlevel": 0, + "translatable": 1 + } + + # Загружаем JSON-файл + with open(docfield_json_path, 'r', encoding='utf-8') as file: + docfield_def = json.load(file) + + # Проверяем, существует ли уже такое поле + for field in docfield_def.get('fields', []): + if field.get('fieldname') == 'js_parent_subtab': + print("⚠️ Поле 'js_parent_subtab' уже существует в определении DocField.") + return True + + # Добавляем новое поле в список полей после поля 'reqd' + insert_position = None + for i, field in enumerate(docfield_def.get('fields', [])): + if field.get('fieldname') == 'reqd': + insert_position = i + 1 + break + + if insert_position is not None: + docfield_def['fields'].insert(insert_position, new_field) + else: + # Если не нашли поле 'reqd', добавляем в конец + docfield_def['fields'].append(new_field) + + # Записываем обновленный JSON обратно в файл + with open(docfield_json_path, 'w', encoding='utf-8') as file: + json.dump(docfield_def, file, indent=1, ensure_ascii=False) + + print("✅ Поле 'js_parent_subtab' успешно добавлено в docfield.json") + print("Не забудьте выполнить 'bench migrate' для применения изменений") + return True + + except Exception as e: + print(f"❌ Произошла ошибка: {str(e)}") + print("Попробуйте запустить скрипт с использованием bench:") + print("bench execute path.to.script.add_field_to_docfield_json") + return False - # Проверяем, существует ли такое свойство в DocField - field_details = frappe.db.sql(""" - SELECT name, fieldname, label, parent - FROM `tabDocField` - WHERE fieldname = 'js_parent_subtab' - """, as_dict=True) - if field_details: - frappe.msgprint(f"Свойство 'js_parent_subtab' уже существует в DocField. Пропускаем создание. Детали: {field_details}") - return - - # Создаём новое свойство - frappe.get_doc({ - "doctype": "Custom Field", - "dt": "DocField", # Указываем DocType, для которого добавляем - "fieldname": "js_parent_subtab", - "label": "JS Parent Subtab", - "fieldtype": "Data", - "insert_after": "reqd", # Вставляем после поля "Mandatory" - "description": "Укажите имя родительского таба" - }).insert(ignore_permissions=True) - - frappe.msgprint("Поле 'js_parent_subtab' успешно добавлено в настройки вкладок.") +if __name__ == "__main__": + add_field_to_docfield_json() \ No newline at end of file