I am using the below code on the customized button on purchase order just for testing purpose.
Actually, I want to call item document with some parameters to create a new document.
But then moment I press this button on the Purchase Order, it says “No Permission”
I appreciate, if anybody can help me in this regard.
Because I will use the same concept to generate a new item code in Item Document.
cur_frm.cscript.update_qty = function() {
return frappe.call({
method: “erpnext.stock.doctype.item.create_a_new_item”,
args: {
“Item”: cur_frm.doc.name
},
callback: function(r) {
var doclist = frappe.model.sync(r.message);
frappe.set_route(“Form”, doclist[0].doctype, doclist[0].name);
}
});
}
1 Like
Add create_a_new_item method, under frappe.whitelist().
frappe.whitelist()
def create_a_new_item():
""" your code """
Hi Saurabh,
Thanks a lot for your information but tell me one thing, how to call a different form/document in new document mode for generating a new document?
Regards
Ruchin Sharma
Hi Saurabh,
I have created a function for the same, now can you please tell me how to return a value from the function to the script.
from function return
a value and capture that in callback()
Python code
frappe.whitelist() def create_a_new_item(): """ your code """ return values_want_to_return
js code
frappe.call({ method:method, args: args, callback:function(r){ r.message.values_want_to_return} })
2 Likes
I appreciate if you can give an example for the same.
Below is my code:
@frappe.whitelist(allow_guest=True)
def generate_document(source_name, target=None):
doc_m = frappe.get_doc(“Item”, source_name)
i=doc_m.item_group[:3]+‘%’
j=frappe.db.sql(“”“select item_code from tabItem where item_code like %s order by item_code desc limit 1"”“,i)
prefix=j[0][0]
prefix=”“.join(prefix)
new_prefix=prefix[0:3]
new_suffix=prefix[4:10]
next_num=(int(new_suffix)+1)
next_num1=str(next_num)
new_num1=next_num1.decode(“ascii”).rjust(6,‘0’)
new_num1=new_prefix+‘-’+new_num1
new_item=frappe.new_doc(“Item”)
new_item.item_code =new_num1
new_item.item_group = doc_m.item_group
new_item.item_name = doc_m.item_code+” Insert New Name"
new_item.stock_uom =doc_m.stock_uom
new_item.description = “Insert New Description Here”
new_item.default_warehouse = doc_m.default_warehouse
new_item.insert()
frappe.msgprint(“New Item Code “+new_num1+” has been generated”)
now tell me one thing
if I do write a return statement at the end of this code say
return new_num1
Then where I will store the same in other side in my JS code
Also, I am facing one more issue in it, that is when I try to run this code on a new document it says there are unsaved changes in the document something like this.
Actually I want to generate the maximum part code in the selected item_group series and tell the user that this is the number you need to assign to this part code. But it works only on the already saved document or either I need to save the document first.
Can you tell me a workaround for it.
My JS Code:
frappe.ui.form.on("Item", "generate_code", function(frm, doctype, name) {
frappe.call({
"method": "library.item_script.generate_document",
args: {
doctype: "Item",
item_group: frm.doc.item_group
},
callback:function(r){
cur_frm.set_value("item_code",new_num1);}
});
cur_frm.set_df_property("generate_code","hidden",true);
});
It is written on a custom button called generate code on item doctype
My Python Code:
@frappe.whitelist(allow_guest=True)
def generate_document(source_name, target=None):
doc_m = frappe.get_doc("Item", source_name)
i=doc_m.item_group[:3]+'%'
j=frappe.db.sql("""select item_code from tabItem where item_code like %s order by item_code desc limit 1""",i)
prefix=j[0][0]
prefix="".join(prefix)
new_prefix=prefix[0:3]
new_suffix=prefix[4:10]
next_num=(int(new_suffix)+1)
next_num1=str(next_num)
new_num1=next_num1.decode("ascii").rjust(6,'0')
new_num1=new_prefix+'-'+new_num1
frappe.msgprint("New Item Code "+new_num1+" has been generated")
return new_num1;
But when I open a new item document and select item group and then press generate code button I receive the below error on my console and I don’t get any result.
SyntaxError: unreachable code after return statement desk.min.js:73:12432
SyntaxError: unreachable code after return statement desk.min.js:7992:187
localStorage cleared desk.min.js:7181:1
Cleared App Cache. desk.min.js:7178:237
localStorage cleared desk.min.js:7181:1
TypeError: ‘submit’ called on an object that does not implement interface HTMLFormElement. jquery.min.js:4:12965
Use of getPreventDefault() is deprecated. Use defaultPrevented instead.
Can anybody help me
Thanks Mr. Rushabh Mehta,
Here is my code with formatting:
JS Code:
frappe.ui.form.on(“Item”, “generate_code”, function(frm, doctype, name) {
frappe.call({
"method": "library.item_script.generate_document",
args: { doctype: "Item", item_group: frm.doc.item_group },
callback:function(r){ cur_frm.set_value("item_code",new_num1);}
});
cur_frm.set_df_property("generate_code","hidden",true);
});
================================================
PY Code:
@frappe.whitelist(allow_guest=True)
def generate_document(source_name, target=None):
doc_m = frappe.get_doc("Item", source_name)
i=doc_m.item_group[:3]+'%'
j=frappe.db.sql("""select item_code from tabItem where item_code like %s order by item_code desc limit 1""",i)
prefix=j[0][0]
prefix="".join(prefix)
new_prefix=prefix[0:3]
new_suffix=prefix[4:10]
next_num=(int(new_suffix)+1)
next_num1=str(next_num)
new_num1=next_num1.decode("ascii").rjust(6,'0')
new_num1=new_prefix+'-'+new_num1
frappe.msgprint("New Item Code "+new_num1+" has been generated")
return new_num1;
I appreciate, if you can help me now.
Can anybody help me on this?
Please check output of [quote=“ruchin78, post:9, topic:7089”]
source_name
[/quote]
in python code.
It gives an error when I press the generate_code button
Traceback (innermost last):
File “/home/sam/frappe-bench/apps/frappe/frappe/app.py”, line 67, in application
response = frappe.handler.handle()
File “/home/sam/frappe-bench/apps/frappe/frappe/handler.py”, line 74, in handle
execute_cmd(cmd)
File “/home/sam/frappe-bench/apps/frappe/frappe/handler.py”, line 99, in execute_cmd
ret = frappe.call(method, **frappe.form_dict)
File “/home/sam/frappe-bench/apps/frappe/frappe/init.py”, line 758, in call
return fn(*args, **newargs)
TypeError: assign_user() takes at least 1 argument (0 given)
@ruchin78 I think you have posted wrong log. This log is related to Assign a document using a custom script or python code post.
Ah! So, sorry for this, the right log is:
Traceback (innermost last):
File “/home/sam/frappe-bench/apps/frappe/frappe/app.py”, line 67, in application
response = frappe.handler.handle()
File “/home/sam/frappe-bench/apps/frappe/frappe/handler.py”, line 74, in handle
execute_cmd(cmd)
File “/home/sam/frappe-bench/apps/frappe/frappe/handler.py”, line 99, in execute_cmd
ret = frappe.call(method, **frappe.form_dict)
File “/home/sam/frappe-bench/apps/frappe/frappe/init.py”, line 758, in call
return fn(*args, **newargs)
TypeError: generate_document() takes at least 1 argument (0 given)
In frappe.call()
you are passing two arguments doctype and item_group
in handler method, you have missed parameters.
rewrite method, in a way that it will accept arguments: doctype and item_group
,
your method should be,
def generate_document(doctype, item_group=None):
It worked for me, thanks a lot.