64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
import json
|
|
|
|
from .utils import EXCLUDE_SELECT_OPTIONS, extract_messages_from_docfield, extract_messages_from_links
|
|
|
|
|
|
def extract(fileobj, *args, **kwargs):
|
|
"""Extract messages from `custom/{doctype}.json` files. To be used by babel extractor.
|
|
|
|
:param fileobj: the file-like object the messages should be extracted from
|
|
:rtype: `iterator`
|
|
"""
|
|
data = json.load(fileobj)
|
|
|
|
if isinstance(data, list):
|
|
return
|
|
|
|
doctype = data.get("doctype")
|
|
|
|
messages = []
|
|
|
|
for field in data.get("custom_fields", []):
|
|
messages.extend(extract_messages_from_docfield(doctype, field))
|
|
|
|
messages.extend(extract_messages_from_links(doctype, data.get("links", [])))
|
|
|
|
for property_setter in data.get("property_setters", []):
|
|
if property_setter.get("doctype_or_field") != "DocField":
|
|
continue
|
|
|
|
property_name = property_setter.get("property")
|
|
|
|
fieldname = property_setter.get("field_name")
|
|
if property_name == "options" and fieldname not in EXCLUDE_SELECT_OPTIONS:
|
|
message = property_setter.get("value")
|
|
select_options = [option for option in message.split("\n") if option and not option.isdigit()]
|
|
|
|
if select_options and "icon" in select_options[0]:
|
|
continue
|
|
|
|
messages.extend(
|
|
(
|
|
option,
|
|
f"Option for the '{fieldname}' (Select) field in DocType '{doctype}'",
|
|
)
|
|
for option in select_options
|
|
)
|
|
|
|
if property_name == "label":
|
|
messages.append(
|
|
(
|
|
property_setter.get("value"),
|
|
f"Label of the '{fieldname}' field in DocType '{doctype}'",
|
|
)
|
|
)
|
|
|
|
if property_name == "description":
|
|
messages.append(
|
|
(
|
|
property_setter.get("value"),
|
|
f"Description of the '{fieldname}' field in DocType '{doctype}'",
|
|
)
|
|
)
|
|
|
|
yield from ((None, "_", message, [comment]) for message, comment in messages)
|