added script for subtab field

This commit is contained in:
Away 2025-04-01 09:41:32 +00:00
parent 8d3e6aa467
commit 71ded58b0a
2 changed files with 78 additions and 29 deletions

View File

@ -247,7 +247,7 @@ fixtures = [
] ]
after_migrate = [ 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" boot_session = "custom_subtabs.custom_subtabs.boot_session_handler"

View File

@ -1,30 +1,79 @@
import frappe import json
import os
import sys
import shutil
from frappe.utils import get_bench_path
def execute(): def add_field_to_docfield_json():
# Проверяем, существует ли такое свойство в Custom Field """
if frappe.db.exists("Custom Field", {"fieldname": "js_parent_subtab", "dt": "DocField"}): Добавляет поле js_parent_subtab в JSON-определение DocField,
frappe.msgprint("Свойство 'js_parent_subtab' уже существует как Custom Field. Пропускаем создание.") используя автоматическое определение пути к bench
return """
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 if __name__ == "__main__":
field_details = frappe.db.sql(""" add_field_to_docfield_json()
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' успешно добавлено в настройки вкладок.")