seitime-frappe/frappe/model/utils/rename_doc.py
Ankush Menat 81b37cb7d2
refactor: clean up code to py310 supported features (#17367)
refactor: clean up code to py39+ supported syntax

- f-strings instead of format
- latest typing support instead of pre 3.9 TitleCase
- remove UTF-8 declarations.
- many more changes

Powered by https://github.com/asottile/pyupgrade/ + manual cleanups
2022-07-01 11:51:05 +05:30

65 lines
2 KiB
Python

# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
from itertools import product
import frappe
from frappe.model.rename_doc import get_link_fields
def update_linked_doctypes(
doctype: str, docname: str, linked_to: str, value: str, ignore_doctypes: list | None = None
):
"""
linked_doctype_info_list = list formed by get_fetch_fields() function
docname = Master DocType's name in which modification are made
value = Value for the field thats set in other DocType's by fetching from Master DocType
"""
linked_doctype_info_list = get_fetch_fields(doctype, linked_to, ignore_doctypes)
for d in linked_doctype_info_list:
frappe.db.set_value(
d.doctype,
{
d.master_fieldname: docname,
d.linked_to_fieldname: ("!=", value),
},
d.linked_to_fieldname,
value,
)
def get_fetch_fields(
doctype: str, linked_to: str, ignore_doctypes: list | None = None
) -> list[dict]:
"""
doctype = Master DocType in which the changes are being made
linked_to = DocType name of the field thats being updated in Master
This function fetches list of all DocType where both doctype and linked_to is found
as link fields.
Forms a list of dict in the form -
[{doctype: , master_fieldname: , linked_to_fieldname: ]
where
doctype = DocType where changes need to be made
master_fieldname = Fieldname where options = doctype
linked_to_fieldname = Fieldname where options = linked_to
"""
out = []
master_list = get_link_fields(doctype)
linked_to_list = get_link_fields(linked_to)
product_list = product(master_list, linked_to_list)
for d in product_list:
linked_doctype_info = frappe._dict()
if (
d[0]["parent"] == d[1]["parent"]
and (not ignore_doctypes or d[0]["parent"] not in ignore_doctypes)
and not d[1]["issingle"]
):
linked_doctype_info.doctype = d[0]["parent"]
linked_doctype_info.master_fieldname = d[0]["fieldname"]
linked_doctype_info.linked_to_fieldname = d[1]["fieldname"]
out.append(linked_doctype_info)
return out