def toggle_hide_tax_id(self): self.hide_tax_id = cint(self.hide_tax_id) # Make property setters to hide tax_id fields for doctype in ("Sales Order", "Sales Invoice", "Delivery Note"): make_property_setter(doctype, "tax_id", "hidden", self.hide_tax_id, "Check") make_property_setter(doctype, "tax_id", "print_hide", self.hide_tax_id, "Check")
def _make_property_setter(property_name, value): property_setter = frappe.db.exists('Property Setter', {'doc_type': doctype, 'field_name': 'naming_series', 'property': property_name}) if property_setter: frappe.db.set_value('Property Setter', property_setter, 'value', value) else: make_property_setter(doctype, "naming_series", "options", value, "Text")
def execute(): frappe.reload_doc('projects', 'doctype', 'timesheet') frappe.reload_doc('projects', 'doctype', 'timesheet_detail') frappe.reload_doc('accounts', 'doctype', 'sales_invoice_timesheet') make_property_setter('Timesheet', "naming_series", "options", 'TS-', "Text") make_property_setter('Timesheet', "naming_series", "default", 'TS-', "Text")
def preserve_naming_series_options_in_property_setter(self): """Preserve naming_series as property setter if it does not exist""" naming_series = self.get("fields", {"fieldname": "naming_series"}) if not naming_series: return # check if atleast 1 record exists if not ( frappe.db.table_exists(self.name) and frappe.db.sql("select name from `tab{}` limit 1".format(self.name)) ): return existing_property_setter = frappe.db.get_value( "Property Setter", {"doc_type": self.name, "property": "options", "field_name": "naming_series"} ) if not existing_property_setter: make_property_setter( self.name, "naming_series", "options", naming_series[0].options, "Text", validate_fields_for_doctype=False, ) if naming_series[0].default: make_property_setter( self.name, "naming_series", "default", naming_series[0].default, "Text", validate_fields_for_doctype=False, )
def toggle_in_words(self): self.disable_in_words = cint(self.disable_in_words) # Make property setters to hide in words fields for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note", "Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"): make_property_setter(doctype, "in_words", "hidden", self.disable_in_words, "Check") make_property_setter(doctype, "in_words", "print_hide", self.disable_in_words, "Check")
def set_sales_order_field(): for data in frappe.db.sql("""select doc_type, field_name, property, value, property_type from `tabProperty Setter` where doc_type = 'Purchase Order Item' and field_name in('material_request', 'material_request_item')""", as_dict=True): if data.field_name == 'material_request': make_property_setter(data.doc_type, 'sales_order', data.property, data.value, data.property_type) else: make_property_setter(data.doc_type, 'sales_order_item', data.property, data.value, data.property_type)
def test_update_fields(self): self.insert_test_events() results = global_search.search('Every Month') self.assertEqual(len(results), 0) doctype = "Event" from frappe.custom.doctype.property_setter.property_setter import make_property_setter make_property_setter(doctype, "repeat_on", "in_global_search", 1, "Int") global_search.rebuild_for_doctype(doctype) results = global_search.search('Every Month') self.assertEqual(len(results), 3)
def toggle_in_words(self): self.disable_in_words = cint(self.disable_in_words) # Make property setters to hide in words fields for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note", "Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"): make_property_setter(doctype, "in_words", "hidden", self.disable_in_words, "Check") make_property_setter(doctype, "in_words", "print_hide", self.disable_in_words, "Check")
def test_reportview_get(self): user = frappe.get_doc("User", "*****@*****.**") add_child_table_to_blog_post() user_roles = frappe.get_roles() user.remove_roles(*user_roles) user.add_roles("Blogger") make_property_setter("Blog Post", "published", "permlevel", 1, "Int") reset("Blog Post") add("Blog Post", "Website Manager", 1) update("Blog Post", "Website Manager", 1, "write", 1) frappe.set_user(user.name) frappe.local.request = frappe._dict() frappe.local.request.method = "POST" frappe.local.form_dict = frappe._dict({ "doctype": "Blog Post", "fields": ["published", "title", "`tabTest Child`.`test_field`"], }) # even if * is passed, fields which are not accessible should be filtered out response = execute_cmd("frappe.desk.reportview.get") self.assertListEqual(response["keys"], ["title"]) frappe.local.form_dict = frappe._dict({ "doctype": "Blog Post", "fields": ["*"], }) response = execute_cmd("frappe.desk.reportview.get") self.assertNotIn("published", response["keys"]) frappe.set_user("Administrator") user.add_roles("Website Manager") frappe.set_user(user.name) frappe.set_user("Administrator") # Admin should be able to see access all fields frappe.local.form_dict = frappe._dict({ "doctype": "Blog Post", "fields": ["published", "title", "`tabTest Child`.`test_field`"], }) response = execute_cmd("frappe.desk.reportview.get") self.assertListEqual(response["keys"], ['published', 'title', 'test_field']) # reset user roles user.remove_roles("Blogger", "Website Manager") user.add_roles(*user_roles)
def _make_property_setter(property_name, value): property_setter = frappe.db.exists( 'Property Setter', { 'doc_type': doctype, 'field_name': 'naming_series', 'property': property_name }) if property_setter: frappe.db.set_value('Property Setter', property_setter, 'value', value) else: make_property_setter(doctype, "naming_series", "options", value, "Text")
def toggle_rounded_total(self): self.disable_rounded_total = cint(self.disable_rounded_total) # Make property setters to hide rounded total fields for doctype in ( "Quotation", "Sales Order", "Sales Invoice", "Delivery Note", "Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt", ): make_property_setter( doctype, "base_rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False, ) make_property_setter( doctype, "base_rounded_total", "print_hide", 1, "Check", validate_fields_for_doctype=False ) make_property_setter( doctype, "rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False, ) make_property_setter( doctype, "rounded_total", "print_hide", self.disable_rounded_total, "Check", validate_fields_for_doctype=False, ) make_property_setter( doctype, "disable_rounded_total", "default", cint(self.disable_rounded_total), "Text", validate_fields_for_doctype=False, )
def toggle_warehouse_field_for_inter_warehouse_transfer(self): make_property_setter("Sales Invoice Item", "target_warehouse", "hidden", 1 - cint(self.allow_from_dn), "Check", validate_fields_for_doctype=False) make_property_setter("Delivery Note Item", "target_warehouse", "hidden", 1 - cint(self.allow_from_dn), "Check", validate_fields_for_doctype=False) make_property_setter("Purchase Invoice Item", "from_warehouse", "hidden", 1 - cint(self.allow_from_pr), "Check", validate_fields_for_doctype=False) make_property_setter("Purchase Receipt Item", "from_warehouse", "hidden", 1 - cint(self.allow_from_pr), "Check", validate_fields_for_doctype=False)
def toggle_rounded_total(self): self.disable_rounded_total = cint(self.disable_rounded_total) make_property_setter("Salary Slip", "rounded_total", "hidden", self.disable_rounded_total, "Check", validate_fields_for_doctype=False) make_property_setter("Salary Slip", "rounded_total", "print_hide", self.disable_rounded_total, "Check", validate_fields_for_doctype=False)
def set_series(doctype, value): doc = frappe.db.exists("Property Setter", { "doc_type": doctype, "property": "autoname" }) if doc: frappe.db.set_value("Property Setter", doc, "value", value) else: make_property_setter(doctype, "", "autoname", value, "", for_doctype=True)
def set_series(doctype, value): doc = frappe.db.exists('Property Setter', { 'doc_type': doctype, 'property': 'autoname' }) if doc: frappe.db.set_value('Property Setter', doc, 'value', value) else: make_property_setter(doctype, '', 'autoname', value, '', for_doctype=True)
def test_update_child_with_precision(self): from frappe.model.meta import get_field_precision from frappe.custom.doctype.property_setter.property_setter import make_property_setter precision = get_field_precision(frappe.get_meta("Sales Order Item").get_field("rate")) make_property_setter("Sales Order Item", "rate", "precision", 7, "Currency") so = make_sales_order(item_code= "_Test Item", qty=4, rate=200.34664) trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200.34669, 'qty' : 4, 'docname': so.items[0].name}]) update_child_qty_rate('Sales Order', trans_item, so.name) so.reload() self.assertEqual(so.items[0].rate, 200.34669) make_property_setter("Sales Order Item", "rate", "precision", precision, "Currency")
def _make_property_setter(property_name, value): property_setter = frappe.db.exists( "Property Setter", { "doc_type": doctype, "field_name": "naming_series", "property": property_name }, ) if property_setter: frappe.db.set_value("Property Setter", property_setter, "value", value) else: make_property_setter(doctype, "naming_series", "options", value, "Text")
def enable_payment_schedule_in_print(self): show_in_print = cint(self.show_payment_schedule_in_print) for doctype in ("Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"): make_property_setter(doctype, "due_date", "print_hide", show_in_print, "Check", validate_fields_for_doctype=False) make_property_setter(doctype, "payment_schedule", "print_hide", 0 if show_in_print else 1, "Check", validate_fields_for_doctype=False)
def test_attachment_limit(self): doctype, docname = make_test_doc() from frappe.custom.doctype.property_setter.property_setter import make_property_setter limit_property = make_property_setter('ToDo', None, 'max_attachments', 1, 'int', for_doctype=True) file1 = frappe.get_doc({ "doctype": "File", "file_name": 'test-attachment', "attached_to_doctype": doctype, "attached_to_name": docname, "content": 'test' }) file1.insert() file2 = frappe.get_doc({ "doctype": "File", "file_name": 'test-attachment', "attached_to_doctype": doctype, "attached_to_name": docname, "content": 'test2' }) self.assertRaises(frappe.exceptions.AttachmentLimitReached, file2.insert) limit_property.delete() frappe.clear_cache(doctype='ToDo')
def validate_provisional_account_for_non_stock_items(self): if not self.get("__islocal"): if (cint(self.enable_provisional_accounting_for_non_stock_items) == 1 and not self.default_provisional_account): frappe.throw( _("Set default {0} account for non stock items").format( frappe.bold("Provisional Account"))) make_property_setter( "Purchase Receipt", "provisional_expense_account", "hidden", not self.enable_provisional_accounting_for_non_stock_items, "Check", validate_fields_for_doctype=False, )
def test_fieldlevel_permissions_in_load(self): blog = frappe.get_doc({ "doctype": "Blog Post", "blog_category": "-test-blog-category-1", "blog_intro": "Test Blog Intro", "blogger": "_Test Blogger 1", "content": "Test Blog Content", "title": "_Test Blog Post {}".format(frappe.utils.now()), "published": 0 }) blog.insert() user = frappe.get_doc('User', '*****@*****.**') user_roles = frappe.get_roles() user.remove_roles(*user_roles) user.add_roles('Blogger') blog_post_property_setter = make_property_setter('Blog Post', 'published', 'permlevel', 1, 'Int') reset('Blog Post') add('Blog Post', 'Website Manager', 1) update('Blog Post', 'Website Manager', 1, 'write', 1) frappe.set_user(user.name) blog_doc = get_blog(blog.name) self.assertEqual(blog_doc.name, blog.name) # since published field has higher permlevel self.assertEqual(blog_doc.published, None) # this will be ignored because user does not # have write access on `published` field (or on permlevel 1 fields) blog_doc.published = 1 blog_doc.save() # since published field has higher permlevel self.assertEqual(blog_doc.published, 0) frappe.set_user('Administrator') user.add_roles('Website Manager') frappe.set_user(user.name) doc = frappe.get_doc('Blog Post', blog.name) doc.published = 1 doc.save() blog_doc = get_blog(blog.name) # now user should be allowed to read field with higher permlevel # (after adding Website Manager role) self.assertEqual(blog_doc.published, 1) frappe.set_user('Administrator') # reset user roles user.remove_roles('Blogger', 'Website Manager') user.add_roles(*user_roles) blog_doc.delete() frappe.delete_doc(blog_post_property_setter.doctype, blog_post_property_setter.name)
def validate(self): from frappe.custom.doctype.property_setter.property_setter import make_property_setter if self.get('instructor_created_by') == 'Naming Series': make_property_setter('Instructor', "naming_series", "hidden", 0, "Check", validate_fields_for_doctype=False) else: make_property_setter('Instructor', "naming_series", "hidden", 1, "Check", validate_fields_for_doctype=False)
def toggle_hide_tax_id(self): self.hide_tax_id = cint(self.hide_tax_id) # Make property setters to hide tax_id fields for doctype in ("Sales Order", "Sales Invoice", "Delivery Note"): make_property_setter(doctype, "tax_id", "hidden", self.hide_tax_id, "Check", validate_fields_for_doctype=False) make_property_setter(doctype, "tax_id", "print_hide", self.hide_tax_id, "Check", validate_fields_for_doctype=False)
def toggle_rounded_total(self): self.disable_rounded_total = cint(self.disable_rounded_total) # Make property setters to hide rounded total fields for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note"): make_property_setter(doctype, "base_rounded_total", "hidden", self.disable_rounded_total, "Check") make_property_setter(doctype, "base_rounded_total", "print_hide", 1, "Check") make_property_setter(doctype, "rounded_total", "hidden", self.disable_rounded_total, "Check") make_property_setter(doctype, "rounded_total", "print_hide", self.disable_rounded_total, "Check")
def setUp(self): global_search.setup_global_search_table() self.assertTrue('__global_search' in frappe.db.get_tables()) doctype = "Event" global_search.reset() from frappe.custom.doctype.property_setter.property_setter import make_property_setter make_property_setter(doctype, "subject", "in_global_search", 1, "Int") make_property_setter(doctype, "event_type", "in_global_search", 1, "Int") make_property_setter(doctype, "roles", "in_global_search", 1, "Int") make_property_setter(doctype, "repeat_on", "in_global_search", 0, "Int")
def setUp(self): global_search.setup_global_search_table() self.assertTrue('__global_search' in frappe.db.get_tables()) doctype = "Event" global_search.reset() from frappe.custom.doctype.property_setter.property_setter import make_property_setter make_property_setter(doctype, "subject", "in_global_search", 1, "Int") make_property_setter(doctype, "event_type", "in_global_search", 1, "Int") make_property_setter(doctype, "roles", "in_global_search", 1, "Int") make_property_setter(doctype, "repeat_on", "in_global_search", 0, "Int")
def preserve_naming_series_options_in_property_setter(self): """Preserve naming_series as property setter if it does not exist""" naming_series = self.get("fields", {"fieldname": "naming_series"}) if not naming_series: return # check if atleast 1 record exists if not (frappe.db.table_exists(self.name) and frappe.db.sql("select name from `tab{}` limit 1".format(self.name))): return existing_property_setter = frappe.db.get_value("Property Setter", {"doc_type": self.name, "property": "options", "field_name": "naming_series"}) if not existing_property_setter: make_property_setter(self.name, "naming_series", "options", naming_series[0].options, "Text", validate_fields_for_doctype=False) if naming_series[0].default: make_property_setter(self.name, "naming_series", "default", naming_series[0].default, "Text", validate_fields_for_doctype=False)
def toggle_rounded_total(self): self.disable_rounded_total = cint(self.disable_rounded_total) # Make property setters to hide rounded total fields for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note", "Supplier Quotation", "Purchase Order"): make_property_setter(doctype, "base_rounded_total", "hidden", self.disable_rounded_total, "Check") make_property_setter(doctype, "base_rounded_total", "print_hide", 1, "Check") make_property_setter(doctype, "rounded_total", "hidden", self.disable_rounded_total, "Check") make_property_setter(doctype, "rounded_total", "print_hide", self.disable_rounded_total, "Check")
def update(doctype, series): field = frappe.model.meta.get_meta(doctype).get_field("naming_series") if series not in field.options: options = series + "\n" + (field.options or "") make_property_setter( doctype, "naming_series", "options", options, "Text", ) if series != field.default: make_property_setter( doctype, "naming_series", "default", series, "Text", )
def test_fieldlevel_permissions_in_load_for_child_table(self): contact = frappe.new_doc("Contact") contact.first_name = "_Test Contact 1" contact.append("phone_nos", {"phone": "123456"}) contact.insert() user = frappe.get_doc("User", "*****@*****.**") user_roles = frappe.get_roles() user.remove_roles(*user_roles) user.add_roles("Accounts User") make_property_setter("Contact Phone", "phone", "permlevel", 1, "Int") reset("Contact Phone") add("Contact", "Sales User", 1) update("Contact", "Sales User", 1, "write", 1) frappe.set_user(user.name) contact = frappe.get_doc("Contact", "_Test Contact 1") contact.phone_nos[0].phone = "654321" contact.save() self.assertEqual(contact.phone_nos[0].phone, "123456") frappe.set_user("Administrator") user.add_roles("Sales User") frappe.set_user(user.name) contact.phone_nos[0].phone = "654321" contact.save() contact = frappe.get_doc("Contact", "_Test Contact 1") self.assertEqual(contact.phone_nos[0].phone, "654321") frappe.set_user("Administrator") # reset user roles user.remove_roles("Accounts User", "Sales User") user.add_roles(*user_roles) contact.delete()
def test_fieldlevel_permissions_in_load_for_child_table(self): contact = frappe.new_doc('Contact') contact.first_name = '_Test Contact 1' contact.append('phone_nos', {'phone': '123456'}) contact.insert() user = frappe.get_doc('User', '*****@*****.**') user_roles = frappe.get_roles() user.remove_roles(*user_roles) user.add_roles('Accounts User') make_property_setter('Contact Phone', 'phone', 'permlevel', 1, 'Int') reset('Contact Phone') add('Contact', 'Sales User', 1) update('Contact', 'Sales User', 1, 'write', 1) frappe.set_user(user.name) contact = frappe.get_doc('Contact', '_Test Contact 1') contact.phone_nos[0].phone = '654321' contact.save() self.assertEqual(contact.phone_nos[0].phone, '123456') frappe.set_user('Administrator') user.add_roles('Sales User') frappe.set_user(user.name) contact.phone_nos[0].phone = '654321' contact.save() contact = frappe.get_doc('Contact', '_Test Contact 1') self.assertEqual(contact.phone_nos[0].phone, '654321') frappe.set_user('Administrator') # reset user roles user.remove_roles('Accounts User', 'Sales User') user.add_roles(*user_roles) contact.delete()
def tearDown(self) -> None: make_property_setter( doctype="GL Entry", for_doctype=True, property="autoname", value=self.gle_autoname, property_type="Data", fieldname=None, ) make_property_setter( doctype="Stock Ledger Entry", for_doctype=True, property="autoname", value=self.sle_autoname, property_type="Data", fieldname=None, ) # since deferred naming autocommits, commit all changes to avoid flake frappe.db.commit() # nosemgrep
def on_update(self): hide_batch_price = not cint(self.use_batch_price) make_property_setter("Batch", "pb_price_sec", "hidden", hide_batch_price, "Check") make_property_setter("Batch", "pb_price_sec", "print_hide", hide_batch_price, "Check") hide_barcode_uom = not cint(self.use_barcode_uom) make_property_setter("Item Barcode", "pb_uom", "hidden", hide_barcode_uom, "Check") hide_sales_employee = not cint(self.show_sales_employee) make_property_setter("Sales Invoice", "pb_sales_employee", "hidden", hide_sales_employee, "Check") make_property_setter( "Sales Invoice", "pb_sales_employee", "reqd", not hide_sales_employee, "Check", )
def test_db_update(self): doctype = "User" frappe.reload_doctype("User", force=True) frappe.model.meta.trim_tables("User") make_property_setter(doctype, "bio", "fieldtype", "Text", "Data") make_property_setter(doctype, "middle_name", "fieldtype", "Data", "Text") make_property_setter(doctype, "enabled", "default", "1", "Int") frappe.db.updatedb(doctype) field_defs = get_field_defs(doctype) table_columns = frappe.db.get_table_columns_description("tab{}".format(doctype)) self.assertEqual(len(field_defs), len(table_columns)) for field_def in field_defs: fieldname = field_def.get("fieldname") table_column = find(table_columns, lambda d: d.get("name") == fieldname) fieldtype = get_fieldtype_from_def(field_def) fallback_default = ( "0" if field_def.get("fieldtype") in frappe.model.numeric_fieldtypes else "NULL" ) default = field_def.default if field_def.default is not None else fallback_default self.assertEqual(fieldtype, table_column.type) self.assertIn(cstr(table_column.default) or "NULL", [cstr(default), "'{}'".format(default)])
def test_db_update(self): doctype = 'User' frappe.reload_doctype('User', force=True) frappe.model.meta.trim_tables('User') make_property_setter(doctype, 'bio', 'fieldtype', 'Text', 'Data') make_property_setter(doctype, 'middle_name', 'fieldtype', 'Data', 'Text') make_property_setter(doctype, 'enabled', 'default', '1', 'Int') frappe.db.updatedb(doctype) field_defs = get_field_defs(doctype) table_columns = frappe.db.get_table_columns_description('tab{}'.format(doctype)) self.assertEqual(len(field_defs), len(table_columns)) for field_def in field_defs: fieldname = field_def.get('fieldname') table_column = find(table_columns, lambda d: d.get('name') == fieldname) fieldtype = get_fieldtype_from_def(field_def) fallback_default = '0' if field_def.get('fieldtype') in frappe.model.numeric_fieldtypes else 'NULL' default = field_def.default if field_def.default is not None else fallback_default self.assertEqual(fieldtype, table_column.type) self.assertIn(cstr(table_column.default) or 'NULL', [cstr(default), "'{}'".format(default)])
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 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 on_update(self): hide_batch_price = not cint(self.use_batch_price) make_property_setter("Batch", "pb_price_sec", "hidden", hide_batch_price, "Check") make_property_setter("Batch", "pb_price_sec", "print_hide", hide_batch_price, "Check") hide_barcode_uom = not cint(self.use_barcode_uom) make_property_setter("Item Barcode", "pb_uom", "hidden", hide_barcode_uom, "Check")
def test_opening_sales_invoice_creation(self): property_setter = make_property_setter("Sales Invoice", "update_stock", "default", 1, "Check") invoices = self.make_invoices(company="_Test Opening Invoice Company") self.assertEqual(len(invoices), 2) expected_value = { "keys": ["customer", "outstanding_amount", "status"], 0: ["_Test Customer", 300, "Overdue"], 1: ["_Test Customer 1", 250, "Overdue"], } self.check_expected_values(invoices, expected_value) si = frappe.get_doc("Sales Invoice", invoices[0]) # Check if update stock is not enabled self.assertEqual(si.update_stock, 0) property_setter.delete()
def set_series(doctype, options, default): make_property_setter(doctype, "naming_series", "options", options, "Text") make_property_setter(doctype, "naming_series", "default", default, "Text")
def enable_payment_schedule_in_print(self): show_in_print = cint(self.show_payment_schedule_in_print) for doctype in ("Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"): make_property_setter(doctype, "due_date", "print_hide", show_in_print, "Check") make_property_setter(doctype, "payment_schedule", "print_hide", 0 if show_in_print else 1, "Check")
def enable_fields_for_cost_center_settings(self): show_field = 0 if cint(self.allow_cost_center_in_entry_of_bs_account) else 1 for doctype in ("Sales Invoice", "Purchase Invoice", "Payment Entry"): make_property_setter(doctype, "cost_center", "hidden", show_field, "Check")
def set_series(doctype, options, default): make_property_setter(doctype, "naming_series", "options", options, "Text") make_property_setter(doctype, "naming_series", "default", default, "Text")
def set_by_naming_series(doctype, fieldname, naming_series, hide_name_field=True): from frappe.custom.doctype.property_setter.property_setter import make_property_setter if naming_series: make_property_setter(doctype, "naming_series", "hidden", 0, "Check") make_property_setter(doctype, "naming_series", "reqd", 1, "Check") # set values for mandatory try: frappe.db.sql("""update `tab{doctype}` set naming_series={s} where ifnull(naming_series, '')=''""".format(doctype=doctype, s="%s"), get_default_naming_series(doctype)) except NamingSeriesNotSetError: pass if hide_name_field: make_property_setter(doctype, fieldname, "reqd", 0, "Check") make_property_setter(doctype, fieldname, "hidden", 1, "Check") else: make_property_setter(doctype, "naming_series", "reqd", 0, "Check") make_property_setter(doctype, "naming_series", "hidden", 1, "Check") if hide_name_field: make_property_setter(doctype, fieldname, "hidden", 0, "Check") make_property_setter(doctype, fieldname, "reqd", 1, "Check") # set values for mandatory frappe.db.sql("""update `tab{doctype}` set `{fieldname}`=`name` where ifnull({fieldname}, '')=''""".format(doctype=doctype, fieldname=fieldname))
def set_series(doctype, value): doc = frappe.db.exists('Property Setter', {'doc_type': doctype, 'property': 'autoname'}) if doc: frappe.db.set_value('Property Setter', doc, 'value', value) else: make_property_setter(doctype, '', 'autoname', value, '', for_doctype = True)
def toggle_simplified_time_log(self): self.simplified_time_log = cint(self.simplified_time_log) set_default('fs_simplified_time_log', self.simplified_time_log) # Make Time log property setters to hide if self.simplified_time_log: make_property_setter("Time Log", "date_worked", "hidden", not self.simplified_time_log, "Check") make_property_setter("Time Log", "date_worked", "reqd", self.simplified_time_log, "Check") else: make_property_setter("Time Log", "date_worked", "reqd", self.simplified_time_log, "Check") make_property_setter("Time Log", "date_worked", "hidden", not self.simplified_time_log, "Check") make_property_setter("Time Log", "to_time", "hidden", self.simplified_time_log, "Check") make_property_setter("Time Log", "from_time", "hidden", self.simplified_time_log, "Check") make_property_setter("Time Log", "date_worked", "in_list_view", self.simplified_time_log, "Check")
def update_values(dt, tax_table): frappe.reload_doctype(dt) frappe.reload_doctype(dt + " Item") frappe.reload_doctype(tax_table) net_total_precision = get_field_precision(frappe.get_meta(dt).get_field("net_total")) for field in ("total", "base_total", "base_net_total"): make_property_setter(dt, field, "precision", net_total_precision, "Select") rate_field_precision = get_field_precision(frappe.get_meta(dt + " Item").get_field("rate")) for field in ("net_rate", "base_net_rate", "net_amount", "base_net_amount", "base_rate", "base_amount"): make_property_setter(dt + " Item", field, "precision", rate_field_precision, "Select") tax_amount_precision = get_field_precision(frappe.get_meta(tax_table).get_field("tax_amount")) for field in ("base_tax_amount", "total", "base_total", "tax_amount_after_discount_amount", "base_tax_amount_after_discount_amount"): make_property_setter(tax_table, field, "precision", tax_amount_precision, "Select") # update net_total, discount_on frappe.db.sql(""" UPDATE `tab{0}` SET total = round(net_total, {1}), base_total = round(net_total*conversion_rate, {1}), net_total = round(base_net_total / conversion_rate, {1}), apply_discount_on = "Grand Total" WHERE docstatus < 2 """.format(dt, net_total_precision)) # update net_amount frappe.db.sql(""" UPDATE `tab{0}` par, `tab{1}` item SET item.base_net_amount = round(item.base_amount, {2}), item.base_net_rate = round(item.base_rate, {2}), item.net_amount = round(item.base_amount / par.conversion_rate, {2}), item.net_rate = round(item.base_rate / par.conversion_rate, {2}), item.base_amount = round(item.amount * par.conversion_rate, {2}), item.base_rate = round(item.rate * par.conversion_rate, {2}) WHERE par.name = item.parent and par.docstatus < 2 """.format(dt, dt + " Item", rate_field_precision)) # update tax in party currency frappe.db.sql(""" UPDATE `tab{0}` par, `tab{1}` tax SET tax.base_tax_amount = round(tax.tax_amount, {2}), tax.tax_amount = round(tax.tax_amount / par.conversion_rate, {2}), tax.base_total = round(tax.total, {2}), tax.total = round(tax.total / conversion_rate, {2}), tax.base_tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount, {2}), tax.tax_amount_after_discount_amount = round(tax.tax_amount_after_discount_amount / conversion_rate, {2}) WHERE par.name = tax.parent and par.docstatus < 2 """.format(dt, tax_table, tax_amount_precision))
def validate(self): from frappe.custom.doctype.property_setter.property_setter import make_property_setter if self.get('instructor_created_by')=='Naming Series': make_property_setter('Instructor', "naming_series", "hidden", 0, "Check") else: make_property_setter('Instructor', "naming_series", "hidden", 1, "Check")