diff --git a/frappe/utils/reset_doc.py b/frappe/utils/reset_doc.py deleted file mode 100755 index 15aff4dc6c..0000000000 --- a/frappe/utils/reset_doc.py +++ /dev/null @@ -1,151 +0,0 @@ - -import frappe -import json, os -from frappe.modules import scrub, get_module_path, utils -from frappe.custom.doctype.customize_form.customize_form import doctype_properties, docfield_properties -from frappe.custom.doctype.property_setter.property_setter import make_property_setter -from frappe.custom.doctype.custom_field.custom_field import create_custom_field -from frappe.core.page.permission_manager.permission_manager import get_standard_permissions -from frappe.permissions import setup_custom_perms -from urllib.request import urlopen - -branch = 'develop' - -def reset_all(): - for doctype in frappe.db.get_all('DocType', dict(custom=0)): - print(doctype.name) - reset_doc(doctype.name) - -def reset_doc(doctype): - ''' - doctype = name of the DocType that you want to reset - ''' - # fetch module name - module = frappe.db.get_value('DocType', doctype, 'module') - app = utils.get_module_app(module) - - # get path for doctype's json and its equivalent git url - doc_path = os.path.join(get_module_path(module), 'doctype', scrub(doctype), scrub(doctype)+'.json') - try: - git_link = '/'.join(['https://raw.githubusercontent.com/frappe',\ - app, branch, doc_path.split('apps/'+app)[1]]) - original_file = urlopen(git_link).read() - except: - print('Did not find {0} in {1}'.format(doctype, app)) - return - - # load local and original json objects - local_doc = json.loads(open(doc_path, 'r').read()) - original_doc = json.loads(original_file) - - remove_duplicate_fields(doctype) - set_property_setter(doctype, local_doc, original_doc) - make_custom_fields(doctype, local_doc, original_doc) - - with open(doc_path, 'w+') as f: - f.write(original_file) - f.close() - - setup_perms_for(doctype) - - frappe.db.commit() - -def remove_duplicate_fields(doctype): - for field in frappe.db.sql('''select fieldname, count(1) as cnt from tabDocField where parent=%s group by fieldname having cnt > 1''', doctype): - frappe.db.sql('delete from tabDocField where fieldname=%s and parent=%s limit 1', (field[0], doctype)) - print('removed duplicate {0} in {1}'.format(field[0], doctype)) - -def set_property_setter(doctype, local_doc, original_doc): - ''' compare doctype_properties and docfield_properties and create property_setter ''' - - # doctype_properties reset - for dp in doctype_properties: - # make property_setter to mimic changes made in local json - if dp in local_doc and dp not in original_doc: - make_property_setter(doctype, '', dp, local_doc[dp], doctype_properties[dp], for_doctype=True) - - local_fields = get_fields_dict(local_doc) - original_fields = get_fields_dict(original_doc) - - # iterate through field and properties of each of those field - for docfield in original_fields: - for prop in original_fields[docfield]: - # skip fields that are not in local_fields - if docfield not in local_fields: continue - - if prop in docfield_properties and prop in local_fields[docfield]\ - and original_fields[docfield][prop] != local_fields[docfield][prop]: - # make property_setter equivalent of local changes - make_property_setter(doctype, docfield, prop, local_fields[docfield][prop],\ - docfield_properties[prop]) - -def make_custom_fields(doctype, local_doc, original_doc): - ''' - check fields and create a custom field equivalent for non standard fields - ''' - local_fields, original_fields = get_fields_dict(local_doc), get_fields_dict(original_doc) - local_fields = sorted(local_fields.items(), key=lambda x: x[1]['idx']) - doctype_doc = frappe.get_doc('DocType', doctype) - - custom_docfield_properties, prev = get_custom_docfield_properties(), "" - for field, field_dict in local_fields: - df = {} - if field not in original_fields: - for prop in field_dict: - if prop in custom_docfield_properties: - df[prop] = field_dict[prop] - - df['insert_after'] = prev if prev else '' - - doctype_doc.fields = [d for d in doctype_doc.fields if d.fieldname != df['fieldname']] - doctype_doc.update_children() - - create_custom_field(doctype, df) - - # set current field as prev field for next field - prev = field - -def get_fields_dict(doc): - fields, idx = {}, 0 - for field in doc['fields']: - field['idx'] = idx - fields[field.get('fieldname')] = field - idx += 1 - - return fields - -def get_custom_docfield_properties(): - fields_meta = frappe.get_meta('Custom Field').fields - fields = {} - for d in fields_meta: - fields[d.fieldname] = d.fieldtype - - return fields - - -def setup_perms_for(doctype): - perms = frappe.get_all('DocPerm', fields='*', filters=dict(parent=doctype), order_by='idx asc') - # get default perms - try: - standard_perms = get_standard_permissions(doctype) - except (IOError, KeyError): - # no json file, doctype no longer exists! - return - - same = True - if len(standard_perms) != len(perms): - same = False - - else: - for i, p in enumerate(perms): - standard = standard_perms[i] - for fieldname in frappe.get_meta('DocPerm').get_fieldnames_with_value(): - if p.get(fieldname) != standard.get(fieldname): - same = False - break - - if not same: - break - - if not same: - setup_custom_perms(doctype) \ No newline at end of file