* migration tool * custom field for primary key added * foreign key and multiple linking F_key issue resolved * refined code * many-to-one mapping temp fix * added support for pre-process + cleaned up code * [various] fixes to setup wizard for developer mode, frappe.enqueue_doc, share with assign * Refactor data migration module * added migration for hub * Add "Skip errors" in data import tool * move db_set to document.py * Add Data Migration Run * Dynamic Migration ID * move run() from Mapping to Run * Push Deleted Documents * fixes * [migration] doc operation counts * insert and update instead of push in connection * fix count and total_pages, skip sync if total_pages is 0 * [migration] child tables * fix complete() * [page] remove required libs * Add sidebar.js, rename old sidebar.js to form_sidebar.js * [minor] get_empty_state fixes * svg in icon * remove image check * fix codacy * fix is_child_table check * [connector] add get_list() * Add test for Data Migration Run * fix test * truncate tabNote * fix test * sync todo with event to fix test * fix db count * [mapping] export Mapping to json * Add docs for Data Migration Tool * [migration] pull data as list, test case * [hub] remove mapping export to files * Pull refactor * [test] * Add comments * [mapping] exec in mapping formula * fix codacy * fix codacy * Remove exec for pre-process and post-process * Add pre and post process for Push * Remove formula * fixes * [refactor] add failed_log to pull, handle error in pull * [test] Push, pull, update * Fix codacy, fix insert_doc for pull * Set migration id on successful insert * fix update_doc * fix update_doc * method is a function * child table mapping * Refactor logging * fix update_doc again * fix hostname, password * update docs, minors * Remove assign_if_none * Remove error handling from connection methods * [refactor] Data migration run * Break push stages into methods * Migration run refactor - fix test - add separate fields for logging * fix codacy * fix hostname password * fix test
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# MIT License. See license.txt
|
|
|
|
from __future__ import unicode_literals, print_function
|
|
"""
|
|
Sync's doctype and docfields from txt files to database
|
|
perms will get synced only if none exist
|
|
"""
|
|
import frappe
|
|
import os
|
|
from frappe.modules.import_file import import_file_by_path
|
|
from frappe.modules.patch_handler import block_user
|
|
from frappe.utils import update_progress_bar
|
|
|
|
def sync_all(force=0, verbose=False, reset_permissions=False):
|
|
block_user(True)
|
|
|
|
for app in frappe.get_installed_apps():
|
|
sync_for(app, force, verbose=verbose, reset_permissions=reset_permissions)
|
|
|
|
block_user(False)
|
|
|
|
frappe.clear_cache()
|
|
|
|
def sync_for(app_name, force=0, sync_everything = False, verbose=False, reset_permissions=False):
|
|
files = []
|
|
|
|
if app_name == "frappe":
|
|
# these need to go first at time of install
|
|
for d in (("core", "docfield"), ("core", "docperm"), ("core", "has_role"), ("core", "doctype"),
|
|
("core", "user"), ("core", "role"), ("custom", "custom_field"),
|
|
("custom", "property_setter"), ("website", "web_form"),
|
|
("website", "web_form_field"), ("website", "portal_menu_item")):
|
|
files.append(os.path.join(frappe.get_app_path("frappe"), d[0],
|
|
"doctype", d[1], d[1] + ".json"))
|
|
|
|
for module_name in frappe.local.app_modules.get(app_name) or []:
|
|
folder = os.path.dirname(frappe.get_module(app_name + "." + module_name).__file__)
|
|
get_doc_files(files, folder, force, sync_everything, verbose=verbose)
|
|
|
|
l = len(files)
|
|
if l:
|
|
for i, doc_path in enumerate(files):
|
|
import_file_by_path(doc_path, force=force, ignore_version=True,
|
|
reset_permissions=reset_permissions, for_sync=True)
|
|
#print module_name + ' | ' + doctype + ' | ' + name
|
|
|
|
frappe.db.commit()
|
|
|
|
# show progress bar
|
|
update_progress_bar("Updating DocTypes for {0}".format(app_name), i, l)
|
|
|
|
print()
|
|
|
|
|
|
def get_doc_files(files, start_path, force=0, sync_everything = False, verbose=False):
|
|
"""walk and sync all doctypes and pages"""
|
|
|
|
# load in sequence - warning for devs
|
|
document_types = ['doctype', 'page', 'report', 'print_format',
|
|
'website_theme', 'web_form', 'email_alert', 'print_style',
|
|
'data_migration_mapping', 'data_migration_plan']
|
|
for doctype in document_types:
|
|
doctype_path = os.path.join(start_path, doctype)
|
|
if os.path.exists(doctype_path):
|
|
|
|
for docname in os.listdir(doctype_path):
|
|
if os.path.isdir(os.path.join(doctype_path, docname)):
|
|
doc_path = os.path.join(doctype_path, docname, docname) + ".json"
|
|
if os.path.exists(doc_path):
|
|
if not doc_path in files:
|
|
files.append(doc_path)
|