mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-03 04:09:11 +00:00
Merge pull request #54301 from ruthra-kumar/merge_repost_settings_to_accounts_settings
refactor(ux): merge repost settings to accounts settings
This commit is contained in:
@@ -2,7 +2,15 @@
|
|||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
frappe.ui.form.on("Accounts Settings", {
|
frappe.ui.form.on("Accounts Settings", {
|
||||||
refresh: function (frm) {},
|
refresh: function (frm) {
|
||||||
|
frm.set_query("document_type", "repost_allowed_types", function (doc, cdt, cdn) {
|
||||||
|
return {
|
||||||
|
filters: {
|
||||||
|
name: ["in", frappe.boot.sysdefaults.repost_allowed_doctypes],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
enable_immutable_ledger: function (frm) {
|
enable_immutable_ledger: function (frm) {
|
||||||
if (!frm.doc.enable_immutable_ledger) {
|
if (!frm.doc.enable_immutable_ledger) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -63,6 +63,8 @@
|
|||||||
"reconciliation_queue_size",
|
"reconciliation_queue_size",
|
||||||
"column_break_resa",
|
"column_break_resa",
|
||||||
"exchange_gain_loss_posting_date",
|
"exchange_gain_loss_posting_date",
|
||||||
|
"repost_section",
|
||||||
|
"repost_allowed_types",
|
||||||
"payment_options_section",
|
"payment_options_section",
|
||||||
"enable_loyalty_point_program",
|
"enable_loyalty_point_program",
|
||||||
"column_break_ctam",
|
"column_break_ctam",
|
||||||
@@ -703,6 +705,17 @@
|
|||||||
"fieldname": "fetch_payment_schedule_in_payment_request",
|
"fieldname": "fetch_payment_schedule_in_payment_request",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Fetch Payment Schedule In Payment Request"
|
"label": "Fetch Payment Schedule In Payment Request"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "repost_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Repost"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "repost_allowed_types",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"label": "Allowed Doctypes",
|
||||||
|
"options": "Repost Allowed Types"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"grid_page_length": 50,
|
"grid_page_length": 50,
|
||||||
@@ -711,7 +724,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2026-03-30 07:32:58.182018",
|
"modified": "2026-04-13 15:30:28.729627",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Accounts Settings",
|
"name": "Accounts Settings",
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ from frappe.custom.doctype.property_setter.property_setter import make_property_
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import cint
|
from frappe.utils import cint
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
|
||||||
|
get_accounting_dimensions,
|
||||||
|
)
|
||||||
from erpnext.accounts.utils import sync_auto_reconcile_config
|
from erpnext.accounts.utils import sync_auto_reconcile_config
|
||||||
|
|
||||||
SELLING_DOCTYPES = [
|
SELLING_DOCTYPES = [
|
||||||
@@ -44,6 +47,8 @@ class AccountsSettings(Document):
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from frappe.types import DF
|
from frappe.types import DF
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.repost_allowed_types.repost_allowed_types import RepostAllowedTypes
|
||||||
|
|
||||||
add_taxes_from_item_tax_template: DF.Check
|
add_taxes_from_item_tax_template: DF.Check
|
||||||
add_taxes_from_taxes_and_charges_template: DF.Check
|
add_taxes_from_taxes_and_charges_template: DF.Check
|
||||||
allow_multi_currency_invoices_against_single_party_account: DF.Check
|
allow_multi_currency_invoices_against_single_party_account: DF.Check
|
||||||
@@ -87,6 +92,7 @@ class AccountsSettings(Document):
|
|||||||
receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"]
|
receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"]
|
||||||
receivable_payable_remarks_length: DF.Int
|
receivable_payable_remarks_length: DF.Int
|
||||||
reconciliation_queue_size: DF.Int
|
reconciliation_queue_size: DF.Int
|
||||||
|
repost_allowed_types: DF.Table[RepostAllowedTypes]
|
||||||
role_allowed_to_over_bill: DF.Link | None
|
role_allowed_to_over_bill: DF.Link | None
|
||||||
role_to_notify_on_depreciation_failure: DF.Link | None
|
role_to_notify_on_depreciation_failure: DF.Link | None
|
||||||
role_to_override_stop_action: DF.Link | None
|
role_to_override_stop_action: DF.Link | None
|
||||||
@@ -145,6 +151,7 @@ class AccountsSettings(Document):
|
|||||||
frappe.clear_cache()
|
frappe.clear_cache()
|
||||||
|
|
||||||
self.validate_and_sync_auto_reconcile_config()
|
self.validate_and_sync_auto_reconcile_config()
|
||||||
|
self.update_property_for_accounting_dimension()
|
||||||
|
|
||||||
def validate_stale_days(self):
|
def validate_stale_days(self):
|
||||||
if not self.allow_stale and cint(self.stale_days) <= 0:
|
if not self.allow_stale and cint(self.stale_days) <= 0:
|
||||||
@@ -191,6 +198,17 @@ class AccountsSettings(Document):
|
|||||||
title=_("Auto Tax Settings Error"),
|
title=_("Auto Tax Settings Error"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def update_property_for_accounting_dimension(self):
|
||||||
|
doctypes = [entry.document_type for entry in self.repost_allowed_types]
|
||||||
|
if not doctypes:
|
||||||
|
return
|
||||||
|
|
||||||
|
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import get_child_docs
|
||||||
|
|
||||||
|
doctypes += get_child_docs(doctypes)
|
||||||
|
|
||||||
|
set_allow_on_submit_for_dimension_fields(doctypes)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def drop_ar_sql_procedures(self):
|
def drop_ar_sql_procedures(self):
|
||||||
from erpnext.accounts.report.accounts_receivable.accounts_receivable import InitSQLProceduresForAR
|
from erpnext.accounts.report.accounts_receivable.accounts_receivable import InitSQLProceduresForAR
|
||||||
@@ -236,3 +254,12 @@ def create_property_setter_for_hiding_field(doctype, field_name, hide):
|
|||||||
"Check",
|
"Check",
|
||||||
validate_fields_for_doctype=False,
|
validate_fields_for_doctype=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def set_allow_on_submit_for_dimension_fields(doctypes):
|
||||||
|
for dt in doctypes:
|
||||||
|
meta = frappe.get_meta(dt)
|
||||||
|
for dimension in get_accounting_dimensions():
|
||||||
|
df = meta.get_field(dimension)
|
||||||
|
if df and not df.allow_on_submit:
|
||||||
|
frappe.db.set_value("Custom Field", dt + "-" + dimension, "allow_on_submit", 1)
|
||||||
|
|||||||
@@ -413,9 +413,9 @@ class TestJournalEntry(ERPNextTestSuite):
|
|||||||
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
|
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
|
||||||
|
|
||||||
# Configure Repost Accounting Ledger for JVs
|
# Configure Repost Accounting Ledger for JVs
|
||||||
settings = frappe.get_doc("Repost Accounting Ledger Settings")
|
settings = frappe.get_doc("Accounts Settings")
|
||||||
if not [x for x in settings.allowed_types if x.document_type == "Journal Entry"]:
|
if "Journal Entry" not in [x.document_type for x in settings.repost_allowed_types]:
|
||||||
settings.append("allowed_types", {"document_type": "Journal Entry", "allowed": True})
|
settings.append("repost_allowed_types", {"document_type": "Journal Entry"})
|
||||||
settings.save()
|
settings.save()
|
||||||
|
|
||||||
# Create JV with defaut cost center - _Test Cost Center
|
# Create JV with defaut cost center - _Test Cost Center
|
||||||
|
|||||||
@@ -2256,9 +2256,9 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin):
|
|||||||
|
|
||||||
def test_repost_accounting_entries(self):
|
def test_repost_accounting_entries(self):
|
||||||
# update repost settings
|
# update repost settings
|
||||||
settings = frappe.get_doc("Repost Accounting Ledger Settings")
|
settings = frappe.get_doc("Accounts Settings")
|
||||||
if not [x for x in settings.allowed_types if x.document_type == "Purchase Invoice"]:
|
if "Purchase Invoice" not in [x.document_type for x in settings.repost_allowed_types]:
|
||||||
settings.append("allowed_types", {"document_type": "Purchase Invoice", "allowed": True})
|
settings.append("repost_allowed_types", {"document_type": "Purchase Invoice"})
|
||||||
settings.save()
|
settings.save()
|
||||||
|
|
||||||
pi = make_purchase_invoice(
|
pi = make_purchase_invoice(
|
||||||
|
|||||||
@@ -217,7 +217,6 @@ def get_allowed_types_from_settings(child_doc: bool = False):
|
|||||||
x.document_type
|
x.document_type
|
||||||
for x in frappe.db.get_all(
|
for x in frappe.db.get_all(
|
||||||
"Repost Allowed Types",
|
"Repost Allowed Types",
|
||||||
filters={"allowed": True},
|
|
||||||
fields=["document_type"],
|
fields=["document_type"],
|
||||||
distinct=True,
|
distinct=True,
|
||||||
)
|
)
|
||||||
@@ -272,14 +271,13 @@ def validate_docs_for_voucher_types(doc_voucher_types):
|
|||||||
if disallowed_types := voucher_types.difference(allowed_types):
|
if disallowed_types := voucher_types.difference(allowed_types):
|
||||||
message = "are" if len(disallowed_types) > 1 else "is"
|
message = "are" if len(disallowed_types) > 1 else "is"
|
||||||
frappe.throw(
|
frappe.throw(
|
||||||
_("{0} {1} not allowed to be reposted. Modify {2} to enable reposting.").format(
|
_(
|
||||||
|
"{0} {1} not allowed to be reposted. You can enable it by adding it '{2}' table in {3}."
|
||||||
|
).format(
|
||||||
frappe.bold(comma_and(list(disallowed_types))),
|
frappe.bold(comma_and(list(disallowed_types))),
|
||||||
message,
|
message,
|
||||||
frappe.bold(
|
frappe.bold("Allowed Doctype"),
|
||||||
frappe.utils.get_link_to_form(
|
frappe.utils.get_link_to_form("Accounts Settings"),
|
||||||
"Repost Accounting Ledger Settings", "Repost Accounting Ledger Settings"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -289,8 +287,6 @@ def validate_docs_for_voucher_types(doc_voucher_types):
|
|||||||
def get_repost_allowed_types(
|
def get_repost_allowed_types(
|
||||||
doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict
|
doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict
|
||||||
):
|
):
|
||||||
filters = {"allowed": True}
|
|
||||||
|
|
||||||
if txt:
|
if txt:
|
||||||
filters.update({"document_type": ("like", f"%{txt}%")})
|
filters.update({"document_type": ("like", f"%{txt}%")})
|
||||||
|
|
||||||
|
|||||||
@@ -280,7 +280,8 @@ def update_repost_settings():
|
|||||||
"Journal Entry",
|
"Journal Entry",
|
||||||
"Purchase Receipt",
|
"Purchase Receipt",
|
||||||
]
|
]
|
||||||
repost_settings = frappe.get_doc("Repost Accounting Ledger Settings")
|
settings = frappe.get_doc("Accounts Settings")
|
||||||
for x in allowed_types:
|
for _type in allowed_types:
|
||||||
repost_settings.append("allowed_types", {"document_type": x, "allowed": True})
|
if _type not in [x.document_type for x in settings.repost_allowed_types]:
|
||||||
repost_settings.save()
|
settings.append("repost_allowed_types", {"document_type": _type})
|
||||||
|
settings.save()
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
|
|
||||||
// For license information, please see license.txt
|
|
||||||
|
|
||||||
// frappe.ui.form.on("Repost Accounting Ledger Settings", {
|
|
||||||
// refresh(frm) {
|
|
||||||
|
|
||||||
// },
|
|
||||||
// });
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
{
|
|
||||||
"actions": [],
|
|
||||||
"creation": "2023-11-07 09:57:20.619939",
|
|
||||||
"doctype": "DocType",
|
|
||||||
"engine": "InnoDB",
|
|
||||||
"field_order": [
|
|
||||||
"allowed_types"
|
|
||||||
],
|
|
||||||
"fields": [
|
|
||||||
{
|
|
||||||
"fieldname": "allowed_types",
|
|
||||||
"fieldtype": "Table",
|
|
||||||
"label": "Allowed Doctypes",
|
|
||||||
"options": "Repost Allowed Types"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"grid_page_length": 50,
|
|
||||||
"hide_toolbar": 0,
|
|
||||||
"in_create": 1,
|
|
||||||
"issingle": 1,
|
|
||||||
"links": [],
|
|
||||||
"modified": "2026-03-16 13:28:21.312607",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Accounts",
|
|
||||||
"name": "Repost Accounting Ledger Settings",
|
|
||||||
"owner": "Administrator",
|
|
||||||
"permissions": [
|
|
||||||
{
|
|
||||||
"create": 1,
|
|
||||||
"delete": 1,
|
|
||||||
"email": 1,
|
|
||||||
"print": 1,
|
|
||||||
"read": 1,
|
|
||||||
"role": "Administrator",
|
|
||||||
"select": 1,
|
|
||||||
"share": 1,
|
|
||||||
"write": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"create": 1,
|
|
||||||
"delete": 1,
|
|
||||||
"read": 1,
|
|
||||||
"role": "System Manager",
|
|
||||||
"select": 1,
|
|
||||||
"write": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"row_format": "Dynamic",
|
|
||||||
"sort_field": "creation",
|
|
||||||
"sort_order": "DESC",
|
|
||||||
"states": [],
|
|
||||||
"track_changes": 1
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
|
|
||||||
# For license information, please see license.txt
|
|
||||||
|
|
||||||
import frappe
|
|
||||||
from frappe.model.document import Document
|
|
||||||
|
|
||||||
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
|
|
||||||
get_accounting_dimensions,
|
|
||||||
)
|
|
||||||
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import get_child_docs
|
|
||||||
|
|
||||||
|
|
||||||
class RepostAccountingLedgerSettings(Document):
|
|
||||||
# begin: auto-generated types
|
|
||||||
# This code is auto-generated. Do not modify anything in this block.
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from frappe.types import DF
|
|
||||||
|
|
||||||
from erpnext.accounts.doctype.repost_allowed_types.repost_allowed_types import RepostAllowedTypes
|
|
||||||
|
|
||||||
allowed_types: DF.Table[RepostAllowedTypes]
|
|
||||||
# end: auto-generated types
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
self.update_property_for_accounting_dimension()
|
|
||||||
|
|
||||||
def update_property_for_accounting_dimension(self):
|
|
||||||
doctypes = [entry.document_type for entry in self.allowed_types if entry.allowed]
|
|
||||||
if not doctypes:
|
|
||||||
return
|
|
||||||
doctypes += get_child_docs(doctypes)
|
|
||||||
|
|
||||||
set_allow_on_submit_for_dimension_fields(doctypes)
|
|
||||||
|
|
||||||
|
|
||||||
def set_allow_on_submit_for_dimension_fields(doctypes):
|
|
||||||
for dt in doctypes:
|
|
||||||
meta = frappe.get_meta(dt)
|
|
||||||
for dimension in get_accounting_dimensions():
|
|
||||||
df = meta.get_field(dimension)
|
|
||||||
if df and not df.allow_on_submit:
|
|
||||||
frappe.db.set_value("Custom Field", dt + "-" + dimension, "allow_on_submit", 1)
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
|
|
||||||
# See license.txt
|
|
||||||
|
|
||||||
# import frappe
|
|
||||||
|
|
||||||
|
|
||||||
from erpnext.tests.utils import ERPNextTestSuite
|
|
||||||
|
|
||||||
|
|
||||||
class TestRepostAccountingLedgerSettings(ERPNextTestSuite):
|
|
||||||
pass
|
|
||||||
@@ -6,9 +6,7 @@
|
|||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"document_type",
|
"document_type"
|
||||||
"column_break_sfzb",
|
|
||||||
"allowed"
|
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@@ -17,28 +15,19 @@
|
|||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Doctype",
|
"label": "Doctype",
|
||||||
"options": "DocType"
|
"options": "DocType"
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"fieldname": "allowed",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"in_list_view": 1,
|
|
||||||
"label": "Allowed"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "column_break_sfzb",
|
|
||||||
"fieldtype": "Column Break"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"grid_page_length": 50,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-03-27 13:10:32.415806",
|
"modified": "2026-04-14 16:53:16.806714",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Repost Allowed Types",
|
"name": "Repost Allowed Types",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
|
"row_format": "Dynamic",
|
||||||
"sort_field": "creation",
|
"sort_field": "creation",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"states": []
|
"states": []
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ class RepostAllowedTypes(Document):
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from frappe.types import DF
|
from frappe.types import DF
|
||||||
|
|
||||||
allowed: DF.Check
|
|
||||||
document_type: DF.Link | None
|
document_type: DF.Link | None
|
||||||
parent: DF.Data
|
parent: DF.Data
|
||||||
parentfield: DF.Data
|
parentfield: DF.Data
|
||||||
|
|||||||
@@ -703,3 +703,11 @@ fields_for_group_similar_items = ["qty", "amount"]
|
|||||||
# List of apps whose translatable strings should be excluded from this app's translations.
|
# List of apps whose translatable strings should be excluded from this app's translations.
|
||||||
ignore_translatable_strings_from = ["frappe"]
|
ignore_translatable_strings_from = ["frappe"]
|
||||||
require_type_annotated_api_methods = True
|
require_type_annotated_api_methods = True
|
||||||
|
|
||||||
|
repost_allowed_doctypes = [
|
||||||
|
"Sales Invoice",
|
||||||
|
"Purchase Invoice",
|
||||||
|
"Journal Entry",
|
||||||
|
"Payment Entry",
|
||||||
|
"Purchase Receipt",
|
||||||
|
]
|
||||||
|
|||||||
@@ -475,3 +475,4 @@ erpnext.patches.v16_0.co_by_product_patch
|
|||||||
erpnext.patches.v16_0.update_requested_qty_packed_item
|
erpnext.patches.v16_0.update_requested_qty_packed_item
|
||||||
erpnext.patches.v16_0.remove_payables_receivables_workspace
|
erpnext.patches.v16_0.remove_payables_receivables_workspace
|
||||||
erpnext.patches.v16_0.depends_on_inv_dimensions
|
erpnext.patches.v16_0.depends_on_inv_dimensions
|
||||||
|
erpnext.patches.v16_0.merge_repost_settings_to_accounts_settings
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import frappe
|
||||||
|
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
if allowed := frappe.get_hooks("repost_allowed_doctypes"):
|
||||||
|
accounts_settings = frappe.get_doc("Accounts Settings")
|
||||||
|
for x in allowed:
|
||||||
|
if x not in [t.document_type for t in accounts_settings.repost_allowed_types]:
|
||||||
|
accounts_settings.append("repost_allowed_types", {"document_type": x})
|
||||||
|
accounts_settings.save()
|
||||||
@@ -66,6 +66,7 @@ def boot_session(bootinfo):
|
|||||||
bootinfo.sysdefaults.default_ageing_range = frappe.db.get_single_value(
|
bootinfo.sysdefaults.default_ageing_range = frappe.db.get_single_value(
|
||||||
"Accounts Settings", "default_ageing_range"
|
"Accounts Settings", "default_ageing_range"
|
||||||
)
|
)
|
||||||
|
bootinfo.sysdefaults.repost_allowed_doctypes = frappe.get_hooks("repost_allowed_doctypes")
|
||||||
|
|
||||||
|
|
||||||
def update_page_info(bootinfo):
|
def update_page_info(bootinfo):
|
||||||
|
|||||||
Reference in New Issue
Block a user