Custom Button function not working

@Safvan_Ph

Code :-

import json
import frappe
from frappe import _, msgprint
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum
from frappe.utils import cint, cstr, flt, get_link_to_form, getdate, new_line_sep, nowdate
from frappe.model.document import Document

class Log_Test(Document):
pass

@frappe.whitelist()
def make_log_schedule(source_name, target_doc=None):

print(f"source_name: {source_name}")  

log_test = frappe.get_doc("Log_Test", source_name)

print(f"log_test: {log_test}")  

log_schedule = frappe.new_doc("Log_Schedule")

log_schedule.update({
    "machine_related_readings": log_schedule.machine_related_readings,
    "other_measurable_readings": log_schedule.other_measurable_readings,
})

for machine in log_test.get("machine_related_readings"):
    new_machine = frappe.new_doc("Log_Schedule_Machines")
    new_machine.log_test = log_schedule.name
    new_machine.machine_group = machine.machine_group
    new_machine.unit_measure = machine.unit_measure
    new_machine.unit = machine.unit
    new_machine.min_max = machine.min_max
    new_machine.save()
    log_schedule = frappe.new_doc("Log_Schedule")
    log_schedule.append("log_schedule_machines", new_machine)

for reading in log_test.get("other_measurable_readings"):
    new_reading = frappe.new_doc("Log_Schedule_Readings")
    new_reading.log_test = log_schedule.name
    new_reading.unit_measure = reading.unit_measure
    new_reading.unit = reading.unit
    new_reading.min_max = reading.min_max
    new_reading.save()
    log_schedule.append("log_schedule_readings", new_reading)

log_schedule.save()

Not like this i will share the code

log_schedule = frappe.new_doc("Log_Schedule")
log_schedule.save()

log_schedule.update({
    "machine_related_readings": log_schedule.machine_related_readings,
    "other_measurable_readings": log_schedule.other_measurable_readings,
})

for machine in log_test.get("machine_related_readings"):
    new_machine = frappe.new_doc("Log_Schedule_Machines")
    new_machine.log_test = log_schedule.name
    new_machine.parent= log_schedule.name
    new_machine.parenttype= "Log_Schedule"
    new_machine.machine_group = machine.machine_group
    new_machine.unit_measure = machine.unit_measure
    new_machine.unit = machine.unit
    new_machine.min_max = machine.min_max
    log_schedule.append("log_schedule_machines", new_machine)
    log_schedule.save()

**Comment below lines for now**

for reading in log_test.get("other_measurable_readings"):
    new_reading = frappe.new_doc("Log_Schedule_Readings")
    new_reading.log_test = log_schedule.name
    new_reading.unit_measure = reading.unit_measure
    new_reading.unit = reading.unit
    new_reading.min_max = reading.min_max
    new_reading.save()
    log_schedule.append("log_schedule_readings", new_reading)

App Versions

{
	"frappe": "15.15.0",
	"workwings": "0.0.1"
}

Route

Workspaces/Core Masters

Traceback

Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 110, in application
    response = frappe.api.handle(request)
  File "apps/frappe/frappe/api/__init__.py", line 49, in handle
    data = endpoint(**arguments)
  File "apps/frappe/frappe/api/v1.py", line 36, in handle_rpc_call
    return frappe.handler.handle()
  File "apps/frappe/frappe/handler.py", line 49, in handle
    data = execute_cmd(cmd)
  File "apps/frappe/frappe/handler.py", line 85, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "apps/frappe/frappe/__init__.py", line 1682, in call
    return fn(*args, **newargs)
  File "apps/frappe/frappe/utils/typing_validations.py", line 31, in wrapper
    return func(*args, **kwargs)
  File "apps/frappe/frappe/desk/form/load.py", line 72, in getdoctype
    docs = get_meta_bundle(doctype)
  File "apps/frappe/frappe/desk/form/load.py", line 83, in get_meta_bundle
    bundle = [frappe.desk.form.meta.get_meta(doctype)]
  File "apps/frappe/frappe/desk/form/meta.py", line 46, in get_meta
    meta = FormMeta(doctype)
  File "apps/frappe/frappe/desk/form/meta.py", line 57, in __init__
    self.load_assets()
  File "apps/frappe/frappe/desk/form/meta.py", line 71, in load_assets
    self.load_templates()
  File "apps/frappe/frappe/desk/form/meta.py", line 252, in load_templates
    module = load_doctype_module(self.name)
  File "apps/frappe/frappe/modules/utils.py", line 237, in load_doctype_module
    doctype_python_modules[key] = frappe.get_module(module_name)
  File "apps/frappe/frappe/__init__.py", line 1414, in get_module
    return importlib.import_module(modulename)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "apps/workwings/workwings/plcm/doctype/log_test/log_test.py", line 30, in <module>
    for machine in log_test.get("machine_related_readings"):
NameError: name 'log_test' is not defined

Request Data

{
	"type": "GET",
	"args": {
		"doctype": "Log_Test",
		"with_parent": 1,
		"cached_timestamp": "2024-04-01 16:02:08.244868"
	},
	"headers": {},
	"error_handlers": {},
	"url": "/api/method/frappe.desk.form.load.getdoctype",
	"request_id": null
}

Response Data

{
	"exception": "NameError: name 'log_test' is not defined",
	"exc_type": "NameError",
	"_exc_source": "workwings (app)"
}

did you removed this line log_test = frappe.get_doc("Log_Test", source_name)? thats the issue

yes i have commented that line

its showing log_test is not defined error

the log_test used in code is not defined anywhere

No don’t comment that line because you are fetching machine_related_readings from the log_test

@Safvan_Ph
I dont understand what to remove from code

Just add my code after the line
log_test = frappe.get_doc("Log_Test", source_name)

then comment these below code

for reading in log_test.get("other_measurable_readings"):
    new_reading = frappe.new_doc("Log_Schedule_Readings")
    new_reading.log_test = log_schedule.name
    new_reading.unit_measure = reading.unit_measure
    new_reading.unit = reading.unit
    new_reading.min_max = reading.min_max
    new_reading.save()
    log_schedule.append("log_schedule_readings", new_reading)

then show me the code

@Safvan_Ph

code :

import json
import frappe
from frappe import _, msgprint
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum
from frappe.utils import cint, cstr, flt, get_link_to_form, getdate, new_line_sep, nowdate
from frappe.model.document import Document

class Log_Test(Document):
pass

@frappe.whitelist()
def make_log_schedule(source_name, target_doc=None):

log_test = frappe.get_doc("Log_Test", source_name)

log_schedule = frappe.new_doc("Log_Schedule")
log_schedule.save()

log_schedule.update({
    "machine_related_readings": log_schedule.machine_related_readings,
    "other_measurable_readings": log_schedule.other_measurable_readings,
})

for machine in log_test.get("machine_related_readings"):
    new_machine = frappe.new_doc("Log_Schedule_Machines")
    new_machine.log_test = log_schedule.name
    new_machine.parent = log_schedule.name
    new_machine.parenttype = "Log_Schedule"
    new_machine.machine_group = machine.machine_group
    new_machine.unit_measure = machine.unit_measure
    new_machine.unit = machine.unit
    new_machine.min_max = machine.min_max
    log_schedule.append("log_schedule_machines", new_machine)
    log_schedule.save()

# **Comment below lines for now**

# for reading in log_test.get("other_measurable_readings"):
#     new_reading = frappe.new_doc("Log_Schedule_Readings")
#     new_reading.log_test = log_schedule.name
#     new_reading.unit_measure = reading.unit_measure
#     new_reading.unit = reading.unit
#     new_reading.min_max = reading.min_max
#     new_reading.save()
#     log_schedule.append("log_schedule_readings", new_reading)

log_schedule.save()

No need the last line.

@Safvan_Ph new log schedule created but the data in the child tables not populated

try this

@Safvan_Ph
No success Still the data of child tables are not populated

Code :

import json
import frappe
from frappe import _, msgprint
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum
from frappe.utils import cint, cstr, flt, get_link_to_form, getdate, new_line_sep, nowdate
from frappe.model.document import Document

class Log_Test(Document):
pass

@frappe.whitelist()
def make_log_schedule(source_name, target_doc=None):

log_test = frappe.get_doc("Log_Test", source_name)

log_schedule = frappe.new_doc("Log_Schedule")
log_schedule.save()

log_schedule.update({
    "machine_related_readings": log_schedule.machine_related_readings,
    "other_measurable_readings": log_schedule.other_measurable_readings,
})

for machine in log_test.get("machine_related_readings"):
 new_machine = frappe.new_doc("Log_Schedule_Machines")
new_machine.log_test = log_schedule.name
new_machine.parent = log_schedule.name
new_machine.parenttype = "Log_Schedule"
new_machine.machine_group = machine.machine_group
new_machine.unit_measure = machine.unit_measure
new_machine.unit = machine.unit
new_machine.min_max = machine.min_max
new_machine.save()
log_schedule.append("log_schedule_machines", new_machine)
log_schedule.save()

# **Comment below lines for now**

# for reading in log_test.get("other_measurable_readings"):
#     new_reading = frappe.new_doc("Log_Schedule_Readings")
#     new_reading.log_test = log_schedule.name
#     new_reading.unit_measure = reading.unit_measure
#     new_reading.unit = reading.unit
#     new_reading.min_max = reading.min_max
#     new_reading.save()
#     log_schedule.append("log_schedule_readings", new_reading)

TypeError: Cannot read properties of undefined (reading ‘docs’)
at Object.sync (sync.js:12:10)
at Object.callback (create_new.js:353:19)
at Object.callback [as success_callback] (request.js:85:16)
at 200 (request.js:133:34)
at Object. (request.js:305:6)
at fire (jquery.js:3213:31)
at Object.fireWith [as resolveWith] (jquery.js:3343:7)
at done (jquery.js:9617:14)
at XMLHttpRequest. (jquery.js:9878:9)

Error shown in console

log_schedule = frappe.new_doc("Log_Schedule")
for machine in log_test.get("machine_related_readings"):
  log_schedule.append("machine_related_readings", {
    "machine_group": machine.machine_group,
    "unit_measure": machine.unit_measure
    //Add mandatory fields for the table here
  }
log_schedule.save()

Can you try like this

1 Like