) should be equal to 64 characters hence doctype should be 61 characters
frappe.throw(
- _("Doctype name is limited to {0} characters ({1})").format(max_length, name), frappe.NameError
+ _("Doctype name is limited to {0} characters ({1})").format(max_length, name),
+ frappe.NameError,
)
# a DocType name should not start or end with an empty space
@@ -1056,7 +1058,6 @@ def validate_series(dt, autoname=None, name=None):
and (not autoname.startswith("naming_series:"))
and (not autoname.startswith("format:"))
):
-
prefix = autoname.split(".", 1)[0]
doctype = frappe.qb.DocType("DocType")
used_in = (
@@ -1095,7 +1096,6 @@ def validate_autoincrement_autoname(dt: Union[DocType, "CustomizeForm"]) -> bool
and autoname_before_save != "autoincrement"
or (not is_autoname_autoincrement and autoname_before_save == "autoincrement")
):
-
if dt.doctype == "Customize Form":
frappe.throw(_("Cannot change to/from autoincrement autoname in Customize Form"))
@@ -1333,7 +1333,9 @@ def validate_fields(meta):
)
elif d.default not in d.options.split("\n"):
frappe.throw(
- _("Default value for {0} must be in the list of options.").format(frappe.bold(d.fieldname))
+ _("Default value for {0} must be in the list of options.").format(
+ frappe.bold(d.fieldname)
+ )
)
def check_precision(d):
@@ -1546,9 +1548,7 @@ def validate_fields(meta):
if docfield.get("is_virtual"):
return
- if docfield.fieldtype == "Data" and not (
- docfield.oldfieldtype and docfield.oldfieldtype != "Data"
- ):
+ if docfield.fieldtype == "Data" and not (docfield.oldfieldtype and docfield.oldfieldtype != "Data"):
if docfield.options and (docfield.options not in data_field_options):
df_str = frappe.bold(_(docfield.label))
text_str = (
@@ -1688,9 +1688,7 @@ def validate_permissions(doctype, for_remove=False, alert=False):
return _("For {0} at level {1} in {2} in row {3}").format(d.role, d.permlevel, d.parent, d.idx)
def check_atleast_one_set(d):
- if (
- not d.select and not d.read and not d.write and not d.submit and not d.cancel and not d.create
- ):
+ if not d.select and not d.read and not d.write and not d.submit and not d.cancel and not d.create:
frappe.throw(_("{0}: No basic permissions set").format(get_txt(d)))
def check_double(d):
@@ -1720,7 +1718,9 @@ def validate_permissions(doctype, for_remove=False, alert=False):
if not has_zero_perm:
frappe.throw(
- _("{0}: Permission at level 0 must be set before higher levels are set").format(get_txt(d))
+ _("{0}: Permission at level 0 must be set before higher levels are set").format(
+ get_txt(d)
+ )
)
for invalid in ("create", "submit", "cancel", "amend"):
@@ -1765,9 +1765,9 @@ def validate_permissions(doctype, for_remove=False, alert=False):
if doctype.custom:
if d.role in AUTOMATIC_ROLES:
frappe.throw(
- _("Row # {0}: Non administrator user can not set the role {1} to the custom doctype").format(
- d.idx, frappe.bold(_(d.role))
- ),
+ _(
+ "Row # {0}: Non administrator user can not set the role {1} to the custom doctype"
+ ).format(d.idx, frappe.bold(_(d.role))),
title=_("Permissions Error"),
)
@@ -1775,9 +1775,9 @@ def validate_permissions(doctype, for_remove=False, alert=False):
if d.role in roles:
frappe.throw(
- _("Row # {0}: Non administrator user can not set the role {1} to the custom doctype").format(
- d.idx, frappe.bold(_(d.role))
- ),
+ _(
+ "Row # {0}: Non administrator user can not set the role {1} to the custom doctype"
+ ).format(d.idx, frappe.bold(_(d.role))),
title=_("Permissions Error"),
)
@@ -1840,9 +1840,7 @@ def check_fieldname_conflicts(docfield):
doc = frappe.get_doc({"doctype": docfield.dt})
available_objects = [x for x in dir(doc) if isinstance(x, str)]
property_list = [x for x in available_objects if is_a_property(getattr(type(doc), x, None))]
- method_list = [
- x for x in available_objects if x not in property_list and callable(getattr(doc, x))
- ]
+ method_list = [x for x in available_objects if x not in property_list and callable(getattr(doc, x))]
msg = _("Fieldname {0} conflicting with meta object").format(docfield.fieldname)
if docfield.fieldname in method_list + property_list:
diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py
index a5657f590a..464996d3e9 100644
--- a/frappe/core/doctype/doctype/test_doctype.py
+++ b/frappe/core/doctype/doctype/test_doctype.py
@@ -220,9 +220,7 @@ class TestDocType(FrappeTestCase):
self.assertListEqual(
[f["fieldname"] for f in test_doctype_json["fields"]], test_doctype_json["field_order"]
)
- self.assertListEqual(
- [f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order
- )
+ self.assertListEqual([f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order)
self.assertListEqual(test_doctype_json["field_order"], initial_fields_order)
# remove field_order to test reload_doc/sync/migrate is backwards compatible without field_order
@@ -246,9 +244,7 @@ class TestDocType(FrappeTestCase):
self.assertListEqual(
[f["fieldname"] for f in test_doctype_json["fields"]], test_doctype_json["field_order"]
)
- self.assertListEqual(
- [f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order
- )
+ self.assertListEqual([f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order)
self.assertListEqual(test_doctype_json["field_order"], initial_fields_order)
# reorder fields: swap row 1 and 3
@@ -259,9 +255,7 @@ class TestDocType(FrappeTestCase):
# assert that reordering fields only affects `field_order` rather than `fields` attr
test_doctype.save()
test_doctype_json = frappe.get_file_json(path)
- self.assertListEqual(
- [f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order
- )
+ self.assertListEqual([f["fieldname"] for f in test_doctype_json["fields"]], initial_fields_order)
self.assertListEqual(
test_doctype_json["field_order"], ["field_3", "field_2", "field_1", "field_4"]
)
diff --git a/frappe/core/doctype/doctype_action/doctype_action.py b/frappe/core/doctype/doctype_action/doctype_action.py
index 5ce72814e0..3547bdc6ed 100644
--- a/frappe/core/doctype/doctype_action/doctype_action.py
+++ b/frappe/core/doctype/doctype_action/doctype_action.py
@@ -24,4 +24,5 @@ class DocTypeAction(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/doctype_link/doctype_link.py b/frappe/core/doctype/doctype_link/doctype_link.py
index 338642f567..9458799c3d 100644
--- a/frappe/core/doctype/doctype_link/doctype_link.py
+++ b/frappe/core/doctype/doctype_link/doctype_link.py
@@ -26,4 +26,5 @@ class DocTypeLink(Document):
parenttype: DF.Data
table_fieldname: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/doctype_state/doctype_state.py b/frappe/core/doctype/doctype_state/doctype_state.py
index 9d2f183eed..a5ee1e9099 100644
--- a/frappe/core/doctype/doctype_state/doctype_state.py
+++ b/frappe/core/doctype/doctype_state/doctype_state.py
@@ -23,4 +23,5 @@ class DocTypeState(Document):
parenttype: DF.Data
title: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/document_naming_rule/document_naming_rule.py b/frappe/core/doctype/document_naming_rule/document_naming_rule.py
index 545929eaa1..b6460797f6 100644
--- a/frappe/core/doctype/document_naming_rule/document_naming_rule.py
+++ b/frappe/core/doctype/document_naming_rule/document_naming_rule.py
@@ -28,6 +28,7 @@ class DocumentNamingRule(Document):
prefix_digits: DF.Int
priority: DF.Int
# end: auto-generated types
+
def validate(self):
self.validate_fields_in_conditions()
diff --git a/frappe/core/doctype/document_naming_rule_condition/document_naming_rule_condition.py b/frappe/core/doctype/document_naming_rule_condition/document_naming_rule_condition.py
index 0b8d540448..bb836401c1 100644
--- a/frappe/core/doctype/document_naming_rule_condition/document_naming_rule_condition.py
+++ b/frappe/core/doctype/document_naming_rule_condition/document_naming_rule_condition.py
@@ -21,4 +21,5 @@ class DocumentNamingRuleCondition(Document):
parenttype: DF.Data
value: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/document_naming_settings/document_naming_settings.py b/frappe/core/doctype/document_naming_settings/document_naming_settings.py
index ddb25dd262..84b20469ce 100644
--- a/frappe/core/doctype/document_naming_settings/document_naming_settings.py
+++ b/frappe/core/doctype/document_naming_settings/document_naming_settings.py
@@ -36,16 +36,15 @@ class DocumentNamingSettings(Document):
try_naming_series: DF.Data | None
user_must_always_select: DF.Check
# end: auto-generated types
+
@frappe.whitelist()
def get_transactions_and_prefixes(self):
-
transactions = self._get_transactions()
prefixes = self._get_prefixes(transactions)
return {"transactions": transactions, "prefixes": prefixes}
def _get_transactions(self) -> list[str]:
-
readable_doctypes = set(get_doctypes_with_read())
standard = frappe.get_all("DocField", {"fieldname": "naming_series"}, "parent", pluck="parent")
@@ -218,9 +217,7 @@ class DocumentNamingSettings(Document):
previous_value = naming_series.get_current_value()
naming_series.update_counter(self.current_value)
- self.create_version_log_for_change(
- naming_series.get_prefix(), previous_value, self.current_value
- )
+ self.create_version_log_for_change(naming_series.get_prefix(), previous_value, self.current_value)
frappe.msgprint(
_("Series counter for {} updated to {} successfully").format(self.prefix, self.current_value),
diff --git a/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py b/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py
index 8fc1584aa3..ef61724d94 100644
--- a/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py
+++ b/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py
@@ -54,7 +54,6 @@ class TestNamingSeries(FrappeTestCase):
serieses = self.dns.preview_series().split("\n")
def test_get_transactions(self):
-
naming_info = self.dns.get_transactions_and_prefixes()
self.assertIn(self.ns_doctype, naming_info["transactions"])
diff --git a/frappe/core/doctype/document_share_key/document_share_key.py b/frappe/core/doctype/document_share_key/document_share_key.py
index ffff1e1387..5ec9ad254f 100644
--- a/frappe/core/doctype/document_share_key/document_share_key.py
+++ b/frappe/core/doctype/document_share_key/document_share_key.py
@@ -21,6 +21,7 @@ class DocumentShareKey(Document):
reference_docname: DF.DynamicLink | None
reference_doctype: DF.Link | None
# end: auto-generated types
+
def before_insert(self):
self.key = frappe.generate_hash(length=randrange(25, 35))
if not self.expires_on and not self.flags.no_expiry:
diff --git a/frappe/core/doctype/domain/domain.py b/frappe/core/doctype/domain/domain.py
index 50e187968e..a27e3e4b61 100644
--- a/frappe/core/doctype/domain/domain.py
+++ b/frappe/core/doctype/domain/domain.py
@@ -18,6 +18,7 @@ class Domain(Document):
domain: DF.Data
# end: auto-generated types
+
"""Domain documents are created automatically when DocTypes
with "Restricted" domains are imported during
installation or migration"""
@@ -123,9 +124,7 @@ class Domain(Document):
# enable
frappe.db.sql(
"""update `tabPortal Menu Item` set enabled=1
- where route in ({})""".format(
- ", ".join(f'"{d}"' for d in self.data.allow_sidebar_items)
- )
+ where route in ({})""".format(", ".join(f'"{d}"' for d in self.data.allow_sidebar_items))
)
if self.data.remove_sidebar_items:
@@ -135,7 +134,5 @@ class Domain(Document):
# enable
frappe.db.sql(
"""update `tabPortal Menu Item` set enabled=0
- where route in ({})""".format(
- ", ".join(f'"{d}"' for d in self.data.remove_sidebar_items)
- )
+ where route in ({})""".format(", ".join(f'"{d}"' for d in self.data.remove_sidebar_items))
)
diff --git a/frappe/core/doctype/domain_settings/domain_settings.py b/frappe/core/doctype/domain_settings/domain_settings.py
index d56475f2cd..a809c743c0 100644
--- a/frappe/core/doctype/domain_settings/domain_settings.py
+++ b/frappe/core/doctype/domain_settings/domain_settings.py
@@ -17,6 +17,7 @@ class DomainSettings(Document):
active_domains: DF.Table[HasDomain]
# end: auto-generated types
+
def set_active_domains(self, domains):
active_domains = [d.domain for d in self.active_domains]
added = False
diff --git a/frappe/core/doctype/dynamic_link/dynamic_link.py b/frappe/core/doctype/dynamic_link/dynamic_link.py
index faf78cb425..774c465301 100644
--- a/frappe/core/doctype/dynamic_link/dynamic_link.py
+++ b/frappe/core/doctype/dynamic_link/dynamic_link.py
@@ -21,6 +21,7 @@ class DynamicLink(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/error_log/error_log.py b/frappe/core/doctype/error_log/error_log.py
index 09a671638c..e9d8b63495 100644
--- a/frappe/core/doctype/error_log/error_log.py
+++ b/frappe/core/doctype/error_log/error_log.py
@@ -23,6 +23,7 @@ class ErrorLog(Document):
seen: DF.Check
trace_id: DF.Data | None
# end: auto-generated types
+
def onload(self):
if not self.seen and not frappe.flags.read_only:
self.db_set("seen", 1, update_modified=0)
diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py
index 02cf453d2b..9d4b8f6a4a 100755
--- a/frappe/core/doctype/file/file.py
+++ b/frappe/core/doctype/file/file.py
@@ -61,6 +61,7 @@ class File(Document):
uploaded_to_dropbox: DF.Check
uploaded_to_google_drive: DF.Check
# end: auto-generated types
+
no_feed_on_delete = True
def __init__(self, *args, **kwargs):
@@ -369,9 +370,7 @@ class File(Document):
return
if self.file_type not in allowed_extensions.splitlines():
- frappe.throw(
- _("File type of {0} is not allowed").format(self.file_type), exc=FileTypeNotAllowed
- )
+ frappe.throw(_("File type of {0} is not allowed").format(self.file_type), exc=FileTypeNotAllowed)
def validate_duplicate_entry(self):
if not self.flags.ignore_duplicate_entry_error and not self.is_folder:
@@ -710,9 +709,7 @@ class File(Document):
def create_attachment_record(self):
icon = ' ' if self.is_private else ""
- file_url = (
- quote(frappe.safe_encode(self.file_url), safe="/:") if self.file_url else self.file_name
- )
+ file_url = quote(frappe.safe_encode(self.file_url), safe="/:") if self.file_url else self.file_name
file_name = self.file_name or self.file_url
self.add_comment_in_reference_doc(
diff --git a/frappe/core/doctype/file/test_file.py b/frappe/core/doctype/file/test_file.py
index 43dc51c8b1..682a09011e 100644
--- a/frappe/core/doctype/file/test_file.py
+++ b/frappe/core/doctype/file/test_file.py
@@ -222,9 +222,7 @@ class TestSameContent(FrappeTestCase):
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
- )
+ limit_property = make_property_setter("ToDo", None, "max_attachments", 1, "int", for_doctype=True)
file1 = frappe.get_doc(
{
"doctype": "File",
@@ -451,9 +449,7 @@ class TestFile(FrappeTestCase):
test_file.file_url = None
test_file.file_name = "/usr/bin/man"
- self.assertRaisesRegex(
- ValidationError, "There is some problem with the file url", test_file.validate
- )
+ self.assertRaisesRegex(ValidationError, "There is some problem with the file url", test_file.validate)
test_file.file_url = None
test_file.file_name = "_file"
@@ -670,9 +666,7 @@ class TestAttachmentsAccess(FrappeTestCase):
frappe.set_user("test4@example.com")
user_files = [file.file_name for file in get_files_in_folder("Home")["files"]]
- user_attachments_files = [
- file.file_name for file in get_files_in_folder("Home/Attachments")["files"]
- ]
+ user_attachments_files = [file.file_name for file in get_files_in_folder("Home/Attachments")["files"]]
self.assertIn("test_sm_standalone.txt", system_manager_files)
self.assertNotIn("test_sm_standalone.txt", user_files)
diff --git a/frappe/core/doctype/has_domain/has_domain.py b/frappe/core/doctype/has_domain/has_domain.py
index f56fabe4d7..c12850abb6 100644
--- a/frappe/core/doctype/has_domain/has_domain.py
+++ b/frappe/core/doctype/has_domain/has_domain.py
@@ -18,4 +18,5 @@ class HasDomain(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/has_role/has_role.py b/frappe/core/doctype/has_role/has_role.py
index 07a10c782a..d7e2c44f65 100644
--- a/frappe/core/doctype/has_role/has_role.py
+++ b/frappe/core/doctype/has_role/has_role.py
@@ -19,6 +19,7 @@ class HasRole(Document):
parenttype: DF.Data
role: DF.Link | None
# end: auto-generated types
+
def before_insert(self):
if frappe.db.exists("Has Role", {"parent": self.parent, "role": self.role}):
frappe.throw(frappe._("User '{0}' already has the role '{1}'").format(self.parent, self.role))
diff --git a/frappe/core/doctype/installed_application/installed_application.py b/frappe/core/doctype/installed_application/installed_application.py
index 48a36df29f..52b6c4ce31 100644
--- a/frappe/core/doctype/installed_application/installed_application.py
+++ b/frappe/core/doctype/installed_application/installed_application.py
@@ -21,4 +21,5 @@ class InstalledApplication(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/installed_applications/installed_applications.py b/frappe/core/doctype/installed_applications/installed_applications.py
index eaa68ae39d..4f8e987533 100644
--- a/frappe/core/doctype/installed_applications/installed_applications.py
+++ b/frappe/core/doctype/installed_applications/installed_applications.py
@@ -24,6 +24,7 @@ class InstalledApplications(Document):
installed_applications: DF.Table[InstalledApplication]
# end: auto-generated types
+
def update_versions(self):
self.delete_key("installed_applications")
for app in frappe.utils.get_installed_apps_info():
diff --git a/frappe/core/doctype/language/language.py b/frappe/core/doctype/language/language.py
index 003b62a4f5..9856573740 100644
--- a/frappe/core/doctype/language/language.py
+++ b/frappe/core/doctype/language/language.py
@@ -24,6 +24,7 @@ class Language(Document):
language_code: DF.Data
language_name: DF.Data
# end: auto-generated types
+
def validate(self):
validate_with_regex(self.language_code, "Language Code")
diff --git a/frappe/core/doctype/log_setting_user/log_setting_user.py b/frappe/core/doctype/log_setting_user/log_setting_user.py
index 87ea2284bc..8becf0d8d9 100644
--- a/frappe/core/doctype/log_setting_user/log_setting_user.py
+++ b/frappe/core/doctype/log_setting_user/log_setting_user.py
@@ -19,4 +19,5 @@ class LogSettingUser(Document):
parenttype: DF.Data
user: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/log_settings/log_settings.py b/frappe/core/doctype/log_settings/log_settings.py
index 7b8deb6ef7..1b363cec3c 100644
--- a/frappe/core/doctype/log_settings/log_settings.py
+++ b/frappe/core/doctype/log_settings/log_settings.py
@@ -41,6 +41,7 @@ class LogSettings(Document):
logs_to_clear: DF.Table[LogsToClear]
# end: auto-generated types
+
def validate(self):
self.remove_unsupported_doctypes()
self._deduplicate_entries()
@@ -78,9 +79,7 @@ class LogSettings(Document):
added_logtypes.add(logtype)
if added_logtypes:
- frappe.msgprint(
- _("Added default log doctypes: {}").format(",".join(added_logtypes)), alert=True
- )
+ frappe.msgprint(_("Added default log doctypes: {}").format(",".join(added_logtypes)), alert=True)
def clear_logs(self):
"""
@@ -133,7 +132,6 @@ def has_unseen_error_log():
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def get_log_doctypes(doctype, txt, searchfield, start, page_len, filters):
-
filters = filters or {}
filters.extend(
diff --git a/frappe/core/doctype/logs_to_clear/logs_to_clear.py b/frappe/core/doctype/logs_to_clear/logs_to_clear.py
index ded1744769..32f4250e08 100644
--- a/frappe/core/doctype/logs_to_clear/logs_to_clear.py
+++ b/frappe/core/doctype/logs_to_clear/logs_to_clear.py
@@ -20,4 +20,5 @@ class LogsToClear(Document):
parenttype: DF.Data
ref_doctype: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/module_def/module_def.py b/frappe/core/doctype/module_def/module_def.py
index 6cb407adbb..3f88897f05 100644
--- a/frappe/core/doctype/module_def/module_def.py
+++ b/frappe/core/doctype/module_def/module_def.py
@@ -25,6 +25,7 @@ class ModuleDef(Document):
package: DF.Link | None
restrict_to_domain: DF.Link | None
# end: auto-generated types
+
def on_update(self):
"""If in `developer_mode`, create folder for module and
add in `modules.txt` of app if missing."""
diff --git a/frappe/core/doctype/module_profile/module_profile.py b/frappe/core/doctype/module_profile/module_profile.py
index 3e1a6ce002..0354bb58c7 100644
--- a/frappe/core/doctype/module_profile/module_profile.py
+++ b/frappe/core/doctype/module_profile/module_profile.py
@@ -17,6 +17,7 @@ class ModuleProfile(Document):
block_modules: DF.Table[BlockModule]
module_profile_name: DF.Data
# end: auto-generated types
+
def onload(self):
from frappe.config import get_modules_from_all_apps
diff --git a/frappe/core/doctype/navbar_item/navbar_item.py b/frappe/core/doctype/navbar_item/navbar_item.py
index 72c5bf37e1..6414ed5c80 100644
--- a/frappe/core/doctype/navbar_item/navbar_item.py
+++ b/frappe/core/doctype/navbar_item/navbar_item.py
@@ -24,4 +24,5 @@ class NavbarItem(Document):
parenttype: DF.Data
route: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.py b/frappe/core/doctype/navbar_settings/navbar_settings.py
index 5b0f813d56..cbab42f4ed 100644
--- a/frappe/core/doctype/navbar_settings/navbar_settings.py
+++ b/frappe/core/doctype/navbar_settings/navbar_settings.py
@@ -21,6 +21,7 @@ class NavbarSettings(Document):
logo_width: DF.Int
settings_dropdown: DF.Table[NavbarItem]
# end: auto-generated types
+
def validate(self):
self.validate_standard_navbar_items()
@@ -36,9 +37,7 @@ class NavbarSettings(Document):
if item.is_standard
]
- after_save_items = [
- item for item in self.help_dropdown + self.settings_dropdown if item.is_standard
- ]
+ after_save_items = [item for item in self.help_dropdown + self.settings_dropdown if item.is_standard]
if not frappe.flags.in_patch and (len(before_save_items) > len(after_save_items)):
frappe.throw(_("Please hide the standard navbar items instead of deleting them"))
diff --git a/frappe/core/doctype/package/package.py b/frappe/core/doctype/package/package.py
index 812a589940..9f0e959092 100644
--- a/frappe/core/doctype/package/package.py
+++ b/frappe/core/doctype/package/package.py
@@ -29,6 +29,7 @@ class Package(Document):
package_name: DF.Data
readme: DF.MarkdownEditor | None
# end: auto-generated types
+
def validate(self):
if not self.package_name:
self.package_name = self.name.lower().replace(" ", "-")
diff --git a/frappe/core/doctype/package/test_package.py b/frappe/core/doctype/package/test_package.py
index 8af076f1be..0120a095ac 100644
--- a/frappe/core/doctype/package/test_package.py
+++ b/frappe/core/doctype/package/test_package.py
@@ -26,7 +26,11 @@ class TestPackage(FrappeTestCase):
self.assertTrue(
os.path.exists(
frappe.get_site_path(
- "packages", "test-package", "test_module_for_package", "doctype", "test_doctype_for_package"
+ "packages",
+ "test-package",
+ "test_module_for_package",
+ "doctype",
+ "test_doctype_for_package",
)
)
)
@@ -49,9 +53,7 @@ class TestPackage(FrappeTestCase):
def make_test_package():
if not frappe.db.exists("Package", "Test Package"):
frappe.get_doc(
- dict(
- doctype="Package", name="Test Package", package_name="test-package", readme="# Test Package"
- )
+ dict(doctype="Package", name="Test Package", package_name="test-package", readme="# Test Package")
).insert()
diff --git a/frappe/core/doctype/package_import/package_import.py b/frappe/core/doctype/package_import/package_import.py
index a1c499067d..52dc08c406 100644
--- a/frappe/core/doctype/package_import/package_import.py
+++ b/frappe/core/doctype/package_import/package_import.py
@@ -27,6 +27,7 @@ class PackageImport(Document):
force: DF.Check
log: DF.Code | None
# end: auto-generated types
+
def validate(self):
if self.activate:
self.import_package()
diff --git a/frappe/core/doctype/package_release/package_release.py b/frappe/core/doctype/package_release/package_release.py
index 8ebe0b3082..639a7045be 100644
--- a/frappe/core/doctype/package_release/package_release.py
+++ b/frappe/core/doctype/package_release/package_release.py
@@ -27,6 +27,7 @@ class PackageRelease(Document):
publish: DF.Check
release_notes: DF.MarkdownEditor | None
# end: auto-generated types
+
def set_version(self):
# set the next patch release by default
doctype = frappe.qb.DocType("Package Release")
diff --git a/frappe/core/doctype/page/page.py b/frappe/core/doctype/page/page.py
index ce72220953..872b6c0012 100644
--- a/frappe/core/doctype/page/page.py
+++ b/frappe/core/doctype/page/page.py
@@ -33,6 +33,7 @@ class Page(Document):
system_page: DF.Check
title: DF.Data | None
# end: auto-generated types
+
def autoname(self):
"""
Creates a url friendly name for this page.
@@ -121,9 +122,7 @@ class Page(Document):
"""Return True if `Has Role` is not set or the user is allowed."""
from frappe.utils import has_common
- allowed = [
- d.role for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": self.name})
- ]
+ allowed = [d.role for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": self.name})]
custom_roles = get_custom_allowed_roles("page", self.name)
allowed.extend(custom_roles)
@@ -170,7 +169,9 @@ class Page(Document):
try:
out = frappe.get_attr(
"{app}.{module}.page.{page}.{page}.get_context".format(
- app=frappe.local.module_app[scrub(self.module)], module=scrub(self.module), page=page_name
+ app=frappe.local.module_app[scrub(self.module)],
+ module=scrub(self.module),
+ page=page_name,
)
)(context)
diff --git a/frappe/core/doctype/patch_log/patch_log.py b/frappe/core/doctype/patch_log/patch_log.py
index 12582c1199..05f15e70ff 100644
--- a/frappe/core/doctype/patch_log/patch_log.py
+++ b/frappe/core/doctype/patch_log/patch_log.py
@@ -20,6 +20,7 @@ class PatchLog(Document):
skipped: DF.Check
traceback: DF.Code | None
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py
index 8710e35f64..d9f8360c75 100644
--- a/frappe/core/doctype/prepared_report/prepared_report.py
+++ b/frappe/core/doctype/prepared_report/prepared_report.py
@@ -38,6 +38,7 @@ class PreparedReport(Document):
report_name: DF.Data
status: DF.Literal["Error", "Queued", "Completed", "Started"]
# end: auto-generated types
+
@property
def queued_by(self):
return self.owner
@@ -217,9 +218,7 @@ def delete_prepared_reports(reports):
def create_json_gz_file(data, dt, dn):
# Storing data in CSV file causes information loss
# Reports like P&L Statement were completely unsuable because of this
- json_filename = "{}.json.gz".format(
- frappe.utils.data.format_datetime(frappe.utils.now(), "Y-m-d-H:M")
- )
+ json_filename = "{}.json.gz".format(frappe.utils.data.format_datetime(frappe.utils.now(), "Y-m-d-H:M"))
encoded_content = frappe.safe_encode(frappe.as_json(data))
compressed_content = gzip.compress(encoded_content)
diff --git a/frappe/core/doctype/recorder_query/recorder_query.py b/frappe/core/doctype/recorder_query/recorder_query.py
index 185c927dbe..c797769dda 100644
--- a/frappe/core/doctype/recorder_query/recorder_query.py
+++ b/frappe/core/doctype/recorder_query/recorder_query.py
@@ -23,9 +23,10 @@ class RecorderQuery(Document):
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data
- query: DF.Data
+ query: DF.Data | None
stack: DF.Text | None
# end: auto-generated types
+
pass
def db_insert(self, *args, **kwargs):
diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py
index bb39142327..e14ec41fde 100644
--- a/frappe/core/doctype/report/report.py
+++ b/frappe/core/doctype/report/report.py
@@ -55,7 +55,8 @@ class Report(Document):
if not self.is_standard:
self.is_standard = "No"
if (
- frappe.session.user == "Administrator" and getattr(frappe.local.conf, "developer_mode", 0) == 1
+ frappe.session.user == "Administrator"
+ and getattr(frappe.local.conf, "developer_mode", 0) == 1
):
self.is_standard = "Yes"
@@ -108,9 +109,7 @@ class Report(Document):
"""Return True if `Has Role` is not set or the user is allowed."""
from frappe.utils import has_common
- allowed = [
- d.role for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": self.name})
- ]
+ allowed = [d.role for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": self.name})]
custom_roles = get_custom_allowed_roles("report", self.name)
@@ -132,9 +131,7 @@ class Report(Document):
return
if self.is_standard == "Yes" and frappe.conf.developer_mode:
- export_to_files(
- record_list=[["Report", self.name]], record_module=self.module, create_init=True
- )
+ export_to_files(record_list=[["Report", self.name]], record_module=self.module, create_init=True)
self.create_report_py()
@@ -339,7 +336,7 @@ class Report(Document):
def build_standard_report_columns(self, columns, group_by_args):
_columns = []
- for (fieldname, doctype) in columns:
+ for fieldname, doctype in columns:
meta = frappe.get_meta(doctype)
if meta.get_field(fieldname):
diff --git a/frappe/core/doctype/report/test_report.py b/frappe/core/doctype/report/test_report.py
index 4f9c229ab8..cda004c00c 100644
--- a/frappe/core/doctype/report/test_report.py
+++ b/frappe/core/doctype/report/test_report.py
@@ -156,9 +156,7 @@ class TestReport(FrappeTestCase):
)
result = response.get("result")
columns = response.get("columns")
- self.assertListEqual(
- ["name", "email", "user_type"], [column.get("fieldname") for column in columns]
- )
+ self.assertListEqual(["name", "email", "user_type"], [column.get("fieldname") for column in columns])
admin_dict = frappe.core.utils.find(result, lambda d: d["name"] == "Administrator")
self.assertDictEqual(
{"name": "Administrator", "user_type": "System User", "email": "admin@example.com"}, admin_dict
@@ -226,9 +224,7 @@ class TestReport(FrappeTestCase):
def test_format_method(self):
if frappe.db.exists("Report", "User Activity Report Without Sort"):
frappe.delete_doc("Report", "User Activity Report Without Sort")
- with open(
- os.path.join(os.path.dirname(__file__), "user_activity_report_without_sort.json")
- ) as f:
+ with open(os.path.join(os.path.dirname(__file__), "user_activity_report_without_sort.json")) as f:
frappe.get_doc(json.loads(f.read())).insert()
report = frappe.get_doc("Report", "User Activity Report Without Sort")
diff --git a/frappe/core/doctype/report_column/report_column.py b/frappe/core/doctype/report_column/report_column.py
index 6a256c967d..5da73830c6 100644
--- a/frappe/core/doctype/report_column/report_column.py
+++ b/frappe/core/doctype/report_column/report_column.py
@@ -37,4 +37,5 @@ class ReportColumn(Document):
parenttype: DF.Data
width: DF.Int
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/report_filter/report_filter.py b/frappe/core/doctype/report_filter/report_filter.py
index ea126d86fe..f8ce4fd3b8 100644
--- a/frappe/core/doctype/report_filter/report_filter.py
+++ b/frappe/core/doctype/report_filter/report_filter.py
@@ -38,4 +38,5 @@ class ReportFilter(Document):
parenttype: DF.Data
wildcard_filter: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/role/role.py b/frappe/core/doctype/role/role.py
index 87ff615e0f..e868b5b978 100644
--- a/frappe/core/doctype/role/role.py
+++ b/frappe/core/doctype/role/role.py
@@ -43,6 +43,7 @@ class Role(Document):
two_factor_auth: DF.Check
view_switcher: DF.Check
# end: auto-generated types
+
def before_rename(self, old, new, merge=False):
if old in STANDARD_ROLES:
frappe.throw(frappe._("Standard roles cannot be renamed"))
@@ -125,9 +126,7 @@ def get_user_info(users, field="email"):
def get_users(role):
return [
d.parent
- for d in frappe.get_all(
- "Has Role", filters={"role": role, "parenttype": "User"}, fields=["parent"]
- )
+ for d in frappe.get_all("Has Role", filters={"role": role, "parenttype": "User"}, fields=["parent"])
]
diff --git a/frappe/core/doctype/role/test_role.py b/frappe/core/doctype/role/test_role.py
index 58aadfcbca..7e751d6dc9 100644
--- a/frappe/core/doctype/role/test_role.py
+++ b/frappe/core/doctype/role/test_role.py
@@ -46,7 +46,6 @@ class TestUser(FrappeTestCase):
self.assertTrue(user.user_type == "Website User")
def test_get_users_by_role(self):
-
role = "System Manager"
sys_managers = get_info_based_on_role(role, field="name")
diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py
index 5d92a12e57..226afb5ec9 100644
--- a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py
+++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py
@@ -24,6 +24,7 @@ class RolePermissionforPageandReport(Document):
roles: DF.Table[HasRole]
set_role_for: DF.Literal["", "Page", "Report"]
# end: auto-generated types
+
@frappe.whitelist()
def set_report_page_data(self):
self.set_custom_roles()
diff --git a/frappe/core/doctype/role_profile/role_profile.py b/frappe/core/doctype/role_profile/role_profile.py
index d0fd42edfa..a9d6b537ed 100644
--- a/frappe/core/doctype/role_profile/role_profile.py
+++ b/frappe/core/doctype/role_profile/role_profile.py
@@ -20,6 +20,7 @@ class RoleProfile(Document):
role_profile: DF.Data
roles: DF.Table[HasRole]
# end: auto-generated types
+
def autoname(self):
"""set name as Role Profile name"""
self.name = self.role_profile
diff --git a/frappe/core/doctype/rq_job/rq_job.py b/frappe/core/doctype/rq_job/rq_job.py
index ca745b01bc..995ceda4c7 100644
--- a/frappe/core/doctype/rq_job/rq_job.py
+++ b/frappe/core/doctype/rq_job/rq_job.py
@@ -54,9 +54,7 @@ class RQJob(Document):
job_name: DF.Data | None
queue: DF.Literal["default", "short", "long"]
started_at: DF.Datetime | None
- status: DF.Literal[
- "queued", "started", "finished", "failed", "deferred", "scheduled", "canceled"
- ]
+ status: DF.Literal["queued", "started", "finished", "failed", "deferred", "scheduled", "canceled"]
time_taken: DF.Duration | None
timeout: DF.Duration | None
# end: auto-generated types
@@ -79,7 +77,6 @@ class RQJob(Document):
@staticmethod
def get_list(args):
-
start = cint(args.get("start"))
page_length = cint(args.get("page_length")) or 20
@@ -88,9 +85,7 @@ class RQJob(Document):
matched_job_ids = RQJob.get_matching_job_ids(args)[start : start + page_length]
conn = get_redis_conn()
- jobs = [
- serialize_job(job) for job in Job.fetch_many(job_ids=matched_job_ids, connection=conn) if job
- ]
+ jobs = [serialize_job(job) for job in Job.fetch_many(job_ids=matched_job_ids, connection=conn) if job]
return sorted(jobs, key=lambda j: j.modified, reverse=order_desc)
diff --git a/frappe/core/doctype/rq_job/test_rq_job.py b/frappe/core/doctype/rq_job/test_rq_job.py
index 82a4e20a83..57c857f7ab 100644
--- a/frappe/core/doctype/rq_job/test_rq_job.py
+++ b/frappe/core/doctype/rq_job/test_rq_job.py
@@ -32,7 +32,6 @@ class TestRQJob(FrappeTestCase):
self.assertEqual(frappe.get_doc("RQ Job", job.id).status, status)
def test_serialization(self):
-
job = frappe.enqueue(method=self.BG_JOB, queue="short")
rq_job = frappe.get_doc("RQ Job", job.id)
@@ -60,7 +59,6 @@ class TestRQJob(FrappeTestCase):
self.assertEqual(rq_job.job_name, "test_func")
def test_get_list_filtering(self):
-
# Check failed job clearning and filtering
remove_failed_jobs()
jobs = RQJob.get_list({"filters": [["RQ Job", "status", "=", "failed"]]})
@@ -176,9 +174,7 @@ class TestRQJob(FrappeTestCase):
jobs = [frappe.enqueue(method=self.BG_JOB, queue="short", fail=True) for _ in range(limit * 2)]
self.check_status(jobs[-1], "failed")
- self.assertLessEqual(
- RQJob.get_count({"filters": [["RQ Job", "status", "=", "failed"]]}), limit * 1.1
- )
+ self.assertLessEqual(RQJob.get_count({"filters": [["RQ Job", "status", "=", "failed"]]}), limit * 1.1)
def test_func(fail=False, sleep=0):
diff --git a/frappe/core/doctype/rq_worker/rq_worker.py b/frappe/core/doctype/rq_worker/rq_worker.py
index c7e1022576..34df52c0af 100644
--- a/frappe/core/doctype/rq_worker/rq_worker.py
+++ b/frappe/core/doctype/rq_worker/rq_worker.py
@@ -37,7 +37,6 @@ class RQWorker(Document):
# end: auto-generated types
def load_from_db(self):
-
all_workers = get_workers()
workers = [w for w in all_workers if w.pid == cint(self.name)]
if not workers:
diff --git a/frappe/core/doctype/scheduled_job_log/scheduled_job_log.py b/frappe/core/doctype/scheduled_job_log/scheduled_job_log.py
index e4bfe21e2d..72e1e6b6c4 100644
--- a/frappe/core/doctype/scheduled_job_log/scheduled_job_log.py
+++ b/frappe/core/doctype/scheduled_job_log/scheduled_job_log.py
@@ -21,6 +21,7 @@ class ScheduledJobLog(Document):
scheduled_job_type: DF.Link
status: DF.Literal["Scheduled", "Complete", "Failed"]
# end: auto-generated types
+
@staticmethod
def clear_old_logs(days=90):
table = frappe.qb.DocType("Scheduled Job Log")
diff --git a/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py b/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py
index f95c06fdbe..3530d85923 100644
--- a/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py
+++ b/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py
@@ -45,6 +45,7 @@ class ScheduledJobType(Document):
server_script: DF.Link | None
stopped: DF.Check
# end: auto-generated types
+
def autoname(self):
self.name = ".".join(self.method.split(".")[-2:])
@@ -236,9 +237,7 @@ def insert_single_event(frequency: str, event: str, cron_format: str = None):
}
)
- if not frappe.db.exists(
- "Scheduled Job Type", {"method": event, "frequency": frequency, **cron_expr}
- ):
+ if not frappe.db.exists("Scheduled Job Type", {"method": event, "frequency": frequency, **cron_expr}):
savepoint = "scheduled_job_type_creation"
try:
frappe.db.savepoint(savepoint)
diff --git a/frappe/core/doctype/scheduled_job_type/test_scheduled_job_type.py b/frappe/core/doctype/scheduled_job_type/test_scheduled_job_type.py
index 6d77c876dc..861726f6d4 100644
--- a/frappe/core/doctype/scheduled_job_type/test_scheduled_job_type.py
+++ b/frappe/core/doctype/scheduled_job_type/test_scheduled_job_type.py
@@ -33,9 +33,7 @@ class TestScheduledJobType(FrappeTestCase):
# check if jobs are synced after change in hooks
updated_scheduler_events = {"hourly": ["frappe.email.queue.flush"]}
sync_jobs(updated_scheduler_events)
- updated_scheduled_job = frappe.get_doc(
- "Scheduled Job Type", {"method": "frappe.email.queue.flush"}
- )
+ updated_scheduled_job = frappe.get_doc("Scheduled Job Type", {"method": "frappe.email.queue.flush"})
self.assertEqual(updated_scheduled_job.frequency, "Hourly")
def test_daily_job(self):
diff --git a/frappe/core/doctype/server_script/server_script.py b/frappe/core/doctype/server_script/server_script.py
index fbd3ca6f50..7abb08b235 100644
--- a/frappe/core/doctype/server_script/server_script.py
+++ b/frappe/core/doctype/server_script/server_script.py
@@ -67,6 +67,7 @@ class ServerScript(Document):
script: DF.Code
script_type: DF.Literal["DocType Event", "Scheduler Event", "Permission Query", "API"]
# end: auto-generated types
+
def validate(self):
frappe.only_for("Script Manager", True)
self.sync_scheduled_jobs()
diff --git a/frappe/core/doctype/server_script/test_server_script.py b/frappe/core/doctype/server_script/test_server_script.py
index f53d69304a..cbf3ef977a 100644
--- a/frappe/core/doctype/server_script/test_server_script.py
+++ b/frappe/core/doctype/server_script/test_server_script.py
@@ -157,9 +157,7 @@ class TestServerScript(FrappeTestCase):
server_script.disabled = 0
server_script.save()
- self.assertRaises(
- AttributeError, frappe.get_doc(dict(doctype="ToDo", description="test me")).insert
- )
+ self.assertRaises(AttributeError, frappe.get_doc(dict(doctype="ToDo", description="test me")).insert)
server_script.disabled = 1
server_script.save()
@@ -169,9 +167,7 @@ class TestServerScript(FrappeTestCase):
server_script.disabled = 0
server_script.save()
- self.assertRaises(
- AttributeError, frappe.get_doc(dict(doctype="ToDo", description="test me")).insert
- )
+ self.assertRaises(AttributeError, frappe.get_doc(dict(doctype="ToDo", description="test me")).insert)
server_script.disabled = 1
server_script.save()
diff --git a/frappe/core/doctype/session_default/session_default.py b/frappe/core/doctype/session_default/session_default.py
index c5697ac848..0e4e835980 100644
--- a/frappe/core/doctype/session_default/session_default.py
+++ b/frappe/core/doctype/session_default/session_default.py
@@ -19,4 +19,5 @@ class SessionDefault(Document):
parenttype: DF.Data
ref_doctype: DF.Link | None
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/session_default_settings/session_default_settings.py b/frappe/core/doctype/session_default_settings/session_default_settings.py
index 5df080c4f5..8d9b15eb74 100644
--- a/frappe/core/doctype/session_default_settings/session_default_settings.py
+++ b/frappe/core/doctype/session_default_settings/session_default_settings.py
@@ -20,6 +20,7 @@ class SessionDefaultSettings(Document):
session_defaults: DF.Table[SessionDefault]
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/sms_parameter/sms_parameter.py b/frappe/core/doctype/sms_parameter/sms_parameter.py
index a415f1fc25..96c1c64536 100644
--- a/frappe/core/doctype/sms_parameter/sms_parameter.py
+++ b/frappe/core/doctype/sms_parameter/sms_parameter.py
@@ -20,4 +20,5 @@ class SMSParameter(Document):
parenttype: DF.Data
value: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/sms_settings/sms_settings.py b/frappe/core/doctype/sms_settings/sms_settings.py
index f2609ad05b..29c3508af6 100644
--- a/frappe/core/doctype/sms_settings/sms_settings.py
+++ b/frappe/core/doctype/sms_settings/sms_settings.py
@@ -23,6 +23,7 @@ class SMSSettings(Document):
sms_gateway_url: DF.SmallText
use_post: DF.Check
# end: auto-generated types
+
pass
@@ -62,7 +63,6 @@ def get_contact_number(contact_name, ref_doctype, ref_name):
@frappe.whitelist()
def send_sms(receiver_list, msg, sender_name="", success_msg=True):
-
import json
if isinstance(receiver_list, str):
diff --git a/frappe/core/doctype/submission_queue/submission_queue.py b/frappe/core/doctype/submission_queue/submission_queue.py
index ba2c74c3dd..bad6f88af4 100644
--- a/frappe/core/doctype/submission_queue/submission_queue.py
+++ b/frappe/core/doctype/submission_queue/submission_queue.py
@@ -32,6 +32,7 @@ class SubmissionQueue(Document):
ref_doctype: DF.Link | None
status: DF.Literal["Queued", "Finished", "Failed"]
# end: auto-generated types
+
@property
def created_at(self):
return self.creation
diff --git a/frappe/core/doctype/success_action/success_action.py b/frappe/core/doctype/success_action/success_action.py
index c32fe326f2..730368c1be 100644
--- a/frappe/core/doctype/success_action/success_action.py
+++ b/frappe/core/doctype/success_action/success_action.py
@@ -19,4 +19,5 @@ class SuccessAction(Document):
next_actions: DF.Data | None
ref_doctype: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py
index 013172a572..5fe1193877 100644
--- a/frappe/core/doctype/system_settings/system_settings.py
+++ b/frappe/core/doctype/system_settings/system_settings.py
@@ -84,9 +84,7 @@ class SystemSettings(Document):
password_reset_limit: DF.Int
reset_password_link_expiry_duration: DF.Duration | None
reset_password_template: DF.Link | None
- rounding_method: DF.Literal[
- "Banker's Rounding (legacy)", "Banker's Rounding", "Commercial Rounding"
- ]
+ rounding_method: DF.Literal["Banker's Rounding (legacy)", "Banker's Rounding", "Commercial Rounding"]
session_expiry: DF.Data | None
setup_complete: DF.Check
strip_exif_metadata_from_uploaded_images: DF.Check
@@ -148,9 +146,7 @@ class SystemSettings(Document):
social_login_enabled = frappe.db.exists("Social Login Key", {"enable_social_login": 1})
ldap_enabled = frappe.db.get_single_value("LDAP Settings", "enabled")
- login_with_email_link_enabled = frappe.db.get_single_value(
- "System Settings", "login_with_email_link"
- )
+ login_with_email_link_enabled = frappe.db.get_single_value("System Settings", "login_with_email_link")
if not (social_login_enabled or ldap_enabled or login_with_email_link_enabled):
frappe.throw(
diff --git a/frappe/core/doctype/transaction_log/transaction_log.py b/frappe/core/doctype/transaction_log/transaction_log.py
index 203580a614..ab1ef6e5ca 100644
--- a/frappe/core/doctype/transaction_log/transaction_log.py
+++ b/frappe/core/doctype/transaction_log/transaction_log.py
@@ -29,6 +29,7 @@ class TransactionLog(Document):
timestamp: DF.Datetime | None
transaction_hash: DF.SmallText | None
# end: auto-generated types
+
def before_insert(self):
index = get_current_index()
self.row_index = index
diff --git a/frappe/core/doctype/translation/translation.py b/frappe/core/doctype/translation/translation.py
index bb5e517160..a9ecc25b4c 100644
--- a/frappe/core/doctype/translation/translation.py
+++ b/frappe/core/doctype/translation/translation.py
@@ -26,6 +26,7 @@ class Translation(Document):
source_text: DF.Code
translated_text: DF.Code
# end: auto-generated types
+
def validate(self):
if is_html(self.source_text):
self.remove_html_from_source()
diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py
index dc973c9e8f..d8e760814f 100644
--- a/frappe/core/doctype/user/test_user.py
+++ b/frappe/core/doctype/user/test_user.py
@@ -113,9 +113,7 @@ class TestUser(FrappeTestCase):
frappe.db.set_single_value("Website Settings", "_test", "_test_val")
self.assertEqual(frappe.db.get_value("Website Settings", None, "_test"), "_test_val")
- self.assertEqual(
- frappe.db.get_value("Website Settings", "Website Settings", "_test"), "_test_val"
- )
+ self.assertEqual(frappe.db.get_value("Website Settings", "Website Settings", "_test"), "_test_val")
def test_high_permlevel_validations(self):
user = frappe.get_meta("User")
@@ -192,9 +190,7 @@ class TestUser(FrappeTestCase):
# Score 1; should now fail
result = test_password_strength("bee2ve")
self.assertEqual(result["feedback"]["password_policy_validation_passed"], False)
- self.assertRaises(
- frappe.exceptions.ValidationError, handle_password_test_fail, result["feedback"]
- )
+ self.assertRaises(frappe.exceptions.ValidationError, handle_password_test_fail, result["feedback"])
self.assertRaises(
frappe.exceptions.ValidationError, handle_password_test_fail, result
) # test backwards compatibility
@@ -333,9 +329,7 @@ class TestUser(FrappeTestCase):
self.assertEqual(frappe.cache.hget("redirect_after_login", random_user), "/welcome")
# re-register
- self.assertTupleEqual(
- sign_up(random_user, random_user_name, "/welcome"), (0, "Already Registered")
- )
+ self.assertTupleEqual(sign_up(random_user, random_user_name, "/welcome"), (0, "Already Registered"))
# disabled user
user = frappe.get_doc("User", random_user)
@@ -393,9 +387,7 @@ class TestUser(FrappeTestCase):
}
# password strength failure test
- with patch.object(
- user_module, "test_password_strength", return_value=password_strength_response
- ):
+ with patch.object(user_module, "test_password_strength", return_value=password_strength_response):
self.assertRaisesRegex(
frappe.exceptions.ValidationError,
"Fix password",
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index ec95d54094..b2b7e7bbcf 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -112,6 +112,7 @@ class User(Document):
user_type: DF.Link | None
username: DF.Data | None
# end: auto-generated types
+
__new_password = None
def __setup__(self):
@@ -170,9 +171,7 @@ class User(Document):
if self.language == "Loading...":
self.language = None
- if (self.name not in ["Administrator", "Guest"]) and (
- not self.get_social_login_userid("frappe")
- ):
+ if (self.name not in ["Administrator", "Guest"]) and (not self.get_social_login_userid("frappe")):
self.set_social_login_userid("frappe", frappe.generate_hash(length=39))
def populate_role_profile_roles(self):
@@ -267,7 +266,6 @@ class User(Document):
and not self.get_other_system_managers()
and cint(frappe.db.get_single_value("System Settings", "setup_complete"))
):
-
msgprint(_("Adding System Manager to this User as there must be atleast one System Manager"))
self.append("roles", {"doctype": "Has Role", "role": "System Manager"})
@@ -411,7 +409,6 @@ class User(Document):
return (self.first_name or "") + (self.first_name and " " or "") + (self.last_name or "")
def password_reset_mail(self, link):
-
reset_password_template = frappe.db.get_system_setting("reset_password_template")
self.send_login_mail(
@@ -671,9 +668,7 @@ class User(Document):
if not username:
# @firstname_last_name
- username = _check_suggestion(
- frappe.scrub("{} {}".format(self.first_name, self.last_name or ""))
- )
+ username = _check_suggestion(frappe.scrub("{} {}".format(self.first_name, self.last_name or "")))
if username:
frappe.msgprint(_("Suggested Username: {0}").format(username))
@@ -681,9 +676,7 @@ class User(Document):
return username
def username_exists(self, username=None):
- return frappe.db.get_value(
- "User", {"username": username or self.username, "name": ("!=", self.name)}
- )
+ return frappe.db.get_value("User", {"username": username or self.username, "name": ("!=", self.name)})
def get_blocked_modules(self):
"""Return list of modules blocked for that user."""
@@ -836,9 +829,7 @@ def update_password(
else:
user = res["user"]
- logout_all_sessions = cint(logout_all_sessions) or frappe.get_system_settings(
- "logout_on_password_reset"
- )
+ logout_all_sessions = cint(logout_all_sessions) or frappe.get_system_settings("logout_on_password_reset")
_update_password(user, new_password, logout_all_sessions=cint(logout_all_sessions))
user_doc, redirect_url = reset_user_data(user)
@@ -861,9 +852,7 @@ def update_password(
@frappe.whitelist(allow_guest=True)
-def test_password_strength(
- new_password: str, key=None, old_password=None, user_data: tuple | None = None
-):
+def test_password_strength(new_password: str, key=None, old_password=None, user_data: tuple | None = None):
from frappe.utils.deprecations import deprecation_warning
from frappe.utils.password_strength import test_password_strength as _test_password_strength
@@ -1086,9 +1075,7 @@ def get_total_users():
FROM `tabUser`
WHERE `enabled` = 1
AND `user_type` = 'System User'
- AND `name` NOT IN ({})""".format(
- ", ".join(["%s"] * len(STANDARD_USERS))
- ),
+ AND `name` NOT IN ({})""".format(", ".join(["%s"] * len(STANDARD_USERS))),
STANDARD_USERS,
)[0][0]
)
@@ -1119,9 +1106,7 @@ def get_active_users():
"""select count(*) from `tabUser`
where enabled = 1 and user_type != 'Website User'
and name not in ({})
- and hour(timediff(now(), last_active)) < 72""".format(
- ", ".join(["%s"] * len(STANDARD_USERS))
- ),
+ and hour(timediff(now(), last_active)) < 72""".format(", ".join(["%s"] * len(STANDARD_USERS))),
STANDARD_USERS,
)[0][0]
@@ -1162,7 +1147,6 @@ def notify_admin_access_to_system_manager(login_manager=None):
and login_manager.user == "Administrator"
and frappe.local.conf.notify_admin_access_to_system_manager
):
-
site = '{0}'.format(frappe.local.request.host_url)
date_and_time = "{}".format(format_datetime(now_datetime(), format_string="medium"))
ip_address = frappe.local.request_ip
diff --git a/frappe/core/doctype/user_document_type/user_document_type.py b/frappe/core/doctype/user_document_type/user_document_type.py
index 3280aecd5d..a2b519b8ca 100644
--- a/frappe/core/doctype/user_document_type/user_document_type.py
+++ b/frappe/core/doctype/user_document_type/user_document_type.py
@@ -27,4 +27,5 @@ class UserDocumentType(Document):
submit: DF.Check
write: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/user_email/user_email.py b/frappe/core/doctype/user_email/user_email.py
index de9a5176f6..bf08615d0a 100644
--- a/frappe/core/doctype/user_email/user_email.py
+++ b/frappe/core/doctype/user_email/user_email.py
@@ -22,4 +22,5 @@ class UserEmail(Document):
parenttype: DF.Data
used_oauth: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/user_group/user_group.py b/frappe/core/doctype/user_group/user_group.py
index 4318114440..24ef170fb8 100644
--- a/frappe/core/doctype/user_group/user_group.py
+++ b/frappe/core/doctype/user_group/user_group.py
@@ -19,6 +19,7 @@ class UserGroup(Document):
user_group_members: DF.TableMultiSelect[UserGroupMember]
# end: auto-generated types
+
def after_insert(self):
frappe.cache.delete_key("user_groups")
diff --git a/frappe/core/doctype/user_group_member/user_group_member.py b/frappe/core/doctype/user_group_member/user_group_member.py
index c85278414a..48b127eb86 100644
--- a/frappe/core/doctype/user_group_member/user_group_member.py
+++ b/frappe/core/doctype/user_group_member/user_group_member.py
@@ -19,4 +19,5 @@ class UserGroupMember(Document):
parenttype: DF.Data
user: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py
index a22316e50d..3e8d677b04 100644
--- a/frappe/core/doctype/user_permission/test_user_permission.py
+++ b/frappe/core/doctype/user_permission/test_user_permission.py
@@ -156,9 +156,7 @@ class TestUserPermission(FrappeTestCase):
doc.is_tree = 1
doc.insert()
- parent_record = frappe.get_doc(
- {"doctype": "Person", "person_name": "Parent", "is_group": 1}
- ).insert()
+ parent_record = frappe.get_doc({"doctype": "Person", "person_name": "Parent", "is_group": 1}).insert()
child_record = frappe.get_doc(
{
diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py
index ae43eb2d9d..02e0304e4c 100644
--- a/frappe/core/doctype/user_permission/user_permission.py
+++ b/frappe/core/doctype/user_permission/user_permission.py
@@ -28,6 +28,7 @@ class UserPermission(Document):
is_default: DF.Check
user: DF.Link
# end: auto-generated types
+
def validate(self):
self.validate_user_permission()
self.validate_default_permission()
@@ -120,7 +121,6 @@ def get_user_permissions(user=None):
fields=["allow", "for_value", "applicable_for", "is_default", "hide_descendants"],
filters=dict(user=user),
):
-
meta = frappe.get_meta(perm.allow)
add_doc_to_perm(perm, perm.for_value, perm.is_default)
@@ -259,9 +259,7 @@ def add_user_permissions(data):
return 1
elif len(data.applicable_doctypes) > 0 and data.apply_to_all_doctypes != 1:
remove_apply_to_all(data.user, data.doctype, data.docname)
- update_applicable(
- perm_applied_docs, data.applicable_doctypes, data.user, data.doctype, data.docname
- )
+ update_applicable(perm_applied_docs, data.applicable_doctypes, data.user, data.doctype, data.docname)
for applicable in data.applicable_doctypes:
if applicable not in perm_applied_docs:
insert_user_perm(
diff --git a/frappe/core/doctype/user_select_document_type/user_select_document_type.py b/frappe/core/doctype/user_select_document_type/user_select_document_type.py
index 5cdd269e5e..b917e79bff 100644
--- a/frappe/core/doctype/user_select_document_type/user_select_document_type.py
+++ b/frappe/core/doctype/user_select_document_type/user_select_document_type.py
@@ -19,4 +19,5 @@ class UserSelectDocumentType(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/user_social_login/user_social_login.py b/frappe/core/doctype/user_social_login/user_social_login.py
index e08eefb3f8..64b5abdf0b 100644
--- a/frappe/core/doctype/user_social_login/user_social_login.py
+++ b/frappe/core/doctype/user_social_login/user_social_login.py
@@ -20,4 +20,5 @@ class UserSocialLogin(Document):
userid: DF.Data | None
username: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/user_type/user_type.py b/frappe/core/doctype/user_type/user_type.py
index 0d7c2f9c9f..1b976e556c 100644
--- a/frappe/core/doctype/user_type/user_type.py
+++ b/frappe/core/doctype/user_type/user_type.py
@@ -31,8 +31,8 @@ class UserType(Document):
user_doctypes: DF.Table[UserDocumentType]
user_id_field: DF.Literal
user_type_modules: DF.Table[UserTypeModule]
-
# end: auto-generated types
+
def validate(self):
self.set_modules()
self.add_select_perm_doctypes()
@@ -333,7 +333,6 @@ def apply_permissions_for_non_standard_user_type(doc, method=None):
"User Permission", {"user": doc.get(data[1]), "allow": data[0], "for_value": doc.name}, "name"
)
):
-
perm_data = frappe.db.get_value(
"User Permission", {"allow": doc.doctype, "for_value": doc.name}, ["name", "user"]
)
diff --git a/frappe/core/doctype/user_type_module/user_type_module.py b/frappe/core/doctype/user_type_module/user_type_module.py
index 9972677690..b8ab63b2f7 100644
--- a/frappe/core/doctype/user_type_module/user_type_module.py
+++ b/frappe/core/doctype/user_type_module/user_type_module.py
@@ -19,4 +19,5 @@ class UserTypeModule(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py
index 89b4a995ea..4b8f9d854b 100644
--- a/frappe/core/doctype/version/version.py
+++ b/frappe/core/doctype/version/version.py
@@ -21,6 +21,7 @@ class Version(Document):
docname: DF.Data
ref_doctype: DF.Link
# end: auto-generated types
+
def update_version_info(self, old: Document | None, new: Document) -> bool:
"""Update changed info and return true if change contains useful data."""
if not old:
diff --git a/frappe/core/doctype/view_log/view_log.py b/frappe/core/doctype/view_log/view_log.py
index 441bccedf9..42d93fff35 100644
--- a/frappe/core/doctype/view_log/view_log.py
+++ b/frappe/core/doctype/view_log/view_log.py
@@ -18,6 +18,7 @@ class ViewLog(Document):
reference_name: DF.DynamicLink | None
viewed_by: DF.Data | None
# end: auto-generated types
+
@staticmethod
def clear_old_logs(days=180):
from frappe.query_builder import Interval
diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py
index 64c6e7b8bb..d19d42d2af 100644
--- a/frappe/core/page/permission_manager/permission_manager.py
+++ b/frappe/core/page/permission_manager/permission_manager.py
@@ -109,9 +109,7 @@ def add(parent, role, permlevel):
@frappe.whitelist()
-def update(
- doctype: str, role: str, permlevel: int, ptype: str, value=None, if_owner=0
-) -> str | None:
+def update(doctype: str, role: str, permlevel: int, ptype: str, value=None, if_owner=0) -> str | None:
"""Update role permission params.
Args:
diff --git a/frappe/custom/doctype/client_script/client_script.py b/frappe/custom/doctype/client_script/client_script.py
index ca7b829a12..f241ca2437 100644
--- a/frappe/custom/doctype/client_script/client_script.py
+++ b/frappe/custom/doctype/client_script/client_script.py
@@ -19,6 +19,7 @@ class ClientScript(Document):
script: DF.Code | None
view: DF.Literal["List", "Form"]
# end: auto-generated types
+
def on_update(self):
frappe.clear_cache(doctype=self.dt)
diff --git a/frappe/custom/doctype/custom_field/custom_field.py b/frappe/custom/doctype/custom_field/custom_field.py
index ce86da5e91..594eabff94 100644
--- a/frappe/custom/doctype/custom_field/custom_field.py
+++ b/frappe/custom/doctype/custom_field/custom_field.py
@@ -115,6 +115,7 @@ class CustomField(Document):
unique: DF.Check
width: DF.Data | None
# end: auto-generated types
+
def autoname(self):
self.set_fieldname()
self.name = self.dt + "-" + self.fieldname
@@ -222,9 +223,7 @@ class CustomField(Document):
frappe.db.delete("Property Setter", {"doc_type": self.dt, "field_name": self.fieldname})
# update doctype layouts
- doctype_layouts = frappe.get_all(
- "DocType Layout", filters={"document_type": self.dt}, pluck="name"
- )
+ doctype_layouts = frappe.get_all("DocType Layout", filters={"document_type": self.dt}, pluck="name")
for layout in doctype_layouts:
layout_doc = frappe.get_doc("DocType Layout", layout)
@@ -374,9 +373,7 @@ def rename_fieldname(custom_field: str, fieldname: str):
frappe.clear_cache()
-def _update_fieldname_references(
- field: CustomField, old_fieldname: str, new_fieldname: str
-) -> None:
+def _update_fieldname_references(field: CustomField, old_fieldname: str, new_fieldname: str) -> None:
# Passwords are stored in auth table, so column name needs to be updated there.
if field.fieldtype == "Password":
Auth = frappe.qb.Table("__Auth")
diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py
index 5cf05978e1..f0f415474c 100644
--- a/frappe/custom/doctype/customize_form/customize_form.py
+++ b/frappe/custom/doctype/customize_form/customize_form.py
@@ -345,9 +345,7 @@ class CustomizeForm(Document):
)
and (df.get(prop) == 0)
):
- frappe.msgprint(
- _("Row {0}: Not allowed to disable Mandatory for standard fields").format(df.idx)
- )
+ frappe.msgprint(_("Row {0}: Not allowed to disable Mandatory for standard fields").format(df.idx))
return False
elif (
@@ -414,7 +412,9 @@ class CustomizeForm(Document):
original = frappe.get_doc(doctype, d.name)
for prop, prop_type in field_map.items():
if d.get(prop) != original.get(prop):
- self.make_property_setter(prop, d.get(prop), prop_type, apply_on=doctype, row_name=d.name)
+ self.make_property_setter(
+ prop, d.get(prop), prop_type, apply_on=doctype, row_name=d.name
+ )
items.append(d.name)
else:
# custom - just insert/update
@@ -523,9 +523,7 @@ class CustomizeForm(Document):
if not is_standard_or_system_generated_field(df):
frappe.delete_doc("Custom Field", df.name)
- def make_property_setter(
- self, prop, value, property_type, fieldname=None, apply_on=None, row_name=None
- ):
+ def make_property_setter(self, prop, value, property_type, fieldname=None, apply_on=None, row_name=None):
delete_property_setter(self.doc_type, prop, fieldname, row_name)
property_value = self.get_existing_property_value(prop, fieldname)
@@ -598,9 +596,7 @@ class CustomizeForm(Document):
SELECT name, {fieldname}, LENGTH({fieldname}) AS len
FROM `tab{doctype}`
WHERE LENGTH({fieldname}) > {max_length}
- """.format(
- fieldname=fieldname, doctype=self.doc_type, max_length=max_length
- ),
+ """.format(fieldname=fieldname, doctype=self.doc_type, max_length=max_length),
as_dict=True,
)
label = df.label
diff --git a/frappe/custom/doctype/customize_form/test_customize_form.py b/frappe/custom/doctype/customize_form/test_customize_form.py
index 7354c55efa..edf72eaf40 100644
--- a/frappe/custom/doctype/customize_form/test_customize_form.py
+++ b/frappe/custom/doctype/customize_form/test_customize_form.py
@@ -69,27 +69,21 @@ class TestCustomizeForm(FrappeTestCase):
def test_save_customization_property(self):
d = self.get_customize_form("Event")
self.assertEqual(
- frappe.db.get_value(
- "Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"
- ),
+ frappe.db.get_value("Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"),
None,
)
d.allow_copy = 1
d.run_method("save_customization")
self.assertEqual(
- frappe.db.get_value(
- "Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"
- ),
+ frappe.db.get_value("Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"),
"1",
)
d.allow_copy = 0
d.run_method("save_customization")
self.assertEqual(
- frappe.db.get_value(
- "Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"
- ),
+ frappe.db.get_value("Property Setter", {"doc_type": "Event", "property": "allow_copy"}, "value"),
None,
)
@@ -340,9 +334,7 @@ class TestCustomizeForm(FrappeTestCase):
frappe.clear_cache()
user_group = frappe.get_meta("Event")
- self.assertFalse(
- [d.name for d in (user_group.links or []) if d.link_doctype == "User Group Member"]
- )
+ self.assertFalse([d.name for d in (user_group.links or []) if d.link_doctype == "User Group Member"])
def test_custom_action(self):
test_route = "/app/List/DocType"
diff --git a/frappe/custom/doctype/doctype_layout/doctype_layout.py b/frappe/custom/doctype/doctype_layout/doctype_layout.py
index c155f32ed1..63d199448e 100644
--- a/frappe/custom/doctype/doctype_layout/doctype_layout.py
+++ b/frappe/custom/doctype/doctype_layout/doctype_layout.py
@@ -26,6 +26,7 @@ class DocTypeLayout(Document):
fields: DF.Table[DocTypeLayoutField]
route: DF.Data
# end: auto-generated types
+
def validate(self):
if not self.route:
self.route = slug(self.name)
diff --git a/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py b/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py
index 7d22ee3c7d..f0c4b50fc6 100644
--- a/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py
+++ b/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py
@@ -11,7 +11,9 @@ def execute():
name=web_form.title,
route=web_form.route,
fields=[
- dict(fieldname=d.fieldname, label=d.label) for d in web_form.web_form_fields if d.fieldname
+ dict(fieldname=d.fieldname, label=d.label)
+ for d in web_form.web_form_fields
+ if d.fieldname
],
)
).insert()
diff --git a/frappe/custom/doctype/doctype_layout_field/doctype_layout_field.py b/frappe/custom/doctype/doctype_layout_field/doctype_layout_field.py
index 470517b589..ffd3b61ccf 100644
--- a/frappe/custom/doctype/doctype_layout_field/doctype_layout_field.py
+++ b/frappe/custom/doctype/doctype_layout_field/doctype_layout_field.py
@@ -20,4 +20,5 @@ class DocTypeLayoutField(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/custom/doctype/property_setter/property_setter.py b/frappe/custom/doctype/property_setter/property_setter.py
index 56f3144722..9b1ce34414 100644
--- a/frappe/custom/doctype/property_setter/property_setter.py
+++ b/frappe/custom/doctype/property_setter/property_setter.py
@@ -30,6 +30,7 @@ class PropertySetter(Document):
row_name: DF.Data | None
value: DF.SmallText | None
# end: auto-generated types
+
def autoname(self):
self.name = "{doctype}-{field}-{property}".format(
doctype=self.doc_type, field=self.field_name or self.row_name or "main", property=self.property
diff --git a/frappe/custom/report/audit_system_hooks/audit_system_hooks.py b/frappe/custom/report/audit_system_hooks/audit_system_hooks.py
index a42c5c361a..0c3b495271 100644
--- a/frappe/custom/report/audit_system_hooks/audit_system_hooks.py
+++ b/frappe/custom/report/audit_system_hooks/audit_system_hooks.py
@@ -18,9 +18,7 @@ def get_columns():
# Each app is shown in order as a column
installed_apps = frappe.get_installed_apps(_ensure_on_bench=True)
- columns += [
- {"label": app, "fieldname": app, "fieldtype": values_field_type} for app in installed_apps
- ]
+ columns += [{"label": app, "fieldname": app, "fieldtype": values_field_type} for app in installed_apps]
return columns
diff --git a/frappe/database/__init__.py b/frappe/database/__init__.py
index 178ad80fc9..12348e2f99 100644
--- a/frappe/database/__init__.py
+++ b/frappe/database/__init__.py
@@ -55,18 +55,14 @@ def get_db(host=None, user=None, password=None, port=None, cur_db_name=None):
if frappe.conf.db_type == "postgres":
import frappe.database.postgres.database
- return frappe.database.postgres.database.PostgresDatabase(
- host, user, password, port, cur_db_name
- )
+ return frappe.database.postgres.database.PostgresDatabase(host, user, password, port, cur_db_name)
else:
import frappe.database.mariadb.database
return frappe.database.mariadb.database.MariaDBDatabase(host, user, password, port, cur_db_name)
-def get_command(
- host=None, port=None, user=None, password=None, db_name=None, extra=None, dump=False
-):
+def get_command(host=None, port=None, user=None, password=None, db_name=None, extra=None, dump=False):
import frappe
if frappe.conf.db_type == "postgres":
diff --git a/frappe/database/database.py b/frappe/database/database.py
index e8e29dbc2a..83b426236f 100644
--- a/frappe/database/database.py
+++ b/frappe/database/database.py
@@ -29,9 +29,8 @@ from frappe.database.utils import (
from frappe.exceptions import DoesNotExistError, ImplicitCommitError
from frappe.monitor import get_trace_id
from frappe.query_builder.functions import Count
-from frappe.utils import CallbackManager
+from frappe.utils import CallbackManager, cint, get_datetime, get_table_name, getdate, now, sbool
from frappe.utils import cast as cast_fieldtype
-from frappe.utils import cint, get_datetime, get_table_name, getdate, now, sbool
from frappe.utils.deprecations import deprecation_warning
if TYPE_CHECKING:
@@ -369,7 +368,9 @@ class Database:
return self._cursor.mogrify(query, values)
except AttributeError:
if isinstance(values, dict):
- return query % {k: frappe.db.escape(v) if isinstance(v, str) else v for k, v in values.items()}
+ return query % {
+ k: frappe.db.escape(v) if isinstance(v, str) else v for k, v in values.items()
+ }
elif isinstance(values, (list, tuple)):
return query % tuple(frappe.db.escape(v) if isinstance(v, str) else v for v in values)
return query, values
@@ -788,9 +789,7 @@ class Database:
)
singles_data = ((doctype, key, sbool(value)) for key, value in to_update.items())
- frappe.qb.into("Singles").columns("doctype", "field", "value").insert(*singles_data).run(
- debug=debug
- )
+ frappe.qb.into("Singles").columns("doctype", "field", "value").insert(*singles_data).run(debug=debug)
frappe.clear_document_cache(doctype, doctype)
if doctype in self.value_cache:
diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py
index f91fe749bf..1c07d77d26 100644
--- a/frappe/database/mariadb/database.py
+++ b/frappe/database/mariadb/database.py
@@ -302,9 +302,7 @@ class MariaDBDatabase(MariaDBConnectionUtil, MariaDBExceptionUtil, Database):
unique `doctype_name` (doctype, name))
COLLATE=utf8mb4_unicode_ci
ENGINE=MyISAM
- CHARACTER SET=utf8mb4""".format(
- self.VARCHAR_LEN
- )
+ CHARACTER SET=utf8mb4""".format(self.VARCHAR_LEN)
)
def create_user_settings_table(self):
@@ -340,9 +338,7 @@ class MariaDBDatabase(MariaDBConnectionUtil, MariaDBExceptionUtil, Database):
column_key = 'UNI' as 'unique',
(is_nullable = 'NO') AS 'not_nullable'
from information_schema.columns as columns
- where table_name = '{table_name}' """.format(
- table_name=table_name
- ),
+ where table_name = '{table_name}' """.format(table_name=table_name),
as_dict=1,
)
@@ -364,14 +360,10 @@ class MariaDBDatabase(MariaDBConnectionUtil, MariaDBExceptionUtil, Database):
def has_index(self, table_name, index_name):
return self.sql(
"""SHOW INDEX FROM `{table_name}`
- WHERE Key_name='{index_name}'""".format(
- table_name=table_name, index_name=index_name
- )
+ WHERE Key_name='{index_name}'""".format(table_name=table_name, index_name=index_name)
)
- def get_column_index(
- self, table_name: str, fieldname: str, unique: bool = False
- ) -> frappe._dict | None:
+ def get_column_index(self, table_name: str, fieldname: str, unique: bool = False) -> frappe._dict | None:
"""Check if column exists for a specific fields in specified order.
This differs from db.has_index because it doesn't rely on index name but columns inside an
diff --git a/frappe/database/mariadb/schema.py b/frappe/database/mariadb/schema.py
index 0486ab9463..ccd8c2c1d9 100644
--- a/frappe/database/mariadb/schema.py
+++ b/frappe/database/mariadb/schema.py
@@ -67,19 +67,14 @@ class MariaDBTable(DBTable):
for col in self.columns.values():
col.build_for_alter_table(self.current_columns.get(col.fieldname.lower()))
- add_column_query = [
- f"ADD COLUMN `{col.fieldname}` {col.get_definition()}" for col in self.add_column
- ]
+ add_column_query = [f"ADD COLUMN `{col.fieldname}` {col.get_definition()}" for col in self.add_column]
columns_to_modify = set(self.change_type + self.set_default + self.change_nullability)
modify_column_query = [
f"MODIFY `{col.fieldname}` {col.get_definition(for_modification=True)}"
for col in columns_to_modify
]
modify_column_query.extend(
- [
- f"ADD UNIQUE INDEX IF NOT EXISTS {col.fieldname} (`{col.fieldname}`)"
- for col in self.add_unique
- ]
+ [f"ADD UNIQUE INDEX IF NOT EXISTS {col.fieldname} (`{col.fieldname}`)" for col in self.add_unique]
)
add_index_query = [
f"ADD INDEX `{col.fieldname}_index`(`{col.fieldname}`)"
@@ -128,9 +123,9 @@ class MariaDBTable(DBTable):
if e.args[0] == DUP_ENTRY:
fieldname = str(e).split("'")[-2]
frappe.throw(
- _("{0} field cannot be set as unique in {1}, as there are non-unique existing values").format(
- fieldname, self.table_name
- )
+ _(
+ "{0} field cannot be set as unique in {1}, as there are non-unique existing values"
+ ).format(fieldname, self.table_name)
)
raise
diff --git a/frappe/database/mariadb/setup_db.py b/frappe/database/mariadb/setup_db.py
index 28fa232022..5ce6e47a42 100644
--- a/frappe/database/mariadb/setup_db.py
+++ b/frappe/database/mariadb/setup_db.py
@@ -164,9 +164,7 @@ def get_root_connection():
)
if not frappe.flags.root_password:
- frappe.flags.root_password = frappe.conf.get("root_password") or getpass(
- "MySQL root password: "
- )
+ frappe.flags.root_password = frappe.conf.get("root_password") or getpass("MySQL root password: ")
frappe.local.flags.root_connection = frappe.database.get_db(
host=frappe.conf.db_host,
diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py
index 76cca1faea..a0030432dc 100644
--- a/frappe/database/postgres/database.py
+++ b/frappe/database/postgres/database.py
@@ -218,9 +218,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database):
from information_schema.tables
where table_catalog='{}'
and table_type = 'BASE TABLE'
- and table_schema='{}'""".format(
- self.cur_db_name, frappe.conf.get("db_schema", "public")
- )
+ and table_schema='{}'""".format(self.cur_db_name, frappe.conf.get("db_schema", "public"))
)
]
@@ -297,9 +295,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database):
content text,
route varchar({0}),
published int not null default 0,
- unique (doctype, name))""".format(
- self.VARCHAR_LEN
- )
+ unique (doctype, name))""".format(self.VARCHAR_LEN)
)
def create_user_settings_table(self):
@@ -343,9 +339,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database):
def has_index(self, table_name, index_name):
return self.sql(
"""SELECT 1 FROM pg_indexes WHERE tablename='{table_name}'
- and indexname='{index_name}' limit 1""".format(
- table_name=table_name, index_name=index_name
- )
+ and indexname='{index_name}' limit 1""".format(table_name=table_name, index_name=index_name)
)
def add_index(self, doctype: str, fields: list, index_name: str = None):
@@ -404,9 +398,7 @@ class PostgresDatabase(PostgresExceptionUtil, Database):
ON SUBSTRING(b.indexdef, '(.*)') LIKE CONCAT('%', a.column_name, '%')
WHERE a.table_name = '{table_name}'
GROUP BY a.column_name, a.data_type, a.column_default, a.character_maximum_length, a.is_nullable;
- """.format(
- table_name=table_name
- ),
+ """.format(table_name=table_name),
as_dict=1,
)
diff --git a/frappe/database/postgres/schema.py b/frappe/database/postgres/schema.py
index 48fd66e31a..18870e299d 100644
--- a/frappe/database/postgres/schema.py
+++ b/frappe/database/postgres/schema.py
@@ -122,10 +122,8 @@ class PostgresTable(DBTable):
for col in self.add_unique:
# if index key not exists
- create_contraint_query += (
- 'CREATE UNIQUE INDEX IF NOT EXISTS "unique_{index_name}" ON `{table_name}`(`{field}`);'.format(
- index_name=col.fieldname, table_name=self.table_name, field=col.fieldname
- )
+ create_contraint_query += 'CREATE UNIQUE INDEX IF NOT EXISTS "unique_{index_name}" ON `{table_name}`(`{field}`);'.format(
+ index_name=col.fieldname, table_name=self.table_name, field=col.fieldname
)
drop_contraint_query = ""
@@ -181,9 +179,9 @@ class PostgresTable(DBTable):
elif frappe.db.is_duplicate_entry(e):
fieldname = str(e).split("'")[-2]
frappe.throw(
- _("{0} field cannot be set as unique in {1}, as there are non-unique existing values").format(
- fieldname, self.table_name
- )
+ _(
+ "{0} field cannot be set as unique in {1}, as there are non-unique existing values"
+ ).format(fieldname, self.table_name)
)
else:
raise e
diff --git a/frappe/database/postgres/setup_db.py b/frappe/database/postgres/setup_db.py
index ba45af4cad..89e9f513aa 100644
--- a/frappe/database/postgres/setup_db.py
+++ b/frappe/database/postgres/setup_db.py
@@ -18,9 +18,7 @@ def setup_database():
else:
root_conn.sql(f"CREATE USER \"{frappe.conf.db_user}\" WITH PASSWORD '{frappe.conf.db_password}'")
root_conn.sql(f'CREATE DATABASE "{frappe.conf.db_name}"')
- root_conn.sql(
- f'GRANT ALL PRIVILEGES ON DATABASE "{frappe.conf.db_name}" TO "{frappe.conf.db_user}"'
- )
+ root_conn.sql(f'GRANT ALL PRIVILEGES ON DATABASE "{frappe.conf.db_name}" TO "{frappe.conf.db_user}"')
if psql_version := root_conn.sql("SELECT VERSION()", as_dict=True):
version_string = psql_version[0].get("version") or "PostgreSQL 14"
major_version = cint(re.split(r"[\w\.]", version_string)[1])
@@ -30,7 +28,6 @@ def setup_database():
def bootstrap_database(verbose, source_sql=None):
-
frappe.connect()
import_db_from_sql(source_sql, verbose)
diff --git a/frappe/database/query.py b/frappe/database/query.py
index 8d3888e494..bded4e3aee 100644
--- a/frappe/database/query.py
+++ b/frappe/database/query.py
@@ -164,9 +164,7 @@ class Engine:
if not isinstance(_field, str):
pass
- elif not self.validate_filters and (
- dynamic_field := DynamicTableField.parse(field, self.doctype)
- ):
+ elif not self.validate_filters and (dynamic_field := DynamicTableField.parse(field, self.doctype)):
# apply implicit join if link field's field is referenced
self.query = dynamic_field.apply_join(self.query)
_field = dynamic_field.field
@@ -249,7 +247,11 @@ class Engine:
)
field = (
- (Field(initial_fields) if "`" not in initial_fields else PseudoColumnMapper(initial_fields))
+ (
+ Field(initial_fields)
+ if "`" not in initial_fields
+ else PseudoColumnMapper(initial_fields)
+ )
if not has_primitive_operator
else field
)
diff --git a/frappe/database/schema.py b/frappe/database/schema.py
index 1387cbc549..6994fa88c8 100644
--- a/frappe/database/schema.py
+++ b/frappe/database/schema.py
@@ -126,7 +126,6 @@ class DBTable:
)
if "varchar" in frappe.db.type_map.get(col.fieldtype, ()):
-
# validate length range
new_length = cint(col.length) or cint(frappe.db.VARCHAR_LEN)
if not (1 <= new_length <= 1000):
@@ -393,9 +392,7 @@ def get_definition(fieldtype, precision=None, length=None):
return coltype
-def add_column(
- doctype, column_name, fieldtype, precision=None, length=None, default=None, not_null=False
-):
+def add_column(doctype, column_name, fieldtype, precision=None, length=None, default=None, not_null=False):
if column_name in frappe.db.get_table_columns(doctype):
# already exists
return
diff --git a/frappe/database/sequence.py b/frappe/database/sequence.py
index 1b22dfdd6a..f68ff7c0e6 100644
--- a/frappe/database/sequence.py
+++ b/frappe/database/sequence.py
@@ -31,7 +31,6 @@ def create_sequence(
min_value: int = 0,
max_value: int = 0,
) -> str:
-
query = "create sequence" if not temporary else "create temporary sequence"
sequence_name = scrub(doctype_name + slug)
@@ -90,7 +89,6 @@ def get_next_val(doctype_name: str, slug: str = "_id_seq") -> int:
def set_next_val(
doctype_name: str, next_val: int, *, slug: str = "_id_seq", is_val_used: bool = False
) -> None:
-
is_val_used = "false" if not is_val_used else "true"
db.multisql(
diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py
index fa2746f86c..26f69be4d2 100644
--- a/frappe/desk/desktop.py
+++ b/frappe/desk/desktop.py
@@ -176,7 +176,6 @@ class Workspace:
def _prepare_item(self, item):
if item.dependencies:
-
dependencies = [dep.strip() for dep in item.dependencies.split(",")]
incomplete_dependencies = [d for d in dependencies if not self._doctype_contains_a_record(d)]
@@ -203,8 +202,7 @@ class Workspace:
from frappe.utils import has_common
allowed = [
- d.role
- for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": custom_block_name})
+ d.role for d in frappe.get_all("Has Role", fields=["role"], filters={"parent": custom_block_name})
]
if not allowed:
@@ -544,9 +542,7 @@ def save_new_widget(doc, page, blocks, new_widgets):
new_widget(widgets.custom_block, "Workspace Custom Block", "custom_blocks")
)
if widgets.number_card:
- doc.number_cards.extend(
- new_widget(widgets.number_card, "Workspace Number Card", "number_cards")
- )
+ doc.number_cards.extend(new_widget(widgets.number_card, "Workspace Number Card", "number_cards"))
if widgets.card:
doc.build_links_table_from_card(widgets.card)
@@ -564,9 +560,7 @@ def save_new_widget(doc, page, blocks, new_widgets):
page: {}
config: {}
exception: {}
- """.format(
- page, json_config, e
- )
+ """.format(page, json_config, e)
doc.log_error("Could not save customization", log)
raise
diff --git a/frappe/desk/doctype/bulk_update/bulk_update.py b/frappe/desk/doctype/bulk_update/bulk_update.py
index a0f5a45326..e7b2a0e62d 100644
--- a/frappe/desk/doctype/bulk_update/bulk_update.py
+++ b/frappe/desk/doctype/bulk_update/bulk_update.py
@@ -66,9 +66,7 @@ def submit_cancel_or_update_docs(doctype, docnames, action="submit", data=None,
timeout=1000,
)
else:
- frappe.throw(
- _("Bulk operations only support up to 500 documents."), title=_("Too Many Documents")
- )
+ frappe.throw(_("Bulk operations only support up to 500 documents."), title=_("Too Many Documents"))
def _bulk_action(doctype, docnames, action, data, task_id=None):
diff --git a/frappe/desk/doctype/calendar_view/calendar_view.py b/frappe/desk/doctype/calendar_view/calendar_view.py
index e5ce017669..cd74381079 100644
--- a/frappe/desk/doctype/calendar_view/calendar_view.py
+++ b/frappe/desk/doctype/calendar_view/calendar_view.py
@@ -19,4 +19,5 @@ class CalendarView(Document):
start_date_field: DF.Literal
subject_field: DF.Literal
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/console_log/console_log.py b/frappe/desk/doctype/console_log/console_log.py
index cd004745a3..d618bb240b 100644
--- a/frappe/desk/doctype/console_log/console_log.py
+++ b/frappe/desk/doctype/console_log/console_log.py
@@ -18,4 +18,5 @@ class ConsoleLog(Document):
script: DF.Code | None
type: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/custom_html_block/custom_html_block.py b/frappe/desk/doctype/custom_html_block/custom_html_block.py
index 493b7ee4e4..35f9c3cc63 100644
--- a/frappe/desk/doctype/custom_html_block/custom_html_block.py
+++ b/frappe/desk/doctype/custom_html_block/custom_html_block.py
@@ -22,6 +22,7 @@ class CustomHTMLBlock(Document):
script: DF.Code | None
style: DF.Code | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index 225a8d6435..0c0a96adba 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -30,14 +30,13 @@ class Dashboard(Document):
is_standard: DF.Check
module: DF.Link | None
# end: auto-generated types
+
def on_update(self):
if self.is_default:
# make all other dashboards non-default
DashBoard = DocType("Dashboard")
- frappe.qb.update(DashBoard).set(DashBoard.is_default, 0).where(
- DashBoard.name != self.name
- ).run()
+ frappe.qb.update(DashBoard).set(DashBoard.is_default, 0).where(DashBoard.name != self.name).run()
if frappe.conf.developer_mode and self.is_standard:
export_to_files(
@@ -111,9 +110,7 @@ def get_permitted_cards(dashboard_name):
def get_non_standard_charts_in_dashboard(dashboard):
non_standard_charts = [doc.name for doc in frappe.get_list("Dashboard Chart", {"is_standard": 0})]
- return [
- chart_link.chart for chart_link in dashboard.charts if chart_link.chart in non_standard_charts
- ]
+ return [chart_link.chart for chart_link in dashboard.charts if chart_link.chart in non_standard_charts]
def get_non_standard_cards_in_dashboard(dashboard):
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
index 8e008e30c6..a4345f269f 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
@@ -37,9 +37,7 @@ def get_permission_query_conditions(user):
report_condition = False
module_condition = False
- allowed_doctypes = [
- frappe.db.escape(doctype) for doctype in frappe.permissions.get_doctypes_with_read()
- ]
+ allowed_doctypes = [frappe.db.escape(doctype) for doctype in frappe.permissions.get_doctypes_with_read()]
allowed_reports = [frappe.db.escape(report) for report in get_allowed_report_names()]
allowed_modules = [
frappe.db.escape(module.get("module_name")) for module in get_modules_from_all_apps_for_user()
@@ -55,9 +53,7 @@ def get_permission_query_conditions(user):
)
if allowed_modules:
module_condition = """`tabDashboard Chart`.`module` in ({allowed_modules})
- or `tabDashboard Chart`.`module` is NULL""".format(
- allowed_modules=",".join(allowed_modules)
- )
+ or `tabDashboard Chart`.`module` is NULL""".format(allowed_modules=",".join(allowed_modules))
return """
((`tabDashboard Chart`.`chart_type` in ('Count', 'Sum', 'Average')
@@ -271,7 +267,6 @@ def get_heatmap_chart_config(chart, filters, heatmap_year):
def get_group_by_chart_config(chart, filters):
-
aggregate_function = get_aggregate_function(chart.group_by_type)
value_field = chart.aggregate_function_based_on or "1"
group_by_field = chart.group_by_based_on
@@ -378,6 +373,7 @@ class DashboardChart(Document):
x_field: DF.Literal
y_axis: DF.Table[DashboardChartField]
# end: auto-generated types
+
def on_update(self):
frappe.cache.delete_key(f"chart-data:{self.name}")
if frappe.conf.developer_mode and self.is_standard:
diff --git a/frappe/desk/doctype/dashboard_chart/test_dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/test_dashboard_chart.py
index ddbabedcb4..1915c61911 100644
--- a/frappe/desk/doctype/dashboard_chart/test_dashboard_chart.py
+++ b/frappe/desk/doctype/dashboard_chart/test_dashboard_chart.py
@@ -254,15 +254,11 @@ class TestDashboardChart(FrappeTestCase):
with patch.object(frappe.utils.data, "get_user_date_format", return_value="dd.mm.yyyy"):
result = get(chart_name="Test Dashboard Chart Date Label")
- self.assertEqual(
- sorted(result.get("labels")), sorted(["05.01.2019", "12.01.2019", "19.01.2019"])
- )
+ self.assertEqual(sorted(result.get("labels")), sorted(["05.01.2019", "12.01.2019", "19.01.2019"]))
with patch.object(frappe.utils.data, "get_user_date_format", return_value="mm-dd-yyyy"):
result = get(chart_name="Test Dashboard Chart Date Label")
- self.assertEqual(
- sorted(result.get("labels")), sorted(["01-19-2019", "01-05-2019", "01-12-2019"])
- )
+ self.assertEqual(sorted(result.get("labels")), sorted(["01-19-2019", "01-05-2019", "01-12-2019"]))
def insert_test_records():
diff --git a/frappe/desk/doctype/dashboard_chart_field/dashboard_chart_field.py b/frappe/desk/doctype/dashboard_chart_field/dashboard_chart_field.py
index 0c0dfb6f64..1578e9504d 100644
--- a/frappe/desk/doctype/dashboard_chart_field/dashboard_chart_field.py
+++ b/frappe/desk/doctype/dashboard_chart_field/dashboard_chart_field.py
@@ -20,4 +20,5 @@ class DashboardChartField(Document):
parenttype: DF.Data
y_field: DF.Literal
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/dashboard_chart_link/dashboard_chart_link.py b/frappe/desk/doctype/dashboard_chart_link/dashboard_chart_link.py
index d95e9bb436..edaf07a089 100644
--- a/frappe/desk/doctype/dashboard_chart_link/dashboard_chart_link.py
+++ b/frappe/desk/doctype/dashboard_chart_link/dashboard_chart_link.py
@@ -20,4 +20,5 @@ class DashboardChartLink(Document):
parenttype: DF.Data
width: DF.Literal["Half", "Full"]
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.py b/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.py
index 0ba5a895e9..faf38263cd 100644
--- a/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.py
+++ b/frappe/desk/doctype/dashboard_chart_source/dashboard_chart_source.py
@@ -33,7 +33,6 @@ class DashboardChartSource(Document):
source_name: DF.Data
timeseries: DF.Check
# end: auto-generated types
+
def on_update(self):
- export_to_files(
- record_list=[[self.doctype, self.name]], record_module=self.module, create_init=True
- )
+ export_to_files(record_list=[[self.doctype, self.name]], record_module=self.module, create_init=True)
diff --git a/frappe/desk/doctype/dashboard_settings/dashboard_settings.py b/frappe/desk/doctype/dashboard_settings/dashboard_settings.py
index b88745a757..5d63e9c397 100644
--- a/frappe/desk/doctype/dashboard_settings/dashboard_settings.py
+++ b/frappe/desk/doctype/dashboard_settings/dashboard_settings.py
@@ -21,6 +21,7 @@ class DashboardSettings(Document):
chart_config: DF.Code | None
user: DF.Link | None
# end: auto-generated types
+
pass
@@ -55,6 +56,4 @@ def save_chart_config(reset, config, chart_name):
chart_config[chart_name] = {}
chart_config[chart_name].update(config)
- frappe.db.set_value(
- "Dashboard Settings", frappe.session.user, "chart_config", json.dumps(chart_config)
- )
+ frappe.db.set_value("Dashboard Settings", frappe.session.user, "chart_config", json.dumps(chart_config))
diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py
index 1c3c2d1c86..bb1076dd46 100644
--- a/frappe/desk/doctype/desktop_icon/desktop_icon.py
+++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py
@@ -37,8 +37,8 @@ class DesktopIcon(Document):
reverse: DF.Check
standard: DF.Check
type: DF.Literal["module", "list", "link", "page", "query-report"]
-
# end: auto-generated types
+
def validate(self):
if not self.label:
self.label = self.module_name
@@ -97,9 +97,7 @@ def get_desktop_icons(user=None):
icon.blocked = 1
standard_map[icon.module_name] = icon
- user_icons = frappe.get_all(
- "Desktop Icon", fields=fields, filters={"standard": 0, "owner": user}
- )
+ user_icons = frappe.get_all("Desktop Icon", fields=fields, filters={"standard": 0, "owner": user})
# update hidden property
for icon in user_icons:
@@ -127,7 +125,6 @@ def get_desktop_icons(user=None):
user_icon_names = [icon.module_name for icon in user_icons]
for standard_icon in standard_icons:
if standard_icon.module_name not in user_icon_names:
-
# if blocked, hidden too!
if standard_icon.blocked:
standard_icon.hidden = 1
@@ -175,9 +172,7 @@ def add_user_icon(_doctype, _report=None, label=None, link=None, type="link", st
else:
idx = (
- frappe.db.sql("select max(idx) from `tabDesktop Icon` where owner=%s", frappe.session.user)[0][
- 0
- ]
+ frappe.db.sql("select max(idx) from `tabDesktop Icon` where owner=%s", frappe.session.user)[0][0]
or frappe.db.sql("select count(*) from `tabDesktop Icon` where standard=1")[0][0]
)
@@ -334,8 +329,7 @@ def set_hidden(module_name, user=None, hidden=1):
def get_all_icons():
return [
- d.module_name
- for d in frappe.get_all("Desktop Icon", filters={"standard": 1}, fields=["module_name"])
+ d.module_name for d in frappe.get_all("Desktop Icon", filters={"standard": 1}, fields=["module_name"])
]
diff --git a/frappe/desk/doctype/event/event.py b/frappe/desk/doctype/event/event.py
index 0442c73d23..c35e4ef136 100644
--- a/frappe/desk/doctype/event/event.py
+++ b/frappe/desk/doctype/event/event.py
@@ -78,6 +78,7 @@ class Event(Document):
tuesday: DF.Check
wednesday: DF.Check
# end: auto-generated types
+
def validate(self):
if not self.starts_on:
self.starts_on = now_datetime()
@@ -88,9 +89,7 @@ class Event(Document):
if self.starts_on and self.ends_on:
self.validate_from_to_dates("starts_on", "ends_on")
- if (
- self.repeat_on == "Daily" and self.ends_on and getdate(self.starts_on) != getdate(self.ends_on)
- ):
+ if self.repeat_on == "Daily" and self.ends_on and getdate(self.starts_on) != getdate(self.ends_on):
frappe.throw(_("Daily Events should finish on the Same Day."))
if self.sync_with_google_calendar and not self.google_calendar:
@@ -359,9 +358,7 @@ def get_events(start, end, user=None, for_reminder=False, filters=None) -> list[
)
new_event.starts_on = date + " " + e.starts_on.split(" ")[1]
- new_event.ends_on = new_event.ends_on = (
- enddate + " " + e.ends_on.split(" ")[1] if e.ends_on else None
- )
+ new_event.ends_on = new_event.ends_on = enddate + " " + e.ends_on.split(" ")[1] if e.ends_on else None
add_events.append(new_event)
@@ -536,12 +533,9 @@ def delete_events(ref_type, ref_name, delete_event=False):
# Close events if ends_on or repeat_till is less than now_datetime
def set_status_of_events():
- events = frappe.get_list(
- "Event", filters={"status": "Open"}, fields=["name", "ends_on", "repeat_till"]
- )
+ events = frappe.get_list("Event", filters={"status": "Open"}, fields=["name", "ends_on", "repeat_till"])
for event in events:
if (event.ends_on and getdate(event.ends_on) < getdate(nowdate())) or (
event.repeat_till and getdate(event.repeat_till) < getdate(nowdate())
):
-
frappe.db.set_value("Event", event.name, "status", "Closed")
diff --git a/frappe/desk/doctype/event_participants/event_participants.py b/frappe/desk/doctype/event_participants/event_participants.py
index 8bd00f1f17..48a3e37f3d 100644
--- a/frappe/desk/doctype/event_participants/event_participants.py
+++ b/frappe/desk/doctype/event_participants/event_participants.py
@@ -19,4 +19,5 @@ class EventParticipants(Document):
reference_docname: DF.DynamicLink
reference_doctype: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/form_tour/form_tour.py b/frappe/desk/doctype/form_tour/form_tour.py
index c492871466..0227561bbd 100644
--- a/frappe/desk/doctype/form_tour/form_tour.py
+++ b/frappe/desk/doctype/form_tour/form_tour.py
@@ -40,6 +40,7 @@ class FormTour(Document):
view_name: DF.Literal["Workspaces", "List", "Form", "Tree", "Page"]
workspace_name: DF.Link | None
# end: auto-generated types
+
def before_save(self):
if self.is_standard and not self.module:
if self.workspace_name:
@@ -98,9 +99,7 @@ def update_user_status(value, step):
app="frappe_ui_tours",
properties={"is_completed": tour.is_completed},
)
- frappe.db.set_value(
- "User", frappe.session.user, "onboarding_status", value, update_modified=False
- )
+ frappe.db.set_value("User", frappe.session.user, "onboarding_status", value, update_modified=False)
frappe.cache.hdel("bootinfo", frappe.session.user)
diff --git a/frappe/desk/doctype/form_tour_step/form_tour_step.py b/frappe/desk/doctype/form_tour_step/form_tour_step.py
index 47f9f96025..f0cbbf633f 100644
--- a/frappe/desk/doctype/form_tour_step/form_tour_step.py
+++ b/frappe/desk/doctype/form_tour_step/form_tour_step.py
@@ -54,4 +54,5 @@ class FormTourStep(Document):
title: DF.Data
ui_tour: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/global_search_doctype/global_search_doctype.py b/frappe/desk/doctype/global_search_doctype/global_search_doctype.py
index 10ca85f74e..dd9ecaf556 100644
--- a/frappe/desk/doctype/global_search_doctype/global_search_doctype.py
+++ b/frappe/desk/doctype/global_search_doctype/global_search_doctype.py
@@ -19,4 +19,5 @@ class GlobalSearchDocType(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/global_search_settings/global_search_settings.py b/frappe/desk/doctype/global_search_settings/global_search_settings.py
index 879cde2910..f84c5e5108 100644
--- a/frappe/desk/doctype/global_search_settings/global_search_settings.py
+++ b/frappe/desk/doctype/global_search_settings/global_search_settings.py
@@ -18,6 +18,7 @@ class GlobalSearchSettings(Document):
allowed_in_global_search: DF.Table[GlobalSearchDocType]
# end: auto-generated types
+
def validate(self):
dts, core_dts, repeated_dts = [], [], []
diff --git a/frappe/desk/doctype/kanban_board/kanban_board.py b/frappe/desk/doctype/kanban_board/kanban_board.py
index 49604f6cd0..c3a96c3c42 100644
--- a/frappe/desk/doctype/kanban_board/kanban_board.py
+++ b/frappe/desk/doctype/kanban_board/kanban_board.py
@@ -27,6 +27,7 @@ class KanbanBoard(Document):
reference_doctype: DF.Link
show_labels: DF.Check
# end: auto-generated types
+
def validate(self):
self.validate_column_name()
@@ -130,9 +131,7 @@ def update_order(board_name, order):
@frappe.whitelist()
-def update_order_for_single_card(
- board_name, docname, from_colname, to_colname, old_index, new_index
-):
+def update_order_for_single_card(board_name, docname, from_colname, to_colname, old_index, new_index):
"""Save the order of cards in columns"""
board = frappe.get_doc("Kanban Board", board_name)
doctype = board.reference_doctype
diff --git a/frappe/desk/doctype/kanban_board_column/kanban_board_column.py b/frappe/desk/doctype/kanban_board_column/kanban_board_column.py
index 73e781965f..70142e0bc6 100644
--- a/frappe/desk/doctype/kanban_board_column/kanban_board_column.py
+++ b/frappe/desk/doctype/kanban_board_column/kanban_board_column.py
@@ -15,17 +15,7 @@ class KanbanBoardColumn(Document):
column_name: DF.Data | None
indicator: DF.Literal[
- "Blue",
- "Cyan",
- "Gray",
- "Green",
- "Light Blue",
- "Orange",
- "Pink",
- "Purple",
- "Red",
- "Red",
- "Yellow",
+ "Blue", "Cyan", "Gray", "Green", "Light Blue", "Orange", "Pink", "Purple", "Red", "Red", "Yellow"
]
order: DF.Code | None
parent: DF.Data
@@ -33,4 +23,5 @@ class KanbanBoardColumn(Document):
parenttype: DF.Data
status: DF.Literal["Active", "Archived"]
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/list_filter/list_filter.py b/frappe/desk/doctype/list_filter/list_filter.py
index 5d2aad5ba0..2b91b39590 100644
--- a/frappe/desk/doctype/list_filter/list_filter.py
+++ b/frappe/desk/doctype/list_filter/list_filter.py
@@ -18,4 +18,5 @@ class ListFilter(Document):
for_user: DF.Link | None
reference_doctype: DF.Link | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/list_view_settings/list_view_settings.py b/frappe/desk/doctype/list_view_settings/list_view_settings.py
index 70ee6db623..29a12707bc 100644
--- a/frappe/desk/doctype/list_view_settings/list_view_settings.py
+++ b/frappe/desk/doctype/list_view_settings/list_view_settings.py
@@ -21,12 +21,12 @@ class ListViewSettings(Document):
fields: DF.Code | None
total_fields: DF.Literal["", "4", "5", "6", "7", "8", "9", "10"]
# end: auto-generated types
+
pass
@frappe.whitelist()
def save_listview_settings(doctype, listview_settings, removed_listview_fields):
-
listview_settings = frappe.parse_json(listview_settings)
removed_listview_fields = frappe.parse_json(removed_listview_fields)
@@ -48,9 +48,7 @@ def save_listview_settings(doctype, listview_settings, removed_listview_fields):
def set_listview_fields(doctype, listview_fields, removed_listview_fields):
meta = frappe.get_meta(doctype)
- listview_fields = [
- f.get("fieldname") for f in frappe.parse_json(listview_fields) if f.get("fieldname")
- ]
+ listview_fields = [f.get("fieldname") for f in frappe.parse_json(listview_fields) if f.get("fieldname")]
for field in removed_listview_fields:
set_in_list_view_property(doctype, meta.get_field(field), "0")
diff --git a/frappe/desk/doctype/module_onboarding/module_onboarding.py b/frappe/desk/doctype/module_onboarding/module_onboarding.py
index 1c7a2adeaf..14049229ef 100644
--- a/frappe/desk/doctype/module_onboarding/module_onboarding.py
+++ b/frappe/desk/doctype/module_onboarding/module_onboarding.py
@@ -27,6 +27,7 @@ class ModuleOnboarding(Document):
success_message: DF.Data
title: DF.Data
# end: auto-generated types
+
def on_update(self):
if frappe.conf.developer_mode:
export_to_files(record_list=[["Module Onboarding", self.name]], record_module=self.module)
diff --git a/frappe/desk/doctype/note/note.py b/frappe/desk/doctype/note/note.py
index ef64d17f79..e303f9b80f 100644
--- a/frappe/desk/doctype/note/note.py
+++ b/frappe/desk/doctype/note/note.py
@@ -23,6 +23,7 @@ class Note(Document):
seen_by: DF.Table[NoteSeenBy]
title: DF.Data
# end: auto-generated types
+
def validate(self):
if self.notify_on_login and not self.expire_notification_on:
# expire this notification in a week (default)
diff --git a/frappe/desk/doctype/note/test_note.py b/frappe/desk/doctype/note/test_note.py
index 426fb5a16e..118a18b8f5 100644
--- a/frappe/desk/doctype/note/test_note.py
+++ b/frappe/desk/doctype/note/test_note.py
@@ -13,9 +13,7 @@ class TestNote(FrappeTestCase):
frappe.db.delete("Note")
frappe.db.delete("Note Seen By")
- return frappe.get_doc(
- dict(doctype="Note", title="test note", content="test note content")
- ).insert()
+ return frappe.get_doc(dict(doctype="Note", title="test note", content="test note content")).insert()
def test_version(self):
note = self.insert_note()
diff --git a/frappe/desk/doctype/note_seen_by/note_seen_by.py b/frappe/desk/doctype/note_seen_by/note_seen_by.py
index 151ac2e1ff..3ec518bd1b 100644
--- a/frappe/desk/doctype/note_seen_by/note_seen_by.py
+++ b/frappe/desk/doctype/note_seen_by/note_seen_by.py
@@ -18,4 +18,5 @@ class NoteSeenBy(Document):
parenttype: DF.Data
user: DF.Link | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/notification_log/notification_log.py b/frappe/desk/doctype/notification_log/notification_log.py
index c585a81826..70e726fd97 100644
--- a/frappe/desk/doctype/notification_log/notification_log.py
+++ b/frappe/desk/doctype/notification_log/notification_log.py
@@ -29,8 +29,8 @@ class NotificationLog(Document):
read: DF.Check
subject: DF.Text | None
type: DF.Literal["Mention", "Energy Point", "Assignment", "Share", "Alert"]
-
# end: auto-generated types
+
def after_insert(self):
frappe.publish_realtime("notification", after_commit=True, user=self.for_user)
set_notifications_as_unseen(self.for_user)
diff --git a/frappe/desk/doctype/notification_log/test_notification_log.py b/frappe/desk/doctype/notification_log/test_notification_log.py
index a43455149f..4f42038bbf 100644
--- a/frappe/desk/doctype/notification_log/test_notification_log.py
+++ b/frappe/desk/doctype/notification_log/test_notification_log.py
@@ -30,9 +30,7 @@ class TestNotificationLog(FrappeTestCase):
self.assertEqual(log_type, "Share")
email = get_last_email_queue()
- content = "Subject: {} shared a document ToDo".format(
- frappe.utils.get_fullname(frappe.session.user)
- )
+ content = f"Subject: {frappe.utils.get_fullname(frappe.session.user)} shared a document ToDo"
self.assertTrue(content in email.message)
diff --git a/frappe/desk/doctype/notification_settings/notification_settings.py b/frappe/desk/doctype/notification_settings/notification_settings.py
index dcdf430c4e..41a6991d6f 100644
--- a/frappe/desk/doctype/notification_settings/notification_settings.py
+++ b/frappe/desk/doctype/notification_settings/notification_settings.py
@@ -30,6 +30,7 @@ class NotificationSettings(Document):
subscribed_documents: DF.TableMultiSelect[NotificationSubscribedDocument]
user: DF.Link | None
# end: auto-generated types
+
def on_update(self):
from frappe.desk.notifications import clear_notification_config
diff --git a/frappe/desk/doctype/notification_subscribed_document/notification_subscribed_document.py b/frappe/desk/doctype/notification_subscribed_document/notification_subscribed_document.py
index 5bc6b95155..56bb1c62cb 100644
--- a/frappe/desk/doctype/notification_subscribed_document/notification_subscribed_document.py
+++ b/frappe/desk/doctype/notification_subscribed_document/notification_subscribed_document.py
@@ -19,4 +19,5 @@ class NotificationSubscribedDocument(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py
index eec086f3bb..034dff7f68 100644
--- a/frappe/desk/doctype/number_card/number_card.py
+++ b/frappe/desk/doctype/number_card/number_card.py
@@ -42,6 +42,7 @@ class NumberCard(Document):
stats_time_interval: DF.Literal["Daily", "Weekly", "Monthly", "Yearly"]
type: DF.Literal["Document Type", "Report", "Custom"]
# end: auto-generated types
+
def autoname(self):
if not self.name:
self.name = self.label
@@ -87,9 +88,7 @@ def get_permission_query_conditions(user=None):
doctype_condition = False
module_condition = False
- allowed_doctypes = [
- frappe.db.escape(doctype) for doctype in frappe.permissions.get_doctypes_with_read()
- ]
+ allowed_doctypes = [frappe.db.escape(doctype) for doctype in frappe.permissions.get_doctypes_with_read()]
allowed_modules = [
frappe.db.escape(module.get("module_name")) for module in get_modules_from_all_apps_for_user()
]
@@ -100,17 +99,13 @@ def get_permission_query_conditions(user=None):
)
if allowed_modules:
module_condition = """`tabNumber Card`.`module` in ({allowed_modules})
- or `tabNumber Card`.`module` is NULL""".format(
- allowed_modules=",".join(allowed_modules)
- )
+ or `tabNumber Card`.`module` is NULL""".format(allowed_modules=",".join(allowed_modules))
return """
{doctype_condition}
and
{module_condition}
- """.format(
- doctype_condition=doctype_condition, module_condition=module_condition
- )
+ """.format(doctype_condition=doctype_condition, module_condition=module_condition)
def has_permission(doc, ptype, user):
diff --git a/frappe/desk/doctype/number_card_link/number_card_link.py b/frappe/desk/doctype/number_card_link/number_card_link.py
index 8155a82085..4f8591ccaf 100644
--- a/frappe/desk/doctype/number_card_link/number_card_link.py
+++ b/frappe/desk/doctype/number_card_link/number_card_link.py
@@ -19,4 +19,5 @@ class NumberCardLink(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/onboarding_permission/onboarding_permission.py b/frappe/desk/doctype/onboarding_permission/onboarding_permission.py
index 47c6f00647..e42c7b436c 100644
--- a/frappe/desk/doctype/onboarding_permission/onboarding_permission.py
+++ b/frappe/desk/doctype/onboarding_permission/onboarding_permission.py
@@ -19,4 +19,5 @@ class OnboardingPermission(Document):
parenttype: DF.Data
role: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.py b/frappe/desk/doctype/onboarding_step/onboarding_step.py
index e21e23ab95..f3f9ce4472 100644
--- a/frappe/desk/doctype/onboarding_step/onboarding_step.py
+++ b/frappe/desk/doctype/onboarding_step/onboarding_step.py
@@ -43,6 +43,7 @@ class OnboardingStep(Document):
value_to_validate: DF.Data | None
video_url: DF.Data | None
# end: auto-generated types
+
def before_export(self, doc):
doc.is_complete = 0
doc.is_skipped = 0
diff --git a/frappe/desk/doctype/onboarding_step_map/onboarding_step_map.py b/frappe/desk/doctype/onboarding_step_map/onboarding_step_map.py
index 0ee27bd634..d8f707fcff 100644
--- a/frappe/desk/doctype/onboarding_step_map/onboarding_step_map.py
+++ b/frappe/desk/doctype/onboarding_step_map/onboarding_step_map.py
@@ -19,4 +19,5 @@ class OnboardingStepMap(Document):
parenttype: DF.Data
step: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/system_console/system_console.py b/frappe/desk/doctype/system_console/system_console.py
index f34f750f9c..c79d83312b 100644
--- a/frappe/desk/doctype/system_console/system_console.py
+++ b/frappe/desk/doctype/system_console/system_console.py
@@ -23,6 +23,7 @@ class SystemConsole(Document):
show_processlist: DF.Check
type: DF.Literal["Python", "SQL"]
# end: auto-generated types
+
def run(self):
frappe.only_for("System Manager")
try:
diff --git a/frappe/desk/doctype/tag/tag.py b/frappe/desk/doctype/tag/tag.py
index 0ebfb3b9c4..b9cb1601ce 100644
--- a/frappe/desk/doctype/tag/tag.py
+++ b/frappe/desk/doctype/tag/tag.py
@@ -18,6 +18,7 @@ class Tag(Document):
description: DF.SmallText | None
# end: auto-generated types
+
pass
@@ -173,9 +174,7 @@ def update_tags(doc, tags):
deleted_tags = list(set(existing_tags) - set(new_tags))
for tag in deleted_tags:
- frappe.db.delete(
- "Tag Link", {"document_type": doc.doctype, "document_name": doc.name, "tag": tag}
- )
+ frappe.db.delete("Tag Link", {"document_type": doc.doctype, "document_name": doc.name, "tag": tag})
@frappe.whitelist()
diff --git a/frappe/desk/doctype/tag_link/tag_link.py b/frappe/desk/doctype/tag_link/tag_link.py
index 18639b4051..52000b6b63 100644
--- a/frappe/desk/doctype/tag_link/tag_link.py
+++ b/frappe/desk/doctype/tag_link/tag_link.py
@@ -19,4 +19,5 @@ class TagLink(Document):
tag: DF.Link | None
title: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/todo/todo.py b/frappe/desk/doctype/todo/todo.py
index d6427f9388..6fedc70ed4 100644
--- a/frappe/desk/doctype/todo/todo.py
+++ b/frappe/desk/doctype/todo/todo.py
@@ -34,12 +34,12 @@ class ToDo(Document):
sender: DF.Data | None
status: DF.Literal["Open", "Closed", "Cancelled"]
# end: auto-generated types
+
DocType = "ToDo"
def validate(self):
self._assignment = None
if self.is_new():
-
if self.assigned_by == self.allocated_to:
assignment_message = frappe._("{0} self assigned this task: {1}").format(
get_fullname(self.assigned_by), self.description
@@ -83,9 +83,7 @@ class ToDo(Document):
def delete_communication_links(self):
# unlink todo from linked comments
- return frappe.db.delete(
- "Communication Link", {"link_doctype": self.doctype, "link_name": self.name}
- )
+ return frappe.db.delete("Communication Link", {"link_doctype": self.doctype, "link_name": self.name})
def update_in_reference(self):
if not (self.reference_type and self.reference_name):
diff --git a/frappe/desk/doctype/workspace/test_workspace.py b/frappe/desk/doctype/workspace/test_workspace.py
index 22665e1dd2..4570ab576b 100644
--- a/frappe/desk/doctype/workspace/test_workspace.py
+++ b/frappe/desk/doctype/workspace/test_workspace.py
@@ -30,9 +30,7 @@ class TestWorkspace(FrappeTestCase):
def create_module(module_name):
- module = frappe.get_doc(
- {"doctype": "Module Def", "module_name": module_name, "app_name": "frappe"}
- )
+ module = frappe.get_doc({"doctype": "Module Def", "module_name": module_name, "app_name": "frappe"})
module.insert(ignore_if_duplicate=True)
return module
diff --git a/frappe/desk/doctype/workspace/workspace.py b/frappe/desk/doctype/workspace/workspace.py
index 814be47124..bcec8e2b52 100644
--- a/frappe/desk/doctype/workspace/workspace.py
+++ b/frappe/desk/doctype/workspace/workspace.py
@@ -65,6 +65,7 @@ class Workspace(Document):
shortcuts: DF.Table[WorkspaceShortcut]
title: DF.Data
# end: auto-generated types
+
def validate(self):
self.title = strip_html(self.title)
@@ -164,7 +165,6 @@ class Workspace(Document):
return cards
def build_links_table_from_card(self, config):
-
for idx, card in enumerate(config):
links = loads(card.get("links"))
@@ -247,9 +247,7 @@ def new_page(new_page):
if page.get("public") and not is_workspace_manager():
return
elif (
- not page.get("public")
- and page.get("for_user") != frappe.session.user
- and not is_workspace_manager()
+ not page.get("public") and page.get("for_user") != frappe.session.user and not is_workspace_manager()
):
frappe.throw(_("Cannot create private workspace of other users"), frappe.PermissionError)
@@ -294,11 +292,7 @@ def update_page(name, title, icon, indicator_color, parent, public):
public = frappe.parse_json(public)
doc = frappe.get_doc("Workspace", name)
- if (
- not doc.get("public")
- and doc.get("for_user") != frappe.session.user
- and not is_workspace_manager()
- ):
+ if not doc.get("public") and doc.get("for_user") != frappe.session.user and not is_workspace_manager():
frappe.throw(
_("Need Workspace Manager role to edit private workspace of other users"),
frappe.PermissionError,
@@ -320,9 +314,7 @@ def update_page(name, title, icon, indicator_color, parent, public):
rename_doc("Workspace", name, new_name, force=True, ignore_permissions=True)
# update new name and public in child pages
- child_docs = frappe.get_all(
- "Workspace", filters={"parent_page": doc.title, "public": doc.public}
- )
+ child_docs = frappe.get_all("Workspace", filters={"parent_page": doc.title, "public": doc.public})
if child_docs:
for child in child_docs:
child_doc = frappe.get_doc("Workspace", child.name)
@@ -349,11 +341,7 @@ def hide_unhide_page(page_name: str, is_hidden: bool):
_("Need Workspace Manager role to hide/unhide public workspaces"), frappe.PermissionError
)
- if (
- not page.get("public")
- and page.get("for_user") != frappe.session.user
- and not is_workspace_manager()
- ):
+ if not page.get("public") and page.get("for_user") != frappe.session.user and not is_workspace_manager():
frappe.throw(_("Cannot update private workspace of other users"), frappe.PermissionError)
page.is_hidden = int(is_hidden)
@@ -465,9 +453,7 @@ def sort_page(workspace_pages, pages):
def last_sequence_id(doc):
- doc_exists = frappe.db.exists(
- {"doctype": "Workspace", "public": doc.public, "for_user": doc.for_user}
- )
+ doc_exists = frappe.db.exists({"doctype": "Workspace", "public": doc.public, "for_user": doc.for_user})
if not doc_exists:
return 0
diff --git a/frappe/desk/doctype/workspace_chart/workspace_chart.py b/frappe/desk/doctype/workspace_chart/workspace_chart.py
index 7f9d8eff74..8afcf9ba05 100644
--- a/frappe/desk/doctype/workspace_chart/workspace_chart.py
+++ b/frappe/desk/doctype/workspace_chart/workspace_chart.py
@@ -20,4 +20,5 @@ class WorkspaceChart(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/workspace_custom_block/workspace_custom_block.py b/frappe/desk/doctype/workspace_custom_block/workspace_custom_block.py
index 933689cc2f..b4fb0254a7 100644
--- a/frappe/desk/doctype/workspace_custom_block/workspace_custom_block.py
+++ b/frappe/desk/doctype/workspace_custom_block/workspace_custom_block.py
@@ -20,4 +20,5 @@ class WorkspaceCustomBlock(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/workspace_number_card/workspace_number_card.py b/frappe/desk/doctype/workspace_number_card/workspace_number_card.py
index 0959d8a958..1a220424b8 100644
--- a/frappe/desk/doctype/workspace_number_card/workspace_number_card.py
+++ b/frappe/desk/doctype/workspace_number_card/workspace_number_card.py
@@ -20,4 +20,5 @@ class WorkspaceNumberCard(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/workspace_quick_list/workspace_quick_list.py b/frappe/desk/doctype/workspace_quick_list/workspace_quick_list.py
index 35bfb171e1..ca2e55f817 100644
--- a/frappe/desk/doctype/workspace_quick_list/workspace_quick_list.py
+++ b/frappe/desk/doctype/workspace_quick_list/workspace_quick_list.py
@@ -21,4 +21,5 @@ class WorkspaceQuickList(Document):
parenttype: DF.Data
quick_list_filter: DF.Code | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/doctype/workspace_shortcut/workspace_shortcut.py b/frappe/desk/doctype/workspace_shortcut/workspace_shortcut.py
index 9e908974fa..22dceb9386 100644
--- a/frappe/desk/doctype/workspace_shortcut/workspace_shortcut.py
+++ b/frappe/desk/doctype/workspace_shortcut/workspace_shortcut.py
@@ -16,7 +16,7 @@ class WorkspaceShortcut(Document):
color: DF.Color | None
doc_view: DF.Literal[
- "", "List", "Report Builder", "Dashboard", "Tree", "New", "Calendar", "Kanban"
+ "", "List", "Report Builder", "Dashboard", "Tree", "New", "Calendar", "Kanban", "Image"
]
format: DF.Data | None
icon: DF.Data | None
@@ -31,4 +31,5 @@ class WorkspaceShortcut(Document):
type: DF.Literal["DocType", "Report", "Page", "Dashboard", "URL"]
url: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py
index c7dc3cab5b..bb3c760190 100644
--- a/frappe/desk/form/assign_to.py
+++ b/frappe/desk/form/assign_to.py
@@ -98,7 +98,9 @@ def add(args=None, *, ignore_permissions=False):
# if assignee does not have permissions, share or inform
if not frappe.has_permission(doc=doc, user=assign_to):
if frappe.get_system_settings("disable_document_sharing"):
- msg = _("User {0} is not permitted to access this document.").format(frappe.bold(assign_to))
+ msg = _("User {0} is not permitted to access this document.").format(
+ frappe.bold(assign_to)
+ )
msg += "
" + _(
"As document sharing is disabled, please give them the required permissions before assigning."
)
@@ -170,9 +172,7 @@ def close_all_assignments(doctype, name, ignore_permissions=False):
@frappe.whitelist()
def remove(doctype, name, assign_to, ignore_permissions=False):
- return set_status(
- doctype, name, "", assign_to, status="Cancelled", ignore_permissions=ignore_permissions
- )
+ return set_status(doctype, name, "", assign_to, status="Cancelled", ignore_permissions=ignore_permissions)
@frappe.whitelist()
@@ -194,14 +194,10 @@ def close(doctype: str, name: str, assign_to: str, ignore_permissions=False):
if assign_to != frappe.session.user:
frappe.throw(_("Only the assignee can complete this to-do."))
- return set_status(
- doctype, name, "", assign_to, status="Closed", ignore_permissions=ignore_permissions
- )
+ return set_status(doctype, name, "", assign_to, status="Closed", ignore_permissions=ignore_permissions)
-def set_status(
- doctype, name, todo=None, assign_to=None, status="Cancelled", ignore_permissions=False
-):
+def set_status(doctype, name, todo=None, assign_to=None, status="Cancelled", ignore_permissions=False):
"""remove from todo"""
if not ignore_permissions:
@@ -258,9 +254,7 @@ def clear(doctype, name, ignore_permissions=False):
return True
-def notify_assignment(
- assigned_by, allocated_to, doc_type, doc_name, action="CLOSE", description=None
-):
+def notify_assignment(assigned_by, allocated_to, doc_type, doc_name, action="CLOSE", description=None):
"""
Notify assignee that there is a change in assignment
"""
@@ -279,9 +273,9 @@ def notify_assignment(
description_html = f"{description}
" if description else None
if action == "CLOSE":
- subject = _(
- "Your assignment on {0} {1} has been removed by {2}", lang=assigned_user.language
- ).format(frappe.bold(_(doc_type)), get_title_html(title), frappe.bold(user_name))
+ subject = _("Your assignment on {0} {1} has been removed by {2}", lang=assigned_user.language).format(
+ frappe.bold(_(doc_type)), get_title_html(title), frappe.bold(user_name)
+ )
else:
user_name = frappe.bold(user_name)
document_type = frappe.bold(_(doc_type, lang=assigned_user.language))
diff --git a/frappe/desk/form/document_follow.py b/frappe/desk/form/document_follow.py
index d698c647da..bae67792bc 100644
--- a/frappe/desk/form/document_follow.py
+++ b/frappe/desk/form/document_follow.py
@@ -141,7 +141,9 @@ def get_message_for_user(frequency, user):
{
"reference_docname": document_follow.ref_docname,
"reference_doctype": document_follow.ref_doctype,
- "reference_url": get_url_to_form(document_follow.ref_doctype, document_follow.ref_docname),
+ "reference_url": get_url_to_form(
+ document_follow.ref_doctype, document_follow.ref_docname
+ ),
}
)
return message, valid_document_follows
diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py
index 45bf42fd8f..eea8bbd4ba 100644
--- a/frappe/desk/form/linked_with.py
+++ b/frappe/desk/form/linked_with.py
@@ -84,7 +84,9 @@ class SubmittableDocumentTree:
child_docs = self.get_next_level_children(parent_dt, parent_docs)
self.visited_documents[parent_dt].extend(parent_docs)
for linked_dt, linked_names in child_docs.items():
- not_visited_child_docs = set(linked_names) - set(self.visited_documents.get(linked_dt, []))
+ not_visited_child_docs = set(linked_names) - set(
+ self.visited_documents.get(linked_dt, [])
+ )
next_level_children[linked_dt].extend(not_visited_child_docs)
self.to_be_visited_documents = next_level_children
@@ -203,9 +205,7 @@ def get_references_across_doctypes(
each["child_table"] for each in itertools.chain(*child_tables_by_doctype.values())
]
- references_by_link_fields = get_references_across_doctypes_by_link_field(
- to_doctypes, limit_link_doctypes
- )
+ references_by_link_fields = get_references_across_doctypes_by_link_field(to_doctypes, limit_link_doctypes)
references_by_dlink_fields = get_references_across_doctypes_by_dynamic_link_field(
to_doctypes, limit_link_doctypes
)
@@ -342,18 +342,14 @@ def get_referencing_documents(
return {from_table: frappe.get_all(from_table, filters, pluck="name", order_by=None)}
filters.extend(child_filters or [])
- res = frappe.get_all(
- from_table, filters=filters, fields=["name", "parenttype", "parent"], order_by=None
- )
+ res = frappe.get_all(from_table, filters=filters, fields=["name", "parenttype", "parent"], order_by=None)
documents = defaultdict(list)
for parent, rows in itertools.groupby(res, key=lambda row: row["parenttype"]):
if allowed_parents and parent not in allowed_parents:
continue
filters = (parent_filters or []) + [["name", "in", tuple(row.parent for row in rows)]]
- documents[parent].extend(
- frappe.get_all(parent, filters=filters, pluck="name", order_by=None) or []
- )
+ documents[parent].extend(frappe.get_all(parent, filters=filters, pluck="name", order_by=None) or [])
return documents
@@ -455,7 +451,9 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
try:
if link.get("filters"):
- ret = frappe.get_all(doctype=dt, fields=fields, filters=link.get("filters"), order_by=None)
+ ret = frappe.get_all(
+ doctype=dt, fields=fields, filters=link.get("filters"), order_by=None
+ )
elif link.get("get_parent"):
ret = None
@@ -464,7 +462,9 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
if not frappe.get_meta(doctype).istable:
continue
- me = frappe.db.get_value(doctype, name, ["parenttype", "parent"], as_dict=True, order_by=None)
+ me = frappe.db.get_value(
+ doctype, name, ["parenttype", "parent"], as_dict=True, order_by=None
+ )
if me and me.parenttype == dt:
ret = frappe.get_all(
doctype=dt, fields=fields, filters=[[dt, "name", "=", me.parent]], order_by=None
@@ -478,7 +478,9 @@ def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> di
# dynamic link
if link.get("doctype_fieldname"):
- filters.append([link.get("child_doctype"), link.get("doctype_fieldname"), "=", doctype])
+ filters.append(
+ [link.get("child_doctype"), link.get("doctype_fieldname"), "=", doctype]
+ )
ret = frappe.get_all(
doctype=dt,
@@ -574,16 +576,13 @@ def _get_linked_doctypes(doctype, without_ignore_user_permissions_enabled=False)
def get_linked_fields(doctype, without_ignore_user_permissions_enabled=False):
-
filters = [["fieldtype", "=", "Link"], ["options", "=", doctype]]
if without_ignore_user_permissions_enabled:
filters.append(["ignore_user_permissions", "!=", 1])
# find links of parents
links = frappe.get_all("DocField", fields=["parent", "fieldname"], filters=filters, as_list=1)
- links += frappe.get_all(
- "Custom Field", fields=["dt as parent", "fieldname"], filters=filters, as_list=1
- )
+ links += frappe.get_all("Custom Field", fields=["dt as parent", "fieldname"], filters=filters, as_list=1)
ret = {}
diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py
index cc515c0ff1..e090cf921e 100644
--- a/frappe/desk/form/load.py
+++ b/frappe/desk/form/load.py
@@ -212,9 +212,7 @@ def get_communications(doctype, name, start=0, limit=20):
return _get_communications(doctype, name, cint(start), cint(limit))
-def get_comments(
- doctype: str, name: str, comment_type: str | list[str] = "Comment"
-) -> list[frappe._dict]:
+def get_comments(doctype: str, name: str, comment_type: str | list[str] = "Comment") -> list[frappe._dict]:
if isinstance(comment_type, list):
comment_types = comment_type
@@ -290,9 +288,7 @@ def get_communication_data(
# find after a particular date
conditions += """
AND C.creation > {}
- """.format(
- after
- )
+ """.format(after)
if doctype == "User":
conditions += """
@@ -306,9 +302,7 @@ def get_communication_data(
WHERE C.communication_type IN ('Communication', 'Feedback', 'Automated Message')
AND (C.reference_doctype = %(doctype)s AND C.reference_name = %(name)s)
{conditions}
- """.format(
- fields=fields, conditions=conditions
- )
+ """.format(fields=fields, conditions=conditions)
# communications linked in Timeline Links
part2 = """
@@ -318,9 +312,7 @@ def get_communication_data(
WHERE C.communication_type IN ('Communication', 'Feedback', 'Automated Message')
AND `tabCommunication Link`.link_doctype = %(doctype)s AND `tabCommunication Link`.link_name = %(name)s
{conditions}
- """.format(
- fields=fields, conditions=conditions
- )
+ """.format(fields=fields, conditions=conditions)
return frappe.db.sql(
"""
@@ -330,9 +322,7 @@ def get_communication_data(
ORDER BY creation DESC
LIMIT %(limit)s
OFFSET %(start)s
- """.format(
- part1=part1, part2=part2, group_by=(group_by or "")
- ),
+ """.format(part1=part1, part2=part2, group_by=(group_by or "")),
dict(
doctype=doctype,
name=name,
diff --git a/frappe/desk/form/utils.py b/frappe/desk/form/utils.py
index 28377572c3..353dea305f 100644
--- a/frappe/desk/form/utils.py
+++ b/frappe/desk/form/utils.py
@@ -70,7 +70,6 @@ def update_comment(name, content):
@frappe.whitelist()
def get_next(doctype, value, prev, filters=None, sort_order="desc", sort_field="modified"):
-
prev = int(prev)
if not filters:
filters = []
diff --git a/frappe/desk/link_preview.py b/frappe/desk/link_preview.py
index 7778d9e373..9c26493e0e 100644
--- a/frappe/desk/link_preview.py
+++ b/frappe/desk/link_preview.py
@@ -12,9 +12,7 @@ def get_preview_data(doctype, docname):
preview_fields = [
field.fieldname
for field in meta.fields
- if field.in_preview
- and field.fieldtype not in no_value_fields
- and field.fieldtype not in table_fields
+ if field.in_preview and field.fieldtype not in no_value_fields and field.fieldtype not in table_fields
]
# no preview fields defined, build list from mandatory fields
diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py
index 090a3f6817..8132979dff 100644
--- a/frappe/desk/notifications.py
+++ b/frappe/desk/notifications.py
@@ -130,7 +130,9 @@ def get_notifications_for_targets(config, notification_percent):
for doc in doc_list:
value = doc[value_field]
target = doc[target_field]
- doc_target_percents[doctype][doc.name] = (value / target * 100) if value < target else 100
+ doc_target_percents[doctype][doc.name] = (
+ (value / target * 100) if value < target else 100
+ )
return doc_target_percents
diff --git a/frappe/desk/page/backups/backups.py b/frappe/desk/page/backups/backups.py
index ffc7d26317..f3dd5f2975 100644
--- a/frappe/desk/page/backups/backups.py
+++ b/frappe/desk/page/backups/backups.py
@@ -95,9 +95,7 @@ def schedule_files_backup(user_email):
)
frappe.msgprint(_("Queued for backup. You will receive an email with the download link"))
else:
- frappe.msgprint(
- _("Backup job is already queued. You will receive an email with the download link")
- )
+ frappe.msgprint(_("Backup job is already queued. You will receive an email with the download link"))
def backup_files_and_notify_user(user_email=None):
diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py
index 0ae465ba55..9394b8a6b4 100755
--- a/frappe/desk/page/setup_wizard/setup_wizard.py
+++ b/frappe/desk/page/setup_wizard/setup_wizard.py
@@ -15,7 +15,6 @@ from . import install_fixtures
def get_setup_stages(args): # nosemgrep
-
# App setup stage functions should not include frappe.db.commit
# That is done by frappe after successful completion of all stages
stages = [
@@ -35,9 +34,7 @@ def get_setup_stages(args): # nosemgrep
# post executing hooks
"status": "Wrapping up",
"fail_msg": "Failed to complete setup",
- "tasks": [
- {"fn": run_post_setup_complete, "args": args, "fail_msg": "Failed to complete setup"}
- ],
+ "tasks": [{"fn": run_post_setup_complete, "args": args, "fail_msg": "Failed to complete setup"}],
}
)
diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py
index e0dfcfe3f4..d4189529aa 100644
--- a/frappe/desk/query_report.py
+++ b/frappe/desk/query_report.py
@@ -97,9 +97,7 @@ def generate_report_result(
columns.insert(custom_column["insert_after_index"] + 1, custom_column)
# all columns which are not in original report
- report_custom_columns = [
- column for column in columns if column["fieldname"] not in report_column_names
- ]
+ report_custom_columns = [column for column in columns if column["fieldname"] not in report_column_names]
if report_custom_columns:
result = add_custom_column_data(report_custom_columns, result)
@@ -324,9 +322,7 @@ def export_query():
if isinstance(visible_idx, str):
visible_idx = json.loads(visible_idx)
- data = run(
- report_name, form_params.filters, custom_columns=custom_columns, are_default_filters=False
- )
+ data = run(report_name, form_params.filters, custom_columns=custom_columns, are_default_filters=False)
data = frappe._dict(data)
data.filters = form_params.applied_filters
@@ -365,9 +361,7 @@ def format_duration_fields(data: frappe._dict) -> None:
row[index] = format_duration(row[index])
-def build_xlsx_data(
- data, visible_idx, include_indentation, include_filters=False, ignore_visible_idx=False
-):
+def build_xlsx_data(data, visible_idx, include_indentation, include_filters=False, ignore_visible_idx=False):
EXCEL_TYPES = (
str,
bool,
@@ -508,7 +502,6 @@ def add_total_row(result, columns, meta=None, is_tree=False, parent_field=None):
@frappe.whitelist()
def get_data_for_custom_field(doctype, field, names=None):
-
if not frappe.has_permission(doctype, "read"):
frappe.throw(_("Not Permitted to read {0}").format(doctype), frappe.PermissionError)
@@ -598,7 +591,9 @@ def get_filtered_data(ref_doctype, columns, data, user):
for row in data:
# Why linked_doctypes.get(ref_doctype)? because if column is empty, linked_doctypes[ref_doctype] is removed
if (
- linked_doctypes.get(ref_doctype) and shared and row.get(linked_doctypes[ref_doctype]) in shared
+ linked_doctypes.get(ref_doctype)
+ and shared
+ and row.get(linked_doctypes[ref_doctype]) in shared
):
result.append(row)
diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py
index 746c6b299f..c69542c44c 100644
--- a/frappe/desk/reportview.py
+++ b/frappe/desk/reportview.py
@@ -168,9 +168,7 @@ def raise_invalid_field(fieldname):
def is_standard(fieldname):
if "." in fieldname:
fieldname = fieldname.split(".")[1].strip("`")
- return (
- fieldname in default_fields or fieldname in optional_fields or fieldname in child_table_fields
- )
+ return fieldname in default_fields or fieldname in optional_fields or fieldname in child_table_fields
def extract_fieldname(field):
@@ -485,7 +483,9 @@ def delete_bulk(doctype, items):
if len(items) >= 5:
frappe.publish_realtime(
"progress",
- dict(progress=[i + 1, len(items)], title=_("Deleting {0}").format(doctype), description=d),
+ dict(
+ progress=[i + 1, len(items)], title=_("Deleting {0}").format(doctype), description=d
+ ),
user=frappe.session.user,
)
# Commit after successful deletion
@@ -620,7 +620,6 @@ def get_filter_dashboard_data(stats, doctype, filters=None):
)[0][1],
]
if data and data[1] != 0:
-
stats[tag["name"]].append(data)
else:
stats[tag["name"]] = tagcount
@@ -656,17 +655,13 @@ def get_match_cond(doctype, as_condition=True):
def build_match_conditions(doctype, user=None, as_condition=True):
- match_conditions = DatabaseQuery(doctype, user=user).build_match_conditions(
- as_condition=as_condition
- )
+ match_conditions = DatabaseQuery(doctype, user=user).build_match_conditions(as_condition=as_condition)
if as_condition:
return match_conditions.replace("%", "%%")
return match_conditions
-def get_filters_cond(
- doctype, filters, conditions, ignore_permissions=None, with_match_conditions=False
-):
+def get_filters_cond(doctype, filters, conditions, ignore_permissions=None, with_match_conditions=False):
if isinstance(filters, str):
filters = json.loads(filters)
@@ -692,7 +687,6 @@ def get_filters_cond(
"between",
"is",
):
-
flt.append([doctype, f[0], f[1][0], f[1][1]])
else:
flt.append([doctype, f[0], "=", f[1]])
diff --git a/frappe/desk/search.py b/frappe/desk/search.py
index 8b76cd35e1..d4d8139908 100644
--- a/frappe/desk/search.py
+++ b/frappe/desk/search.py
@@ -72,7 +72,6 @@ def search_widget(
reference_doctype: str | None = None,
ignore_user_permissions: bool = False,
):
-
start = cint(start)
if isinstance(filters, str):
@@ -319,9 +318,7 @@ def get_users_for_mentions():
def get_user_groups():
- return frappe.get_all(
- "User Group", fields=["name as id", "name as value"], update={"is_group": True}
- )
+ return frappe.get_all("User Group", fields=["name as id", "name as value"], update={"is_group": True})
@frappe.whitelist()
diff --git a/frappe/email/__init__.py b/frappe/email/__init__.py
index 5cb9677f3e..434592914e 100644
--- a/frappe/email/__init__.py
+++ b/frappe/email/__init__.py
@@ -80,7 +80,6 @@ def get_communication_doctype(doctype, txt, searchfield, start, page_len, filter
com_doctypes = []
if len(txt) < 2:
-
for name in frappe.get_hooks("communication_doctypes"):
try:
module = load_doctype_module(name, suffix="_dashboard")
@@ -94,9 +93,7 @@ def get_communication_doctype(doctype, txt, searchfield, start, page_len, filter
d[0] for d in frappe.db.get_values("DocType", {"issingle": 0, "istable": 0, "hide_toolbar": 0})
]
- return [
- [dt] for dt in com_doctypes if txt.lower().replace("%", "") in dt.lower() and dt in can_read
- ]
+ return [[dt] for dt in com_doctypes if txt.lower().replace("%", "") in dt.lower() and dt in can_read]
def get_cached_contacts(txt):
diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py
index 5549d0ba6e..88cd216e9a 100644
--- a/frappe/email/doctype/auto_email_report/auto_email_report.py
+++ b/frappe/email/doctype/auto_email_report/auto_email_report.py
@@ -42,9 +42,7 @@ class AutoEmailReport(Document):
from frappe.types import DF
data_modified_till: DF.Int
- day_of_week: DF.Literal[
- "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
- ]
+ day_of_week: DF.Literal["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
description: DF.TextEditor | None
dynamic_date_period: DF.Literal[
"", "Daily", "Weekly", "Monthly", "Quarterly", "Half Yearly", "Yearly"
@@ -190,7 +188,6 @@ class AutoEmailReport(Document):
frappe.throw(_("Invalid Output Format"))
def get_html_table(self, columns=None, data=None):
-
date_time = global_date_format(now()) + " " + format_time(now())
report_doctype = frappe.db.get_value("Report", self.report, "ref_doctype")
diff --git a/frappe/email/doctype/document_follow/document_follow.py b/frappe/email/doctype/document_follow/document_follow.py
index 4a2933276e..ba84dce825 100644
--- a/frappe/email/doctype/document_follow/document_follow.py
+++ b/frappe/email/doctype/document_follow/document_follow.py
@@ -17,4 +17,5 @@ class DocumentFollow(Document):
ref_doctype: DF.Link
user: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/document_follow/test_document_follow.py b/frappe/email/doctype/document_follow/test_document_follow.py
index 845f6e93bb..568879d415 100644
--- a/frappe/email/doctype/document_follow/test_document_follow.py
+++ b/frappe/email/doctype/document_follow/test_document_follow.py
@@ -91,9 +91,7 @@ class TestDocumentFollow(FrappeTestCase):
frappe.set_user(user.name)
event = get_event()
- add_comment(
- event.doctype, event.name, "This is a test comment", "Administrator@example.com", "Bosh"
- )
+ add_comment(event.doctype, event.name, "This is a test comment", "Administrator@example.com", "Bosh")
documents_followed = get_events_followed_by_user(event.name, user.name)
self.assertTrue(documents_followed)
@@ -103,9 +101,7 @@ class TestDocumentFollow(FrappeTestCase):
frappe.set_user(user.name)
event = get_event()
- add_comment(
- event.doctype, event.name, "This is a test comment", "Administrator@example.com", "Bosh"
- )
+ add_comment(event.doctype, event.name, "This is a test comment", "Administrator@example.com", "Bosh")
documents_followed = get_events_followed_by_user(event.name, user.name)
self.assertFalse(documents_followed)
diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py
index 2c22354365..a438af445d 100755
--- a/frappe/email/doctype/email_account/email_account.py
+++ b/frappe/email/doctype/email_account/email_account.py
@@ -96,9 +96,7 @@ class EmailAccount(Document):
password: DF.Password | None
send_notification_to: DF.SmallText | None
send_unsubscribe_message: DF.Check
- service: DF.Literal[
- "", "GMail", "Sendgrid", "SparkPost", "Yahoo Mail", "Outlook.com", "Yandex.Mail"
- ]
+ service: DF.Literal["", "GMail", "Sendgrid", "SparkPost", "Yahoo Mail", "Outlook.com", "Yandex.Mail"]
signature: DF.TextEditor | None
smtp_port: DF.Data | None
smtp_server: DF.Data | None
@@ -111,7 +109,9 @@ class EmailAccount(Document):
use_ssl_for_outgoing: DF.Check
use_starttls: DF.Check
use_tls: DF.Check
+ validate_ssl_certificate: DF.Check
# end: auto-generated types
+
DOCTYPE = "Email Account"
def autoname(self):
@@ -671,9 +671,7 @@ class EmailAccount(Document):
if not self.enable_incoming:
frappe.throw(_("Automatic Linking can be activated only if Incoming is enabled."))
- if frappe.db.exists(
- "Email Account", {"enable_automatic_linking": 1, "name": ("!=", self.name)}
- ):
+ if frappe.db.exists("Email Account", {"enable_automatic_linking": 1, "name": ("!=", self.name)}):
frappe.throw(_("Automatic Linking can be activated only for one Email Account."))
def append_email_to_sent_folder(self, message):
@@ -695,9 +693,7 @@ class EmailAccount(Document):
@frappe.whitelist()
-def get_append_to(
- doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None
-):
+def get_append_to(doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None):
txt = txt if txt else ""
filters = {"istable": 0, "issingle": 0, "email_append_to": 1}
@@ -749,7 +745,8 @@ def notify_unreplied():
{
"creation": (
">",
- datetime.now() - timedelta(seconds=(email_account.unreplied_for_mins or 30) * 60 * 3),
+ datetime.now()
+ - timedelta(seconds=(email_account.unreplied_for_mins or 30) * 60 * 3),
)
},
],
@@ -842,9 +839,7 @@ def get_max_email_uid(email_account):
return cint(result[0].get("uid", 0)) + 1
-def setup_user_email_inbox(
- email_account, awaiting_password, email_id, enable_outgoing, used_oauth
-):
+def setup_user_email_inbox(email_account, awaiting_password, email_id, enable_outgoing, used_oauth):
"""setup email inbox for user"""
from frappe.core.doctype.user.user import ask_pass_update
@@ -873,9 +868,7 @@ def setup_user_email_inbox(
# check if inbox is alreay configured
user_inbox = (
- frappe.db.get_value(
- "User Email", {"email_account": email_account, "parent": user_name}, ["name"]
- )
+ frappe.db.get_value("User Email", {"email_account": email_account, "parent": user_name}, ["name"])
or None
)
@@ -889,9 +882,7 @@ def setup_user_email_inbox(
UserEmail = frappe.qb.DocType("User Email")
frappe.qb.update(UserEmail).set(UserEmail.awaiting_password, (awaiting_password or 0)).set(
UserEmail.enable_outgoing, (enable_outgoing or 0)
- ).set(UserEmail.used_oauth, (used_oauth or 0)).where(
- UserEmail.email_account == email_account
- ).run()
+ ).set(UserEmail.used_oauth, (used_oauth or 0)).where(UserEmail.email_account == email_account).run()
else:
users = " and ".join([frappe.bold(user.get("name")) for user in user_names])
@@ -904,9 +895,7 @@ def remove_user_email_inbox(email_account):
if not email_account:
return
- users = frappe.get_all(
- "User Email", filters={"email_account": email_account}, fields=["parent as name"]
- )
+ users = frappe.get_all("User Email", filters={"email_account": email_account}, fields=["parent as name"])
for user in users:
doc = frappe.get_doc("User", user.get("name"))
diff --git a/frappe/email/doctype/email_account/test_email_account.py b/frappe/email/doctype/email_account/test_email_account.py
index 8af48b591b..16364104fa 100644
--- a/frappe/email/doctype/email_account/test_email_account.py
+++ b/frappe/email/doctype/email_account/test_email_account.py
@@ -132,9 +132,7 @@ class TestEmailAccount(FrappeTestCase):
TestEmailAccount.mocked_email_receive(email_account, messages)
comm = frappe.get_doc("Communication", {"sender": "test_sender@example.com"})
- self.assertTrue(
- "From: "Microsoft Outlook" <test_sender@example.com>" in comm.content
- )
+ self.assertTrue("From: "Microsoft Outlook" <test_sender@example.com>" in comm.content)
self.assertTrue(
"This is an e-mail message sent automatically by Microsoft Outlook while" in comm.content
)
@@ -155,9 +153,7 @@ class TestEmailAccount(FrappeTestCase):
TestEmailAccount.mocked_email_receive(email_account, messages)
comm = frappe.get_doc("Communication", {"sender": "test_sender@example.com"})
- self.assertTrue(
- "From: "Microsoft Outlook" <test_sender@example.com>" in comm.content
- )
+ self.assertTrue("From: "Microsoft Outlook" <test_sender@example.com>" in comm.content)
self.assertTrue(
"This is an e-mail message sent automatically by Microsoft Outlook while" in comm.content
)
@@ -290,7 +286,9 @@ class TestEmailAccount(FrappeTestCase):
messages = {
# append_to = ToDo
'"INBOX"': {
- "latest_messages": [f.read().replace("{{ message_id }}", "<" + last_mail.message_id + ">")],
+ "latest_messages": [
+ f.read().replace("{{ message_id }}", "<" + last_mail.message_id + ">")
+ ],
"seen_status": {2: "UNSEEN"},
"uid_list": [2],
}
@@ -429,9 +427,7 @@ class TestEmailAccount(FrappeTestCase):
@patch("frappe.email.receive.EmailServer.select_imap_folder", return_value=True)
@patch("frappe.email.receive.EmailServer.logout", side_effect=lambda: None)
- def mocked_email_receive(
- email_account, messages={}, mocked_logout=None, mocked_select_imap_folder=None
- ):
+ def mocked_email_receive(email_account, messages={}, mocked_logout=None, mocked_select_imap_folder=None):
def get_mocked_messages(**kwargs):
return messages.get(kwargs["folder"], {})
diff --git a/frappe/email/doctype/email_domain/email_domain.py b/frappe/email/doctype/email_domain/email_domain.py
index fef6e1b303..55927f94d7 100644
--- a/frappe/email/doctype/email_domain/email_domain.py
+++ b/frappe/email/doctype/email_domain/email_domain.py
@@ -73,8 +73,10 @@ class EmailDomain(Document):
use_ssl_for_outgoing: DF.Check
use_starttls: DF.Check
use_tls: DF.Check
-
+ validate_ssl_certificate: DF.Check
+ validate_ssl_certificate_for_outgoing: DF.Check
# end: auto-generated types
+
def validate(self):
"""Validate POP3/IMAP and SMTP connections."""
diff --git a/frappe/email/doctype/email_flag_queue/email_flag_queue.py b/frappe/email/doctype/email_flag_queue/email_flag_queue.py
index 1f20aece88..a8faa4928f 100644
--- a/frappe/email/doctype/email_flag_queue/email_flag_queue.py
+++ b/frappe/email/doctype/email_flag_queue/email_flag_queue.py
@@ -19,4 +19,5 @@ class EmailFlagQueue(Document):
is_completed: DF.Check
uid: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/email_group/email_group.py b/frappe/email/doctype/email_group/email_group.py
index 9619802edb..a6fafe9a03 100755
--- a/frappe/email/doctype/email_group/email_group.py
+++ b/frappe/email/doctype/email_group/email_group.py
@@ -25,6 +25,7 @@ class EmailGroup(Document):
welcome_email_template: DF.Link | None
welcome_url: DF.Data | None
# end: auto-generated types
+
def onload(self):
singles = [d.name for d in frappe.get_all("DocType", "name", {"issingle": 1})]
self.get("__onload").import_types = [
diff --git a/frappe/email/doctype/email_group_member/email_group_member.py b/frappe/email/doctype/email_group_member/email_group_member.py
index e8694d2284..437f712272 100644
--- a/frappe/email/doctype/email_group_member/email_group_member.py
+++ b/frappe/email/doctype/email_group_member/email_group_member.py
@@ -18,6 +18,7 @@ class EmailGroupMember(Document):
email_group: DF.Link
unsubscribed: DF.Check
# end: auto-generated types
+
def after_delete(self):
email_group = frappe.get_doc("Email Group", self.email_group)
email_group.update_total_subscribers()
diff --git a/frappe/email/doctype/email_queue/email_queue.py b/frappe/email/doctype/email_queue/email_queue.py
index aff8782abf..e33c12d64f 100644
--- a/frappe/email/doctype/email_queue/email_queue.py
+++ b/frappe/email/doctype/email_queue/email_queue.py
@@ -65,6 +65,7 @@ class EmailQueue(Document):
unsubscribe_method: DF.Data | None
unsubscribe_param: DF.Data | None
# end: auto-generated types
+
DOCTYPE = "Email Queue"
def set_recipients(self, recipients):
@@ -195,9 +196,7 @@ class EmailQueue(Document):
# Delete queue table
(
- frappe.qb.from_(email_queue)
- .delete()
- .where(email_queue.modified < (Now() - Interval(days=days)))
+ frappe.qb.from_(email_queue).delete().where(email_queue.modified < (Now() - Interval(days=days)))
).run()
# delete child tables, note that this has potential to leave some orphan
@@ -305,9 +304,7 @@ class SendMailContext:
if not message:
return ""
- message = message.replace(
- self.message_placeholder("tracker"), self.get_tracker_str(recipient_email)
- )
+ message = message.replace(self.message_placeholder("tracker"), self.get_tracker_str(recipient_email))
message = message.replace(
self.message_placeholder("unsubscribe_url"), self.get_unsubscribe_str(recipient_email)
)
@@ -411,11 +408,9 @@ def bulk_retry(queues):
)
email_queue = frappe.qb.DocType("Email Queue")
- frappe.qb.update(email_queue).set(email_queue.status, "Not Sent").set(
- email_queue.modified, now()
- ).set(email_queue.modified_by, frappe.session.user).where(
- email_queue.name.isin(queues) & email_queue.status == "Error"
- ).run()
+ frappe.qb.update(email_queue).set(email_queue.status, "Not Sent").set(email_queue.modified, now()).set(
+ email_queue.modified_by, frappe.session.user
+ ).where(email_queue.name.isin(queues) & email_queue.status == "Error").run()
@frappe.whitelist()
@@ -434,9 +429,7 @@ def toggle_sending(enable):
def on_doctype_update():
"""Add index in `tabCommunication` for `(reference_doctype, reference_name)`"""
- frappe.db.add_index(
- "Email Queue", ("status", "send_after", "priority", "creation"), "index_bulk_flush"
- )
+ frappe.db.add_index("Email Queue", ("status", "send_after", "priority", "creation"), "index_bulk_flush")
frappe.db.add_index("Email Queue", ["message_id(140)"])
diff --git a/frappe/email/doctype/email_queue/test_email_queue.py b/frappe/email/doctype/email_queue/test_email_queue.py
index 7d76039b47..74ea856bf3 100644
--- a/frappe/email/doctype/email_queue/test_email_queue.py
+++ b/frappe/email/doctype/email_queue/test_email_queue.py
@@ -87,9 +87,7 @@ class TestEmailQueue(FrappeTestCase):
def get_server(q):
return q.get_email_account().get_smtp_server()
- self.assertIs(
- get_server(frappe.new_doc("Email Queue")), get_server(frappe.new_doc("Email Queue"))
- )
+ self.assertIs(get_server(frappe.new_doc("Email Queue")), get_server(frappe.new_doc("Email Queue")))
q1 = frappe.new_doc("Email Queue", email_account="_Test Email Account 1")
q2 = frappe.new_doc("Email Queue", email_account="_Test Email Account 1")
diff --git a/frappe/email/doctype/email_queue_recipient/email_queue_recipient.py b/frappe/email/doctype/email_queue_recipient/email_queue_recipient.py
index 2d0c5678f7..343c3e6840 100644
--- a/frappe/email/doctype/email_queue_recipient/email_queue_recipient.py
+++ b/frappe/email/doctype/email_queue_recipient/email_queue_recipient.py
@@ -21,6 +21,7 @@ class EmailQueueRecipient(Document):
recipient: DF.Data | None
status: DF.Literal["", "Not Sent", "Sent"]
# end: auto-generated types
+
DOCTYPE = "Email Queue Recipient"
def is_mail_to_be_sent(self):
diff --git a/frappe/email/doctype/email_rule/email_rule.py b/frappe/email/doctype/email_rule/email_rule.py
index 8eab691b95..33b1f7dc24 100644
--- a/frappe/email/doctype/email_rule/email_rule.py
+++ b/frappe/email/doctype/email_rule/email_rule.py
@@ -16,4 +16,5 @@ class EmailRule(Document):
email_id: DF.Data | None
is_spam: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py
index 5cfc4a38d1..200a6487a5 100644
--- a/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py
+++ b/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py
@@ -20,13 +20,12 @@ class EmailUnsubscribe(Document):
reference_doctype: DF.Link | None
reference_name: DF.DynamicLink | None
# end: auto-generated types
+
def validate(self):
if not self.global_unsubscribe and not (self.reference_doctype and self.reference_name):
frappe.throw(_("Reference DocType and Reference Name are required"), frappe.MandatoryError)
- if not self.global_unsubscribe and frappe.db.get_value(
- self.doctype, self.name, "global_unsubscribe"
- ):
+ if not self.global_unsubscribe and frappe.db.get_value(self.doctype, self.name, "global_unsubscribe"):
frappe.throw(_("Delete this record to allow sending to this email address"))
if self.global_unsubscribe:
diff --git a/frappe/email/doctype/imap_folder/imap_folder.py b/frappe/email/doctype/imap_folder/imap_folder.py
index efbe2073ea..e5a8bd8756 100644
--- a/frappe/email/doctype/imap_folder/imap_folder.py
+++ b/frappe/email/doctype/imap_folder/imap_folder.py
@@ -22,4 +22,5 @@ class IMAPFolder(Document):
uidnext: DF.Data | None
uidvalidity: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py
index ea33937d49..45d5c35d99 100644
--- a/frappe/email/doctype/newsletter/newsletter.py
+++ b/frappe/email/doctype/newsletter/newsletter.py
@@ -337,9 +337,7 @@ def subscribe(email, email_group=None):
content = """
{}. {}.
{}
- """.format(
- *translatable_content
- )
+ """.format(*translatable_content)
frappe.sendmail(
email,
diff --git a/frappe/email/doctype/newsletter/test_newsletter.py b/frappe/email/doctype/newsletter/test_newsletter.py
index 9677b94de3..7c355af0f0 100644
--- a/frappe/email/doctype/newsletter/test_newsletter.py
+++ b/frappe/email/doctype/newsletter/test_newsletter.py
@@ -147,9 +147,7 @@ class TestNewsletter(TestNewsletterMixin, FrappeTestCase):
def test_unsubscribe(self):
name = self.send_newsletter()
to_unsubscribe = choice(emails)
- group = frappe.get_all(
- "Newsletter Email Group", filters={"parent": name}, fields=["email_group"]
- )
+ group = frappe.get_all("Newsletter Email Group", filters={"parent": name}, fields=["email_group"])
flush()
confirmed_unsubscribe(to_unsubscribe, group[0].email_group)
diff --git a/frappe/email/doctype/newsletter_attachment/newsletter_attachment.py b/frappe/email/doctype/newsletter_attachment/newsletter_attachment.py
index dcb3753124..e0a3f3aa56 100644
--- a/frappe/email/doctype/newsletter_attachment/newsletter_attachment.py
+++ b/frappe/email/doctype/newsletter_attachment/newsletter_attachment.py
@@ -19,4 +19,5 @@ class NewsletterAttachment(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/newsletter_email_group/newsletter_email_group.py b/frappe/email/doctype/newsletter_email_group/newsletter_email_group.py
index ed3398c2c2..59b06e446d 100644
--- a/frappe/email/doctype/newsletter_email_group/newsletter_email_group.py
+++ b/frappe/email/doctype/newsletter_email_group/newsletter_email_group.py
@@ -19,4 +19,5 @@ class NewsletterEmailGroup(Document):
parenttype: DF.Data
total_subscribers: DF.ReadOnly | None
# end: auto-generated types
+
pass
diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py
index 28a45ce35e..79a90b811d 100644
--- a/frappe/email/doctype/notification/notification.py
+++ b/frappe/email/doctype/notification/notification.py
@@ -67,6 +67,7 @@ class Notification(Document):
subject: DF.Data | None
value_changed: DF.Literal
# end: auto-generated types
+
def onload(self):
"""load message"""
if self.is_standard:
@@ -381,7 +382,6 @@ def get_context(context):
if (doc.docstatus == 0 and not print_settings.allow_print_for_draft) or (
doc.docstatus == 2 and not print_settings.allow_print_for_cancelled
):
-
# ignoring attachment as draft and cancelled documents are not allowed to print
status = "Draft" if doc.docstatus == 0 else "Cancelled"
frappe.throw(
diff --git a/frappe/email/doctype/notification/test_notification.py b/frappe/email/doctype/notification/test_notification.py
index 576d9e9a66..e9043b2a38 100644
--- a/frappe/email/doctype/notification/test_notification.py
+++ b/frappe/email/doctype/notification/test_notification.py
@@ -87,9 +87,7 @@ class TestNotification(FrappeTestCase):
)
)
- self.assertEqual(
- frappe.db.get_value("Communication", communication.name, "subject"), "__testing__"
- )
+ self.assertEqual(frappe.db.get_value("Communication", communication.name, "subject"), "__testing__")
def test_condition(self):
"""Check notification is triggered based on a condition."""
@@ -263,7 +261,6 @@ class TestNotification(FrappeTestCase):
)
def test_cc_jinja(self):
-
frappe.db.delete("User", {"email": "test_jinja@example.com"})
frappe.db.delete("Email Queue")
frappe.db.delete("Email Queue Recipient")
@@ -282,9 +279,7 @@ class TestNotification(FrappeTestCase):
)
)
- self.assertTrue(
- frappe.db.get_value("Email Queue Recipient", {"recipient": "test_jinja@example.com"})
- )
+ self.assertTrue(frappe.db.get_value("Email Queue Recipient", {"recipient": "test_jinja@example.com"}))
frappe.db.delete("User", {"email": "test_jinja@example.com"})
frappe.db.delete("Email Queue")
diff --git a/frappe/email/doctype/notification_recipient/notification_recipient.py b/frappe/email/doctype/notification_recipient/notification_recipient.py
index 1a1b397a80..004a7f8353 100644
--- a/frappe/email/doctype/notification_recipient/notification_recipient.py
+++ b/frappe/email/doctype/notification_recipient/notification_recipient.py
@@ -22,4 +22,5 @@ class NotificationRecipient(Document):
receiver_by_document_field: DF.Literal
receiver_by_role: DF.Link | None
# end: auto-generated types
+
pass
diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py
index 80348df394..34308f1af8 100755
--- a/frappe/email/email_body.py
+++ b/frappe/email/email_body.py
@@ -220,9 +220,7 @@ class EMail:
"""Set plain text from HTML"""
self.set_text(to_markdown(html))
- def set_message(
- self, message, mime_type="text/html", as_attachment=0, filename="attachment.html"
- ):
+ def set_message(self, message, mime_type="text/html", as_attachment=0, filename="attachment.html"):
"""Append the message with MIME content to the root node (as attachment)"""
from email.mime.text import MIMEText
@@ -243,9 +241,7 @@ class EMail:
self.add_attachment(_file.file_name, content)
- def add_attachment(
- self, fname, fcontent, content_type=None, parent=None, content_id=None, inline=False
- ):
+ def add_attachment(self, fname, fcontent, content_type=None, parent=None, content_id=None, inline=False):
"""add attachment"""
if not parent:
@@ -355,7 +351,6 @@ def get_formatted_html(
sender=None,
with_container=False,
):
-
email_account = email_account or EmailAccount.find_outgoing(match_by_email=sender)
rendered_email = frappe.get_template("templates/emails/standard.html").render(
@@ -518,9 +513,7 @@ def replace_filename_with_cid(message):
content_id = random_string(10)
- inline_images.append(
- {"filename": filename, "filecontent": filecontent, "content_id": content_id}
- )
+ inline_images.append({"filename": filename, "filecontent": filecontent, "content_id": content_id})
message = re.sub(f"""embed=['"]{re.escape(img_path)}['"]""", f'src="cid:{content_id}"', message)
diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py
index ef5187e7e1..e5215ec397 100644
--- a/frappe/email/inbox.py
+++ b/frappe/email/inbox.py
@@ -124,9 +124,7 @@ def mark_as_spam(communication: str, sender: str):
set_value("Communication", communication, "email_status", "Spam")
-def link_communication_to_document(
- doc, reference_doctype, reference_name, ignore_communication_links
-):
+def link_communication_to_document(doc, reference_doctype, reference_name, ignore_communication_links):
if not ignore_communication_links:
doc.reference_doctype = reference_doctype
doc.reference_name = reference_name
diff --git a/frappe/email/oauth.py b/frappe/email/oauth.py
index 87feb8ca11..497ee65d45 100644
--- a/frappe/email/oauth.py
+++ b/frappe/email/oauth.py
@@ -15,7 +15,6 @@ class Oauth:
access_token: str,
mechanism: str = "XOAUTH2",
) -> None:
-
self.email_account = email_account
self.email = email
self._mechanism = mechanism
diff --git a/frappe/email/queue.py b/frappe/email/queue.py
index 6c78383b0c..7cdc5511de 100755
--- a/frappe/email/queue.py
+++ b/frappe/email/queue.py
@@ -62,9 +62,7 @@ def get_emails_sent_today(email_account=None):
return frappe.db.sql(q, q_args)[0][0]
-def get_unsubscribe_message(
- unsubscribe_message: str, expose_recipients: str
-) -> "frappe._dict[str, str]":
+def get_unsubscribe_message(unsubscribe_message: str, expose_recipients: str) -> "frappe._dict[str, str]":
unsubscribe_message = unsubscribe_message or _("Unsubscribe")
unsubscribe_link = f'{unsubscribe_message}'
unsubscribe_html = _("{0} to stop receiving emails of this type").format(unsubscribe_link)
@@ -82,9 +80,7 @@ def get_unsubscribe_message(
return frappe._dict(html=html, text=text)
-def get_unsubcribed_url(
- reference_doctype, reference_name, email, unsubscribe_method, unsubscribe_params
-):
+def get_unsubcribed_url(reference_doctype, reference_name, email, unsubscribe_method, unsubscribe_params):
params = {
"email": cstr(email),
"doctype": cstr(reference_doctype),
@@ -157,7 +153,8 @@ def flush():
failed_email_queues.append(row.name)
if (
- len(failed_email_queues) / len(email_queue_batch) > EMAIL_QUEUE_BATCH_FAILURE_THRESHOLD_PERCENT
+ len(failed_email_queues) / len(email_queue_batch)
+ > EMAIL_QUEUE_BATCH_FAILURE_THRESHOLD_PERCENT
and len(failed_email_queues) > EMAIL_QUEUE_BATCH_FAILURE_THRESHOLD_COUNT
):
frappe.throw(_("Email Queue flushing aborted due to too many failures."))
diff --git a/frappe/email/receive.py b/frappe/email/receive.py
index 74d7f84dac..ff8995e7c1 100644
--- a/frappe/email/receive.py
+++ b/frappe/email/receive.py
@@ -237,9 +237,7 @@ class EmailServer:
).where(EmailAccount.name == self.settings.email_account_name).run()
sync_count = 100 if uid_validity else int(self.settings.initial_sync_count)
- from_uid = (
- 1 if uidnext < (sync_count + 1) or (uidnext - sync_count) < 1 else uidnext - sync_count
- )
+ from_uid = 1 if uidnext < (sync_count + 1) or (uidnext - sync_count) < 1 else uidnext - sync_count
# sync last 100 email
self.settings.email_sync_rule = f"UID {from_uid}:{uidnext}"
self.uid_reindexed = True
@@ -445,9 +443,7 @@ class Email:
if not email:
return
decoded = ""
- for part, encoding in decode_header(
- frappe.as_unicode(email).replace('"', " ").replace("'", " ")
- ):
+ for part, encoding in decode_header(frappe.as_unicode(email).replace('"', " ").replace("'", " ")):
if encoding:
decoded += part.decode(encoding, "replace")
else:
@@ -850,9 +846,7 @@ class InboundMail(Email):
@staticmethod
def get_users_linked_to_account(email_account):
"""Get list of users who linked to Email account."""
- users = frappe.get_all(
- "User Email", filters={"email_account": email_account.name}, fields=["parent"]
- )
+ users = frappe.get_all("User Email", filters={"email_account": email_account.name}, fields=["parent"])
return list({user.get("parent") for user in users})
@staticmethod
diff --git a/frappe/email/test_email_body.py b/frappe/email/test_email_body.py
index c2c69d8e3d..a95adafac7 100644
--- a/frappe/email/test_email_body.py
+++ b/frappe/email/test_email_body.py
@@ -133,9 +133,7 @@ w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- """.format(
- inline_images[0].get("content_id")
- )
+ """.format(inline_images[0].get("content_id"))
self.assertEqual(message, processed_message)
def test_inline_styling(self):
diff --git a/frappe/frappeclient.py b/frappe/frappeclient.py
index 0e18fbf483..00d0ef332a 100644
--- a/frappe/frappeclient.py
+++ b/frappe/frappeclient.py
@@ -106,9 +106,7 @@ class FrappeClient:
headers=self.headers,
)
- def get_list(
- self, doctype, fields='["name"]', filters=None, limit_start=0, limit_page_length=None
- ):
+ def get_list(self, doctype, fields='["name"]', filters=None, limit_start=0, limit_page_length=None):
"""Return list of records of a particular type."""
if not isinstance(fields, str):
fields = json.dumps(fields)
@@ -247,9 +245,7 @@ class FrappeClient:
}
return self.post_request(params)
- def migrate_doctype(
- self, doctype, filters=None, update=None, verbose=1, exclude=None, preprocess=None
- ):
+ def migrate_doctype(self, doctype, filters=None, update=None, verbose=1, exclude=None, preprocess=None):
"""Migrate records from another doctype"""
meta = frappe.get_meta(doctype)
tables = {}
diff --git a/frappe/geo/doctype/country/country.py b/frappe/geo/doctype/country/country.py
index a2caad81c7..01e217a3db 100644
--- a/frappe/geo/doctype/country/country.py
+++ b/frappe/geo/doctype/country/country.py
@@ -20,6 +20,7 @@ class Country(Document):
time_format: DF.Data | None
time_zones: DF.Text | None
# end: auto-generated types
+
# NOTE: During installation country docs are bulk inserted.
pass
diff --git a/frappe/geo/doctype/currency/currency.py b/frappe/geo/doctype/currency/currency.py
index 3c3e9e923f..715adf19c0 100644
--- a/frappe/geo/doctype/currency/currency.py
+++ b/frappe/geo/doctype/currency/currency.py
@@ -37,6 +37,7 @@ class Currency(Document):
symbol: DF.Data | None
symbol_on_right: DF.Check
# end: auto-generated types
+
# NOTE: During installation country docs are bulk inserted.
def validate(self):
frappe.clear_cache()
diff --git a/frappe/gettext/extractors/module_onboarding.py b/frappe/gettext/extractors/module_onboarding.py
index 3468501074..518b995d8b 100644
--- a/frappe/gettext/extractors/module_onboarding.py
+++ b/frappe/gettext/extractors/module_onboarding.py
@@ -25,6 +25,4 @@ def extract(fileobj, *args, **kwargs):
yield None, "_", subtitle, [f"Subtitle of the Module Onboarding '{onboarding_name}'"]
if success_message := data.get("success_message"):
- yield None, "_", success_message, [
- f"Success message of the Module Onboarding '{onboarding_name}'"
- ]
+ yield None, "_", success_message, [f"Success message of the Module Onboarding '{onboarding_name}'"]
diff --git a/frappe/gettext/extractors/navbar.py b/frappe/gettext/extractors/navbar.py
index abf51cd9a5..c40790dd41 100644
--- a/frappe/gettext/extractors/navbar.py
+++ b/frappe/gettext/extractors/navbar.py
@@ -18,20 +18,30 @@ def extract(fileobj, *args, **kwargs):
for nav_item in standard_navbar_items:
if label := nav_item.get("item_label"):
item_type = nav_item.get("item_type")
- yield None, "_", label, [
- "Label of a standard navbar item",
- f"Type: {item_type}",
- ]
+ yield (
+ None,
+ "_",
+ label,
+ [
+ "Label of a standard navbar item",
+ f"Type: {item_type}",
+ ],
+ )
if hasattr(module, "standard_help_items"):
standard_help_items = getattr(module, "standard_help_items")
for help_item in standard_help_items:
if label := help_item.get("item_label"):
item_type = nav_item.get("item_type")
- yield None, "_", label, [
- "Label of a standard help item",
- f"Type: {item_type}",
- ]
+ yield (
+ None,
+ "_",
+ label,
+ [
+ "Label of a standard help item",
+ f"Type: {item_type}",
+ ],
+ )
def get_module(path):
diff --git a/frappe/gettext/extractors/onboarding_step.py b/frappe/gettext/extractors/onboarding_step.py
index 1188b5399e..70f36ada2d 100644
--- a/frappe/gettext/extractors/onboarding_step.py
+++ b/frappe/gettext/extractors/onboarding_step.py
@@ -27,6 +27,9 @@ def extract(fileobj, *args, **kwargs):
yield None, "_", description, [f"Description of the Onboarding Step '{step_title}'"]
if report_description := data.get("report_description"):
- yield None, "_", report_description, [
- f"Description of a report in the Onboarding Step '{step_title}'"
- ]
+ yield (
+ None,
+ "_",
+ report_description,
+ [f"Description of a report in the Onboarding Step '{step_title}'"],
+ )
diff --git a/frappe/handler.py b/frappe/handler.py
index d875e9bd57..770ead5a5f 100644
--- a/frappe/handler.py
+++ b/frappe/handler.py
@@ -218,9 +218,7 @@ def upload_file():
frappe.local.uploaded_file = content
frappe.local.uploaded_filename = filename
- if content is not None and (
- frappe.session.user == "Guest" or (user and not user.has_desk_access())
- ):
+ if content is not None and (frappe.session.user == "Guest" or (user and not user.has_desk_access())):
filetype = guess_type(filename)[0]
if filetype not in ALLOWED_MIMETYPES:
frappe.throw(_("You can only upload JPG, PNG, PDF, TXT or Microsoft documents."))
diff --git a/frappe/hooks.py b/frappe/hooks.py
index c5f19ebfb2..907f337c7b 100644
--- a/frappe/hooks.py
+++ b/frappe/hooks.py
@@ -91,9 +91,7 @@ on_session_creation = [
"frappe.core.doctype.user.user.notify_admin_access_to_system_manager",
]
-on_logout = (
- "frappe.core.doctype.session_default_settings.session_default_settings.clear_session_defaults"
-)
+on_logout = "frappe.core.doctype.session_default_settings.session_default_settings.clear_session_defaults"
# PDF
pdf_header_html = "frappe.utils.pdf.pdf_header_html"
@@ -139,9 +137,7 @@ has_permission = {
"Notification Settings": "frappe.desk.doctype.notification_settings.notification_settings.has_permission",
}
-has_website_permission = {
- "Address": "frappe.contacts.doctype.address.address.has_website_permission"
-}
+has_website_permission = {"Address": "frappe.contacts.doctype.address.address.has_website_permission"}
jinja = {
"methods": "frappe.utils.jinja_globals",
diff --git a/frappe/installer.py b/frappe/installer.py
index 68fd4d87d2..d33926690d 100644
--- a/frappe/installer.py
+++ b/frappe/installer.py
@@ -104,9 +104,7 @@ def _new_site(
setup=setup_db,
)
- apps_to_install = (
- ["frappe"] + (frappe.conf.get("install_apps") or []) + (list(install_apps) or [])
- )
+ apps_to_install = ["frappe"] + (frappe.conf.get("install_apps") or []) + (list(install_apps) or [])
for app in apps_to_install:
# NOTE: not using force here for 2 reasons:
@@ -451,9 +449,7 @@ def _delete_modules(modules: list[str], dry_run: bool) -> list[str]:
return drop_doctypes
-def _delete_linked_documents(
- module_name: str, doctype_linkfield_map: dict[str, str], dry_run: bool
-) -> None:
+def _delete_linked_documents(module_name: str, doctype_linkfield_map: dict[str, str], dry_run: bool) -> None:
"""Deleted all records linked with module def"""
for doctype, fieldname in doctype_linkfield_map.items():
for record in frappe.get_all(doctype, filters={fieldname: module_name}, pluck="name"):
diff --git a/frappe/integrations/doctype/connected_app/connected_app.py b/frappe/integrations/doctype/connected_app/connected_app.py
index d571b2ba00..07f5c10b01 100644
--- a/frappe/integrations/doctype/connected_app/connected_app.py
+++ b/frappe/integrations/doctype/connected_app/connected_app.py
@@ -41,6 +41,7 @@ class ConnectedApp(Document):
token_uri: DF.Data | None
userinfo_uri: DF.Data | None
# end: auto-generated types
+
"""Connect to a remote oAuth Server. Retrieve and store user's access token
in a Token Cache.
"""
diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py
index 216b7defec..031ba18817 100644
--- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py
+++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py
@@ -44,6 +44,7 @@ class DropboxSettings(Document):
send_email_for_successful_backup: DF.Check
send_notifications_to: DF.Data
# end: auto-generated types
+
def onload(self):
if not self.app_access_key and frappe.conf.dropbox_access_key:
self.set_onload("dropbox_setup_via_site_config", 1)
@@ -144,9 +145,7 @@ def backup_to_dropbox(upload_db_backup=True):
return did_not_upload, list(set(error_log))
-def upload_from_folder(
- path, is_private, dropbox_folder, dropbox_client, did_not_upload, error_log
-):
+def upload_from_folder(path, is_private, dropbox_folder, dropbox_client, did_not_upload, error_log):
if not os.path.exists(path):
return
diff --git a/frappe/integrations/doctype/google_calendar/google_calendar.py b/frappe/integrations/doctype/google_calendar/google_calendar.py
index 2afd3222c5..e36fe8b2b8 100644
--- a/frappe/integrations/doctype/google_calendar/google_calendar.py
+++ b/frappe/integrations/doctype/google_calendar/google_calendar.py
@@ -83,6 +83,7 @@ class GoogleCalendar(Document):
refresh_token: DF.Password | None
user: DF.Link
# end: auto-generated types
+
def validate(self):
google_settings = frappe.get_single("Google Settings")
if not google_settings.enable:
@@ -376,9 +377,7 @@ def insert_event_to_calendar(account, event, recurrence=None):
"pulled_from_google_calendar": 1,
}
calendar_event.update(
- google_calendar_to_repeat_on(
- recurrence=recurrence, start=event.get("start"), end=event.get("end")
- )
+ google_calendar_to_repeat_on(recurrence=recurrence, start=event.get("start"), end=event.get("end"))
)
frappe.get_doc(calendar_event).insert(ignore_permissions=True)
@@ -392,9 +391,7 @@ def update_event_in_calendar(account, event, recurrence=None):
calendar_event.description = event.get("description")
calendar_event.google_meet_link = event.get("hangoutLink")
calendar_event.update(
- google_calendar_to_repeat_on(
- recurrence=recurrence, start=event.get("start"), end=event.get("end")
- )
+ google_calendar_to_repeat_on(recurrence=recurrence, start=event.get("start"), end=event.get("end"))
)
calendar_event.save(ignore_permissions=True)
@@ -772,9 +769,7 @@ def get_attendees(doc):
if participant.get("email"):
attendees.append({"email": participant.email})
else:
- email_not_found.append(
- {"dt": participant.reference_doctype, "dn": participant.reference_docname}
- )
+ email_not_found.append({"dt": participant.reference_doctype, "dn": participant.reference_docname})
if email_not_found:
frappe.msgprint(
diff --git a/frappe/integrations/doctype/google_contacts/google_contacts.py b/frappe/integrations/doctype/google_contacts/google_contacts.py
index fa316de026..8116419423 100644
--- a/frappe/integrations/doctype/google_contacts/google_contacts.py
+++ b/frappe/integrations/doctype/google_contacts/google_contacts.py
@@ -30,6 +30,7 @@ class GoogleContacts(Document):
push_to_google_contacts: DF.Check
refresh_token: DF.Password | None
# end: auto-generated types
+
def validate(self):
if not frappe.db.get_single_value("Google Settings", "enable"):
frappe.throw(_("Enable Google API in Google Settings."))
@@ -176,12 +177,14 @@ def sync_contacts_from_google_contacts(g_contact):
for email in connection.get("emailAddresses", []):
contact.add_email(
- email_id=email.get("value"), is_primary=1 if email.get("metadata").get("primary") else 0
+ email_id=email.get("value"),
+ is_primary=1 if email.get("metadata").get("primary") else 0,
)
for phone in connection.get("phoneNumbers", []):
contact.add_phone(
- phone=phone.get("value"), is_primary_phone=1 if phone.get("metadata").get("primary") else 0
+ phone=phone.get("value"),
+ is_primary_phone=1 if phone.get("metadata").get("primary") else 0,
)
contact.insert(ignore_permissions=True)
diff --git a/frappe/integrations/doctype/google_drive/google_drive.py b/frappe/integrations/doctype/google_drive/google_drive.py
index 394f43bbee..cd1c8c2577 100644
--- a/frappe/integrations/doctype/google_drive/google_drive.py
+++ b/frappe/integrations/doctype/google_drive/google_drive.py
@@ -41,6 +41,7 @@ class GoogleDrive(Document):
refresh_token: DF.Data | None
send_email_for_successful_backup: DF.Check
# end: auto-generated types
+
def validate(self):
doc_before_save = self.get_doc_before_save()
if doc_before_save and doc_before_save.backup_folder_name != self.backup_folder_name:
@@ -66,9 +67,7 @@ def authorize_access(reauthorize=False, code=None):
Google Contact Name is set to flags to set_value after Authorization Code is obtained.
"""
- oauth_code = (
- frappe.db.get_single_value("Google Drive", "authorization_code") if not code else code
- )
+ oauth_code = frappe.db.get_single_value("Google Drive", "authorization_code") if not code else code
oauth_obj = GoogleOAuth("drive")
if not oauth_code or reauthorize:
@@ -130,9 +129,7 @@ def check_for_folder_in_google_drive():
google_drive.files().list(q="mimeType='application/vnd.google-apps.folder'").execute()
)
except HttpError as e:
- frappe.throw(
- _("Google Drive - Could not find folder in Google Drive - Error Code {0}").format(e)
- )
+ frappe.throw(_("Google Drive - Could not find folder in Google Drive - Error Code {0}").format(e))
for f in google_drive_folders.get("files"):
if f.get("name") == account.backup_folder_name:
diff --git a/frappe/integrations/doctype/integration_request/integration_request.py b/frappe/integrations/doctype/integration_request/integration_request.py
index a81e702dfc..2271fe0ab6 100644
--- a/frappe/integrations/doctype/integration_request/integration_request.py
+++ b/frappe/integrations/doctype/integration_request/integration_request.py
@@ -30,6 +30,7 @@ class IntegrationRequest(Document):
status: DF.Literal["", "Queued", "Authorized", "Completed", "Cancelled", "Failed"]
url: DF.SmallText | None
# end: auto-generated types
+
def autoname(self):
if self.flags._name:
self.name = self.flags._name
diff --git a/frappe/integrations/doctype/ldap_group_mapping/ldap_group_mapping.py b/frappe/integrations/doctype/ldap_group_mapping/ldap_group_mapping.py
index f653d8da61..c2abf05d87 100644
--- a/frappe/integrations/doctype/ldap_group_mapping/ldap_group_mapping.py
+++ b/frappe/integrations/doctype/ldap_group_mapping/ldap_group_mapping.py
@@ -20,4 +20,5 @@ class LDAPGroupMapping(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.py b/frappe/integrations/doctype/ldap_settings/ldap_settings.py
index 93d970d95d..011d6c88b4 100644
--- a/frappe/integrations/doctype/ldap_settings/ldap_settings.py
+++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.py
@@ -63,6 +63,7 @@ class LDAPSettings(Document):
require_trusted_certificate: DF.Literal["No", "Yes"]
ssl_tls_mode: DF.Literal["Off", "StartTLS"]
# end: auto-generated types
+
def validate(self):
self.default_user_type = self.default_user_type or "Website User"
@@ -77,7 +78,6 @@ class LDAPSettings(Document):
and self.ldap_search_string
and "{0}" in self.ldap_search_string
):
-
conn = self.connect_to_ldap(
base_dn=self.base_dn, password=self.get_password(raise_exception=False)
)
@@ -91,7 +91,9 @@ class LDAPSettings(Document):
)
conn.search(
- search_base=self.ldap_search_path_group, search_filter="(objectClass=*)", attributes=["cn"]
+ search_base=self.ldap_search_path_group,
+ search_filter="(objectClass=*)",
+ attributes=["cn"],
)
except LDAPAttributeError as ex:
@@ -190,9 +192,7 @@ class LDAPSettings(Document):
lower_groups = [g.lower() for g in additional_groups or []]
all_mapped_roles = {r.erpnext_role for r in self.ldap_groups}
- matched_roles = {
- r.erpnext_role for r in self.ldap_groups if r.ldap_group.lower() in lower_groups
- }
+ matched_roles = {r.erpnext_role for r in self.ldap_groups if r.ldap_group.lower() in lower_groups}
unmatched_roles = all_mapped_roles.difference(matched_roles)
needed_roles.update(matched_roles)
roles_to_remove = current_roles.intersection(unmatched_roles)
@@ -337,9 +337,7 @@ class LDAPSettings(Document):
def reset_password(self, user, password, logout_sessions=False):
search_filter = f"({self.ldap_email_field}={user})"
- conn = self.connect_to_ldap(
- self.base_dn, self.get_password(raise_exception=False), read_only=False
- )
+ conn = self.connect_to_ldap(self.base_dn, self.get_password(raise_exception=False), read_only=False)
if conn.search(
search_base=self.ldap_search_path_user,
diff --git a/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py b/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py
index 8f9ebf712c..1fcda3e077 100644
--- a/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py
+++ b/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py
@@ -31,7 +31,6 @@ class LDAP_TestCase:
def mock_ldap_connection(f):
@functools.wraps(f)
def wrapped(self, *args, **kwargs):
-
with mock.patch(
"frappe.integrations.doctype.ldap_settings.ldap_settings.LDAPSettings.connect_to_ldap",
return_value=self.connection,
@@ -279,7 +278,8 @@ class LDAP_TestCase:
)
self.assertTrue(
- kwargs["raise_exceptions"], "ldap3.Connection must raise exceptions for error handling"
+ kwargs["raise_exceptions"],
+ "ldap3.Connection must raise exceptions for error handling",
)
self.assertTrue(
@@ -479,7 +479,9 @@ class LDAP_TestCase:
# Existing user
self.test_class.create_or_update_user(self.user1doc, test_user_data[test_user])
- self.assertTrue(sync_roles_method.called, "User roles need to be updated for an existing user")
+ self.assertTrue(
+ sync_roles_method.called, "User roles need to be updated for an existing user"
+ )
self.assertTrue(
update_user_fields_method.called, "User fields need to be updated for an existing user"
)
@@ -555,9 +557,7 @@ class LDAP_TestCase:
if (
"ACCESS:test3" in search_filter
): # posix.user does not have str in ldap.description auth should fail
-
with self.assertRaises(frappe.exceptions.ValidationError) as display_massage:
-
self.test_class.authenticate("posix.user", "posix_user_password")
self.assertTrue(str(display_massage.exception).lower() == "invalid username or password")
diff --git a/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.py b/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.py
index cfc9009b0a..50e15b56ca 100644
--- a/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.py
+++ b/frappe/integrations/doctype/oauth_authorization_code/oauth_authorization_code.py
@@ -25,4 +25,5 @@ class OAuthAuthorizationCode(Document):
user: DF.Link | None
validity: DF.Literal["Valid", "Invalid"]
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.py b/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.py
index f393d2bd77..6b6259da77 100644
--- a/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.py
+++ b/frappe/integrations/doctype/oauth_bearer_token/oauth_bearer_token.py
@@ -23,6 +23,7 @@ class OAuthBearerToken(Document):
status: DF.Literal["Active", "Revoked"]
user: DF.Link | None
# end: auto-generated types
+
def validate(self):
if not self.expiration_time:
self.expiration_time = frappe.utils.datetime.datetime.strptime(
diff --git a/frappe/integrations/doctype/oauth_client/oauth_client.py b/frappe/integrations/doctype/oauth_client/oauth_client.py
index d026822981..604dd02d89 100644
--- a/frappe/integrations/doctype/oauth_client/oauth_client.py
+++ b/frappe/integrations/doctype/oauth_client/oauth_client.py
@@ -26,6 +26,7 @@ class OAuthClient(Document):
skip_authorization: DF.Check
user: DF.Link | None
# end: auto-generated types
+
def validate(self):
self.client_id = self.name
if not self.client_secret:
diff --git a/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.py b/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.py
index b66f7e9479..74fa9fdd80 100644
--- a/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.py
+++ b/frappe/integrations/doctype/oauth_provider_settings/oauth_provider_settings.py
@@ -17,15 +17,12 @@ class OAuthProviderSettings(Document):
skip_authorization: DF.Literal["Force", "Auto"]
# end: auto-generated types
+
pass
def get_oauth_settings():
"""Return OAuth settings."""
return frappe._dict(
- {
- "skip_authorization": frappe.db.get_single_value(
- "OAuth Provider Settings", "skip_authorization"
- )
- }
+ {"skip_authorization": frappe.db.get_single_value("OAuth Provider Settings", "skip_authorization")}
)
diff --git a/frappe/integrations/doctype/oauth_scope/oauth_scope.py b/frappe/integrations/doctype/oauth_scope/oauth_scope.py
index 8ab50d01fe..2506fd03eb 100644
--- a/frappe/integrations/doctype/oauth_scope/oauth_scope.py
+++ b/frappe/integrations/doctype/oauth_scope/oauth_scope.py
@@ -19,4 +19,5 @@ class OAuthScope(Document):
parenttype: DF.Data
scope: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/query_parameters/query_parameters.py b/frappe/integrations/doctype/query_parameters/query_parameters.py
index e69329176e..bb07f785e2 100644
--- a/frappe/integrations/doctype/query_parameters/query_parameters.py
+++ b/frappe/integrations/doctype/query_parameters/query_parameters.py
@@ -20,4 +20,5 @@ class QueryParameters(Document):
parenttype: DF.Data
value: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
index 1b583a2bd6..d37c94ef67 100755
--- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
+++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
@@ -39,6 +39,7 @@ class S3BackupSettings(Document):
secret_access_key: DF.Password
send_email_for_successful_backup: DF.Check
# end: auto-generated types
+
def validate(self):
if not self.enabled:
return
@@ -112,7 +113,7 @@ def take_backups_s3(retry_count=0):
"frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_s3",
queue="long",
timeout=1500,
- **args
+ **args,
)
else:
notify()
diff --git a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py
index ff5f8e9761..e802199532 100644
--- a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py
+++ b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py
@@ -32,6 +32,7 @@ class SlackWebhookURL(Document):
webhook_name: DF.Data
webhook_url: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/social_login_key/social_login_key.py b/frappe/integrations/doctype/social_login_key/social_login_key.py
index 54f2c3ae1b..8dbea0ae55 100644
--- a/frappe/integrations/doctype/social_login_key/social_login_key.py
+++ b/frappe/integrations/doctype/social_login_key/social_login_key.py
@@ -60,6 +60,7 @@ class SocialLoginKey(Document):
]
user_id_property: DF.Data | None
# end: auto-generated types
+
def autoname(self):
self.name = frappe.scrub(self.provider_name)
@@ -74,9 +75,7 @@ class SocialLoginKey(Document):
if not self.redirect_url:
frappe.throw(_("Please enter Redirect URL"), exc=RedirectUrlNotSetError)
if self.enable_social_login and not self.client_id:
- frappe.throw(
- _("Please enter Client ID before social login is enabled"), exc=ClientIDNotSetError
- )
+ frappe.throw(_("Please enter Client ID before social login is enabled"), exc=ClientIDNotSetError)
if self.enable_social_login and not self.client_secret:
frappe.throw(
_("Please enter Client Secret before social login is enabled"), exc=ClientSecretNotSetError
diff --git a/frappe/integrations/doctype/token_cache/token_cache.py b/frappe/integrations/doctype/token_cache/token_cache.py
index 5619030499..b07f525c3d 100644
--- a/frappe/integrations/doctype/token_cache/token_cache.py
+++ b/frappe/integrations/doctype/token_cache/token_cache.py
@@ -32,6 +32,7 @@ class TokenCache(Document):
token_type: DF.Data | None
user: DF.Link | None
# end: auto-generated types
+
def get_auth_header(self):
if self.access_token:
return {"Authorization": "Bearer " + self.get_password("access_token")}
diff --git a/frappe/integrations/doctype/webhook/__init__.py b/frappe/integrations/doctype/webhook/__init__.py
index 1cd08aeca1..9cbab711ab 100644
--- a/frappe/integrations/doctype/webhook/__init__.py
+++ b/frappe/integrations/doctype/webhook/__init__.py
@@ -25,12 +25,7 @@ def run_webhooks(doc, method):
frappe_flags = frappe.local.flags
- if (
- frappe_flags.in_import
- or frappe_flags.in_patch
- or frappe_flags.in_install
- or frappe_flags.in_migrate
- ):
+ if frappe_flags.in_import or frappe_flags.in_patch or frappe_flags.in_install or frappe_flags.in_migrate:
return
# load all webhooks from cache / DB
diff --git a/frappe/integrations/doctype/webhook/test_webhook.py b/frappe/integrations/doctype/webhook/test_webhook.py
index c0148f5f67..eae78f3564 100644
--- a/frappe/integrations/doctype/webhook/test_webhook.py
+++ b/frappe/integrations/doctype/webhook/test_webhook.py
@@ -204,7 +204,6 @@ class TestWebhook(FrappeTestCase):
self.assertTrue(frappe.get_all("Webhook Request Log", pluck="name"))
def test_webhook_with_array_body(self):
-
"""Check if array request body are supported."""
wh_config = {
"doctype": "Webhook",
diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py
index 64d38a2ae7..7aad3da182 100644
--- a/frappe/integrations/doctype/webhook/webhook.py
+++ b/frappe/integrations/doctype/webhook/webhook.py
@@ -39,7 +39,7 @@ class Webhook(Document):
preview_request_body: DF.Code | None
request_method: DF.Literal["POST", "PUT", "DELETE"]
request_structure: DF.Literal["", "Form URL-Encoded", "JSON"]
- request_url: DF.Data
+ request_url: DF.SmallText
timeout: DF.Int
webhook_data: DF.Table[WebhookData]
webhook_docevent: DF.Literal[
@@ -56,6 +56,7 @@ class Webhook(Document):
webhook_json: DF.Code | None
webhook_secret: DF.Password | None
# end: auto-generated types
+
def validate(self):
self.validate_docevent()
self.validate_condition()
diff --git a/frappe/integrations/doctype/webhook_data/webhook_data.py b/frappe/integrations/doctype/webhook_data/webhook_data.py
index 7461115dc5..72392aefb6 100644
--- a/frappe/integrations/doctype/webhook_data/webhook_data.py
+++ b/frappe/integrations/doctype/webhook_data/webhook_data.py
@@ -20,4 +20,5 @@ class WebhookData(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/webhook_header/webhook_header.py b/frappe/integrations/doctype/webhook_header/webhook_header.py
index a313ebf495..fde5631f6d 100644
--- a/frappe/integrations/doctype/webhook_header/webhook_header.py
+++ b/frappe/integrations/doctype/webhook_header/webhook_header.py
@@ -14,10 +14,11 @@ class WebhookHeader(Document):
if TYPE_CHECKING:
from frappe.types import DF
- key: DF.Data | None
+ key: DF.SmallText | None
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data
- value: DF.Data | None
+ value: DF.SmallText | None
# end: auto-generated types
+
pass
diff --git a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py
index 0b0b9aa060..98d963df93 100644
--- a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py
+++ b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py
@@ -23,6 +23,7 @@ class WebhookRequestLog(Document):
user: DF.Link | None
webhook: DF.Link | None
# end: auto-generated types
+
@staticmethod
def clear_old_logs(days=30):
from frappe.query_builder import Interval
diff --git a/frappe/integrations/google_oauth.py b/frappe/integrations/google_oauth.py
index 7f24c611bf..19d6035f3a 100644
--- a/frappe/integrations/google_oauth.py
+++ b/frappe/integrations/google_oauth.py
@@ -145,9 +145,7 @@ def handle_response(
raise_err: bool = False,
):
if "error" in response:
- frappe.log_error(
- frappe._(error_title), frappe._(response.get("error_description", error_message))
- )
+ frappe.log_error(frappe._(error_title), frappe._(response.get("error_description", error_message)))
if raise_err:
frappe.throw(frappe._(error_title), GoogleAuthenticationError, frappe._(error_message))
@@ -158,9 +156,7 @@ def handle_response(
def is_valid_access_token(access_token: str) -> bool:
- response = get(
- "https://oauth2.googleapis.com/tokeninfo", params={"access_token": access_token}
- ).json()
+ response = get("https://oauth2.googleapis.com/tokeninfo", params={"access_token": access_token}).json()
if "error" in response:
return False
@@ -196,6 +192,4 @@ def callback(state: str, code: str = None, error: str = None) -> None:
)
frappe.local.response["type"] = "redirect"
- frappe.local.response[
- "location"
- ] = f"{redirect}?{failure_query_param if error else success_query_param}"
+ frappe.local.response["location"] = f"{redirect}?{failure_query_param if error else success_query_param}"
diff --git a/frappe/integrations/oauth2.py b/frappe/integrations/oauth2.py
index 724d3b32a7..41f2e67b04 100644
--- a/frappe/integrations/oauth2.py
+++ b/frappe/integrations/oauth2.py
@@ -49,9 +49,10 @@ def approve(*args, **kwargs):
r = frappe.request
try:
- (scopes, frappe.flags.oauth_credentials,) = get_oauth_server().validate_authorization_request(
- r.url, r.method, r.get_data(), r.headers
- )
+ (
+ scopes,
+ frappe.flags.oauth_credentials,
+ ) = get_oauth_server().validate_authorization_request(r.url, r.method, r.get_data(), r.headers)
headers, body, status = get_oauth_server().create_authorization_response(
uri=frappe.flags.oauth_credentials["redirect_uri"],
@@ -72,23 +73,20 @@ def approve(*args, **kwargs):
@frappe.whitelist(allow_guest=True)
def authorize(**kwargs):
- success_url = "/api/method/frappe.integrations.oauth2.approve?" + encode_params(
- sanitize_kwargs(kwargs)
- )
+ success_url = "/api/method/frappe.integrations.oauth2.approve?" + encode_params(sanitize_kwargs(kwargs))
failure_url = frappe.form_dict["redirect_uri"] + "?error=access_denied"
if frappe.session.user == "Guest":
# Force login, redirect to preauth again.
frappe.local.response["type"] = "redirect"
- frappe.local.response["location"] = "/login?" + encode_params(
- {"redirect-to": frappe.request.url}
- )
+ frappe.local.response["location"] = "/login?" + encode_params({"redirect-to": frappe.request.url})
else:
try:
r = frappe.request
- (scopes, frappe.flags.oauth_credentials,) = get_oauth_server().validate_authorization_request(
- r.url, r.method, r.get_data(), r.headers
- )
+ (
+ scopes,
+ frappe.flags.oauth_credentials,
+ ) = get_oauth_server().validate_authorization_request(r.url, r.method, r.get_data(), r.headers)
skip_auth = frappe.db.get_value(
"OAuth Client",
diff --git a/frappe/integrations/offsite_backup_utils.py b/frappe/integrations/offsite_backup_utils.py
index a71fe0e28d..da9f35b146 100644
--- a/frappe/integrations/offsite_backup_utils.py
+++ b/frappe/integrations/offsite_backup_utils.py
@@ -33,9 +33,7 @@ def send_email(success, service_name, doctype, email_field, error_status=None):
Backup Upload Failed!
Oops, your automated backup to {} failed.
Error message: {}
-Please contact your system manager for more information.
""".format(
- service_name, error_status
- )
+Please contact your system manager for more information.
""".format(service_name, error_status)
frappe.sendmail(recipients=recipients, subject=subject, message=message)
diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py
index 14ae944192..ca6065c577 100644
--- a/frappe/integrations/utils.py
+++ b/frappe/integrations/utils.py
@@ -10,9 +10,7 @@ from frappe import _
from frappe.utils import get_request_session
-def make_request(
- method: str, url: str, auth=None, headers=None, data=None, json=None, params=None
-):
+def make_request(method: str, url: str, auth=None, headers=None, data=None, json=None, params=None):
auth = auth or ""
data = data or {}
headers = headers or {}
diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py
index f83a971082..2c7933b1d7 100644
--- a/frappe/model/base_document.py
+++ b/frappe/model/base_document.py
@@ -774,9 +774,7 @@ class BaseDocument:
invalid_links = []
cancelled_links = []
- for df in self.meta.get_link_fields() + self.meta.get(
- "fields", {"fieldtype": ("=", "Dynamic Link")}
- ):
+ for df in self.meta.get_link_fields() + self.meta.get("fields", {"fieldtype": ("=", "Dynamic Link")}):
docname = self.get(df.fieldname)
if docname:
@@ -806,13 +804,18 @@ class BaseDocument:
# cache a single value type
values = _dict(name=frappe.db.get_value(doctype, docname, "name", cache=True))
else:
- values_to_fetch = ["name"] + [_df.fetch_from.split(".")[-1] for _df in fields_to_fetch]
+ values_to_fetch = ["name"] + [
+ _df.fetch_from.split(".")[-1] for _df in fields_to_fetch
+ ]
# fallback to dict with field_to_fetch=None if link field value is not found
# (for compatibility, `values` must have same data type)
empty_values = _dict({value: None for value in values_to_fetch})
# don't cache if fetching other values too
- values = frappe.db.get_value(doctype, docname, values_to_fetch, as_dict=True) or empty_values
+ values = (
+ frappe.db.get_value(doctype, docname, values_to_fetch, as_dict=True)
+ or empty_values
+ )
if getattr(frappe.get_meta(doctype), "issingle", 0):
values.name = doctype
@@ -838,7 +841,6 @@ class BaseDocument:
and frappe.get_meta(doctype).is_submittable
and cint(frappe.db.get_value(doctype, docname, "docstatus")) == DocStatus.cancelled()
):
-
cancelled_links.append((df.fieldname, docname, get_msg(df, docname)))
return invalid_links, cancelled_links
@@ -855,7 +857,9 @@ class BaseDocument:
if not fetch_from_df:
frappe.throw(
- _('Please check the value of "Fetch From" set for field {0}').format(frappe.bold(df.label)),
+ _('Please check the value of "Fetch From" set for field {0}').format(
+ frappe.bold(df.label)
+ ),
title=_("Wrong Fetch From value"),
)
@@ -1123,9 +1127,7 @@ class BaseDocument:
if self.get(fieldname) and not self.is_dummy_password(self.get(fieldname)):
return self.get(fieldname)
- return get_decrypted_password(
- self.doctype, self.name, fieldname, raise_exception=raise_exception
- )
+ return get_decrypted_password(self.doctype, self.name, fieldname, raise_exception=raise_exception)
def is_dummy_password(self, pwd):
return "".join(set(pwd)) == "*"
diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py
index d836fa481d..b1ab33ff29 100644
--- a/frappe/model/create_new.py
+++ b/frappe/model/create_new.py
@@ -32,9 +32,7 @@ def get_new_doc(doctype, parent_doc=None, parentfield=None, as_dict=False):
def make_new_doc(doctype):
- doc = frappe.get_doc(
- {"doctype": doctype, "__islocal": 1, "owner": frappe.session.user, "docstatus": 0}
- )
+ doc = frappe.get_doc({"doctype": doctype, "__islocal": 1, "owner": frappe.session.user, "docstatus": 0})
set_user_and_static_default_values(doc)
@@ -72,7 +70,9 @@ def set_user_and_static_default_values(doc):
else:
if df.fieldname != doc.meta.title_field:
- static_default_value = get_static_default_value(df, doctype_user_permissions, allowed_records)
+ static_default_value = get_static_default_value(
+ df, doctype_user_permissions, allowed_records
+ )
if static_default_value is not None:
doc.set(df.fieldname, static_default_value)
@@ -118,9 +118,7 @@ def get_static_default_value(df, doctype_user_permissions, allowed_records):
return df.options.split("\n", 1)[0]
-def validate_value_via_user_permissions(
- df, doctype_user_permissions, allowed_records, user_default=None
-):
+def validate_value_via_user_permissions(df, doctype_user_permissions, allowed_records, user_default=None):
is_valid = True
# If User Permission exists and allowed records is empty,
# that means there are User Perms, but none applicable to this new doctype.
@@ -173,9 +171,7 @@ def get_default_based_on_another_field(df, user_permissions, parent_doc):
ref_doctype = df.default[1:]
ref_fieldname = ref_doctype.lower().replace(" ", "_")
- reference_name = (
- parent_doc.get(ref_fieldname) if parent_doc else frappe.db.get_default(ref_fieldname)
- )
+ reference_name = parent_doc.get(ref_fieldname) if parent_doc else frappe.db.get_default(ref_fieldname)
default_value = frappe.db.get_value(ref_doctype, reference_name, df.fieldname)
is_allowed_default_value = not user_permissions_exist(df, user_permissions.get(df.options)) or (
default_value in get_allowed_docs_for_doctype(user_permissions[df.options], df.parent)
diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py
index 11054a9a7a..23a46425c5 100644
--- a/frappe/model/db_query.py
+++ b/frappe/model/db_query.py
@@ -32,21 +32,13 @@ from frappe.utils import (
from frappe.utils.data import DateTimeLikeObject, get_datetime, getdate, sbool
LOCATE_PATTERN = re.compile(r"locate\([^,]+,\s*[`\"]?name[`\"]?\s*\)", flags=re.IGNORECASE)
-LOCATE_CAST_PATTERN = re.compile(
- r"locate\(([^,]+),\s*([`\"]?name[`\"]?)\s*\)", flags=re.IGNORECASE
-)
-FUNC_IFNULL_PATTERN = re.compile(
- r"(strpos|ifnull|coalesce)\(\s*[`\"]?name[`\"]?\s*,", flags=re.IGNORECASE
-)
-CAST_VARCHAR_PATTERN = re.compile(
- r"([`\"]?tab[\w`\" -]+\.[`\"]?name[`\"]?)(?!\w)", flags=re.IGNORECASE
-)
+LOCATE_CAST_PATTERN = re.compile(r"locate\(([^,]+),\s*([`\"]?name[`\"]?)\s*\)", flags=re.IGNORECASE)
+FUNC_IFNULL_PATTERN = re.compile(r"(strpos|ifnull|coalesce)\(\s*[`\"]?name[`\"]?\s*,", flags=re.IGNORECASE)
+CAST_VARCHAR_PATTERN = re.compile(r"([`\"]?tab[\w`\" -]+\.[`\"]?name[`\"]?)(?!\w)", flags=re.IGNORECASE)
ORDER_BY_PATTERN = re.compile(r"\ order\ by\ |\ asc|\ ASC|\ desc|\ DESC", flags=re.IGNORECASE)
SUB_QUERY_PATTERN = re.compile("^.*[,();@].*")
IS_QUERY_PATTERN = re.compile(r"^(select|delete|update|drop|create)\s")
-IS_QUERY_PREDICATE_PATTERN = re.compile(
- r"\s*[0-9a-zA-z]*\s*( from | group by | order by | where | join )"
-)
+IS_QUERY_PREDICATE_PATTERN = re.compile(r"\s*[0-9a-zA-z]*\s*( from | group by | order by | where | join )")
FIELD_QUOTE_PATTERN = re.compile(r"[0-9a-zA-Z]+\s*'")
FIELD_COMMA_PATTERN = re.compile(r"[0-9a-zA-Z]+\s*,")
STRICT_FIELD_PATTERN = re.compile(r".*/\*.*")
@@ -118,15 +110,12 @@ class DatabaseQuery:
*,
parent_doctype=None,
) -> list:
-
if not ignore_permissions:
self.check_read_permission(self.doctype, parent_doctype=parent_doctype)
# filters and fields swappable
# its hard to remember what comes first
- if isinstance(fields, dict) or (
- fields and isinstance(fields, list) and isinstance(fields[0], list)
- ):
+ if isinstance(fields, dict) or (fields and isinstance(fields, list) and isinstance(fields[0], list)):
# if fields is given as dict/list of list, its probably filters
filters, fields = fields, filters
@@ -488,7 +477,8 @@ class DatabaseQuery:
if table_name[0] != "`":
table_name = f"`{table_name}`"
if (
- table_name not in self.query_tables and table_name not in self.linked_table_aliases.values()
+ table_name not in self.query_tables
+ and table_name not in self.linked_table_aliases.values()
):
self.append_table(table_name)
@@ -701,7 +691,11 @@ class DatabaseQuery:
params = (x.strip() for x in _params[0].split(","))
for param in params:
if not (
- not param or param in permitted_fields or param.isnumeric() or "'" in param or '"' in param
+ not param
+ or param in permitted_fields
+ or param.isnumeric()
+ or "'" in param
+ or '"' in param
):
self.remove_field(i)
break
@@ -839,7 +833,6 @@ class DatabaseQuery:
f.fieldname in ("creation", "modified")
or (df and (df.fieldtype == "Date" or df.fieldtype == "Datetime"))
):
-
escape = False
value = get_between_date_filter(f.value, df)
fallback = f"'{FallBackDateTimeStr}'"
@@ -885,9 +878,7 @@ class DatabaseQuery:
# because "like" uses backslash (\) for escaping
value = value.replace("\\", "\\\\").replace("%", "%%")
- elif (
- f.operator == "=" and df and df.fieldtype in ["Link", "Data"]
- ): # TODO: Refactor if possible
+ elif f.operator == "=" and df and df.fieldtype in ["Link", "Data"]: # TODO: Refactor if possible
value = f.value or "''"
fallback = "''"
@@ -1108,7 +1099,9 @@ class DatabaseQuery:
sort_field = self.doctype_meta.sort_field or "modified"
sort_order = (self.doctype_meta.sort_field and self.doctype_meta.sort_order) or "desc"
if self.order_by:
- args.order_by = f"`tab{self.doctype}`.`{sort_field or 'modified'}` {sort_order or 'desc'}"
+ args.order_by = (
+ f"`tab{self.doctype}`.`{sort_field or 'modified'}` {sort_order or 'desc'}"
+ )
# draft docs always on top
if hasattr(self.doctype_meta, "is_submittable") and self.doctype_meta.is_submittable:
diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py
index 6a92971c72..5967e9c5c9 100644
--- a/frappe/model/delete_doc.py
+++ b/frappe/model/delete_doc.py
@@ -65,7 +65,6 @@ def delete_doc(
doc = None
if doctype == "DocType":
if for_reload:
-
try:
doc = frappe.get_doc(doctype, name)
except frappe.DoesNotExistError:
@@ -92,7 +91,10 @@ def delete_doc(
frappe.conf.developer_mode
and not doc.custom
and not (
- for_reload or frappe.flags.in_migrate or frappe.flags.in_install or frappe.flags.in_uninstall
+ for_reload
+ or frappe.flags.in_migrate
+ or frappe.flags.in_install
+ or frappe.flags.in_uninstall
)
):
try:
@@ -300,7 +302,6 @@ def check_if_doc_is_linked(doc, method="Delete"):
def check_if_doc_is_dynamically_linked(doc, method="Delete"):
"""Raise `frappe.LinkExistsError` if the document is dynamically linked"""
for df in get_dynamic_link_map().get(doc.doctype, []):
-
ignore_linked_doctypes = doc.get("ignore_linked_doctypes") or []
if df.parent in frappe.get_hooks("ignore_links_on_delete") or (
@@ -329,9 +330,7 @@ def check_if_doc_is_dynamically_linked(doc, method="Delete"):
df["table"] = ", `parent`, `parenttype`, `idx`" if meta.istable else ""
for refdoc in frappe.db.sql(
"""select `name`, `docstatus` {table} from `tab{parent}` where
- {options}=%s and {fieldname}=%s""".format(
- **df
- ),
+ {options}=%s and {fieldname}=%s""".format(**df),
(doc.doctype, doc.name),
as_dict=True,
):
@@ -356,9 +355,7 @@ def check_if_doc_is_dynamically_linked(doc, method="Delete"):
def raise_link_exists_exception(doc, reference_doctype, reference_docname, row=""):
doc_link = '{1}'.format(doc.doctype, doc.name)
- reference_link = '{1}'.format(
- reference_doctype, reference_docname
- )
+ reference_link = '{1}'.format(reference_doctype, reference_docname)
# hack to display Single doctype only once in message
if reference_doctype == reference_docname:
@@ -415,9 +412,7 @@ def clear_references(
set
{1}=NULL, {2}=NULL
where
- {1}=%s and {2}=%s""".format(
- doctype, reference_doctype_field, reference_name_field
- ), # nosec
+ {1}=%s and {2}=%s""".format(doctype, reference_doctype_field, reference_name_field), # nosec
(reference_doctype, reference_name),
)
diff --git a/frappe/model/document.py b/frappe/model/document.py
index 72d593de8b..df900457ef 100644
--- a/frappe/model/document.py
+++ b/frappe/model/document.py
@@ -318,9 +318,7 @@ class Document(BaseDocument):
if hasattr(self, "__unsaved"):
delattr(self, "__unsaved")
- if not (
- frappe.flags.in_migrate or frappe.local.flags.in_install or frappe.flags.in_setup_wizard
- ):
+ if not (frappe.flags.in_migrate or frappe.local.flags.in_install or frappe.flags.in_setup_wizard):
if frappe.get_cached_value("User", frappe.session.user, "follow_created_documents"):
follow_document(self.doctype, self.name, frappe.session.user)
return self
@@ -398,7 +396,6 @@ class Document(BaseDocument):
# loop through attachments
for attach_item in get_attachments(self.doctype, self.amended_from):
-
# save attachments to new doc
_file = frappe.get_doc(
{
@@ -601,7 +598,6 @@ class Document(BaseDocument):
for df in self.meta.get(
"fields", {"non_negative": ("=", 1), "fieldtype": ("in", ["Int", "Float", "Currency"])}
):
-
if flt(self.get(df.fieldname)) < 0:
msg = get_msg(df)
frappe.throw(msg, frappe.NonNegativeError, title=_("Negative Value"))
@@ -737,9 +733,7 @@ class Document(BaseDocument):
roles = frappe.get_roles()
for perm in self.get_permissions():
- if (
- perm.role in roles and perm.get(permission_type) and perm.permlevel not in allowed_permlevels
- ):
+ if perm.role in roles and perm.get(permission_type) and perm.permlevel not in allowed_permlevels:
allowed_permlevels.append(perm.permlevel)
return allowed_permlevels
@@ -1019,9 +1013,7 @@ class Document(BaseDocument):
self.docstatus = DocStatus.cancelled()
return self.save()
- def _rename(
- self, name: str, merge: bool = False, force: bool = False, validate_rename: bool = True
- ):
+ def _rename(self, name: str, merge: bool = False, force: bool = False, validate_rename: bool = True):
"""Rename the document. Triggers frappe.rename_doc, then reloads."""
from frappe.model.rename_doc import rename_doc
@@ -1162,11 +1154,7 @@ class Document(BaseDocument):
after_commit=True,
)
- if (
- not self.meta.get("read_only")
- and not self.meta.get("issingle")
- and not self.meta.get("istable")
- ):
+ if not self.meta.get("read_only") and not self.meta.get("issingle") and not self.meta.get("istable"):
data = {"doctype": self.doctype, "name": self.name, "user": frappe.session.user}
frappe.publish_realtime("list_update", data, after_commit=True)
@@ -1410,7 +1398,9 @@ class Document(BaseDocument):
if user not in _seen:
_seen.append(user)
- frappe.db.set_value(self.doctype, self.name, "_seen", json.dumps(_seen), update_modified=False)
+ frappe.db.set_value(
+ self.doctype, self.name, "_seen", json.dumps(_seen), update_modified=False
+ )
frappe.local.flags.commit = True
def add_viewed(self, user=None, force=False, unique_views=False):
diff --git a/frappe/model/dynamic_links.py b/frappe/model/dynamic_links.py
index 61ed86de46..96545f9f75 100644
--- a/frappe/model/dynamic_links.py
+++ b/frappe/model/dynamic_links.py
@@ -42,7 +42,9 @@ def get_dynamic_link_map(for_delete=False):
dynamic_link_map.setdefault(meta.name, []).append(df)
else:
try:
- links = frappe.db.sql_list("""select distinct {options} from `tab{parent}`""".format(**df))
+ links = frappe.db.sql_list(
+ """select distinct {options} from `tab{parent}`""".format(**df)
+ )
for doctype in links:
dynamic_link_map.setdefault(doctype, []).append(df)
except frappe.db.TableMissingError: # noqa: E722
diff --git a/frappe/model/mapper.py b/frappe/model/mapper.py
index d467c92958..6d0cba2044 100644
--- a/frappe/model/mapper.py
+++ b/frappe/model/mapper.py
@@ -63,7 +63,6 @@ def get_mapped_doc(
ignore_child_tables=False,
cached=False,
):
-
apply_strict_user_permissions = frappe.get_system_settings("apply_strict_user_permissions")
# main
@@ -168,9 +167,7 @@ def get_mapped_doc(
ret_doc.run_method("after_mapping", source_doc)
ret_doc.set_onload("load_after_mapping", True)
- if (
- apply_strict_user_permissions and not ignore_permissions and not ret_doc.has_permission("create")
- ):
+ if apply_strict_user_permissions and not ignore_permissions and not ret_doc.has_permission("create"):
ret_doc.raise_no_permission_to("create")
return ret_doc
@@ -272,9 +269,7 @@ def map_fetch_fields(target_doc, df, no_copy_fields):
def map_child_doc(source_d, target_parent, table_map, source_parent=None):
target_child_doctype = table_map["doctype"]
target_parentfield = target_parent.get_parentfield_of_doctype(target_child_doctype)
- target_d = frappe.new_doc(
- target_child_doctype, parent_doc=target_parent, parentfield=target_parentfield
- )
+ target_d = frappe.new_doc(target_child_doctype, parent_doc=target_parent, parentfield=target_parentfield)
map_doc(source_d, target_d, table_map, source_parent)
diff --git a/frappe/model/meta.py b/frappe/model/meta.py
index 1d5767850d..7a205cf507 100644
--- a/frappe/model/meta.py
+++ b/frappe/model/meta.py
@@ -183,9 +183,7 @@ class Meta(Document):
return self._dynamic_link_fields
def get_select_fields(self):
- return self.get(
- "fields", {"fieldtype": "Select", "options": ["not in", ["[Select]", "Loading..."]]}
- )
+ return self.get("fields", {"fieldtype": "Select", "options": ["not in", ["[Select]", "Loading..."]]})
def get_image_fields(self):
return self.get("fields", {"fieldtype": "Attach Image"})
@@ -536,7 +534,9 @@ class Meta(Document):
def get_fieldnames_with_value(self, with_field_meta=False, with_virtual_fields=False):
def is_value_field(docfield):
return not (
- not with_virtual_fields and docfield.get("is_virtual") or docfield.fieldtype in no_value_fields
+ not with_virtual_fields
+ and docfield.get("is_virtual")
+ or docfield.fieldtype in no_value_fields
)
if with_field_meta:
@@ -770,7 +770,6 @@ def get_field_currency(df, doc=None):
and frappe.local.field_currency.get((doc.doctype, doc.parent), {}).get(df.fieldname)
)
):
-
ref_docname = doc.get("parent") or doc.name
if ":" in cstr(df.get("options")):
@@ -793,8 +792,7 @@ def get_field_currency(df, doc=None):
)
return frappe.local.field_currency.get((doc.doctype, doc.name), {}).get(df.fieldname) or (
- doc.get("parent")
- and frappe.local.field_currency.get((doc.doctype, doc.parent), {}).get(df.fieldname)
+ doc.get("parent") and frappe.local.field_currency.get((doc.doctype, doc.parent), {}).get(df.fieldname)
)
@@ -847,9 +845,7 @@ def trim_tables(doctype=None, dry_run=False, quiet=False):
if quiet:
continue
click.secho(f"Ignoring missing table for DocType: {doctype}", fg="yellow", err=True)
- click.secho(
- f"Consider removing record in the DocType table for {doctype}", fg="yellow", err=True
- )
+ click.secho(f"Consider removing record in the DocType table for {doctype}", fg="yellow", err=True)
except Exception as e:
if quiet:
continue
diff --git a/frappe/model/naming.py b/frappe/model/naming.py
index e775e0573b..5a0e23159f 100644
--- a/frappe/model/naming.py
+++ b/frappe/model/naming.py
@@ -115,9 +115,7 @@ class NamingSeries:
if frappe.db.get_value("Series", prefix, "name", order_by="name") is None:
frappe.qb.into(Series).insert(prefix, 0).columns("name", "current").run()
- (
- frappe.qb.update(Series).set(Series.current, cint(new_count)).where(Series.name == prefix)
- ).run()
+ (frappe.qb.update(Series).set(Series.current, cint(new_count)).where(Series.name == prefix)).run()
def get_current_value(self) -> int:
prefix = self.get_prefix()
@@ -276,7 +274,6 @@ def parse_naming_series(
doc: Optional["Document"] = None,
number_generator: Callable[[str, int], str] | None = None,
) -> str:
-
"""Parse the naming series and get next name.
args:
@@ -411,9 +408,7 @@ def revert_series_if_last(key, name, doc=None):
count = cint(name.replace(prefix, ""))
series = DocType("Series")
- current = (
- frappe.qb.from_(series).where(series.name == prefix).for_update().select("current")
- ).run()
+ current = (frappe.qb.from_(series).where(series.name == prefix).for_update().select("current")).run()
if current and current[0][0] == count:
frappe.db.sql("UPDATE `tabSeries` SET `current` = `current` - 1 WHERE `name`=%s", prefix)
@@ -431,7 +426,6 @@ def get_default_naming_series(doctype: str) -> str | None:
def validate_name(doctype: str, name: int | str):
-
if not name:
frappe.throw(_("No Name Specified for {0}").format(doctype))
@@ -456,9 +450,7 @@ def validate_name(doctype: str, name: int | str):
special_characters = "<>"
if re.findall(f"[{special_characters}]+", name):
message = ", ".join(f"'{c}'" for c in special_characters)
- frappe.throw(
- _("Name cannot contain special characters like {0}").format(message), frappe.NameError
- )
+ frappe.throw(_("Name cannot contain special characters like {0}").format(message), frappe.NameError)
return name
diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py
index 7d5539becd..42864880a0 100644
--- a/frappe/model/rename_doc.py
+++ b/frappe/model/rename_doc.py
@@ -60,9 +60,7 @@ def update_document_title(
title_field = doc.meta.get_title_field()
- title_updated = (
- updated_title and (title_field != "name") and (updated_title != doc.get(title_field))
- )
+ title_updated = updated_title and (title_field != "name") and (updated_title != doc.get(title_field))
name_updated = updated_name and (updated_name != doc.name)
queue = kwargs.get("queue") or "default"
@@ -213,9 +211,7 @@ def rename_doc(
if merge:
new_doc.add_comment("Edit", _("merged {0} into {1}").format(frappe.bold(old), frappe.bold(new)))
else:
- new_doc.add_comment(
- "Edit", _("renamed from {0} to {1}").format(frappe.bold(old), frappe.bold(new))
- )
+ new_doc.add_comment("Edit", _("renamed from {0} to {1}").format(frappe.bold(old), frappe.bold(new)))
if merge:
frappe.delete_doc(doctype, old)
@@ -358,9 +354,7 @@ def validate_rename(
_SAVE_POINT = f"validate_rename_{frappe.generate_hash(length=8)}"
frappe.db.savepoint(_SAVE_POINT)
- exists = (
- frappe.qb.from_(doctype).where(Field("name") == new).for_update().select("name").run(pluck=True)
- )
+ exists = frappe.qb.from_(doctype).where(Field("name") == new).for_update().select("name").run(pluck=True)
exists = exists[0] if exists else None
if not frappe.db.exists(doctype, old):
@@ -379,9 +373,7 @@ def validate_rename(
if not merge and exists and not ignore_if_exists:
frappe.throw(_("Another {0} with name {1} exists, select another name").format(doctype, new))
- if not (
- ignore_permissions or frappe.permissions.has_permission(doctype, "write", print_logs=False)
- ):
+ if not (ignore_permissions or frappe.permissions.has_permission(doctype, "write", print_logs=False)):
frappe.throw(_("You need write permission to rename"))
if not force and not ignore_permissions and not meta.allow_rename:
@@ -481,9 +473,7 @@ def get_link_fields(doctype: str) -> list[dict]:
.run(as_dict=True)
)
- ps_issingle = (
- frappe.qb.from_(dt).select(dt.issingle).where(dt.name == ps.doc_type).as_("issingle")
- )
+ ps_issingle = frappe.qb.from_(dt).select(dt.issingle).where(dt.name == ps.doc_type).as_("issingle")
property_setter_fields = (
frappe.qb.from_(ps)
.select(ps.doc_type.as_("parent"), ps.field_name.as_("fieldname"), ps_issingle)
@@ -562,9 +552,7 @@ def get_select_fields(old: str, new: str) -> list[dict]:
)
# remove fields whose options have been changed using property setter
- ps_issingle = (
- frappe.qb.from_(dt).select(dt.issingle).where(dt.name == ps.doc_type).as_("issingle")
- )
+ ps_issingle = frappe.qb.from_(dt).select(dt.issingle).where(dt.name == ps.doc_type).as_("issingle")
property_setter_select_fields = (
frappe.qb.from_(ps)
.select(ps.doc_type.as_("parent"), ps.field_name.as_("fieldname"), ps_issingle)
@@ -593,17 +581,13 @@ def update_select_field_values(old: str, new: str):
& (DocField.options.like(f"%\n{old}%") | DocField.options.like(f"%{old}\n%"))
).run()
- frappe.qb.update(CustomField).set(
- CustomField.options, Replace(CustomField.options, old, new)
- ).where(
+ frappe.qb.update(CustomField).set(CustomField.options, Replace(CustomField.options, old, new)).where(
(CustomField.fieldtype == "Select")
& (CustomField.dt != new)
& (CustomField.options.like(f"%\n{old}%") | CustomField.options.like(f"%{old}\n%"))
).run()
- frappe.qb.update(PropertySetter).set(
- PropertySetter.value, Replace(PropertySetter.value, old, new)
- ).where(
+ frappe.qb.update(PropertySetter).set(PropertySetter.value, Replace(PropertySetter.value, old, new)).where(
(PropertySetter.property == "options")
& (PropertySetter.field_name.notnull())
& (PropertySetter.doc_type != new)
@@ -659,9 +643,7 @@ def rename_dynamic_links(doctype: str, old: str, new: str):
).run()
-def bulk_rename(
- doctype: str, rows: list[list] | None = None, via_console: bool = False
-) -> list[str] | None:
+def bulk_rename(doctype: str, rows: list[list] | None = None, via_console: bool = False) -> list[str] | None:
"""Bulk rename documents
:param doctype: DocType to be renamed
diff --git a/frappe/model/utils/rename_doc.py b/frappe/model/utils/rename_doc.py
index ae6649f057..828123283a 100644
--- a/frappe/model/utils/rename_doc.py
+++ b/frappe/model/utils/rename_doc.py
@@ -29,9 +29,7 @@ def update_linked_doctypes(
)
-def get_fetch_fields(
- doctype: str, linked_to: str, ignore_doctypes: list | None = None
-) -> list[dict]:
+def get_fetch_fields(doctype: str, linked_to: str, ignore_doctypes: list | None = None) -> list[dict]:
"""
doctype = Master DocType in which the changes are being made
linked_to = DocType name of the field thats being updated in Master
diff --git a/frappe/model/utils/user_settings.py b/frappe/model/utils/user_settings.py
index 02bc67b929..16922200bc 100644
--- a/frappe/model/utils/user_settings.py
+++ b/frappe/model/utils/user_settings.py
@@ -87,7 +87,10 @@ def update_user_settings_data(
if view_settings and view_settings.get("filters"):
view_filters = view_settings.get("filters")
for view_filter in view_filters:
- if condition_fieldname and view_filter[filter_dict[condition_fieldname]] != condition_values:
+ if (
+ condition_fieldname
+ and view_filter[filter_dict[condition_fieldname]] != condition_values
+ ):
continue
if view_filter[filter_dict[fieldname]] == old:
view_filter[filter_dict[fieldname]] = new
diff --git a/frappe/model/virtual_doctype.py b/frappe/model/virtual_doctype.py
index 6d8088ed80..6390e35cef 100644
--- a/frappe/model/virtual_doctype.py
+++ b/frappe/model/virtual_doctype.py
@@ -60,9 +60,7 @@ def validate_controller(doctype: str) -> None:
try:
controller = get_controller(doctype)
except ImportError:
- frappe.msgprint(
- _("Failed to import virtual doctype {}, is controller file present?").format(doctype)
- )
+ frappe.msgprint(_("Failed to import virtual doctype {}, is controller file present?").format(doctype))
return
def _as_str(method):
diff --git a/frappe/model/workflow.py b/frappe/model/workflow.py
index c089b8fa74..69d9a5065f 100644
--- a/frappe/model/workflow.py
+++ b/frappe/model/workflow.py
@@ -29,9 +29,7 @@ class WorkflowPermissionError(frappe.ValidationError):
def get_workflow_name(doctype):
workflow_name = frappe.cache.hget("workflow", doctype)
if workflow_name is None:
- workflow_name = frappe.db.get_value(
- "Workflow", {"document_type": doctype, "is_active": 1}, "name"
- )
+ workflow_name = frappe.db.get_value("Workflow", {"document_type": doctype, "is_active": 1}, "name")
frappe.cache.hset("workflow", doctype, workflow_name or "")
return workflow_name
@@ -94,9 +92,7 @@ def is_transition_condition_satisfied(transition, doc) -> bool:
if not transition.condition:
return True
else:
- return frappe.safe_eval(
- transition.condition, get_workflow_safe_globals(), dict(doc=doc.as_dict())
- )
+ return frappe.safe_eval(transition.condition, get_workflow_safe_globals(), dict(doc=doc.as_dict()))
@frappe.whitelist()
@@ -216,9 +212,7 @@ def get_workflow(doctype) -> "Workflow":
def has_approval_access(user, doc, transition):
- return (
- user == "Administrator" or transition.get("allow_self_approval") or user != doc.get("owner")
- )
+ return user == "Administrator" or transition.get("allow_self_approval") or user != doc.get("owner")
def get_workflow_state_field(workflow_name):
@@ -235,7 +229,6 @@ def get_workflow_field_value(workflow_name, field):
@frappe.whitelist()
def bulk_workflow_approval(docnames, doctype, action):
-
docnames = json.loads(docnames)
if len(docnames) < 20:
_bulk_workflow_action(docnames, doctype, action)
@@ -259,7 +252,7 @@ def _bulk_workflow_action(docnames, doctype, action):
successful_transactions = defaultdict(list)
frappe.clear_messages()
- for (idx, docname) in enumerate(docnames, 1):
+ for idx, docname in enumerate(docnames, 1):
message_dict = {}
try:
show_progress(docnames, _("Applying: {0}").format(action), idx, docname)
@@ -334,7 +327,7 @@ def get_common_transition_actions(docs, doctype):
if isinstance(docs, str):
docs = json.loads(docs)
try:
- for (i, doc) in enumerate(docs, 1):
+ for i, doc in enumerate(docs, 1):
if not doc.get("doctype"):
doc["doctype"] = doctype
actions = [
diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py
index b58bdf235f..56f3956f6f 100644
--- a/frappe/modules/import_file.py
+++ b/frappe/modules/import_file.py
@@ -59,9 +59,7 @@ def import_files(module, dt=None, dn=None, force=False, pre_process=None, reset_
def import_file(module, dt, dn, force=False, pre_process=None, reset_permissions=False):
"""Sync a file from txt if modifed, return false if not updated"""
path = get_file_path(module, dt, dn)
- return import_file_by_path(
- path, force, pre_process=pre_process, reset_permissions=reset_permissions
- )
+ return import_file_by_path(path, force, pre_process=pre_process, reset_permissions=reset_permissions)
def get_file_path(module, dt, dn):
diff --git a/frappe/modules/patch_handler.py b/frappe/modules/patch_handler.py
index c9bf443248..bc15b646ef 100644
--- a/frappe/modules/patch_handler.py
+++ b/frappe/modules/patch_handler.py
@@ -82,7 +82,6 @@ def run_all(skip_failing: bool = False, patch_type: PatchType | None = None) ->
def get_all_patches(patch_type: PatchType | None = None) -> list[str]:
-
if patch_type and not isinstance(patch_type, PatchType):
frappe.throw(f"Unsupported patch type specified: {patch_type}")
diff --git a/frappe/modules/utils.py b/frappe/modules/utils.py
index 5d4cd6deac..3fd3c83b05 100644
--- a/frappe/modules/utils.py
+++ b/frappe/modules/utils.py
@@ -32,9 +32,7 @@ def export_module_json(doc: "Document", is_standard: bool, module: str) -> str |
from frappe.modules.export_file import export_to_files
# json
- export_to_files(
- record_list=[[doc.doctype, doc.name]], record_module=module, create_init=is_standard
- )
+ export_to_files(record_list=[[doc.doctype, doc.name]], record_module=module, create_init=is_standard)
return os.path.join(
frappe.get_module_path(module), scrub(doc.doctype), scrub(doc.name), scrub(doc.name)
@@ -75,9 +73,7 @@ def export_customizations(
}
if with_permissions:
- custom["custom_perms"] = frappe.get_all(
- "Custom DocPerm", fields="*", filters={"parent": doctype}
- )
+ custom["custom_perms"] = frappe.get_all("Custom DocPerm", fields="*", filters={"parent": doctype})
# also update the custom fields and property setters for all child tables
for d in frappe.get_meta(doctype).get_table_fields():
@@ -246,9 +242,7 @@ def load_doctype_module(doctype, module=None, prefix="", suffix=""):
return doctype_python_modules[key]
-def get_module_name(
- doctype: str, module: str, prefix: str = "", suffix: str = "", app: str | None = None
-):
+def get_module_name(doctype: str, module: str, prefix: str = "", suffix: str = "", app: str | None = None):
app = scrub(app or get_module_app(module))
module = scrub(module)
doctype = scrub(doctype)
diff --git a/frappe/oauth.py b/frappe/oauth.py
index 119e0d1771..fcd59430d0 100644
--- a/frappe/oauth.py
+++ b/frappe/oauth.py
@@ -15,7 +15,6 @@ from frappe.utils.data import get_system_timezone, now_datetime
class OAuthWebRequestValidator(RequestValidator):
-
# Pre- and post-authorization.
def validate_client_id(self, client_id, request, *args, **kwargs):
# Simple validity check, does client exist? Not banned?
@@ -73,7 +72,6 @@ class OAuthWebRequestValidator(RequestValidator):
# Post-authorization
def save_authorization_code(self, client_id, code, request, *args, **kwargs):
-
cookie_dict = get_cookie_dict_from_headers(request)
oac = frappe.new_doc("OAuth Authorization Code")
@@ -292,9 +290,7 @@ class OAuthWebRequestValidator(RequestValidator):
- Refresh Token Grant
"""
- otoken = frappe.get_doc(
- "OAuth Bearer Token", {"refresh_token": refresh_token, "status": "Active"}
- )
+ otoken = frappe.get_doc("OAuth Bearer Token", {"refresh_token": refresh_token, "status": "Active"})
if not otoken:
return False
diff --git a/frappe/parallel_test_runner.py b/frappe/parallel_test_runner.py
index ebfa5d8c32..8f101be883 100644
--- a/frappe/parallel_test_runner.py
+++ b/frappe/parallel_test_runner.py
@@ -274,9 +274,7 @@ class ParallelTestWithOrchestrator(ParallelTestRunner):
def register_instance(self):
test_spec_list = get_all_tests(self.app)
- response_data = self.call_orchestrator(
- "register-instance", data={"test_spec_list": test_spec_list}
- )
+ response_data = self.call_orchestrator("register-instance", data={"test_spec_list": test_spec_list})
self.is_master = response_data.get("is_master")
def get_next_test(self):
diff --git a/frappe/patches/v10_0/refactor_social_login_keys.py b/frappe/patches/v10_0/refactor_social_login_keys.py
index 7beaa4e53b..0c4e940f57 100644
--- a/frappe/patches/v10_0/refactor_social_login_keys.py
+++ b/frappe/patches/v10_0/refactor_social_login_keys.py
@@ -30,9 +30,7 @@ def execute():
frappe_login_key.base_url = social_login_keys.get("frappe_server_url")
frappe_login_key.client_id = social_login_keys.get("frappe_client_id")
frappe_login_key.client_secret = social_login_keys.get("frappe_client_secret")
- if not (
- frappe_login_key.client_secret and frappe_login_key.client_id and frappe_login_key.base_url
- ):
+ if not (frappe_login_key.client_secret and frappe_login_key.client_id and frappe_login_key.base_url):
frappe_login_key.enable_social_login = 0
frappe_login_key.save()
@@ -63,9 +61,7 @@ def run_patch():
frappe.reload_doc("core", "doctype", "user", force=True)
frappe.reload_doc("core", "doctype", "user_social_login", force=True)
- users = frappe.get_all(
- "User", fields=["*"], filters={"name": ("not in", ["Administrator", "Guest"])}
- )
+ users = frappe.get_all("User", fields=["*"], filters={"name": ("not in", ["Administrator", "Guest"])})
for user in users:
idx = 0
@@ -122,9 +118,7 @@ def insert_user_social_login(user, modified_by, provider, idx, userid=None, user
query = """INSERT INTO `tabUser Social Login` (`{source_cols}`)
VALUES ({values})
- """.format(
- source_cols="`, `".join(source_cols), values=", ".join([frappe.db.escape(d) for d in values])
- )
+ """.format(source_cols="`, `".join(source_cols), values=", ".join([frappe.db.escape(d) for d in values]))
frappe.db.sql(query)
diff --git a/frappe/patches/v11_0/change_email_signature_fieldtype.py b/frappe/patches/v11_0/change_email_signature_fieldtype.py
index 8ca13437e6..b188c048a1 100644
--- a/frappe/patches/v11_0/change_email_signature_fieldtype.py
+++ b/frappe/patches/v11_0/change_email_signature_fieldtype.py
@@ -5,9 +5,7 @@ import frappe
def execute():
- signatures = frappe.db.get_list(
- "User", {"email_signature": ["!=", ""]}, ["name", "email_signature"]
- )
+ signatures = frappe.db.get_list("User", {"email_signature": ["!=", ""]}, ["name", "email_signature"])
frappe.reload_doc("core", "doctype", "user")
for d in signatures:
signature = d.get("email_signature")
diff --git a/frappe/patches/v11_0/delete_duplicate_user_permissions.py b/frappe/patches/v11_0/delete_duplicate_user_permissions.py
index f2ca6d51fe..a8bb291769 100644
--- a/frappe/patches/v11_0/delete_duplicate_user_permissions.py
+++ b/frappe/patches/v11_0/delete_duplicate_user_permissions.py
@@ -13,8 +13,6 @@ def execute():
for record in duplicateRecords:
frappe.db.sql(
"""delete from `tabUser Permission`
- where allow=%s and user=%s and for_value=%s limit {}""".format(
- record.count - 1
- ),
+ where allow=%s and user=%s and for_value=%s limit {}""".format(record.count - 1),
(record.allow, record.user, record.for_value),
)
diff --git a/frappe/patches/v11_0/make_all_prepared_report_attachments_private.py b/frappe/patches/v11_0/make_all_prepared_report_attachments_private.py
index 277235ce04..9fb9cc3fb6 100644
--- a/frappe/patches/v11_0/make_all_prepared_report_attachments_private.py
+++ b/frappe/patches/v11_0/make_all_prepared_report_attachments_private.py
@@ -2,10 +2,7 @@ import frappe
def execute():
- if (
- frappe.db.count("File", filters={"attached_to_doctype": "Prepared Report", "is_private": 0})
- > 10000
- ):
+ if frappe.db.count("File", filters={"attached_to_doctype": "Prepared Report", "is_private": 0}) > 10000:
frappe.db.auto_commit_on_many_writes = True
files = frappe.get_all(
diff --git a/frappe/patches/v11_0/remove_skip_for_doctype.py b/frappe/patches/v11_0/remove_skip_for_doctype.py
index ce0e43302a..a8e20a4e9b 100644
--- a/frappe/patches/v11_0/remove_skip_for_doctype.py
+++ b/frappe/patches/v11_0/remove_skip_for_doctype.py
@@ -86,6 +86,4 @@ def execute():
).insert(*new_user_permissions_list).run()
if user_permissions_to_delete:
- frappe.db.delete(
- "User Permission", filters=(Field("name").isin(tuple(user_permissions_to_delete)))
- )
+ frappe.db.delete("User Permission", filters=(Field("name").isin(tuple(user_permissions_to_delete))))
diff --git a/frappe/patches/v11_0/rename_workflow_action_to_workflow_action_master.py b/frappe/patches/v11_0/rename_workflow_action_to_workflow_action_master.py
index b8fa85217a..7d3e23c9bf 100644
--- a/frappe/patches/v11_0/rename_workflow_action_to_workflow_action_master.py
+++ b/frappe/patches/v11_0/rename_workflow_action_to_workflow_action_master.py
@@ -3,8 +3,6 @@ from frappe.model.rename_doc import rename_doc
def execute():
- if frappe.db.table_exists("Workflow Action") and not frappe.db.table_exists(
- "Workflow Action Master"
- ):
+ if frappe.db.table_exists("Workflow Action") and not frappe.db.table_exists("Workflow Action Master"):
rename_doc("DocType", "Workflow Action", "Workflow Action Master")
frappe.reload_doc("workflow", "doctype", "workflow_action_master")
diff --git a/frappe/patches/v11_0/replicate_old_user_permissions.py b/frappe/patches/v11_0/replicate_old_user_permissions.py
index 98ae220ff9..2b3b29b6f2 100644
--- a/frappe/patches/v11_0/replicate_old_user_permissions.py
+++ b/frappe/patches/v11_0/replicate_old_user_permissions.py
@@ -55,7 +55,6 @@ def get_doctypes_to_skip(doctype, user):
doctypes_to_skip.append(parent_doctype)
elif parent_doctype not in doctypes_to_skip:
-
user_permission_doctypes = get_user_permission_doctypes(perm)
# "No doctypes present" indicates that user permission will be applied to each link field
diff --git a/frappe/patches/v11_0/update_list_user_settings.py b/frappe/patches/v11_0/update_list_user_settings.py
index 5209b9e384..5cbcd3bc0a 100644
--- a/frappe/patches/v11_0/update_list_user_settings.py
+++ b/frappe/patches/v11_0/update_list_user_settings.py
@@ -13,9 +13,7 @@ def execute():
# get user_settings for each user
settings = frappe.db.sql(
"select * from `__UserSettings` \
- where user={}".format(
- frappe.db.escape(user.user)
- ),
+ where user={}".format(frappe.db.escape(user.user)),
as_dict=True,
)
diff --git a/frappe/patches/v12_0/fix_email_id_formatting.py b/frappe/patches/v12_0/fix_email_id_formatting.py
index 9cc2f49966..6b5375e058 100644
--- a/frappe/patches/v12_0/fix_email_id_formatting.py
+++ b/frappe/patches/v12_0/fix_email_id_formatting.py
@@ -17,7 +17,6 @@ def fix_communications():
""",
as_dict=1,
):
-
communication["recipients"] = format_email_id(communication.recipients)
communication["cc"] = format_email_id(communication.cc)
communication["bcc"] = format_email_id(communication.bcc)
@@ -35,10 +34,7 @@ def fix_show_as_cc_email_queue():
{"creation": [">", "2020-06-01"], "status": "Not Sent", "show_as_cc": ["like", "%<%"]},
["name", "show_as_cc"],
):
-
- frappe.db.set_value(
- "Email Queue", queue["name"], "show_as_cc", format_email_id(queue["show_as_cc"])
- )
+ frappe.db.set_value("Email Queue", queue["name"], "show_as_cc", format_email_id(queue["show_as_cc"]))
def fix_email_queue_recipients():
@@ -48,7 +44,6 @@ def fix_email_queue_recipients():
and status='Not Sent' and creation > '2020-06-01' """,
as_dict=1,
):
-
frappe.db.set_value(
"Email Queue Recipient", recipient["name"], "recipient", format_email_id(recipient["recipient"])
)
diff --git a/frappe/patches/v12_0/fix_public_private_files.py b/frappe/patches/v12_0/fix_public_private_files.py
index 382e3c2db1..d33bf8fbc2 100644
--- a/frappe/patches/v12_0/fix_public_private_files.py
+++ b/frappe/patches/v12_0/fix_public_private_files.py
@@ -2,9 +2,7 @@ import frappe
def execute():
- files = frappe.get_all(
- "File", fields=["is_private", "file_url", "name"], filters={"is_folder": 0}
- )
+ files = frappe.get_all("File", fields=["is_private", "file_url", "name"], filters={"is_folder": 0})
for file in files:
file_url = file.file_url or ""
diff --git a/frappe/patches/v12_0/move_email_and_phone_to_child_table.py b/frappe/patches/v12_0/move_email_and_phone_to_child_table.py
index 7283760c23..7511a2ee1d 100644
--- a/frappe/patches/v12_0/move_email_and_phone_to_child_table.py
+++ b/frappe/patches/v12_0/move_email_and_phone_to_child_table.py
@@ -83,9 +83,7 @@ def execute():
(`idx`, `name`, `email_id`, `parentfield`, `parenttype`, `parent`, `is_primary`, `creation`,
`modified`, `modified_by`)
VALUES {}
- """.format(
- ", ".join(["%s"] * len(email_values))
- ),
+ """.format(", ".join(["%s"] * len(email_values))),
tuple(email_values),
)
@@ -98,9 +96,7 @@ def execute():
(`idx`, `name`, `phone`, `parentfield`, `parenttype`, `parent`, `is_primary_phone`, `is_primary_mobile_no`, `creation`,
`modified`, `modified_by`)
VALUES {}
- """.format(
- ", ".join(["%s"] * len(phone_values))
- ),
+ """.format(", ".join(["%s"] * len(phone_values))),
tuple(phone_values),
)
diff --git a/frappe/patches/v12_0/move_timeline_links_to_dynamic_links.py b/frappe/patches/v12_0/move_timeline_links_to_dynamic_links.py
index 4d2061c5ac..c51a21f7eb 100644
--- a/frappe/patches/v12_0/move_timeline_links_to_dynamic_links.py
+++ b/frappe/patches/v12_0/move_timeline_links_to_dynamic_links.py
@@ -56,9 +56,7 @@ def execute():
(`idx`, `name`, `parentfield`, `parenttype`, `parent`, `link_doctype`, `link_name`, `creation`,
`modified`, `modified_by`)
VALUES {}
- """.format(
- ", ".join([d for d in values])
- )
+ """.format(", ".join([d for d in values]))
)
values = []
diff --git a/frappe/patches/v12_0/remove_deprecated_fields_from_doctype.py b/frappe/patches/v12_0/remove_deprecated_fields_from_doctype.py
index 5727ab7b48..e7673ff837 100644
--- a/frappe/patches/v12_0/remove_deprecated_fields_from_doctype.py
+++ b/frappe/patches/v12_0/remove_deprecated_fields_from_doctype.py
@@ -5,8 +5,6 @@ def execute():
frappe.reload_doc("core", "doctype", "doctype_link")
frappe.reload_doc("core", "doctype", "doctype_action")
frappe.reload_doc("core", "doctype", "doctype")
- frappe.model.delete_fields(
- {"DocType": ["hide_heading", "image_view", "read_only_onload"]}, delete=1
- )
+ frappe.model.delete_fields({"DocType": ["hide_heading", "image_view", "read_only_onload"]}, delete=1)
frappe.db.delete("Property Setter", {"property": "read_only_onload"})
diff --git a/frappe/patches/v12_0/set_correct_url_in_files.py b/frappe/patches/v12_0/set_correct_url_in_files.py
index fee0b5d6fc..98f6e100af 100644
--- a/frappe/patches/v12_0/set_correct_url_in_files.py
+++ b/frappe/patches/v12_0/set_correct_url_in_files.py
@@ -30,7 +30,9 @@ def execute():
if file_is_private:
public_file_url = os.path.join(public_file_path, file_name)
if os.path.exists(public_file_url):
- frappe.db.set_value("File", file.name, {"file_url": f"/files/{file_name}", "is_private": 0})
+ frappe.db.set_value(
+ "File", file.name, {"file_url": f"/files/{file_name}", "is_private": 0}
+ )
else:
private_file_url = os.path.join(private_file_path, file_name)
if os.path.exists(private_file_url):
diff --git a/frappe/patches/v12_0/setup_comments_from_communications.py b/frappe/patches/v12_0/setup_comments_from_communications.py
index ad168f7c22..add1e4ce68 100644
--- a/frappe/patches/v12_0/setup_comments_from_communications.py
+++ b/frappe/patches/v12_0/setup_comments_from_communications.py
@@ -7,10 +7,7 @@ def execute():
if frappe.db.count("Communication", filters=dict(communication_type="Comment")) > 20000:
frappe.db.auto_commit_on_many_writes = True
- for comment in frappe.get_all(
- "Communication", fields=["*"], filters=dict(communication_type="Comment")
- ):
-
+ for comment in frappe.get_all("Communication", fields=["*"], filters=dict(communication_type="Comment")):
new_comment = frappe.new_doc("Comment")
new_comment.comment_type = comment.comment_type
new_comment.comment_email = comment.sender
diff --git a/frappe/patches/v13_0/create_custom_dashboards_cards_and_charts.py b/frappe/patches/v13_0/create_custom_dashboards_cards_and_charts.py
index 4ac6b918b5..ec96a212a4 100644
--- a/frappe/patches/v13_0/create_custom_dashboards_cards_and_charts.py
+++ b/frappe/patches/v13_0/create_custom_dashboards_cards_and_charts.py
@@ -34,9 +34,7 @@ def execute():
def get_modified_docs(doctype):
- return frappe.get_all(
- doctype, filters={"owner": "Administrator", "modified_by": ["!=", "Administrator"]}
- )
+ return frappe.get_all(doctype, filters={"owner": "Administrator", "modified_by": ["!=", "Administrator"]})
def rename_modified_doc(docname, doctype):
diff --git a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py
index 62c7bcdfde..32d77d578c 100644
--- a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py
+++ b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py
@@ -6,9 +6,7 @@ import frappe
def execute():
frappe.reload_doc("website", "doctype", "website_theme_ignore_app")
- themes = frappe.get_all(
- "Website Theme", filters={"theme_url": ("not like", "/files/website_theme/%")}
- )
+ themes = frappe.get_all("Website Theme", filters={"theme_url": ("not like", "/files/website_theme/%")})
for theme in themes:
doc = frappe.get_doc("Website Theme", theme.name)
try:
diff --git a/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py
index c7c8cbc724..20b92a1929 100644
--- a/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py
+++ b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py
@@ -12,9 +12,7 @@ def execute():
frappe.reload_doc("desk", "doctype", "List View Settings")
- existing_list_view_settings = frappe.get_all(
- "List View Settings", as_list=True, order_by="modified"
- )
+ existing_list_view_settings = frappe.get_all("List View Settings", as_list=True, order_by="modified")
for list_view_setting in frappe.get_all(
"List View Setting",
fields=["disable_count", "disable_sidebar_stats", "disable_auto_refresh", "name"],
diff --git a/frappe/patches/v13_0/set_read_times.py b/frappe/patches/v13_0/set_read_times.py
index 987ed0f1b9..bc5a1c90c8 100644
--- a/frappe/patches/v13_0/set_read_times.py
+++ b/frappe/patches/v13_0/set_read_times.py
@@ -9,9 +9,7 @@ def execute():
for blog in frappe.get_all("Blog Post"):
blog = frappe.get_doc("Blog Post", blog.name)
- frappe.db.set_value(
- "Blog Post", blog.name, "read_time", get_read_time(blog), update_modified=False
- )
+ frappe.db.set_value("Blog Post", blog.name, "read_time", get_read_time(blog), update_modified=False)
def get_read_time(blog):
diff --git a/frappe/patches/v13_0/update_date_filters_in_user_settings.py b/frappe/patches/v13_0/update_date_filters_in_user_settings.py
index a2ac9e94fb..6565641d9b 100644
--- a/frappe/patches/v13_0/update_date_filters_in_user_settings.py
+++ b/frappe/patches/v13_0/update_date_filters_in_user_settings.py
@@ -14,9 +14,7 @@ def execute():
* from `__UserSettings`
where
user='{user}'
- """.format(
- user=user.user
- ),
+ """.format(user=user.user),
as_dict=True,
)
diff --git a/frappe/patches/v13_0/update_notification_channel_if_empty.py b/frappe/patches/v13_0/update_notification_channel_if_empty.py
index 5ebab68f27..5b4c79f62f 100644
--- a/frappe/patches/v13_0/update_notification_channel_if_empty.py
+++ b/frappe/patches/v13_0/update_notification_channel_if_empty.py
@@ -5,13 +5,10 @@ import frappe
def execute():
-
frappe.reload_doc("Email", "doctype", "Notification")
notifications = frappe.get_all("Notification", {"is_standard": 1}, {"name", "channel"})
for notification in notifications:
if not notification.channel:
- frappe.db.set_value(
- "Notification", notification.name, "channel", "Email", update_modified=False
- )
+ frappe.db.set_value("Notification", notification.name, "channel", "Email", update_modified=False)
frappe.db.commit()
diff --git a/frappe/patches/v14_0/copy_mail_data.py b/frappe/patches/v14_0/copy_mail_data.py
index c44b7c9e92..69a9818ff9 100644
--- a/frappe/patches/v14_0/copy_mail_data.py
+++ b/frappe/patches/v14_0/copy_mail_data.py
@@ -3,9 +3,7 @@ import frappe
def execute():
# patch for all Email Account with the flag use_imap
- for email_account in frappe.get_list(
- "Email Account", filters={"enable_incoming": 1, "use_imap": 1}
- ):
+ for email_account in frappe.get_list("Email Account", filters={"enable_incoming": 1, "use_imap": 1}):
# get all data from Email Account
doc = frappe.get_doc("Email Account", email_account.name)
diff --git a/frappe/patches/v14_0/disable_email_accounts_with_oauth.py b/frappe/patches/v14_0/disable_email_accounts_with_oauth.py
index 2066b5f640..4ac1a1b44a 100644
--- a/frappe/patches/v14_0/disable_email_accounts_with_oauth.py
+++ b/frappe/patches/v14_0/disable_email_accounts_with_oauth.py
@@ -3,9 +3,7 @@ from frappe.desk.doctype.notification_log.notification_log import make_notificat
def execute():
- if frappe.get_all(
- "Email Account", {"auth_method": "OAuth", "connected_user": ["is", "set"]}, limit=1
- ):
+ if frappe.get_all("Email Account", {"auth_method": "OAuth", "connected_user": ["is", "set"]}, limit=1):
return
# Setting awaiting password to 1 for email accounts where Oauth is enabled.
diff --git a/frappe/patches/v14_0/reset_creation_datetime.py b/frappe/patches/v14_0/reset_creation_datetime.py
index 5ba1bc9529..c82e57de25 100644
--- a/frappe/patches/v14_0/reset_creation_datetime.py
+++ b/frappe/patches/v14_0/reset_creation_datetime.py
@@ -9,9 +9,7 @@ from frappe.query_builder import DocType as _DocType
def execute():
"""Resetting creation datetimes for DocTypes"""
DocType = _DocType("DocType")
- doctype_jsons = glob.glob(
- os.path.join("..", "apps", "frappe", "frappe", "**", "doctype", "**", "*.json")
- )
+ doctype_jsons = glob.glob(os.path.join("..", "apps", "frappe", "frappe", "**", "doctype", "**", "*.json"))
frappe_modules = frappe.get_all("Module Def", filters={"app_name": "frappe"}, pluck="name")
site_doctypes = frappe.get_all(
diff --git a/frappe/permissions.py b/frappe/permissions.py
index cc36fc53c6..cb13ca45af 100644
--- a/frappe/permissions.py
+++ b/frappe/permissions.py
@@ -105,9 +105,7 @@ def has_permission(
return True
if ptype == "share" and frappe.get_system_settings("disable_document_sharing"):
- debug and _debug_log(
- "User can't share because sharing is disabled globally from system settings"
- )
+ debug and _debug_log("User can't share because sharing is disabled globally from system settings")
return False
if not doc and hasattr(doctype, "doctype"):
@@ -213,9 +211,7 @@ def get_doc_permissions(doc, user=None, ptype=None, debug=False):
push_perm_check_log(_("Not allowed via controller permission check"), debug=debug)
return {ptype: 0}
- permissions = copy.deepcopy(
- get_role_permissions(meta, user=user, is_owner=is_user_owner(), debug=debug)
- )
+ permissions = copy.deepcopy(get_role_permissions(meta, user=user, is_owner=is_user_owner(), debug=debug))
debug and _debug_log(
"User has following permissions using role permission system: "
@@ -294,9 +290,7 @@ def get_role_permissions(doctype_meta, user=None, is_owner=None, debug=False):
def has_permission_without_if_owner_enabled(ptype):
return any(p.get(ptype, 0) and not p.get("if_owner", 0) for p in applicable_permissions)
- applicable_permissions = list(
- filter(is_perm_applicable, getattr(doctype_meta, "permissions", []))
- )
+ applicable_permissions = list(filter(is_perm_applicable, getattr(doctype_meta, "permissions", [])))
has_if_owner_enabled = any(p.get("if_owner", 0) for p in applicable_permissions)
perms["has_if_owner_enabled"] = has_if_owner_enabled
@@ -385,7 +379,6 @@ def has_user_permission(doc, user=None, debug=False):
# check all link fields for user permissions
for field in meta.get_link_fields():
-
if field.ignore_user_permissions:
continue
@@ -514,7 +507,9 @@ def get_roles(user=None, with_standard=True):
roles = (
frappe.qb.from_(table)
.where(
- (table.parenttype == "User") & (table.parent == user) & (table.role.notin(AUTOMATIC_ROLES))
+ (table.parenttype == "User")
+ & (table.parent == user)
+ & (table.role.notin(AUTOMATIC_ROLES))
)
.select(table.role)
.run(pluck=True)
diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py
index ca6241584d..82e9ff40ba 100644
--- a/frappe/printing/doctype/letter_head/letter_head.py
+++ b/frappe/printing/doctype/letter_head/letter_head.py
@@ -24,7 +24,9 @@ class LetterHead(Document):
footer_image: DF.AttachImage | None
footer_image_height: DF.Float
footer_image_width: DF.Float
+ footer_script: DF.Code | None
footer_source: DF.Literal["Image", "HTML"]
+ header_script: DF.Code | None
image: DF.AttachImage | None
image_height: DF.Float
image_width: DF.Float
@@ -32,6 +34,7 @@ class LetterHead(Document):
letter_head_name: DF.Data
source: DF.Literal["Image", "HTML"]
# end: auto-generated types
+
def before_insert(self):
# for better UX, let user set from attachment
self.source = "Image"
diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py
index ea359820d2..71a1d9290c 100644
--- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py
+++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py
@@ -19,6 +19,7 @@ class NetworkPrinterSettings(Document):
printer_name: DF.Literal
server_ip: DF.Data
# end: auto-generated types
+
@frappe.whitelist()
def get_printers_list(self, ip="127.0.0.1", port=631):
printer_list = []
diff --git a/frappe/printing/doctype/print_format/print_format.py b/frappe/printing/doctype/print_format/print_format.py
index 4110f849ec..7450b3882a 100644
--- a/frappe/printing/doctype/print_format/print_format.py
+++ b/frappe/printing/doctype/print_format/print_format.py
@@ -70,7 +70,6 @@ class PrintFormat(Document):
and not frappe.flags.in_migrate
and not frappe.flags.in_test
):
-
frappe.throw(frappe._("Standard Print Format cannot be updated"))
# old_doc_type is required for clearing item cache
@@ -85,9 +84,7 @@ class PrintFormat(Document):
validate_template(self.html)
if self.custom_format and self.raw_printing and not self.raw_commands:
- frappe.throw(
- _("{0} are required").format(frappe.bold(_("Raw Commands"))), frappe.MandatoryError
- )
+ frappe.throw(_("{0} are required").format(frappe.bold(_("Raw Commands"))), frappe.MandatoryError)
if self.custom_format and not self.html and not self.raw_printing:
frappe.throw(_("{0} is required").format(frappe.bold(_("HTML"))), frappe.MandatoryError)
diff --git a/frappe/printing/doctype/print_format/test_print_format.py b/frappe/printing/doctype/print_format/test_print_format.py
index c54e421861..212fda2b9d 100644
--- a/frappe/printing/doctype/print_format/test_print_format.py
+++ b/frappe/printing/doctype/print_format/test_print_format.py
@@ -18,9 +18,7 @@ class TestPrintFormat(FrappeTestCase):
def test_print_user(self, style=None):
print_html = frappe.get_print("User", "Administrator", style=style)
self.assertTrue("" in print_html)
- self.assertTrue(
- re.findall(r'[\s]*administrator[\s]*
', print_html)
- )
+ self.assertTrue(re.findall(r'[\s]*administrator[\s]*
', print_html))
return print_html
def test_print_user_standard(self):
diff --git a/frappe/printing/doctype/print_format_field_template/print_format_field_template.py b/frappe/printing/doctype/print_format_field_template/print_format_field_template.py
index 4f3f5d53b8..abeb9a980c 100644
--- a/frappe/printing/doctype/print_format_field_template/print_format_field_template.py
+++ b/frappe/printing/doctype/print_format_field_template/print_format_field_template.py
@@ -22,6 +22,7 @@ class PrintFormatFieldTemplate(Document):
template: DF.Code | None
template_file: DF.Data | None
# end: auto-generated types
+
def validate(self):
if self.standard and not frappe.conf.developer_mode and not frappe.flags.in_patch:
frappe.throw(_("Enable developer mode to create a standard Print Template"))
diff --git a/frappe/printing/doctype/print_heading/print_heading.py b/frappe/printing/doctype/print_heading/print_heading.py
index 7a652befd7..06e89393b8 100644
--- a/frappe/printing/doctype/print_heading/print_heading.py
+++ b/frappe/printing/doctype/print_heading/print_heading.py
@@ -17,4 +17,5 @@ class PrintHeading(Document):
description: DF.SmallText | None
print_heading: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/printing/doctype/print_settings/print_settings.py b/frappe/printing/doctype/print_settings/print_settings.py
index 555d3243d1..4ca4b3736e 100644
--- a/frappe/printing/doctype/print_settings/print_settings.py
+++ b/frappe/printing/doctype/print_settings/print_settings.py
@@ -22,9 +22,7 @@ class PrintSettings(Document):
allow_print_for_draft: DF.Check
enable_print_server: DF.Check
enable_raw_printing: DF.Check
- font: DF.Literal[
- "Default", "Helvetica Neue", "Arial", "Helvetica", "Inter", "Verdana", "Monospace"
- ]
+ font: DF.Literal["Default", "Helvetica Neue", "Arial", "Helvetica", "Inter", "Verdana", "Monospace"]
font_size: DF.Float
pdf_page_height: DF.Float
pdf_page_size: DF.Literal[
@@ -66,6 +64,7 @@ class PrintSettings(Document):
send_print_as_pdf: DF.Check
with_letterhead: DF.Check
# end: auto-generated types
+
def validate(self):
if self.pdf_page_size == "Custom" and not (self.pdf_page_height and self.pdf_page_width):
frappe.throw(_("Page height and width cannot be zero"))
diff --git a/frappe/printing/doctype/print_style/print_style.py b/frappe/printing/doctype/print_style/print_style.py
index c1ca66242c..1c1d29a71f 100644
--- a/frappe/printing/doctype/print_style/print_style.py
+++ b/frappe/printing/doctype/print_style/print_style.py
@@ -20,6 +20,7 @@ class PrintStyle(Document):
print_style_name: DF.Data
standard: DF.Check
# end: auto-generated types
+
def validate(self):
if (
self.standard == 1
@@ -27,7 +28,6 @@ class PrintStyle(Document):
and not frappe.flags.in_import
and not frappe.flags.in_test
):
-
frappe.throw(frappe._("Standard Print Style cannot be changed. Please duplicate to edit."))
def on_update(self):
diff --git a/frappe/query_builder/functions.py b/frappe/query_builder/functions.py
index aa25fa1215..6dc473d1d8 100644
--- a/frappe/query_builder/functions.py
+++ b/frappe/query_builder/functions.py
@@ -129,9 +129,9 @@ class Cast_(Function):
def _aggregate(function, dt, fieldname, filters, **kwargs):
return (
- frappe.qb.get_query(dt, filters=filters, fields=[function(PseudoColumn(fieldname))]).run(
- **kwargs
- )[0][0]
+ frappe.qb.get_query(dt, filters=filters, fields=[function(PseudoColumn(fieldname))]).run(**kwargs)[0][
+ 0
+ ]
or 0
)
diff --git a/frappe/realtime.py b/frappe/realtime.py
index fe62571c05..61b3273ef7 100644
--- a/frappe/realtime.py
+++ b/frappe/realtime.py
@@ -9,9 +9,7 @@ import frappe
from frappe.utils.data import cstr
-def publish_progress(
- percent, title=None, doctype=None, docname=None, description=None, task_id=None
-):
+def publish_progress(percent, title=None, doctype=None, docname=None, description=None, task_id=None):
publish_realtime(
"progress",
{"percent": percent, "title": title, "description": description},
diff --git a/frappe/sessions.py b/frappe/sessions.py
index 73343f2fd0..1968ea438c 100644
--- a/frappe/sessions.py
+++ b/frappe/sessions.py
@@ -68,10 +68,7 @@ def get_sessions_to_clear(user=None, keep_current=False):
session_id = session_id.where(session.sid != frappe.session.sid)
query = (
- session_id.select(session.sid)
- .offset(offset)
- .limit(100)
- .orderby(session.lastupdate, order=Order.desc)
+ session_id.select(session.sid).offset(offset).limit(100).orderby(session.lastupdate, order=Order.desc)
)
return query.run(pluck=True)
@@ -89,9 +86,7 @@ def delete_session(sid=None, user=None, reason="Session Expired"):
frappe.cache.hdel("last_db_session_update", sid)
if sid and not user:
table = frappe.qb.DocType("Sessions")
- user_details = (
- frappe.qb.from_(table).where(table.sid == sid).select(table.user).run(as_dict=True)
- )
+ user_details = frappe.qb.from_(table).where(table.sid == sid).select(table.user).run(as_dict=True)
if user_details:
user = user_details[0].get("user")
@@ -114,9 +109,7 @@ def get_expired_sessions():
sessions = frappe.qb.DocType("Sessions")
return (
- frappe.qb.from_(sessions)
- .select(sessions.sid)
- .where(sessions.lastupdate < get_expired_threshold())
+ frappe.qb.from_(sessions).select(sessions.sid).where(sessions.lastupdate < get_expired_threshold())
).run(pluck=True)
@@ -199,9 +192,7 @@ class Session:
__slots__ = ("user", "user_type", "full_name", "data", "time_diff", "sid")
def __init__(self, user, resume=False, full_name=None, user_type=None):
- self.sid = cstr(
- frappe.form_dict.get("sid") or unquote(frappe.request.cookies.get("sid", "Guest"))
- )
+ self.sid = cstr(frappe.form_dict.get("sid") or unquote(frappe.request.cookies.get("sid", "Guest")))
self.user = user
self.user_type = user_type
self.full_name = full_name
@@ -260,15 +251,12 @@ class Session:
frappe.db.commit()
def insert_session_record(self):
-
Sessions = frappe.qb.DocType("Sessions")
now = frappe.utils.now()
(
frappe.qb.into(Sessions)
- .columns(
- Sessions.sessiondata, Sessions.user, Sessions.lastupdate, Sessions.sid, Sessions.status
- )
+ .columns(Sessions.sessiondata, Sessions.user, Sessions.lastupdate, Sessions.sid, Sessions.status)
.insert((str(self.data["data"]), self.data["user"], now, self.data["sid"], "Active"))
).run()
frappe.cache.hset("session", self.data.sid, self.data)
diff --git a/frappe/share.py b/frappe/share.py
index 07e7e6c592..e5e61d1184 100644
--- a/frappe/share.py
+++ b/frappe/share.py
@@ -49,9 +49,7 @@ def add_docshare(
doc = frappe.get_doc("DocShare", share_name)
else:
doc = frappe.new_doc("DocShare")
- doc.update(
- {"user": user, "share_doctype": doctype, "share_name": name, "everyone": cint(everyone)}
- )
+ doc.update({"user": user, "share_doctype": doctype, "share_name": name, "everyone": cint(everyone)})
if flags:
doc.flags.update(flags)
@@ -76,9 +74,7 @@ def add_docshare(
def remove(doctype, name, user, flags=None):
- share_name = frappe.db.get_value(
- "DocShare", {"user": user, "share_name": name, "share_doctype": doctype}
- )
+ share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name, "share_doctype": doctype})
if share_name:
frappe.delete_doc("DocShare", share_name, flags=flags)
@@ -226,7 +222,6 @@ def check_share_permission(doctype, name):
def notify_assignment(shared_by, doctype, doc_name, everyone, notify=0):
-
if not (shared_by and doctype and doc_name) or everyone or not notify:
return
diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.py b/frappe/social/doctype/energy_point_log/energy_point_log.py
index a9b6d01e4e..8c58026774 100644
--- a/frappe/social/doctype/energy_point_log/energy_point_log.py
+++ b/frappe/social/doctype/energy_point_log/energy_point_log.py
@@ -38,6 +38,7 @@ class EnergyPointLog(Document):
type: DF.Literal["Auto", "Appreciation", "Criticism", "Review", "Revert"]
user: DF.Link
# end: auto-generated types
+
def validate(self):
self.map_milestone_reference()
if self.type in ["Appreciation", "Criticism"] and self.user == self.owner:
@@ -62,7 +63,6 @@ class EnergyPointLog(Document):
if self.type != "Review" and frappe.get_cached_value(
"Notification Settings", self.user, "energy_points_system_notifications"
):
-
reference_user = self.user if self.type == "Auto" else self.owner
notification_doc = {
"type": "Energy Point",
@@ -271,9 +271,7 @@ def get_user_energy_and_review_points(user=None, from_date=None, as_dict=True):
{conditions}
GROUP BY `user`
ORDER BY `energy_points` DESC
- """.format(
- conditions=conditions, given_points_condition=given_points_condition
- ),
+ """.format(conditions=conditions, given_points_condition=given_points_condition),
values=values,
as_dict=1,
)
diff --git a/frappe/social/doctype/energy_point_log/test_energy_point_log.py b/frappe/social/doctype/energy_point_log/test_energy_point_log.py
index 2b4a8335fc..42c027f44d 100644
--- a/frappe/social/doctype/energy_point_log/test_energy_point_log.py
+++ b/frappe/social/doctype/energy_point_log/test_energy_point_log.py
@@ -6,9 +6,8 @@ from frappe.desk.page.user_profile.user_profile import get_energy_points_heatmap
from frappe.tests.utils import FrappeTestCase
from frappe.utils.testutils import add_custom_field, clear_custom_fields
-from .energy_point_log import create_review_points_log
+from .energy_point_log import create_review_points_log, review
from .energy_point_log import get_energy_points as _get_energy_points
-from .energy_point_log import review
class TestEnergyPointLog(FrappeTestCase):
@@ -191,9 +190,7 @@ class TestEnergyPointLog(FrappeTestCase):
created_todo.docstatus = 2
created_todo.save()
- energy_point_logs = frappe.get_all(
- "Energy Point Log", fields=["reference_name", "type", "reverted"]
- )
+ energy_point_logs = frappe.get_all("Energy Point Log", fields=["reference_name", "type", "reverted"])
self.assertListEqual(
energy_point_logs,
@@ -211,9 +208,7 @@ class TestEnergyPointLog(FrappeTestCase):
create_a_todo()
points_after_todo_creation = get_points("test@example.com")
- self.assertEqual(
- points_after_todo_creation, points_before_todo_creation + todo_point_rule.points
- )
+ self.assertEqual(points_after_todo_creation, points_before_todo_creation + todo_point_rule.points)
def test_point_allocation_for_assigned_users(self):
todo = create_a_todo()
@@ -240,9 +235,7 @@ class TestEnergyPointLog(FrappeTestCase):
self.assertIsInstance(get_energy_points_heatmap_data(user="test@example.com", date=None), dict)
def test_points_on_field_value_change(self):
- rule = create_energy_point_rule_for_todo(
- for_doc_event="Value Change", field_to_check="description"
- )
+ rule = create_energy_point_rule_for_todo(for_doc_event="Value Change", field_to_check="description")
frappe.set_user("test@example.com")
points_before_todo_creation = get_points("test@example.com")
@@ -255,9 +248,7 @@ class TestEnergyPointLog(FrappeTestCase):
todo.description = "This is new todo"
todo.save()
points_after_changing_todo_description = get_points("test@example.com")
- self.assertEqual(
- points_after_changing_todo_description, points_before_todo_creation + rule.points
- )
+ self.assertEqual(points_after_changing_todo_description, points_before_todo_creation + rule.points)
def test_apply_only_once(self):
frappe.set_user("test@example.com")
@@ -271,9 +262,7 @@ class TestEnergyPointLog(FrappeTestCase):
first_user_points_after_closing_todo = get_points("test@example.com")
- self.assertEqual(
- first_user_points_after_closing_todo, first_user_points + todo_point_rule.points
- )
+ self.assertEqual(first_user_points_after_closing_todo, first_user_points + todo_point_rule.points)
frappe.set_user("test2@example.com")
second_user_points = get_points("test2@example.com")
diff --git a/frappe/social/doctype/energy_point_rule/energy_point_rule.py b/frappe/social/doctype/energy_point_rule/energy_point_rule.py
index 71835563c7..712b1f7b0a 100644
--- a/frappe/social/doctype/energy_point_rule/energy_point_rule.py
+++ b/frappe/social/doctype/energy_point_rule/energy_point_rule.py
@@ -35,6 +35,7 @@ class EnergyPointRule(Document):
rule_name: DF.Data
user_field: DF.Literal
# end: auto-generated types
+
def on_update(self):
frappe.cache_manager.clear_doctype_map("Energy Point Rule", self.reference_doctype)
diff --git a/frappe/social/doctype/energy_point_settings/energy_point_settings.py b/frappe/social/doctype/energy_point_settings/energy_point_settings.py
index a83840420d..910bdcb5be 100644
--- a/frappe/social/doctype/energy_point_settings/energy_point_settings.py
+++ b/frappe/social/doctype/energy_point_settings/energy_point_settings.py
@@ -22,6 +22,7 @@ class EnergyPointSettings(Document):
point_allocation_periodicity: DF.Literal["Daily", "Weekly", "Monthly"]
review_levels: DF.Table[ReviewLevel]
# end: auto-generated types
+
pass
@@ -32,9 +33,7 @@ def is_energy_point_enabled():
def allocate_review_points():
settings = frappe.get_single("Energy Point Settings")
- if not can_allocate_today(
- settings.last_point_allocation_date, settings.point_allocation_periodicity
- ):
+ if not can_allocate_today(settings.last_point_allocation_date, settings.point_allocation_periodicity):
return
user_point_map = {}
diff --git a/frappe/social/doctype/review_level/review_level.py b/frappe/social/doctype/review_level/review_level.py
index 8c59b0b7bf..03891d1d38 100644
--- a/frappe/social/doctype/review_level/review_level.py
+++ b/frappe/social/doctype/review_level/review_level.py
@@ -21,4 +21,5 @@ class ReviewLevel(Document):
review_points: DF.Int
role: DF.Link
# end: auto-generated types
+
pass
diff --git a/frappe/templates/includes/comments/comments.py b/frappe/templates/includes/comments/comments.py
index d76b6d1a48..f9ba40d7cb 100644
--- a/frappe/templates/includes/comments/comments.py
+++ b/frappe/templates/includes/comments/comments.py
@@ -39,9 +39,7 @@ def add_comment(comment, comment_email, comment_by, reference_doctype, reference
return False
doc = frappe.get_doc(reference_doctype, reference_name)
- comment = doc.add_comment(
- text=clean_html(comment), comment_email=comment_email, comment_by=comment_by
- )
+ comment = doc.add_comment(text=clean_html(comment), comment_email=comment_email, comment_by=comment_by)
comment.db_set("published", 1)
diff --git a/frappe/tests/test_api.py b/frappe/tests/test_api.py
index 8dd68dd644..61e76b213d 100644
--- a/frappe/tests/test_api.py
+++ b/frappe/tests/test_api.py
@@ -190,9 +190,7 @@ class TestResourceAPI(FrappeAPITestCase):
def test_get_list_fields(self):
# test 6: fetch response with fields
- response = self.get(
- self.resource_path(self.DOCTYPE), {"sid": self.sid, "fields": '["description"]'}
- )
+ response = self.get(self.resource_path(self.DOCTYPE), {"sid": self.sid, "fields": '["description"]'})
self.assertEqual(response.status_code, 200)
json = frappe._dict(response.json)
self.assertIn("description", json.data[0])
@@ -236,9 +234,7 @@ class TestResourceAPI(FrappeAPITestCase):
self.assertIn(response.status_code, (403, 200))
if response.status_code == 403:
- self.assertTrue(
- set(response.json.keys()) == {"exc_type", "exception", "exc", "_server_messages"}
- )
+ self.assertTrue(set(response.json.keys()) == {"exc_type", "exception", "exc", "_server_messages"})
self.assertEqual(response.json.get("exc_type"), "PermissionError")
self.assertEqual(
response.json.get("exception"), "frappe.exceptions.PermissionError: Not permitted"
diff --git a/frappe/tests/test_api_v2.py b/frappe/tests/test_api_v2.py
index ba25b8b05d..753e95b4d4 100644
--- a/frappe/tests/test_api_v2.py
+++ b/frappe/tests/test_api_v2.py
@@ -70,9 +70,7 @@ class TestResourceAPIV2(FrappeAPITestCase):
def test_get_list_fields(self):
# test 6: fetch response with fields
- response = self.get(
- self.resource_path(self.DOCTYPE), {"sid": self.sid, "fields": '["description"]'}
- )
+ response = self.get(self.resource_path(self.DOCTYPE), {"sid": self.sid, "fields": '["description"]'})
self.assertEqual(response.status_code, 200)
json = frappe._dict(response.json)
self.assertIn("description", json.data[0])
@@ -205,9 +203,7 @@ class TestMethodAPIV2(FrappeAPITestCase):
method = "frappe.tests.test_api.test"
expected_message = "Failed v2"
- response = self.get(
- self.method_path(method), {"sid": self.sid, "message": expected_message}
- ).json
+ response = self.get(self.method_path(method), {"sid": self.sid, "message": expected_message}).json
self.assertIsInstance(response["messages"], list)
self.assertEqual(response["messages"][0]["message"], expected_message)
diff --git a/frappe/tests/test_assign.py b/frappe/tests/test_assign.py
index c299d235dc..171fd04925 100644
--- a/frappe/tests/test_assign.py
+++ b/frappe/tests/test_assign.py
@@ -81,9 +81,7 @@ class TestAssign(FrappeTestCase):
self.assertEqual(data["test_assign1@example.com"], 1)
self.assertEqual(data["test_assign2@example.com"], 3)
- data = {
- d.name: d.count for d in get_group_by_count(TEST_DOCTYPE, '[{"public": 1}]', "assigned_to")
- }
+ data = {d.name: d.count for d in get_group_by_count(TEST_DOCTYPE, '[{"public": 1}]', "assigned_to")}
self.assertFalse("test_assign1@example.com" in data)
self.assertEqual(data["test_assign2@example.com"], 2)
diff --git a/frappe/tests/test_auth.py b/frappe/tests/test_auth.py
index 652aebd078..2a25ba6a4a 100644
--- a/frappe/tests/test_auth.py
+++ b/frappe/tests/test_auth.py
@@ -133,7 +133,6 @@ class TestAuth(FrappeTestCase):
FrappeClient(self.HOST_NAME, self.test_user_email, self.test_user_password).get_list("ToDo")
def test_login_with_email_link(self):
-
user = self.test_user_email
# Logs in
@@ -188,9 +187,7 @@ class TestLoginAttemptTracker(FrappeTestCase):
def test_account_unlock(self):
"""Make sure that locked account gets unlocked after lock_interval of time."""
lock_interval = 2 # In sec
- tracker = LoginAttemptTracker(
- "tester", max_consecutive_login_attempts=1, lock_interval=lock_interval
- )
+ tracker = LoginAttemptTracker("tester", max_consecutive_login_attempts=1, lock_interval=lock_interval)
# Clear the cache by setting attempt as success
tracker.add_success_attempt()
diff --git a/frappe/tests/test_caching.py b/frappe/tests/test_caching.py
index 5f911543d2..950a07ef94 100644
--- a/frappe/tests/test_caching.py
+++ b/frappe/tests/test_caching.py
@@ -232,7 +232,6 @@ class TestDocumentCache(FrappeAPITestCase):
class TestRedisWrapper(FrappeAPITestCase):
def test_delete_keys(self):
-
prefix = "test_del_"
for i in range(5):
diff --git a/frappe/tests/test_commands.py b/frappe/tests/test_commands.py
index fc39adc9a3..7754903ed3 100644
--- a/frappe/tests/test_commands.py
+++ b/frappe/tests/test_commands.py
@@ -453,9 +453,7 @@ class TestCommands(BaseTestCommands):
self.assertEqual(check_password("Administrator", original_password), "Administrator")
@skipIf(
- not (
- frappe.conf.root_password and frappe.conf.admin_password and frappe.conf.db_type == "mariadb"
- ),
+ not (frappe.conf.root_password and frappe.conf.admin_password and frappe.conf.db_type == "mariadb"),
"DB Root password and Admin password not set in config",
)
def test_bench_drop_site_should_archive_site(self):
@@ -485,9 +483,7 @@ class TestCommands(BaseTestCommands):
self.assertTrue(os.path.exists(archive_directory))
@skipIf(
- not (
- frappe.conf.root_password and frappe.conf.admin_password and frappe.conf.db_type == "mariadb"
- ),
+ not (frappe.conf.root_password and frappe.conf.admin_password and frappe.conf.db_type == "mariadb"),
"DB Root password and Admin password not set in config",
)
def test_force_install_app(self):
@@ -725,9 +721,7 @@ class TestBackups(BaseTestCommands):
def test_backup_with_custom_path(self):
"""Backup to a custom path (--backup-path)"""
backup_path = os.path.join(self.home, "backups")
- self.execute(
- "bench --site {site} backup --backup-path {backup_path}", {"backup_path": backup_path}
- )
+ self.execute("bench --site {site} backup --backup-path {backup_path}", {"backup_path": backup_path})
self.assertEqual(self.returncode, 0)
self.assertTrue(os.path.exists(backup_path))
@@ -842,7 +836,12 @@ class TestRemoveApp(FrappeTestCase):
"module": "RemoveThis",
"custom": 1,
"fields": [
- {"label": "Modulen't", "fieldname": "notmodule", "fieldtype": "Link", "options": "Module Def"}
+ {
+ "label": "Modulen't",
+ "fieldname": "notmodule",
+ "fieldtype": "Link",
+ "options": "Module Def",
+ }
],
}
).insert()
diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py
index 42d4347aa0..35ba845d5f 100644
--- a/frappe/tests/test_db.py
+++ b/frappe/tests/test_db.py
@@ -91,9 +91,7 @@ class TestDB(FrappeTestCase):
)
self.assertIn(
"for update",
- frappe.db.get_value(
- "User", Field("name") == "Administrator", for_update=True, run=False
- ).lower(),
+ frappe.db.get_value("User", Field("name") == "Administrator", for_update=True, run=False).lower(),
)
user_doctype = frappe.qb.DocType("User")
self.assertEqual(
@@ -166,9 +164,7 @@ class TestDB(FrappeTestCase):
"Datetime": datetime.datetime.now(),
"Time": datetime.timedelta(hours=9, minutes=45, seconds=10),
}
- test_inputs = [
- {"fieldtype": fieldtype, "value": value} for fieldtype, value in values_dict.items()
- ]
+ test_inputs = [{"fieldtype": fieldtype, "value": value} for fieldtype, value in values_dict.items()]
for fieldtype in values_dict:
create_custom_field(
"Print Settings",
@@ -344,9 +340,7 @@ class TestDB(FrappeTestCase):
random_value = random_string(20)
# Testing read
- self.assertEqual(
- list(frappe.get_all("ToDo", fields=[random_field], limit=1)[0])[0], random_field
- )
+ self.assertEqual(list(frappe.get_all("ToDo", fields=[random_field], limit=1)[0])[0], random_field)
self.assertEqual(
list(frappe.get_all("ToDo", fields=[f"`{random_field}` as total"], limit=1)[0])[0], "total"
)
@@ -562,9 +556,7 @@ class TestDB(FrappeTestCase):
modify_query(query),
)
- query = (
- 'select locate(".io", "frappe.io"), locate("3", cast(3 as varchar)), locate("3", 3::varchar)'
- )
+ query = 'select locate(".io", "frappe.io"), locate("3", cast(3 as varchar)), locate("3", 3::varchar)'
self.assertEqual(
'select strpos( "frappe.io", ".io"), strpos( cast(3 as varchar), "3"), strpos( 3::varchar, "3")',
modify_query(query),
@@ -584,7 +576,6 @@ class TestDB(FrappeTestCase):
)
def test_callbacks(self):
-
order_of_execution = []
def f(val):
@@ -741,9 +732,7 @@ class TestDBSetValue(FrappeTestCase):
self.assertEqual(status, updated_status)
def test_update_multiple_rows_single_column(self):
- frappe.db.set_value(
- "ToDo", {"description": ("like", "%test_set_value%")}, "description", "change 2"
- )
+ frappe.db.set_value("ToDo", {"description": ("like", "%test_set_value%")}, "description", "change 2")
self.assertEqual(frappe.db.get_value("ToDo", self.todo1.name, "description"), "change 2")
self.assertEqual(frappe.db.get_value("ToDo", self.todo2.name, "description"), "change 2")
diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py
index 178d80e29f..89c29e9892 100644
--- a/frappe/tests/test_db_query.py
+++ b/frappe/tests/test_db_query.py
@@ -172,9 +172,7 @@ class TestDBQuery(FrappeTestCase):
self.assertEqual(results2[0].child_title, "parent 2 child record 1")
def test_link_field_syntax(self):
- todo = frappe.get_doc(
- doctype="ToDo", description="Test ToDo", allocated_to="Administrator"
- ).insert()
+ todo = frappe.get_doc(doctype="ToDo", description="Test ToDo", allocated_to="Administrator").insert()
result = frappe.get_all(
"ToDo",
filters={"name": todo.name},
@@ -828,7 +826,10 @@ class TestDBQuery(FrappeTestCase):
self.assertEqual(len(data[0]), 1)
data = frappe.get_list(
- "Blog Post", filters={"published": 1}, fields=["name", "`tabTest Child`.`test_field`"], limit=1
+ "Blog Post",
+ filters={"published": 1},
+ fields=["name", "`tabTest Child`.`test_field`"],
+ limit=1,
)
self.assertFalse("test_field" in data[0])
self.assertTrue("name" in data[0])
@@ -862,9 +863,7 @@ class TestDBQuery(FrappeTestCase):
self.assertIsInstance(data[0]["abhi"], datetime.datetime)
self.assertEqual(len(data[0]), 2)
- data = frappe.get_list(
- "Blog Post", filters={"published": 1}, fields=["name", "'LABEL'"], limit=1
- )
+ data = frappe.get_list("Blog Post", filters={"published": 1}, fields=["name", "'LABEL'"], limit=1)
self.assertTrue("name" in data[0])
self.assertTrue("LABEL" in data[0].values())
self.assertEqual(len(data[0]), 2)
@@ -989,9 +988,7 @@ class TestDBQuery(FrappeTestCase):
SELECT name
FROM `tabDashboard Settings`
WHERE {condition}
- """.format(
- condition=permission_query_conditions
- ),
+ """.format(condition=permission_query_conditions),
as_dict=1,
)[0]
diff --git a/frappe/tests/test_document.py b/frappe/tests/test_document.py
index cf911d0ce3..0b993570e4 100644
--- a/frappe/tests/test_document.py
+++ b/frappe/tests/test_document.py
@@ -123,9 +123,7 @@ class TestDocument(FrappeTestCase):
def test_text_editor_field(self):
try:
- frappe.get_doc(
- doctype="Activity Log", subject="test", message='
'
- ).insert()
+ frappe.get_doc(doctype="Activity Log", subject="test", message='
').insert()
except frappe.MandatoryError:
self.fail("Text Editor false positive mandatory error")
@@ -329,7 +327,9 @@ class TestDocument(FrappeTestCase):
@contextmanager
def customize_note(with_options=False):
options = (
- "frappe.utils.now_datetime() - frappe.utils.get_datetime(doc.creation)" if with_options else ""
+ "frappe.utils.now_datetime() - frappe.utils.get_datetime(doc.creation)"
+ if with_options
+ else ""
)
custom_field = frappe.get_doc(
{
diff --git a/frappe/tests/test_email.py b/frappe/tests/test_email.py
index bd17a523ba..68fbad8e03 100644
--- a/frappe/tests/test_email.py
+++ b/frappe/tests/test_email.py
@@ -55,9 +55,7 @@ class TestEmail(FrappeTestCase):
from frappe.email.queue import flush
flush()
- email_queue = frappe.db.sql(
- """select name from `tabEmail Queue` where status='Sent'""", as_dict=1
- )
+ email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
self.assertEqual(len(email_queue), 0)
def test_flush(self):
@@ -65,9 +63,7 @@ class TestEmail(FrappeTestCase):
from frappe.email.queue import flush
flush()
- email_queue = frappe.db.sql(
- """select name from `tabEmail Queue` where status='Sent'""", as_dict=1
- )
+ email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
self.assertEqual(len(email_queue), 1)
queue_recipients = [
r.recipient
@@ -133,9 +129,7 @@ class TestEmail(FrappeTestCase):
expose_recipients="footer",
now=True,
)
- email_queue = frappe.db.sql(
- """select name from `tabEmail Queue` where status='Sent'""", as_dict=1
- )
+ email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
self.assertEqual(len(email_queue), 1)
queue_recipients = [
r.recipient
@@ -172,9 +166,7 @@ class TestEmail(FrappeTestCase):
unsubscribe_message="Unsubscribe",
now=True,
)
- email_queue = frappe.db.sql(
- """select name from `tabEmail Queue` where status='Sent'""", as_dict=1
- )
+ email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
self.assertEqual(len(email_queue), 1)
queue_recipients = [
r.recipient
diff --git a/frappe/tests/test_frappe_client.py b/frappe/tests/test_frappe_client.py
index e1886fcbf0..10061cce8a 100644
--- a/frappe/tests/test_frappe_client.py
+++ b/frappe/tests/test_frappe_client.py
@@ -74,9 +74,7 @@ class TestFrappeClient(FrappeTestCase):
server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
server.insert({"doctype": "Note", "title": "get_value", "content": CONTENT}).get("name")
- self.assertEqual(
- server.get_value("Note", "content", {"title": "get_value"}).get("content"), CONTENT
- )
+ self.assertEqual(server.get_value("Note", "content", {"title": "get_value"}).get("content"), CONTENT)
def test_get_value_by_name(self):
server = FrappeClient(get_url(), "Administrator", self.PASSWORD, verify=False)
diff --git a/frappe/tests/test_linked_with.py b/frappe/tests/test_linked_with.py
index 2ba4f04c3f..d47d3fd18a 100644
--- a/frappe/tests/test_linked_with.py
+++ b/frappe/tests/test_linked_with.py
@@ -64,9 +64,7 @@ class TestLinkedWith(FrappeTestCase):
frappe.db.commit()
def test_get_doctype_references_by_link_field(self):
- references = linked_with.get_references_across_doctypes_by_link_field(
- to_doctypes=["Parent DocType"]
- )
+ references = linked_with.get_references_across_doctypes_by_link_field(to_doctypes=["Parent DocType"])
self.assertEqual(len(references["Parent DocType"]), 3)
self.assertIn(
{"doctype": "Child DocType1", "fieldname": "parent_doctype"}, references["Parent DocType"]
@@ -75,9 +73,7 @@ class TestLinkedWith(FrappeTestCase):
{"doctype": "Child DocType2", "fieldname": "parent_doctype"}, references["Parent DocType"]
)
- references = linked_with.get_references_across_doctypes_by_link_field(
- to_doctypes=["Child DocType1"]
- )
+ references = linked_with.get_references_across_doctypes_by_link_field(to_doctypes=["Child DocType1"])
self.assertEqual(len(references["Child DocType1"]), 2)
self.assertIn(
{"doctype": "Child DocType2", "fieldname": "child_doctype1"}, references["Child DocType1"]
@@ -133,9 +129,7 @@ class TestLinkedWith(FrappeTestCase):
}
).insert()
- linked_docs = linked_with.get_submitted_linked_docs(parent_record.doctype, parent_record.name)[
- "docs"
- ]
+ linked_docs = linked_with.get_submitted_linked_docs(parent_record.doctype, parent_record.name)["docs"]
self.assertIn(child_record.name, linked_docs[0]["name"])
child_record.cancel()
child_record.delete()
diff --git a/frappe/tests/test_model_utils.py b/frappe/tests/test_model_utils.py
index 72f5776808..c58f845161 100644
--- a/frappe/tests/test_model_utils.py
+++ b/frappe/tests/test_model_utils.py
@@ -26,9 +26,7 @@ class TestModelUtils(FrappeTestCase):
user = "test@example.com"
full_name = frappe.db.get_value("User", user, "full_name")
- self.assertEqual(
- get_fetch_values(doctype, "assigned_by", user), {"assigned_by_full_name": full_name}
- )
+ self.assertEqual(get_fetch_values(doctype, "assigned_by", user), {"assigned_by_full_name": full_name})
def test_get_permitted_fields(self):
# Administrator should have access to all fields in ToDo
diff --git a/frappe/tests/test_naming.py b/frappe/tests/test_naming.py
index 19229ac881..f1e99ffb83 100644
--- a/frappe/tests/test_naming.py
+++ b/frappe/tests/test_naming.py
@@ -42,7 +42,6 @@ class TestNaming(FrappeTestCase):
self.assertEqual(append_number_if_name_exists(DOCTYPE, TITLE, "title", "_"), f"{TITLE}_1")
def test_field_autoname_name_sync(self):
-
country = frappe.get_last_doc("Country")
original_name = country.name
country.country_name = "Not a country"
@@ -334,7 +333,6 @@ class TestNaming(FrappeTestCase):
self.assertRaises(InvalidNamingSeriesError, NamingSeries(series).validate)
def test_naming_using_fields(self):
-
webhook = frappe.new_doc("Webhook")
webhook.webhook_docevent = "on_update"
name = NamingSeries("KOOH-.{webhook_docevent}.").generate_next_name(webhook)
@@ -364,9 +362,7 @@ class TestNaming(FrappeTestCase):
series = "KOOH-..{webhook_docevent}.-.####"
name = parse_naming_series(series, doc=webhook)
- self.assertTrue(
- name.startswith("KOOH-"), f"incorrect name generated {name}, missing field value"
- )
+ self.assertTrue(name.startswith("KOOH-"), f"incorrect name generated {name}, missing field value")
def test_naming_with_empty_field(self):
# check naming with empty field value
diff --git a/frappe/tests/test_nestedset.py b/frappe/tests/test_nestedset.py
index d308388646..8e52db93a5 100644
--- a/frappe/tests/test_nestedset.py
+++ b/frappe/tests/test_nestedset.py
@@ -263,7 +263,6 @@ class TestNestedSet(FrappeTestCase):
self.assertFalse(frappe.db.exists(TEST_DOCTYPE, "Root Node"))
def test_desc_filters(self):
-
linked_doctype = (
new_doctype(
fields=[
diff --git a/frappe/tests/test_oauth20.py b/frappe/tests/test_oauth20.py
index fb064eb82d..8bf0ccdde7 100644
--- a/frappe/tests/test_oauth20.py
+++ b/frappe/tests/test_oauth20.py
@@ -391,9 +391,7 @@ def check_valid_openid_response(access_token=None, client: "FrappeRequestTestCas
def login(session):
- session.post(
- get_full_url("/api/method/login"), data={"usr": "test@example.com", "pwd": "Eastern_43A1W"}
- )
+ session.post(get_full_url("/api/method/login"), data={"usr": "test@example.com", "pwd": "Eastern_43A1W"})
def get_full_url(endpoint):
diff --git a/frappe/tests/test_perf.py b/frappe/tests/test_perf.py
index fc736543a8..c0796809c8 100644
--- a/frappe/tests/test_perf.py
+++ b/frappe/tests/test_perf.py
@@ -84,7 +84,6 @@ class TestPerformance(FrappeTestCase):
)
def test_controller_caching(self):
-
get_controller("User")
with self.assertQueryCount(0):
get_controller("User")
diff --git a/frappe/tests/test_permissions.py b/frappe/tests/test_permissions.py
index 1b05c28d2a..2258e2e817 100644
--- a/frappe/tests/test_permissions.py
+++ b/frappe/tests/test_permissions.py
@@ -447,9 +447,7 @@ class TestPermissions(FrappeTestCase):
# should be applicable for across all doctypes
add_user_permission("Blogger", "_Test Blogger", "test2@example.com")
# should be applicable only while accessing Blog Post
- add_user_permission(
- "Blogger", "_Test Blogger 1", "test2@example.com", applicable_for="Blog Post"
- )
+ add_user_permission("Blogger", "_Test Blogger 1", "test2@example.com", applicable_for="Blog Post")
# should be applicable only while accessing User
add_user_permission("Blogger", "_Test Blogger 2", "test2@example.com", applicable_for="User")
diff --git a/frappe/tests/test_printview.py b/frappe/tests/test_printview.py
index 1afc7d952f..8fa7ad76ce 100644
--- a/frappe/tests/test_printview.py
+++ b/frappe/tests/test_printview.py
@@ -5,7 +5,6 @@ from frappe.www.printview import get_html_and_style
class PrintViewTest(FrappeTestCase):
def test_print_view_without_errors(self):
-
user = frappe.get_last_doc("User")
messages_before = frappe.get_message_log()
diff --git a/frappe/tests/test_query.py b/frappe/tests/test_query.py
index 9242630104..514ac534f7 100644
--- a/frappe/tests/test_query.py
+++ b/frappe/tests/test_query.py
@@ -425,9 +425,7 @@ class TestQuery(FrappeTestCase):
frappe.db.sql_ddl("drop table if exists `tabTest Tree DocType`")
def test_child_field_syntax(self):
- note1 = frappe.get_doc(
- doctype="Note", title="Note 1", seen_by=[{"user": "Administrator"}]
- ).insert()
+ note1 = frappe.get_doc(doctype="Note", title="Note 1", seen_by=[{"user": "Administrator"}]).insert()
note2 = frappe.get_doc(
doctype="Note", title="Note 2", seen_by=[{"user": "Administrator"}, {"user": "Guest"}]
).insert()
diff --git a/frappe/tests/test_query_builder.py b/frappe/tests/test_query_builder.py
index 801394429c..c6784cd50d 100644
--- a/frappe/tests/test_query_builder.py
+++ b/frappe/tests/test_query_builder.py
@@ -69,8 +69,7 @@ class TestCustomFunctionsMariaDB(FrappeTestCase):
)
select_query = select_query.where(
- CombineDatetime(note.posting_date, note.posting_time)
- >= CombineDatetime("2021-01-01", "00:00:01")
+ CombineDatetime(note.posting_date, note.posting_time) >= CombineDatetime("2021-01-01", "00:00:01")
)
self.assertIn(
"timestamp(`tabnote`.`posting_date`,`tabnote`.`posting_time`)>=timestamp('2021-01-01','00:00:01')",
@@ -111,9 +110,7 @@ class TestCustomFunctionsMariaDB(FrappeTestCase):
)
# Function comparison
- select_query = select_query.where(
- UnixTimestamp(note.posting_date) >= UnixTimestamp("2021-01-01")
- )
+ select_query = select_query.where(UnixTimestamp(note.posting_date) >= UnixTimestamp("2021-01-01"))
self.assertIn(
"unix_timestamp(`tabnote`.`posting_date`)>=unix_timestamp('2021-01-01')",
str(select_query).lower(),
@@ -132,9 +129,7 @@ class TestCustomFunctionsMariaDB(FrappeTestCase):
"TIMESTAMP('2021-01-01','00:00:21')", CombineDatetime("2021-01-01", time(0, 0, 21)).get_sql()
)
- select_query = frappe.qb.from_(note).select(
- CombineDatetime(note.posting_date, note.posting_time)
- )
+ select_query = frappe.qb.from_(note).select(CombineDatetime(note.posting_date, note.posting_time))
self.assertIn("select timestamp(`posting_date`,`posting_time`)", str(select_query).lower())
select_query = select_query.where(
@@ -202,18 +197,13 @@ class TestCustomFunctionsPostgres(FrappeTestCase):
.on(todo.refernce_name == note.name)
.select(CombineDatetime(note.posting_date, note.posting_time))
)
- self.assertIn(
- 'select "tabnote"."posting_date"+"tabnote"."posting_time"', str(select_query).lower()
- )
+ self.assertIn('select "tabnote"."posting_date"+"tabnote"."posting_time"', str(select_query).lower())
select_query = select_query.orderby(CombineDatetime(note.posting_date, note.posting_time))
- self.assertIn(
- 'order by "tabnote"."posting_date"+"tabnote"."posting_time"', str(select_query).lower()
- )
+ self.assertIn('order by "tabnote"."posting_date"+"tabnote"."posting_time"', str(select_query).lower())
select_query = select_query.where(
- CombineDatetime(note.posting_date, note.posting_time)
- >= CombineDatetime("2021-01-01", "00:00:01")
+ CombineDatetime(note.posting_date, note.posting_time) >= CombineDatetime("2021-01-01", "00:00:01")
)
self.assertIn(
"""where "tabnote"."posting_date"+"tabnote"."posting_time">=cast('2021-01-01' as date)+cast('00:00:01' as time)""",
@@ -276,9 +266,7 @@ class TestCustomFunctionsPostgres(FrappeTestCase):
CombineDatetime("2021-01-01", time(0, 0, 21)).get_sql(),
)
- select_query = frappe.qb.from_(note).select(
- CombineDatetime(note.posting_date, note.posting_time)
- )
+ select_query = frappe.qb.from_(note).select(CombineDatetime(note.posting_date, note.posting_time))
self.assertIn('select "posting_date"+"posting_time"', str(select_query).lower())
select_query = select_query.where(
@@ -372,9 +360,7 @@ class TestParameterization(FrappeTestCase):
def test_where_conditions_functions(self):
DocType = frappe.qb.DocType("DocType")
query = (
- frappe.qb.from_(DocType)
- .select(DocType.name)
- .where(Coalesce(DocType.search_fields == "subject"))
+ frappe.qb.from_(DocType).select(DocType.name).where(Coalesce(DocType.search_fields == "subject"))
)
self.assertTrue("walk" in dir(query))
diff --git a/frappe/tests/test_rename_doc.py b/frappe/tests/test_rename_doc.py
index c831e832fb..1d484f2c50 100644
--- a/frappe/tests/test_rename_doc.py
+++ b/frappe/tests/test_rename_doc.py
@@ -136,9 +136,7 @@ class TestRenameDoc(FrappeTestCase):
second_todo_doc.priority = "High"
second_todo_doc.save()
- merged_todo = frappe.rename_doc(
- self.test_doctype, first_todo, second_todo, merge=True, force=True
- )
+ merged_todo = frappe.rename_doc(self.test_doctype, first_todo, second_todo, merge=True, force=True)
merged_todo_doc = frappe.get_doc(self.test_doctype, merged_todo)
self.available_documents.remove(first_todo)
@@ -192,9 +190,7 @@ class TestRenameDoc(FrappeTestCase):
)
# Test if Doctype value has changed in Link field
- linked_to_doctype = frappe.db.get_value(
- "Renamed Doc", to_rename_record.name, "linked_to_doctype"
- )
+ linked_to_doctype = frappe.db.get_value("Renamed Doc", to_rename_record.name, "linked_to_doctype")
self.assertEqual(linked_to_doctype, "Renamed Doc")
# Test if there are conflicts between a record and a DocType
diff --git a/frappe/tests/test_safe_exec.py b/frappe/tests/test_safe_exec.py
index 3542fdfce1..2f70dc0e5c 100644
--- a/frappe/tests/test_safe_exec.py
+++ b/frappe/tests/test_safe_exec.py
@@ -23,7 +23,6 @@ class TestSafeExec(FrappeTestCase):
self.assertEqual(_locals["out"], 1)
def test_safe_eval(self):
-
TEST_CASES = {
"1+1": 2,
'"abc" in "abl"': False,
@@ -73,9 +72,7 @@ class TestSafeExec(FrappeTestCase):
self.assertEqual(frappe.db.sql("SELECT Max(name) FROM tabUser"), _locals["out"])
def test_safe_query_builder(self):
- self.assertRaises(
- frappe.PermissionError, safe_exec, """frappe.qb.from_("User").delete().run()"""
- )
+ self.assertRaises(frappe.PermissionError, safe_exec, """frappe.qb.from_("User").delete().run()""")
def test_call(self):
# call non whitelisted method
diff --git a/frappe/tests/test_scheduler.py b/frappe/tests/test_scheduler.py
index 73e8d12d64..a85e9358ea 100644
--- a/frappe/tests/test_scheduler.py
+++ b/frappe/tests/test_scheduler.py
@@ -93,9 +93,7 @@ class TestScheduler(TestCase):
)
-def get_test_job(
- method="frappe.tests.test_scheduler.test_timeout_10", frequency="All"
-) -> ScheduledJobType:
+def get_test_job(method="frappe.tests.test_scheduler.test_timeout_10", frequency="All") -> ScheduledJobType:
if not frappe.db.exists("Scheduled Job Type", dict(method=method)):
job = frappe.get_doc(
dict(
diff --git a/frappe/tests/test_search.py b/frappe/tests/test_search.py
index 0a6e34d408..7f54d1f9c0 100644
--- a/frappe/tests/test_search.py
+++ b/frappe/tests/test_search.py
@@ -19,9 +19,7 @@ class TestSearch(FrappeTestCase):
self.addCleanup(teardown_test_link_field_order, self)
def test_search_field_sanitizer(self):
- results = search_link(
- "DocType", "User", query=None, filters=None, page_length=20, searchfield="name"
- )
+ results = search_link("DocType", "User", query=None, filters=None, page_length=20, searchfield="name")
self.assertTrue("User" in results[0]["value"])
# raise exception on injection
@@ -120,12 +118,11 @@ class TestSearch(FrappeTestCase):
frappe.local.lang = "en"
def test_validate_and_sanitize_search_inputs(self):
-
# should raise error if searchfield is injectable
self.assertRaises(
frappe.DataError,
get_data,
- *("User", "Random", "select * from tabSessions) --", "1", "10", dict())
+ *("User", "Random", "select * from tabSessions) --", "1", "10", dict()),
)
# page_len and start should be converted to int
@@ -187,9 +184,7 @@ def get_data(doctype, txt, searchfield, start, page_len, filters):
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
-def query_with_reference_doctype(
- doctype, txt, searchfield, start, page_len, filters, reference_doctype=None
-):
+def query_with_reference_doctype(doctype, txt, searchfield, start, page_len, filters, reference_doctype=None):
return []
@@ -261,7 +256,6 @@ class TestWebsiteSearch(FrappeTestCase):
return response
def test_basic_search(self):
-
no_search = self.get("/search")
self.assertEqual(no_search.status_code, 200)
diff --git a/frappe/tests/test_test_utils.py b/frappe/tests/test_test_utils.py
index de004ac028..2118548fa8 100644
--- a/frappe/tests/test_test_utils.py
+++ b/frappe/tests/test_test_utils.py
@@ -9,7 +9,6 @@ class TestTestUtils(FrappeTestCase):
SHOW_TRANSACTION_COMMIT_WARNINGS = True
def test_document_assertions(self):
-
currency = frappe.new_doc("Currency")
currency.currency_name = "STONKS"
currency.smallest_currency_fraction_value = 0.420_001
diff --git a/frappe/tests/test_translate.py b/frappe/tests/test_translate.py
index 425ca28bb2..f83cfb15b0 100644
--- a/frappe/tests/test_translate.py
+++ b/frappe/tests/test_translate.py
@@ -184,7 +184,6 @@ class TestTranslate(FrappeTestCase):
verify_translation_files("frappe")
def test_python_extractor(self):
-
code = textwrap.dedent(
"""
frappe._("attr")
@@ -220,7 +219,6 @@ class TestTranslate(FrappeTestCase):
self.assertEqual(expected, actual)
def test_js_extractor(self):
-
code = textwrap.dedent(
"""
__("attr")
diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py
index c32dddd3b4..482cc80e5a 100644
--- a/frappe/tests/test_utils.py
+++ b/frappe/tests/test_utils.py
@@ -103,7 +103,8 @@ class TestFilters(FrappeTestCase):
)
self.assertFalse(
evaluate_filters(
- {"doctype": "User", "status": "Open", "name": "Test 1"}, {"status": "Closed", "name": "Test 1"}
+ {"doctype": "User", "status": "Open", "name": "Test 1"},
+ {"status": "Closed", "name": "Test 1"},
)
)
@@ -248,9 +249,7 @@ class TestDataManipulation(FrappeTestCase):
self.assertTrue(f'Test link 2' in html)
self.assertTrue(f'Test link 3' in html)
self.assertTrue(f'
' in html)
- self.assertTrue(
- f"style=\"background-image: url('{url}/assets/frappe/bg.jpg') !important\"" in html
- )
+ self.assertTrue(f"style=\"background-image: url('{url}/assets/frappe/bg.jpg') !important\"" in html)
self.assertTrue('email' in html)
@@ -370,9 +369,7 @@ class TestValidationUtils(FrappeTestCase):
# Scheme validation
self.assertFalse(validate_url("https://google.com", valid_schemes="http"))
self.assertTrue(validate_url("ftp://frappe.cloud", valid_schemes=["https", "ftp"]))
- self.assertFalse(
- validate_url("bolo://frappe.io", valid_schemes=("http", "https", "ftp", "ftps"))
- )
+ self.assertFalse(validate_url("bolo://frappe.io", valid_schemes=("http", "https", "ftp", "ftps")))
self.assertRaises(
frappe.ValidationError, validate_url, "gopher://frappe.io", valid_schemes="https", throw=True
)
@@ -391,14 +388,10 @@ class TestValidationUtils(FrappeTestCase):
self.assertFalse(validate_email_address("someone"))
self.assertFalse(validate_email_address("someone@----.com"))
self.assertFalse(validate_email_address("test 1@frappe.com"))
- self.assertFalse(
- validate_email_address("test@example.com test2@example.com,undisclosed-recipient")
- )
+ self.assertFalse(validate_email_address("test@example.com test2@example.com,undisclosed-recipient"))
# Invalid with throw
- self.assertRaises(
- frappe.InvalidEmailAddressError, validate_email_address, "someone.com", throw=True
- )
+ self.assertRaises(frappe.InvalidEmailAddressError, validate_email_address, "someone.com", throw=True)
self.assertEqual(validate_email_address("Some%20One@frappe.com"), "Some%20One@frappe.com")
self.assertEqual(
@@ -430,9 +423,7 @@ class TestValidationUtils(FrappeTestCase):
class TestImage(FrappeTestCase):
def test_strip_exif_data(self):
- original_image = Image.open(
- frappe.get_app_path("frappe", "tests", "data", "exif_sample_image.jpg")
- )
+ original_image = Image.open(frappe.get_app_path("frappe", "tests", "data", "exif_sample_image.jpg"))
original_image_content = open(
frappe.get_app_path("frappe", "tests", "data", "exif_sample_image.jpg"), mode="rb"
).read()
@@ -444,9 +435,7 @@ class TestImage(FrappeTestCase):
self.assertNotEqual(original_image._getexif(), new_image._getexif())
def test_optimize_image(self):
- image_file_path = frappe.get_app_path(
- "frappe", "tests", "data", "sample_image_for_optimization.jpg"
- )
+ image_file_path = frappe.get_app_path("frappe", "tests", "data", "sample_image_for_optimization.jpg")
content_type = guess_type(image_file_path)[0]
original_content = open(image_file_path, mode="rb").read()
@@ -540,20 +529,12 @@ class TestDateUtils(FrappeTestCase):
)
# Sunday as start of the week
- self.assertEqual(
- frappe.utils.get_first_day_of_week("2020-12-25"), frappe.utils.getdate("2020-12-20")
- )
- self.assertEqual(
- frappe.utils.get_first_day_of_week("2020-12-21"), frappe.utils.getdate("2020-12-20")
- )
+ self.assertEqual(frappe.utils.get_first_day_of_week("2020-12-25"), frappe.utils.getdate("2020-12-20"))
+ self.assertEqual(frappe.utils.get_first_day_of_week("2020-12-21"), frappe.utils.getdate("2020-12-20"))
def test_last_day_of_week(self):
- self.assertEqual(
- frappe.utils.get_last_day_of_week("2020-12-24"), frappe.utils.getdate("2020-12-26")
- )
- self.assertEqual(
- frappe.utils.get_last_day_of_week("2020-12-28"), frappe.utils.getdate("2021-01-02")
- )
+ self.assertEqual(frappe.utils.get_last_day_of_week("2020-12-24"), frappe.utils.getdate("2020-12-26"))
+ self.assertEqual(frappe.utils.get_last_day_of_week("2020-12-28"), frappe.utils.getdate("2021-01-02"))
def test_is_last_day_of_the_month(self):
self.assertEqual(frappe.utils.is_last_day_of_the_month("2020-12-24"), False)
@@ -600,7 +581,6 @@ class TestDateUtils(FrappeTestCase):
self.assertEqual(duration_to_seconds("110m"), 110 * 60)
def test_get_timespan_date_range(self):
-
supported_timespans = [
"last week",
"last month",
@@ -731,9 +711,7 @@ class TestTimeDeltaUtils(FrappeTestCase):
self.assertEqual(format_timedelta(timedelta(hours=10)), "10:00:00")
self.assertEqual(format_timedelta(timedelta(hours=100)), "100:00:00")
self.assertEqual(format_timedelta(timedelta(seconds=100, microseconds=129)), "0:01:40.000129")
- self.assertEqual(
- format_timedelta(timedelta(seconds=100, microseconds=12212199129)), "3:25:12.199129"
- )
+ self.assertEqual(format_timedelta(timedelta(seconds=100, microseconds=12212199129)), "3:25:12.199129")
def test_parse_timedelta(self):
self.assertEqual(parse_timedelta("0:0:0"), timedelta(seconds=0))
diff --git a/frappe/tests/test_website.py b/frappe/tests/test_website.py
index 4e768e5467..7ca2069fc6 100644
--- a/frappe/tests/test_website.py
+++ b/frappe/tests/test_website.py
@@ -167,9 +167,7 @@ class TestWebsite(FrappeTestCase):
dict(source=r"/testfrom", target=r"://testto1"),
dict(source=r"/testfromregex.*", target=r"://testto2"),
dict(source=r"/testsub/(.*)", target=r"://testto3/\1"),
- dict(
- source=r"/courses/course\?course=(.*)", target=r"/courses/\1", match_with_query_string=True
- ),
+ dict(source=r"/courses/course\?course=(.*)", target=r"/courses/\1", match_with_query_string=True),
dict(
source="/test307",
target="/test",
@@ -300,9 +298,7 @@ class TestWebsite(FrappeTestCase):
content = get_response_content("/_test/_test_folder/_test_page")
# test if {next} was rendered
- self.assertIn(
- 'Next: Test TOC', content
- )
+ self.assertIn('Next: Test TOC', content)
def test_colocated_assets(self):
content = get_response_content("/_test/_test_folder/_test_page")
@@ -413,7 +409,8 @@ class TestWebsite(FrappeTestCase):
)
self.assertIn('', content)
self.assertIn(
- '', content
+ '',
+ content,
)
delattr(frappe.local, "request")
frappe.set_user("Guest")
diff --git a/frappe/tests/tests_geo_utils.py b/frappe/tests/tests_geo_utils.py
index cecb0cf092..3ecf2dd8e5 100644
--- a/frappe/tests/tests_geo_utils.py
+++ b/frappe/tests/tests_geo_utils.py
@@ -41,14 +41,10 @@ class TestGeoUtils(FrappeTestCase):
self.assertEqual(coords, {"type": "FeatureCollection", "features": []})
def test_get_coords_from_not_existable_location(self):
- self.assertRaises(
- frappe.ValidationError, get_coords, "ToDo", self.test_filter_todo, "location_field"
- )
+ self.assertRaises(frappe.ValidationError, get_coords, "ToDo", self.test_filter_todo, "location_field")
def test_get_coords_from_not_existable_coords(self):
- self.assertRaises(
- frappe.ValidationError, get_coords, "ToDo", self.test_filter_todo, "coordinates"
- )
+ self.assertRaises(frappe.ValidationError, get_coords, "ToDo", self.test_filter_todo, "coordinates")
def tearDown(self):
self.todo.delete()
diff --git a/frappe/tests/ui_test_helpers.py b/frappe/tests/ui_test_helpers.py
index 9304da9a1d..e9746ae74c 100644
--- a/frappe/tests/ui_test_helpers.py
+++ b/frappe/tests/ui_test_helpers.py
@@ -242,9 +242,7 @@ def create_web_page(title, route, single_thread):
web_page = frappe.db.exists("Web Page", {"route": route})
if web_page:
return web_page
- web_page = frappe.get_doc(
- {"doctype": "Web Page", "title": title, "route": route, "published": True}
- )
+ web_page = frappe.get_doc({"doctype": "Web Page", "title": title, "route": route, "published": True})
web_page.save()
web_page.append(
@@ -401,7 +399,6 @@ def insert_translations():
@whitelist_for_tests
def create_blog_post():
-
blog_category = frappe.get_doc(
{"name": "general", "doctype": "Blog Category", "title": "general"}
).insert(ignore_if_duplicate=True)
diff --git a/frappe/tests/utils.py b/frappe/tests/utils.py
index d42a6d3893..9b667b016d 100644
--- a/frappe/tests/utils.py
+++ b/frappe/tests/utils.py
@@ -90,9 +90,7 @@ class FrappeTestCase(unittest.TestCase):
"""Formats SQL consistently so simple string comparisons can work on them."""
import sqlparse
- return (
- sqlparse.format(query.strip(), keyword_case="upper", reindent=True, strip_comments=True),
- )
+ return (sqlparse.format(query.strip(), keyword_case="upper", reindent=True, strip_comments=True),)
def assertQueryEqual(self, first: str, second: str):
self.assertEqual(self.normalize_sql(first), self.normalize_sql(second))
diff --git a/frappe/translate.py b/frappe/translate.py
index a0ee8001eb..e5527883f7 100644
--- a/frappe/translate.py
+++ b/frappe/translate.py
@@ -762,7 +762,6 @@ def update_translations(lang, untranslated_file, translated_file, app="_ALL_APPS
frappe.get_file_items(untranslated_file, ignore_empty_lines=False),
frappe.get_file_items(translated_file, ignore_empty_lines=False),
):
-
# undo hack in get_untranslated
translation_dict[restore_newlines(key)] = restore_newlines(value)
@@ -855,9 +854,7 @@ def write_translations_file(app, lang, full_dict=None, app_messages=None):
tpath = frappe.get_app_path(app, "translations")
frappe.create_folder(tpath)
- write_csv_file(
- os.path.join(tpath, lang + ".csv"), app_messages, full_dict or get_all_translations(lang)
- )
+ write_csv_file(os.path.join(tpath, lang + ".csv"), app_messages, full_dict or get_all_translations(lang))
def send_translations(translation_dict):
@@ -1000,7 +997,7 @@ def print_language(language: str):
```
with print_language("de"):
- html = frappe.get_print( ... )
+ html = frappe.get_print(...)
```
"""
if not language or language == frappe.local.lang:
diff --git a/frappe/twofactor.py b/frappe/twofactor.py
index a53ec27d06..ad422c0224 100644
--- a/frappe/twofactor.py
+++ b/frappe/twofactor.py
@@ -211,8 +211,7 @@ def process_2fa_for_sms(user, token, otp_secret):
status = send_token_via_sms(otp_secret, token=token, phone_no=phone)
return {
"token_delivery": status,
- "prompt": status
- and "Enter verification code sent to {}".format(phone[:4] + "******" + phone[-3:]),
+ "prompt": status and "Enter verification code sent to {}".format(phone[:4] + "******" + phone[-3:]),
"method": "SMS",
"setup": status,
}
@@ -247,9 +246,7 @@ def process_2fa_for_email(user, token, otp_secret, otp_issuer, method="Email"):
else:
"""Sending email verification"""
prompt = _("Verification code has been sent to your registered email address.")
- status = send_token_via_email(
- user, token, otp_secret, otp_issuer, subject=subject, message=message
- )
+ status = send_token_via_email(user, token, otp_secret, otp_issuer, subject=subject, message=message)
return {
"token_delivery": status,
"prompt": status and prompt,
@@ -397,9 +394,7 @@ def create_barcode_folder():
folder = frappe.db.exists("File", {"file_name": folder_name})
if folder:
return folder
- folder = frappe.get_doc(
- {"doctype": "File", "file_name": folder_name, "is_folder": 1, "folder": "Home"}
- )
+ folder = frappe.get_doc({"doctype": "File", "file_name": folder_name, "is_folder": 1, "folder": "Home"})
folder.insert(ignore_permissions=True)
return folder.name
diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py
index 6f91356427..c7cd1daf30 100644
--- a/frappe/utils/__init__.py
+++ b/frappe/utils/__init__.py
@@ -276,9 +276,7 @@ def get_gravatar_url(email: str, default: Literal["mm", "404"] = "mm") -> str:
If `default` is set to "404", gravatar URL will return 404 if no avatar is found.
If `default` is set to "mm", a placeholder image will be returned.
"""
- hexdigest = hashlib.md5(
- frappe.as_unicode(email).encode("utf-8"), usedforsecurity=False
- ).hexdigest()
+ hexdigest = hashlib.md5(frappe.as_unicode(email).encode("utf-8"), usedforsecurity=False).hexdigest()
return f"https://secure.gravatar.com/avatar/{hexdigest}?d={default}&s=200"
@@ -452,7 +450,7 @@ def execute_in_shell(cmd, verbose=False, low_priority=False, check_exit_code=Fal
# ensure it's properly escaped; only a single string argument executes via shell
cmd = shlex.join(cmd)
- with (tempfile.TemporaryFile() as stdout, tempfile.TemporaryFile() as stderr):
+ with tempfile.TemporaryFile() as stdout, tempfile.TemporaryFile() as stderr:
kwargs = {
"shell": True,
"stdout": stdout,
@@ -1031,7 +1029,7 @@ def groupby_metric(iterable: dict[str, list], key: str):
'india': [{'id':1, 'name': 'iplayer-1', 'ranking': 1}, {'id': 2, 'ranking': 1, 'name': 'iplayer-2'}, {'id': 2, 'ranking': 2, 'name': 'iplayer-3'}],
'Aus': [{'id':1, 'name': 'aplayer-1', 'ranking': 1}, {'id': 2, 'ranking': 1, 'name': 'aplayer-2'}, {'id': 2, 'ranking': 2, 'name': 'aplayer-3'}]
}
- >>> groupby(d, key='ranking')
+ >>> groupby(d, key="ranking")
{1: {'Aus': [{'id': 1, 'name': 'aplayer-1', 'ranking': 1},
{'id': 2, 'name': 'aplayer-2', 'ranking': 1}],
'india': [{'id': 1, 'name': 'iplayer-1', 'ranking': 1},
diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py
index 1283df7e7b..8e4313d10a 100755
--- a/frappe/utils/background_jobs.py
+++ b/frappe/utils/background_jobs.py
@@ -49,8 +49,7 @@ def get_queues_timeout():
"default": default_timeout,
"long": 1500,
**{
- worker: config.get("timeout", default_timeout)
- for worker, config in custom_workers_config.items()
+ worker: config.get("timeout", default_timeout) for worker, config in custom_workers_config.items()
},
}
@@ -163,9 +162,7 @@ def enqueue(
return enqueue_call()
-def enqueue_doc(
- doctype, name=None, method=None, queue="default", timeout=300, now=False, **kwargs
-):
+def enqueue_doc(doctype, name=None, method=None, queue="default", timeout=300, now=False, **kwargs):
"""Enqueue a method to be run on a document"""
return enqueue(
"frappe.utils.background_jobs.run_doc_method",
diff --git a/frappe/utils/backups.py b/frappe/utils/backups.py
index 40aba696f5..4f8ce825f4 100644
--- a/frappe/utils/backups.py
+++ b/frappe/utils/backups.py
@@ -283,13 +283,9 @@ class BackupGenerator:
return None
return file_path
- latest_backups = {
- file_type: get_latest(pattern) for file_type, pattern in file_type_slugs.items()
- }
+ latest_backups = {file_type: get_latest(pattern) for file_type, pattern in file_type_slugs.items()}
- recent_backups = {
- file_type: old_enough(file_name) for file_type, file_name in latest_backups.items()
- }
+ recent_backups = {file_type: old_enough(file_name) for file_type, file_name in latest_backups.items()}
return (
recent_backups.get("database"),
diff --git a/frappe/utils/boilerplate.py b/frappe/utils/boilerplate.py
index 5a721279bd..812f84c3b2 100644
--- a/frappe/utils/boilerplate.py
+++ b/frappe/utils/boilerplate.py
@@ -121,9 +121,7 @@ def _create_app_boilerplate(dest, hooks, no_git=False):
os.path.join(dest, hooks.app_name, hooks.app_name, frappe.scrub(hooks.app_title)),
with_init=True,
)
- frappe.create_folder(
- os.path.join(dest, hooks.app_name, hooks.app_name, "templates"), with_init=True
- )
+ frappe.create_folder(os.path.join(dest, hooks.app_name, hooks.app_name, "templates"), with_init=True)
frappe.create_folder(os.path.join(dest, hooks.app_name, hooks.app_name, "www"))
frappe.create_folder(
os.path.join(dest, hooks.app_name, hooks.app_name, "templates", "pages"), with_init=True
diff --git a/frappe/utils/caching.py b/frappe/utils/caching.py
index 9b359e9209..0093146c95 100644
--- a/frappe/utils/caching.py
+++ b/frappe/utils/caching.py
@@ -141,7 +141,6 @@ def redis_cache(ttl: int | None = 3600, user: str | bool | None = None) -> Calla
"""
def wrapper(func: Callable = None) -> Callable:
-
func_key = f"{func.__module__}.{func.__qualname__}"
def clear_cache():
diff --git a/frappe/utils/commands.py b/frappe/utils/commands.py
index 91de7ccfe1..6c01183ec9 100644
--- a/frappe/utils/commands.py
+++ b/frappe/utils/commands.py
@@ -8,9 +8,7 @@ def get_first_party_apps():
apps = []
for org in ["frappe", "erpnext"]:
- req = requests.get(
- f"https://api.github.com/users/{org}/repos", {"type": "sources", "per_page": 200}
- )
+ req = requests.get(f"https://api.github.com/users/{org}/repos", {"type": "sources", "per_page": 200})
if req.ok:
apps.extend([x["name"] for x in req.json()])
return apps
diff --git a/frappe/utils/csvutils.py b/frappe/utils/csvutils.py
index fdf530b58f..fd39fdd482 100644
--- a/frappe/utils/csvutils.py
+++ b/frappe/utils/csvutils.py
@@ -133,7 +133,9 @@ def check_record(d):
if docfield.fieldtype == "Select" and val and docfield.options:
if val not in docfield.options.split("\n"):
frappe.throw(
- _("{0} must be one of {1}").format(_(docfield.label), comma_or(docfield.options.split("\n")))
+ _("{0} must be one of {1}").format(
+ _(docfield.label), comma_or(docfield.options.split("\n"))
+ )
)
if val and docfield.fieldtype == "Date":
diff --git a/frappe/utils/data.py b/frappe/utils/data.py
index 612b9f191a..a7eebe9342 100644
--- a/frappe/utils/data.py
+++ b/frappe/utils/data.py
@@ -329,23 +329,17 @@ def month_diff(string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeO
return (ed_date.year - st_date.year) * 12 + ed_date.month - st_date.month + 1
-def time_diff(
- string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject
-) -> datetime.timedelta:
+def time_diff(string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject) -> datetime.timedelta:
"""Return the difference between given two dates as `datetime.timedelta` object."""
return get_datetime(string_ed_date) - get_datetime(string_st_date)
-def time_diff_in_seconds(
- string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject
-) -> float:
+def time_diff_in_seconds(string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject) -> float:
"""Return the difference between given two dates in seconds."""
return time_diff(string_ed_date, string_st_date).total_seconds()
-def time_diff_in_hours(
- string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject
-) -> float:
+def time_diff_in_hours(string_ed_date: DateTimeLikeObject, string_st_date: DateTimeLikeObject) -> float:
"""Return the difference between given two dates in hours."""
return round(float(time_diff(string_ed_date, string_st_date).total_seconds()) / 3600, 6)
@@ -460,9 +454,7 @@ def get_first_day(dt, d_years=0, d_months=0, as_str: Literal[True] = False) -> s
# TODO: first arg
-def get_first_day(
- dt, d_years: int = 0, d_months: int = 0, as_str: bool = False
-) -> str | datetime.date:
+def get_first_day(dt, d_years: int = 0, d_months: int = 0, as_str: bool = False) -> str | datetime.date:
"""Return the first day of the month for the date specified by date object.
Also, add `d_years` and `d_months` if specified.
@@ -481,9 +473,7 @@ def get_first_day(
@typing.overload
-def get_quarter_start(
- dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False
-) -> datetime.date:
+def get_quarter_start(dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False) -> datetime.date:
...
@@ -492,9 +482,7 @@ def get_quarter_start(dt: DateTimeLikeObject | None = None, as_str: Literal[True
...
-def get_quarter_start(
- dt: DateTimeLikeObject | None = None, as_str: bool = False
-) -> str | datetime.date:
+def get_quarter_start(dt: DateTimeLikeObject | None = None, as_str: bool = False) -> str | datetime.date:
"""Return the start date of the quarter for the given datetime like object (`dt`).
If `dt` is None, the current quarter start date is returned.
@@ -592,9 +580,7 @@ def is_last_day_of_the_month(dt):
@typing.overload
-def get_quarter_ending(
- dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False
-) -> datetime.date:
+def get_quarter_ending(dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False) -> datetime.date:
...
@@ -603,9 +589,7 @@ def get_quarter_ending(dt: DateTimeLikeObject | None = None, as_str: Literal[Tru
...
-def get_quarter_ending(
- date: DateTimeLikeObject | None = None, as_str=False
-) -> str | datetime.date:
+def get_quarter_ending(date: DateTimeLikeObject | None = None, as_str=False) -> str | datetime.date:
"""Return the end date of the quarter for the given datetime like object (`date`).
If `date` is None, the current quarter end date is returned.
@@ -626,9 +610,7 @@ def get_quarter_ending(
@typing.overload
-def get_year_ending(
- dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False
-) -> datetime.date:
+def get_year_ending(dt: DateTimeLikeObject | None = None, as_str: Literal[False] = False) -> datetime.date:
...
@@ -713,9 +695,7 @@ def get_user_time_format() -> str:
return frappe.local.user_time_format or "HH:mm:ss"
-def format_date(
- string_date=None, format_string: str | None = None, parse_day_first: bool = False
-) -> str:
+def format_date(string_date=None, format_string: str | None = None, parse_day_first: bool = False) -> str:
"""Convert the given string date to :data:`user_date_format`.
User format specified in defaults
@@ -874,9 +854,7 @@ def duration_to_seconds(duration):
def validate_duration_format(duration):
if not DURATION_PATTERN.match(duration):
frappe.throw(
- frappe._("Value {0} must be in the valid duration format: d h m s").format(
- frappe.bold(duration)
- )
+ frappe._("Value {0} must be in the valid duration format: d h m s").format(frappe.bold(duration))
)
@@ -984,9 +962,7 @@ def global_date_format(date: DateTimeLikeObject, format="long") -> str:
import babel.dates
date = getdate(date)
- return babel.dates.format_date(
- date, locale=(frappe.local.lang or "en").replace("-", "_"), format=format
- )
+ return babel.dates.format_date(date, locale=(frappe.local.lang or "en").replace("-", "_"), format=format)
def has_common(l1: typing.Hashable, l2: typing.Hashable) -> bool:
@@ -1091,9 +1067,7 @@ def flt(s: NumericType | str, precision: int | None = None) -> float:
...
-def flt(
- s: NumericType | str, precision: int | None = None, rounding_method: str | None = None
-) -> float:
+def flt(s: NumericType | str, precision: int | None = None, rounding_method: str | None = None) -> float:
"""Convert to float (ignoring commas in string).
:param s: Number in string or other numeric format.
@@ -1813,9 +1787,7 @@ def get_url(uri: str | None = None, full_address: bool = False) -> str:
def get_host_name_from_request() -> str:
"""Return the hostname (`request.host`) from the request headers."""
if hasattr(frappe.local, "request") and frappe.local.request and frappe.local.request.host:
- protocol = (
- "https://" if "https" == frappe.get_request_header("X-Forwarded-Proto", "") else "http://"
- )
+ protocol = "https://" if "https" == frappe.get_request_header("X-Forwarded-Proto", "") else "http://"
return protocol + frappe.local.request.host
@@ -1868,7 +1840,8 @@ def get_link_to_report(
for k, v in filters.items():
if isinstance(v, list):
conditions.extend(
- str(k) + "=" + '["' + str(value[0] + '"' + "," + '"' + str(value[1]) + '"]') for value in v
+ str(k) + "=" + '["' + str(value[0] + '"' + "," + '"' + str(value[1]) + '"]')
+ for value in v
)
else:
conditions.append(str(k) + "=" + str(v))
@@ -2060,7 +2033,6 @@ def get_filter(doctype: str, f: dict | list | tuple, filters_config=None) -> "fr
# verify fieldname belongs to the doctype
meta = frappe.get_meta(f.doctype)
if not meta.has_field(f.fieldname):
-
# try and match the doctype name from child tables
for df in meta.get_table_fields():
if frappe.get_meta(df.options).has_field(f.fieldname):
@@ -2390,9 +2362,7 @@ def get_user_info_for_avatar(user_id: str) -> _UserInfo:
return {"email": user_id, "image": "", "name": user_id}
-def validate_python_code(
- string: str, fieldname: str | None = None, is_expression: bool = True
-) -> None:
+def validate_python_code(string: str, fieldname: str | None = None, is_expression: bool = True) -> None:
"""Validate python code fields by using compile_command to ensure that expression is valid python.
args:
diff --git a/frappe/utils/dateutils.py b/frappe/utils/dateutils.py
index 217ce59ea9..73880d2907 100644
--- a/frappe/utils/dateutils.py
+++ b/frappe/utils/dateutils.py
@@ -54,9 +54,7 @@ def parse_date(date):
date = date.split(" ", 1)[0]
# why the sorting? checking should be done in a predictable order
- check_formats = [None] + sorted(
- list(dateformats), reverse=not get_user_date_format().startswith("dd")
- )
+ check_formats = [None] + sorted(list(dateformats), reverse=not get_user_date_format().startswith("dd"))
for f in check_formats:
try:
@@ -115,9 +113,7 @@ def get_dates_from_timegrain(from_date, to_date, timegrain="Daily"):
if "Weekly" == timegrain:
date = get_last_day_of_week(add_to_date(dates[-1], years=years, months=months, days=days))
else:
- date = get_period_ending(
- add_to_date(dates[-1], years=years, months=months, days=days), timegrain
- )
+ date = get_period_ending(add_to_date(dates[-1], years=years, months=months, days=days), timegrain)
dates.append(date)
return dates
diff --git a/frappe/utils/diff.py b/frappe/utils/diff.py
index 883f888a89..a140079bbe 100644
--- a/frappe/utils/diff.py
+++ b/frappe/utils/diff.py
@@ -7,10 +7,7 @@ from frappe.utils.data import cstr
@frappe.whitelist()
-def get_version_diff(
- from_version: int | str, to_version: int | str, fieldname: str = "script"
-) -> list[str]:
-
+def get_version_diff(from_version: int | str, to_version: int | str, fieldname: str = "script") -> list[str]:
before, before_timestamp = _get_value_from_version(from_version, fieldname)
after, after_timestamp = _get_value_from_version(to_version, fieldname)
diff --git a/frappe/utils/error.py b/frappe/utils/error.py
index 6cee88598e..d1f326cb88 100644
--- a/frappe/utils/error.py
+++ b/frappe/utils/error.py
@@ -33,9 +33,7 @@ def _is_ldap_exception(e):
return False
-def log_error(
- title=None, message=None, reference_doctype=None, reference_name=None, *, defer_insert=False
-):
+def log_error(title=None, message=None, reference_doctype=None, reference_name=None, *, defer_insert=False):
"""Log error to Error Log"""
from frappe.monitor import get_trace_id
from frappe.utils.sentry import capture_exception
@@ -79,7 +77,6 @@ def log_error(
def log_error_snapshot(exception: Exception):
-
if isinstance(exception, EXCLUDE_EXCEPTIONS) or _is_ldap_exception(exception):
return
@@ -95,9 +92,7 @@ def log_error_snapshot(exception: Exception):
def get_default_args(func):
"""Get default arguments of a function from its signature."""
signature = inspect.signature(func)
- return {
- k: v.default for k, v in signature.parameters.items() if v.default is not inspect.Parameter.empty
- }
+ return {k: v.default for k, v in signature.parameters.items() if v.default is not inspect.Parameter.empty}
def raise_error_on_no_output(error_message, error_type=None, keep_quiet=None):
@@ -113,8 +108,8 @@ def raise_error_on_no_output(error_message, error_type=None, keep_quiet=None):
:type keep_quiet: function
>>> @raise_error_on_no_output("Ingradients missing")
- ... def get_indradients(_raise_error=1): return
- ...
+ ... def get_indradients(_raise_error=1):
+ ... return
>>> get_ingradients()
`Exception Name`: Ingradients missing
"""
diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py
index 05c05e1f1b..9aafeb6dfa 100644
--- a/frappe/utils/file_manager.py
+++ b/frappe/utils/file_manager.py
@@ -243,9 +243,7 @@ def write_file(content, fname, is_private=0):
def remove_all(dt, dn, from_delete=False, delete_permanently=False):
"""remove all files in a transaction"""
try:
- for fid in frappe.get_all(
- "File", {"attached_to_doctype": dt, "attached_to_name": dn}, pluck="name"
- ):
+ for fid in frappe.get_all("File", {"attached_to_doctype": dt, "attached_to_name": dn}, pluck="name"):
if from_delete:
# If deleting a doc, directly delete files
frappe.delete_doc("File", fid, ignore_permissions=True, delete_permanently=delete_permanently)
@@ -273,9 +271,7 @@ def remove_file(
"""Remove file and File entry"""
file_name = None
if not (attached_to_doctype and attached_to_name):
- attached = frappe.db.get_value(
- "File", fid, ["attached_to_doctype", "attached_to_name", "file_name"]
- )
+ attached = frappe.db.get_value("File", fid, ["attached_to_doctype", "attached_to_name", "file_name"])
if attached:
attached_to_doctype, attached_to_name, file_name = attached
diff --git a/frappe/utils/fixtures.py b/frappe/utils/fixtures.py
index 120d452cc0..2a9fb541b6 100644
--- a/frappe/utils/fixtures.py
+++ b/frappe/utils/fixtures.py
@@ -67,9 +67,7 @@ def export_fixtures(app=None):
else:
apps = frappe.get_installed_apps()
for app in apps:
- fixture_auto_order = bool(
- next(iter(frappe.get_hooks("fixture_auto_order", app_name=app)), False)
- )
+ fixture_auto_order = bool(next(iter(frappe.get_hooks("fixture_auto_order", app_name=app)), False))
fixtures = frappe.get_hooks("fixtures", app_name=app)
for index, fixture in enumerate(fixtures, start=1):
filters = None
diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py
index 1f5af30d6a..cef7ab2188 100644
--- a/frappe/utils/global_search.py
+++ b/frappe/utils/global_search.py
@@ -55,8 +55,7 @@ def get_doctypes_with_global_search(with_child_tables=True):
doctypes = [
d.name
for d in global_search_doctypes
- if module_app.get(frappe.scrub(d.module))
- and module_app[frappe.scrub(d.module)] in installed_apps
+ if module_app.get(frappe.scrub(d.module)) and module_app[frappe.scrub(d.module)] in installed_apps
]
return doctypes
@@ -196,7 +195,9 @@ def get_children_data(doctype, meta):
child_search_fields.setdefault(child.options, search_fields)
child_fieldnames = get_selected_fields(child_meta, search_fields)
child_records = frappe.get_all(
- child.options, fields=child_fieldnames, filters={"docstatus": ["!=", 1], "parenttype": doctype}
+ child.options,
+ fields=child_fieldnames,
+ filters={"docstatus": ["!=", 1], "parenttype": doctype},
)
for record in child_records:
@@ -220,15 +221,11 @@ def insert_values_for_multiple_docs(all_contents):
{
"mariadb": """INSERT IGNORE INTO `__global_search`
(doctype, name, content, published, title, route)
- VALUES {} """.format(
- ", ".join(batch_values)
- ),
+ VALUES {} """.format(", ".join(batch_values)),
"postgres": """INSERT INTO `__global_search`
(doctype, name, content, published, title, route)
VALUES {}
- ON CONFLICT("name", "doctype") DO NOTHING""".format(
- ", ".join(batch_values)
- ),
+ ON CONFLICT("name", "doctype") DO NOTHING""".format(", ".join(batch_values)),
}
)
@@ -242,11 +239,7 @@ def update_global_search(doc):
if frappe.local.conf.get("disable_global_search"):
return
- if (
- doc.docstatus > 1
- or (doc.meta.has_field("enabled") and not doc.get("enabled"))
- or doc.get("disabled")
- ):
+ if doc.docstatus > 1 or (doc.meta.has_field("enabled") and not doc.get("enabled")) or doc.get("disabled"):
return
content = [
@@ -404,9 +397,7 @@ def sync_values(values: list):
GlobalSearch = frappe.qb.Table("__global_search")
conflict_fields = ["content", "published", "title", "route"]
- query = (
- frappe.qb.into(GlobalSearch).columns(["doctype", "name"] + conflict_fields).insert(*values)
- )
+ query = frappe.qb.into(GlobalSearch).columns(["doctype", "name"] + conflict_fields).insert(*values)
if frappe.db.db_type == "postgres":
query = query.on_conflict(GlobalSearch.doctype, GlobalSearch.name)
@@ -561,9 +552,7 @@ def web_search(text: str, scope: str | None = None, start: int = 0, limit: int =
mariadb_conditions += "MATCH(`content`) AGAINST ({} IN BOOLEAN MODE)".format(
frappe.db.escape("+" + text + "*")
)
- postgres_conditions += 'TO_TSVECTOR("content") @@ PLAINTO_TSQUERY({})'.format(
- frappe.db.escape(text)
- )
+ postgres_conditions += f'TO_TSVECTOR("content") @@ PLAINTO_TSQUERY({frappe.db.escape(text)})'
values = {"scope": "".join([scope, "%"]) if scope else "", "limit": limit, "start": start}
diff --git a/frappe/utils/image.py b/frappe/utils/image.py
index e9b04bf7bd..1d16ee690a 100644
--- a/frappe/utils/image.py
+++ b/frappe/utils/image.py
@@ -46,9 +46,7 @@ def strip_exif_data(content, content_type) -> bytes:
return content
-def optimize_image(
- content, content_type, max_width=1024, max_height=768, optimize=True, quality=85
-):
+def optimize_image(content, content_type, max_width=1024, max_height=768, optimize=True, quality=85):
if content_type == "image/svg+xml":
return content
diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py
index 5ccfdf6ff6..21cdb29d0c 100644
--- a/frappe/utils/jinja.py
+++ b/frappe/utils/jinja.py
@@ -122,7 +122,9 @@ def get_jloader():
apps = frappe.get_hooks("template_apps")
if not apps:
apps = list(
- reversed(frappe.local.flags.web_pages_apps or frappe.get_installed_apps(_ensure_on_bench=True))
+ reversed(
+ frappe.local.flags.web_pages_apps or frappe.get_installed_apps(_ensure_on_bench=True)
+ )
)
if "frappe" not in apps:
diff --git a/frappe/utils/lazy_loader.py b/frappe/utils/lazy_loader.py
index c22d679edd..59394d8672 100644
--- a/frappe/utils/lazy_loader.py
+++ b/frappe/utils/lazy_loader.py
@@ -10,8 +10,8 @@ def lazy_import(name, package=None):
$ cat mod.py
print("Loading mod.py")
$ python -i lazy_loader.py
- >>> mod = lazy_import("mod") # Module is not loaded
- >>> mod.__str__() # module is loaded on accessing attribute
+ >>> mod = lazy_import("mod") # Module is not loaded
+ >>> mod.__str__() # module is loaded on accessing attribute
Loading mod.py
""
>>>
diff --git a/frappe/utils/make_random.py b/frappe/utils/make_random.py
index e0bf31b3d4..381f2266a3 100644
--- a/frappe/utils/make_random.py
+++ b/frappe/utils/make_random.py
@@ -36,9 +36,7 @@ def add_random_children(doc: "Document", fieldname: str, rows, randomize: dict,
def get_random(doctype: str, filters: dict = None, doc: bool = False):
condition = []
if filters:
- condition.extend(
- "{}='{}'".format(key, str(val).replace("'", "'")) for key, val in filters.items()
- )
+ condition.extend("{}='{}'".format(key, str(val).replace("'", "'")) for key, val in filters.items())
condition = " where " + " and ".join(condition) if condition else ""
out = frappe.db.multisql(
diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py
index 60565581c9..41c2b378fb 100644
--- a/frappe/utils/nestedset.py
+++ b/frappe/utils/nestedset.py
@@ -89,15 +89,11 @@ def update_add_node(doc, parent, parent_field):
frappe.qb.update(Table).set(Table.rgt, Table.rgt + 2).where(Table.rgt >= right).run()
frappe.qb.update(Table).set(Table.lft, Table.lft + 2).where(Table.lft >= right).run()
- if (
- frappe.qb.from_(Table).select("*").where((Table.lft == right) | (Table.rgt == right + 1)).run()
- ):
+ if frappe.qb.from_(Table).select("*").where((Table.lft == right) | (Table.rgt == right + 1)).run():
frappe.throw(_("Nested set error. Please contact the Administrator."))
# update index of new node
- frappe.qb.update(Table).set(Table.lft, right).set(Table.rgt, right + 1).where(
- Table.name == name
- ).run()
+ frappe.qb.update(Table).set(Table.lft, right).set(Table.rgt, right + 1).where(Table.name == name).run()
return right
@@ -162,9 +158,9 @@ def update_move_node(doc: Document, parent_field: str):
new_diff = max_rgt + 1 - doc.lft
# bring back from dark side
- frappe.qb.update(Table).set(Table.lft, -Table.lft + new_diff).set(
- Table.rgt, -Table.rgt + new_diff
- ).where(Table.lft < 0).run()
+ frappe.qb.update(Table).set(Table.lft, -Table.lft + new_diff).set(Table.rgt, -Table.rgt + new_diff).where(
+ Table.lft < 0
+ ).run()
@frappe.whitelist()
@@ -228,9 +224,7 @@ def rebuild_node(doctype, parent, left, parent_field):
def validate_loop(doctype, name, lft, rgt):
"""check if item not an ancestor (loop)"""
- if name in frappe.get_all(
- doctype, filters={"lft": ["<=", lft], "rgt": [">=", rgt]}, pluck="name"
- ):
+ if name in frappe.get_all(doctype, filters={"lft": ["<=", lft], "rgt": [">=", rgt]}, pluck="name"):
frappe.throw(_("Item cannot be added to its own descendants"), NestedSetRecursionError)
@@ -354,9 +348,7 @@ class NestedSet(Document):
def get_children(self) -> Iterator["NestedSet"]:
"""Return a generator that yields child Documents."""
- child_names = frappe.get_list(
- self.doctype, filters={self.nsm_parent_field: self.name}, pluck="name"
- )
+ child_names = frappe.get_list(self.doctype, filters={self.nsm_parent_field: self.name}, pluck="name")
for name in child_names:
yield frappe.get_doc(self.doctype, name)
@@ -369,9 +361,7 @@ def get_root_of(doctype):
t1 = Table.as_("t1")
t2 = Table.as_("t2")
- node_query = SubQuery(
- frappe.qb.from_(t2).select(Count("*")).where((t2.lft < t1.lft) & (t2.rgt > t1.rgt))
- )
+ node_query = SubQuery(frappe.qb.from_(t2).select(Count("*")).where((t2.lft < t1.lft) & (t2.rgt > t1.rgt)))
result = frappe.qb.from_(t1).select(t1.name).where((node_query == 0) & (t1.rgt > t1.lft)).run()
return result[0][0] if result else None
diff --git a/frappe/utils/oauth.py b/frappe/utils/oauth.py
index f339398678..c077b475ce 100644
--- a/frappe/utils/oauth.py
+++ b/frappe/utils/oauth.py
@@ -115,17 +115,12 @@ def login_via_oauth2(provider: str, code: str, state: str, decoder: Callable | N
login_oauth_user(info, provider=provider, state=state)
-def login_via_oauth2_id_token(
- provider: str, code: str, state: str, decoder: Callable | None = None
-):
+def login_via_oauth2_id_token(provider: str, code: str, state: str, decoder: Callable | None = None):
info = get_info_via_oauth(provider, code, decoder, id_token=True)
login_oauth_user(info, provider=provider, state=state)
-def get_info_via_oauth(
- provider: str, code: str, decoder: Callable | None = None, id_token: bool = False
-):
-
+def get_info_via_oauth(provider: str, code: str, decoder: Callable | None = None, id_token: bool = False):
import jwt
flow = get_oauth2_flow(provider)
@@ -212,9 +207,7 @@ def login_oauth_user(
if frappe.utils.cint(generate_login_token):
login_token = frappe.generate_hash(length=32)
- frappe.cache.set_value(
- f"login_token:{login_token}", frappe.local.session.sid, expires_in_sec=120
- )
+ frappe.cache.set_value(f"login_token:{login_token}", frappe.local.session.sid, expires_in_sec=120)
frappe.response["login_token"] = login_token
@@ -314,9 +307,7 @@ def get_email(data: dict) -> str:
return data.get("email") or data.get("upn") or data.get("unique_name")
-def redirect_post_login(
- desk_user: bool, redirect_to: str | None = None, provider: str | None = None
-):
+def redirect_post_login(desk_user: bool, redirect_to: str | None = None, provider: str | None = None):
frappe.local.response["type"] = "redirect"
if not redirect_to:
diff --git a/frappe/utils/password_strength.py b/frappe/utils/password_strength.py
index 5b77eca4dd..68313dbfa0 100644
--- a/frappe/utils/password_strength.py
+++ b/frappe/utils/password_strength.py
@@ -146,9 +146,7 @@ def get_match_feedback(match: "_Match", is_sole_match: bool) -> "PasswordStrengt
return pattern_fn()
-def get_dictionary_match_feedback(
- match: "_Match", is_sole_match: bool
-) -> "PasswordStrengthFeedback":
+def get_dictionary_match_feedback(match: "_Match", is_sole_match: bool) -> "PasswordStrengthFeedback":
"""Return feedback for a match that is found in a dictionary."""
warning = ""
suggestions = []
diff --git a/frappe/utils/pdf.py b/frappe/utils/pdf.py
index 8b521dec05..2d9b1c78a9 100644
--- a/frappe/utils/pdf.py
+++ b/frappe/utils/pdf.py
@@ -67,9 +67,7 @@ def _guess_template_error_line_number(template) -> int | None:
def pdf_footer_html(soup, head, content, styles, html_id, css):
- return pdf_header_html(
- soup=soup, head=head, content=content, styles=styles, html_id=html_id, css=css
- )
+ return pdf_header_html(soup=soup, head=head, content=content, styles=styles, html_id=html_id, css=css)
def get_pdf(html, options=None, output: PdfWriter | None = None):
@@ -121,7 +119,6 @@ def get_pdf(html, options=None, output: PdfWriter | None = None):
def get_file_data_from_writer(writer_obj):
-
# https://docs.python.org/3/library/io.html
stream = io.BytesIO()
writer_obj.write(stream)
diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py
index e229f64b6d..bfa2577871 100644
--- a/frappe/utils/print_format.py
+++ b/frappe/utils/print_format.py
@@ -19,9 +19,7 @@ from frappe.www.printview import validate_print_permission
@frappe.whitelist()
-def download_multi_pdf(
- doctype, name, format=None, no_letterhead=False, letterhead=None, options=None
-):
+def download_multi_pdf(doctype, name, format=None, no_letterhead=False, letterhead=None, options=None):
"""Return a PDF compiled by concatenating multiple documents.
The documents can be from a single DocType or multiple DocTypes.
@@ -119,9 +117,7 @@ def read_multi_pdf(output: PdfWriter) -> bytes:
@frappe.whitelist(allow_guest=True)
-def download_pdf(
- doctype, name, format=None, doc=None, no_letterhead=0, language=None, letterhead=None
-):
+def download_pdf(doctype, name, format=None, doc=None, no_letterhead=0, language=None, letterhead=None):
doc = doc or frappe.get_doc(doctype, name)
validate_print_permission(doc)
@@ -130,9 +126,7 @@ def download_pdf(
doctype, name, format, doc=doc, as_pdf=True, letterhead=letterhead, no_letterhead=no_letterhead
)
- frappe.local.response.filename = "{name}.pdf".format(
- name=name.replace(" ", "-").replace("/", "-")
- )
+ frappe.local.response.filename = "{name}.pdf".format(name=name.replace(" ", "-").replace("/", "-"))
frappe.local.response.filecontent = pdf_file
frappe.local.response.type = "pdf"
diff --git a/frappe/utils/redis_queue.py b/frappe/utils/redis_queue.py
index b045be3ab1..6110d024c9 100644
--- a/frappe/utils/redis_queue.py
+++ b/frappe/utils/redis_queue.py
@@ -30,9 +30,7 @@ class RedisQueue:
username = "default"
conn = cls.get_connection(username, cur_password)
password = "+" + (new_password or conn.acl_genpass())
- conn.acl_setuser(
- username=username, enabled=True, reset_passwords=reset_passwords, passwords=password
- )
+ conn.acl_setuser(username=username, enabled=True, reset_passwords=reset_passwords, passwords=password)
return password[1:]
@classmethod
diff --git a/frappe/utils/response.py b/frappe/utils/response.py
index 116f3cd611..8aa63ba990 100644
--- a/frappe/utils/response.py
+++ b/frappe/utils/response.py
@@ -232,18 +232,14 @@ def json_handler(obj):
return repr(obj)
else:
- raise TypeError(
- f"""Object of type {type(obj)} with value of {repr(obj)} is not JSON serializable"""
- )
+ raise TypeError(f"""Object of type {type(obj)} with value of {repr(obj)} is not JSON serializable""")
def as_page():
"""print web page"""
from frappe.website.serve import get_response
- return get_response(
- frappe.response["route"], http_status_code=frappe.response.get("http_status_code")
- )
+ return get_response(frappe.response["route"], http_status_code=frappe.response.get("http_status_code"))
def redirect():
diff --git a/frappe/utils/safe_exec.py b/frappe/utils/safe_exec.py
index a3f313cb77..e68259d893 100644
--- a/frappe/utils/safe_exec.py
+++ b/frappe/utils/safe_exec.py
@@ -86,7 +86,6 @@ def safe_exec(
script_filename: str | None = None,
):
if not is_safe_exec_enabled():
-
msg = _("Server Scripts are disabled. Please enable server scripts from bench configuration.")
docs_cta = _("Read the documentation to know more")
msg += f"
{docs_cta}"
@@ -338,9 +337,7 @@ def call_whitelisted_function(function, **kwargs):
def run_script(script, **kwargs):
"""run another server script"""
- return call_with_form_dict(
- lambda: frappe.get_doc("Server Script", script).execute_method(), kwargs
- )
+ return call_with_form_dict(lambda: frappe.get_doc("Server Script", script).execute_method(), kwargs)
def call_with_form_dict(function, kwargs):
diff --git a/frappe/utils/scheduler.py b/frappe/utils/scheduler.py
index ca2950a156..6f9ce6b010 100755
--- a/frappe/utils/scheduler.py
+++ b/frappe/utils/scheduler.py
@@ -179,9 +179,7 @@ def is_dormant(check_time=None):
def _get_last_modified_timestamp(doctype):
- timestamp = frappe.db.get_value(
- doctype, filters={}, fieldname="modified", order_by="modified desc"
- )
+ timestamp = frappe.db.get_value(doctype, filters={}, fieldname="modified", order_by="modified desc")
if timestamp:
return get_datetime(timestamp)
diff --git a/frappe/utils/typing_validations.py b/frappe/utils/typing_validations.py
index cd8e736fe6..ce521e996c 100644
--- a/frappe/utils/typing_validations.py
+++ b/frappe/utils/typing_validations.py
@@ -52,9 +52,7 @@ def qualified_name(obj) -> str:
return f"{module}.{qualname}"
-def raise_type_error(
- arg_name: str, arg_type: type, arg_value: object, current_exception: Exception = None
-):
+def raise_type_error(arg_name: str, arg_type: type, arg_value: object, current_exception: Exception = None):
"""
Raise a TypeError with a message that includes the name of the argument, the expected type
and the actual type of the value passed.
diff --git a/frappe/utils/weasyprint.py b/frappe/utils/weasyprint.py
index 8b633bf57c..af9778ed49 100644
--- a/frappe/utils/weasyprint.py
+++ b/frappe/utils/weasyprint.py
@@ -14,9 +14,7 @@ def download_pdf(doctype, name, print_format, letterhead=None):
generator = PrintFormatGenerator(print_format, doc, letterhead)
pdf = generator.render_pdf()
- frappe.local.response.filename = "{name}.pdf".format(
- name=name.replace(" ", "-").replace("/", "-")
- )
+ frappe.local.response.filename = "{name}.pdf".format(name=name.replace(" ", "-").replace("/", "-"))
frappe.local.response.filecontent = pdf
frappe.local.response.type = "pdf"
@@ -89,9 +87,7 @@ class PrintFormatGenerator:
return self.get_main_html()
def get_main_html(self):
- self.context.css = frappe.render_template(
- "templates/print_format/print_format.css", self.context
- )
+ self.context.css = frappe.render_template("templates/print_format/print_format.css", self.context)
return frappe.render_template("templates/print_format/print_format.html", self.context)
def get_header_footer_html(self):
diff --git a/frappe/website/doctype/about_us_settings/about_us_settings.py b/frappe/website/doctype/about_us_settings/about_us_settings.py
index 4860a533b1..5bc7351c15 100644
--- a/frappe/website/doctype/about_us_settings/about_us_settings.py
+++ b/frappe/website/doctype/about_us_settings/about_us_settings.py
@@ -27,6 +27,7 @@ class AboutUsSettings(Document):
team_members_heading: DF.Data | None
team_members_subtitle: DF.SmallText | None
# end: auto-generated types
+
def on_update(self):
from frappe.website.utils import clear_cache
diff --git a/frappe/website/doctype/about_us_team_member/about_us_team_member.py b/frappe/website/doctype/about_us_team_member/about_us_team_member.py
index 777e139174..29436c3dd0 100644
--- a/frappe/website/doctype/about_us_team_member/about_us_team_member.py
+++ b/frappe/website/doctype/about_us_team_member/about_us_team_member.py
@@ -23,4 +23,5 @@ class AboutUsTeamMember(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/blog_category/blog_category.py b/frappe/website/doctype/blog_category/blog_category.py
index a3b584af4a..fac00370f6 100644
--- a/frappe/website/doctype/blog_category/blog_category.py
+++ b/frappe/website/doctype/blog_category/blog_category.py
@@ -20,6 +20,7 @@ class BlogCategory(WebsiteGenerator):
route: DF.Data | None
title: DF.Data
# end: auto-generated types
+
def autoname(self):
# to override autoname of WebsiteGenerator
self.name = self.scrub(self.title)
diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py
index a59ae89764..f2e39d0a19 100644
--- a/frappe/website/doctype/blog_post/blog_post.py
+++ b/frappe/website/doctype/blog_post/blog_post.py
@@ -53,8 +53,8 @@ class BlogPost(WebsiteGenerator):
read_time: DF.Int
route: DF.Data | None
title: DF.Data
-
# end: auto-generated types
+
@frappe.whitelist()
def make_route(self):
if not self.route:
@@ -301,17 +301,13 @@ def get_blog_categories():
def clear_blog_cache():
- for blog in frappe.db.get_list(
- "Blog Post", fields=["route"], pluck="route", filters={"published": True}
- ):
+ for blog in frappe.db.get_list("Blog Post", fields=["route"], pluck="route", filters={"published": True}):
clear_cache(blog)
clear_cache("writers")
-def get_blog_list(
- doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None
-):
+def get_blog_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by=None):
conditions = []
if filters and filters.get("blog_category"):
category = filters.get("blog_category")
diff --git a/frappe/website/doctype/blog_post/test_blog_post.py b/frappe/website/doctype/blog_post/test_blog_post.py
index 760989d635..b11f2f3497 100644
--- a/frappe/website/doctype/blog_post/test_blog_post.py
+++ b/frappe/website/doctype/blog_post/test_blog_post.py
@@ -182,9 +182,7 @@ def make_test_blog(category_title="Test Blog Category"):
if not frappe.db.exists("Blog Category", category_name):
frappe.get_doc(dict(doctype="Blog Category", title=category_title)).insert()
if not frappe.db.exists("Blogger", "test-blogger"):
- frappe.get_doc(
- dict(doctype="Blogger", short_name="test-blogger", full_name="Test Blogger")
- ).insert()
+ frappe.get_doc(dict(doctype="Blogger", short_name="test-blogger", full_name="Test Blogger")).insert()
return frappe.get_doc(
dict(
diff --git a/frappe/website/doctype/blog_settings/blog_settings.py b/frappe/website/doctype/blog_settings/blog_settings.py
index 741f3ff951..57401fcf6b 100644
--- a/frappe/website/doctype/blog_settings/blog_settings.py
+++ b/frappe/website/doctype/blog_settings/blog_settings.py
@@ -30,6 +30,7 @@ class BlogSettings(Document):
subtitle: DF.Data | None
title: DF.Data | None
# end: auto-generated types
+
def on_update(self):
from frappe.website.utils import clear_cache
diff --git a/frappe/website/doctype/blogger/blogger.py b/frappe/website/doctype/blogger/blogger.py
index ce23993d42..2bd7b75fe8 100644
--- a/frappe/website/doctype/blogger/blogger.py
+++ b/frappe/website/doctype/blogger/blogger.py
@@ -24,6 +24,7 @@ class Blogger(Document):
short_name: DF.Data
user: DF.Link | None
# end: auto-generated types
+
def validate(self):
if self.user and not frappe.db.exists("User", self.user):
# for data import
diff --git a/frappe/website/doctype/color/color.py b/frappe/website/doctype/color/color.py
index 78e4eba589..463bca3946 100644
--- a/frappe/website/doctype/color/color.py
+++ b/frappe/website/doctype/color/color.py
@@ -16,4 +16,5 @@ class Color(Document):
color: DF.Color
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/company_history/company_history.py b/frappe/website/doctype/company_history/company_history.py
index 16036b095e..2aece56fe9 100644
--- a/frappe/website/doctype/company_history/company_history.py
+++ b/frappe/website/doctype/company_history/company_history.py
@@ -22,4 +22,5 @@ class CompanyHistory(Document):
parenttype: DF.Data
year: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/contact_us_settings/contact_us_settings.py b/frappe/website/doctype/contact_us_settings/contact_us_settings.py
index a0e181b8f7..80805ee907 100644
--- a/frappe/website/doctype/contact_us_settings/contact_us_settings.py
+++ b/frappe/website/doctype/contact_us_settings/contact_us_settings.py
@@ -32,6 +32,7 @@ class ContactUsSettings(Document):
skype: DF.Data | None
state: DF.Data | None
# end: auto-generated types
+
def on_update(self):
from frappe.website.utils import clear_cache
diff --git a/frappe/website/doctype/discussion_reply/discussion_reply.py b/frappe/website/doctype/discussion_reply/discussion_reply.py
index 3bc1bb17e9..9067b1f956 100644
--- a/frappe/website/doctype/discussion_reply/discussion_reply.py
+++ b/frappe/website/doctype/discussion_reply/discussion_reply.py
@@ -18,6 +18,7 @@ class DiscussionReply(Document):
reply: DF.TextEditor | None
topic: DF.Link | None
# end: auto-generated types
+
def on_update(self):
frappe.publish_realtime(
event="update_message",
diff --git a/frappe/website/doctype/discussion_topic/discussion_topic.py b/frappe/website/doctype/discussion_topic/discussion_topic.py
index 45e15e9537..b4a4573bf1 100644
--- a/frappe/website/doctype/discussion_topic/discussion_topic.py
+++ b/frappe/website/doctype/discussion_topic/discussion_topic.py
@@ -18,12 +18,12 @@ class DiscussionTopic(Document):
reference_doctype: DF.Link | None
title: DF.Data | None
# end: auto-generated types
+
pass
@frappe.whitelist()
def submit_discussion(doctype, docname, reply, title, topic_name=None, reply_name=None):
-
if reply_name:
doc = frappe.get_doc("Discussion Reply", reply_name)
doc.reply = reply
diff --git a/frappe/website/doctype/help_category/help_category.py b/frappe/website/doctype/help_category/help_category.py
index 10efcb30e7..48e26c5af5 100644
--- a/frappe/website/doctype/help_category/help_category.py
+++ b/frappe/website/doctype/help_category/help_category.py
@@ -21,6 +21,7 @@ class HelpCategory(WebsiteGenerator):
published: DF.Check
route: DF.Data | None
# end: auto-generated types
+
website = frappe._dict(condition_field="published", page_title_field="category_name")
def before_insert(self):
diff --git a/frappe/website/doctype/marketing_campaign/marketing_campaign.py b/frappe/website/doctype/marketing_campaign/marketing_campaign.py
index b3967d9c92..26ae1c427e 100644
--- a/frappe/website/doctype/marketing_campaign/marketing_campaign.py
+++ b/frappe/website/doctype/marketing_campaign/marketing_campaign.py
@@ -16,4 +16,5 @@ class MarketingCampaign(Document):
campaign_description: DF.SmallText | None
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py b/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py
index 6b166d2a14..51f0b36909 100644
--- a/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py
+++ b/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py
@@ -29,8 +29,8 @@ class PersonalDataDeletionRequest(Document):
deletion_steps: DF.Table[PersonalDataDeletionStep]
email: DF.Data
status: DF.Literal["Pending Verification", "Pending Approval", "On Hold", "Deleted"]
-
# end: auto-generated types
+
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -237,7 +237,6 @@ class PersonalDataDeletionRequest(Document):
filter_by_meta = meta.get_field(filter_by)
if filter_by_meta and filter_by_meta.fieldtype != "Link":
-
if self.email in doc[filter_by]:
value = re.sub(self.full_name_regex, self.anonymization_value_map["Data"], doc[filter_by])
value = re.sub(self.email_regex, self.anon, value)
diff --git a/frappe/website/doctype/personal_data_deletion_request/test_personal_data_deletion_request.py b/frappe/website/doctype/personal_data_deletion_request/test_personal_data_deletion_request.py
index a892b6f379..1bef4f2611 100644
--- a/frappe/website/doctype/personal_data_deletion_request/test_personal_data_deletion_request.py
+++ b/frappe/website/doctype/personal_data_deletion_request/test_personal_data_deletion_request.py
@@ -49,9 +49,9 @@ class TestPersonalDataDeletionRequest(FrappeTestCase):
self.assertEqual(self.delete_request.status, "Deleted")
def test_unverified_record_removal(self):
- date_time_obj = datetime.strptime(
- self.delete_request.creation, "%Y-%m-%d %H:%M:%S.%f"
- ) + timedelta(days=-7)
+ date_time_obj = datetime.strptime(self.delete_request.creation, "%Y-%m-%d %H:%M:%S.%f") + timedelta(
+ days=-7
+ )
self.delete_request.db_set("creation", date_time_obj)
self.delete_request.db_set("status", "Pending Verification")
@@ -60,9 +60,9 @@ class TestPersonalDataDeletionRequest(FrappeTestCase):
def test_process_auto_request(self):
frappe.db.set_single_value("Website Settings", "auto_account_deletion", "1")
- date_time_obj = datetime.strptime(
- self.delete_request.creation, "%Y-%m-%d %H:%M:%S.%f"
- ) + timedelta(hours=-2)
+ date_time_obj = datetime.strptime(self.delete_request.creation, "%Y-%m-%d %H:%M:%S.%f") + timedelta(
+ hours=-2
+ )
self.delete_request.db_set("creation", date_time_obj)
self.delete_request.db_set("status", "Pending Approval")
diff --git a/frappe/website/doctype/personal_data_deletion_step/personal_data_deletion_step.py b/frappe/website/doctype/personal_data_deletion_step/personal_data_deletion_step.py
index c4f40356d6..ef928dec99 100644
--- a/frappe/website/doctype/personal_data_deletion_step/personal_data_deletion_step.py
+++ b/frappe/website/doctype/personal_data_deletion_step/personal_data_deletion_step.py
@@ -23,4 +23,5 @@ class PersonalDataDeletionStep(Document):
partial: DF.Check
status: DF.Literal["Pending", "Deleted"]
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/personal_data_download_request/personal_data_download_request.py b/frappe/website/doctype/personal_data_download_request/personal_data_download_request.py
index 7d64b77e60..c725ca8c0b 100644
--- a/frappe/website/doctype/personal_data_download_request/personal_data_download_request.py
+++ b/frappe/website/doctype/personal_data_download_request/personal_data_download_request.py
@@ -22,6 +22,7 @@ class PersonalDataDownloadRequest(Document):
user: DF.Link
user_name: DF.Data | None
# end: auto-generated types
+
def after_insert(self):
personal_data = get_user_data(self.user)
diff --git a/frappe/website/doctype/personal_data_download_request/test_personal_data_download_request.py b/frappe/website/doctype/personal_data_download_request/test_personal_data_download_request.py
index 1a8bb1743f..e353147f31 100644
--- a/frappe/website/doctype/personal_data_download_request/test_personal_data_download_request.py
+++ b/frappe/website/doctype/personal_data_download_request/test_personal_data_download_request.py
@@ -44,9 +44,7 @@ class TestRequestPersonalData(FrappeTestCase):
self.assertEqual(file_count, 1)
- email_queue = frappe.get_all(
- "Email Queue", fields=["message"], order_by="creation DESC", limit=1
- )
+ email_queue = frappe.get_all("Email Queue", fields=["message"], order_by="creation DESC", limit=1)
self.assertIn(frappe._("Download Your Data"), email_queue[0].message)
frappe.db.delete("Email Queue")
diff --git a/frappe/website/doctype/portal_menu_item/portal_menu_item.py b/frappe/website/doctype/portal_menu_item/portal_menu_item.py
index d7ce7c707f..8a04765873 100644
--- a/frappe/website/doctype/portal_menu_item/portal_menu_item.py
+++ b/frappe/website/doctype/portal_menu_item/portal_menu_item.py
@@ -24,4 +24,5 @@ class PortalMenuItem(Document):
target: DF.Data | None
title: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/portal_settings/portal_settings.py b/frappe/website/doctype/portal_settings/portal_settings.py
index bb37de2f01..a531557f5e 100644
--- a/frappe/website/doctype/portal_settings/portal_settings.py
+++ b/frappe/website/doctype/portal_settings/portal_settings.py
@@ -21,6 +21,7 @@ class PortalSettings(Document):
hide_standard_menu: DF.Check
menu: DF.Table[PortalMenuItem]
# end: auto-generated types
+
def add_item(self, item):
"""insert new portal menu item if route is not set, or role is different"""
exists = [d for d in self.get("menu", []) if d.get("route") == item.get("route")]
diff --git a/frappe/website/doctype/social_link_settings/social_link_settings.py b/frappe/website/doctype/social_link_settings/social_link_settings.py
index 5bf75d544e..f3b36c3985 100644
--- a/frappe/website/doctype/social_link_settings/social_link_settings.py
+++ b/frappe/website/doctype/social_link_settings/social_link_settings.py
@@ -21,4 +21,5 @@ class SocialLinkSettings(Document):
parenttype: DF.Data
social_link_type: DF.Literal["", "facebook", "linkedin", "twitter", "email"]
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/web_form/test_web_form.py b/frappe/website/doctype/web_form/test_web_form.py
index 914ee0ba09..f1a444ff11 100644
--- a/frappe/website/doctype/web_form/test_web_form.py
+++ b/frappe/website/doctype/web_form/test_web_form.py
@@ -50,9 +50,7 @@ class TestWebForm(FrappeTestCase):
accept("manage-events", json.dumps(doc))
- self.assertEqual(
- frappe.db.get_value("Event", self.event_name, "description"), doc.get("description")
- )
+ self.assertEqual(frappe.db.get_value("Event", self.event_name, "description"), doc.get("description"))
def test_webform_render(self):
set_request(method="GET", path="manage-events/new")
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index af9e497d75..906766d0bb 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -40,7 +40,7 @@ class WebForm(WebsiteGenerator):
breadcrumbs: DF.Code | None
button_label: DF.Data | None
client_script: DF.Code | None
- condition: DF.Code | None
+ condition_json: DF.JSON | None
custom_css: DF.Code | None
doc_type: DF.Link
introduction_text: DF.TextEditor | None
@@ -66,6 +66,7 @@ class WebForm(WebsiteGenerator):
web_form_fields: DF.Table[WebFormField]
website_sidebar: DF.Link | None
# end: auto-generated types
+
website = frappe._dict(no_cache=1)
def validate(self):
@@ -281,9 +282,7 @@ def get_context(context):
messages.extend(col.get("label") if col else "" for col in self.list_columns)
- context.translated_messages = frappe.as_json(
- {message: _(message) for message in messages if message}
- )
+ context.translated_messages = frappe.as_json({message: _(message) for message in messages if message})
def load_list_data(self, context):
if not self.list_columns:
diff --git a/frappe/website/doctype/web_form_field/web_form_field.py b/frappe/website/doctype/web_form_field/web_form_field.py
index 208d31096a..8a6286ec04 100644
--- a/frappe/website/doctype/web_form_field/web_form_field.py
+++ b/frappe/website/doctype/web_form_field/web_form_field.py
@@ -62,4 +62,5 @@ class WebFormField(Document):
reqd: DF.Check
show_in_filter: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/web_form_list_column/web_form_list_column.py b/frappe/website/doctype/web_form_list_column/web_form_list_column.py
index 210159bb5b..d3a6f9deda 100644
--- a/frappe/website/doctype/web_form_list_column/web_form_list_column.py
+++ b/frappe/website/doctype/web_form_list_column/web_form_list_column.py
@@ -22,4 +22,5 @@ class WebFormListColumn(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py
index 3e6d6cbc4c..8652421412 100644
--- a/frappe/website/doctype/web_page/web_page.py
+++ b/frappe/website/doctype/web_page/web_page.py
@@ -65,6 +65,7 @@ class WebPage(WebsiteGenerator):
title: DF.Data
website_sidebar: DF.Link | None
# end: auto-generated types
+
def validate(self):
self.validate_dates()
self.set_route()
diff --git a/frappe/website/doctype/web_page_block/web_page_block.py b/frappe/website/doctype/web_page_block/web_page_block.py
index df82d71748..80a47b9cf3 100644
--- a/frappe/website/doctype/web_page_block/web_page_block.py
+++ b/frappe/website/doctype/web_page_block/web_page_block.py
@@ -31,4 +31,5 @@ class WebPageBlock(Document):
web_template: DF.Link | None
web_template_values: DF.Code | None
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/web_page_view/web_page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py
index 05d482e0fd..3ee634fc98 100644
--- a/frappe/website/doctype/web_page_view/web_page_view.py
+++ b/frappe/website/doctype/web_page_view/web_page_view.py
@@ -20,6 +20,7 @@ class WebPageView(Document):
browser: DF.Data | None
browser_version: DF.Data | None
campaign: DF.Data | None
+ content: DF.Data | None
is_unique: DF.Data | None
medium: DF.Data | None
path: DF.Data | None
@@ -29,6 +30,7 @@ class WebPageView(Document):
user_agent: DF.Data | None
visitor_id: DF.Data | None
# end: auto-generated types
+
@staticmethod
def clear_old_logs(days=180):
from frappe.query_builder import Interval
diff --git a/frappe/website/doctype/web_template_field/web_template_field.py b/frappe/website/doctype/web_template_field/web_template_field.py
index e8e6b5abd5..e69c7f6ef2 100644
--- a/frappe/website/doctype/web_template_field/web_template_field.py
+++ b/frappe/website/doctype/web_template_field/web_template_field.py
@@ -37,4 +37,5 @@ class WebTemplateField(Document):
parenttype: DF.Data
reqd: DF.Check
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/website_meta_tag/website_meta_tag.py b/frappe/website/doctype/website_meta_tag/website_meta_tag.py
index e0004212c2..c3f71aedb6 100644
--- a/frappe/website/doctype/website_meta_tag/website_meta_tag.py
+++ b/frappe/website/doctype/website_meta_tag/website_meta_tag.py
@@ -20,6 +20,7 @@ class WebsiteMetaTag(Document):
parenttype: DF.Data
value: DF.Text
# end: auto-generated types
+
def get_content(self):
# can't have new lines in meta content
return (self.value or "").replace("\n", " ")
diff --git a/frappe/website/doctype/website_route_meta/website_route_meta.py b/frappe/website/doctype/website_route_meta/website_route_meta.py
index f874e6fd6c..9164196b13 100644
--- a/frappe/website/doctype/website_route_meta/website_route_meta.py
+++ b/frappe/website/doctype/website_route_meta/website_route_meta.py
@@ -16,6 +16,7 @@ class WebsiteRouteMeta(Document):
meta_tags: DF.Table[WebsiteMetaTag]
# end: auto-generated types
+
def autoname(self):
if self.name and self.name.startswith("/"):
self.name = self.name[1:]
diff --git a/frappe/website/doctype/website_script/website_script.py b/frappe/website/doctype/website_script/website_script.py
index 9d044a394e..467b664a8c 100644
--- a/frappe/website/doctype/website_script/website_script.py
+++ b/frappe/website/doctype/website_script/website_script.py
@@ -18,6 +18,7 @@ class WebsiteScript(Document):
javascript: DF.Code | None
# end: auto-generated types
+
def on_update(self):
"""clear cache"""
frappe.clear_cache(user="Guest")
diff --git a/frappe/website/doctype/website_settings/google_indexing.py b/frappe/website/doctype/website_settings/google_indexing.py
index c50b20e71e..0483d3e0a6 100644
--- a/frappe/website/doctype/website_settings/google_indexing.py
+++ b/frappe/website/doctype/website_settings/google_indexing.py
@@ -16,9 +16,7 @@ def authorize_access(reauthorize=False, code=None):
"""If no Authorization code get it from Google and then request for Refresh Token."""
oauth_code = (
- frappe.db.get_single_value("Website Settings", "indexing_authorization_code")
- if not code
- else code
+ frappe.db.get_single_value("Website Settings", "indexing_authorization_code") if not code else code
)
oauth_obj = GoogleOAuth("indexing")
diff --git a/frappe/website/doctype/website_sidebar/website_sidebar.py b/frappe/website/doctype/website_sidebar/website_sidebar.py
index 283184a76c..f28ce58f1a 100644
--- a/frappe/website/doctype/website_sidebar/website_sidebar.py
+++ b/frappe/website/doctype/website_sidebar/website_sidebar.py
@@ -18,6 +18,7 @@ class WebsiteSidebar(Document):
sidebar_items: DF.Table[WebsiteSidebarItem]
title: DF.Data
# end: auto-generated types
+
def get_items(self):
items = frappe.get_all(
"Website Sidebar Item",
diff --git a/frappe/website/doctype/website_sidebar_item/website_sidebar_item.py b/frappe/website/doctype/website_sidebar_item/website_sidebar_item.py
index 931628b5f4..bcaab9e2c7 100644
--- a/frappe/website/doctype/website_sidebar_item/website_sidebar_item.py
+++ b/frappe/website/doctype/website_sidebar_item/website_sidebar_item.py
@@ -21,4 +21,5 @@ class WebsiteSidebarItem(Document):
route: DF.Data | None
title: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/website_slideshow/website_slideshow.py b/frappe/website/doctype/website_slideshow/website_slideshow.py
index 797270b61c..e1301fe004 100644
--- a/frappe/website/doctype/website_slideshow/website_slideshow.py
+++ b/frappe/website/doctype/website_slideshow/website_slideshow.py
@@ -24,6 +24,7 @@ class WebsiteSlideshow(Document):
slideshow_items: DF.Table[WebsiteSlideshowItem]
slideshow_name: DF.Data
# end: auto-generated types
+
def validate(self):
self.validate_images()
diff --git a/frappe/website/doctype/website_slideshow_item/website_slideshow_item.py b/frappe/website/doctype/website_slideshow_item/website_slideshow_item.py
index 7ed0a381cc..0425557d3a 100644
--- a/frappe/website/doctype/website_slideshow_item/website_slideshow_item.py
+++ b/frappe/website/doctype/website_slideshow_item/website_slideshow_item.py
@@ -24,4 +24,5 @@ class WebsiteSlideshowItem(Document):
parenttype: DF.Data
url: DF.Data | None
# end: auto-generated types
+
pass
diff --git a/frappe/website/doctype/website_theme/test_website_theme.py b/frappe/website/doctype/website_theme/test_website_theme.py
index b99aa00043..59dbdd0f8f 100644
--- a/frappe/website/doctype/website_theme/test_website_theme.py
+++ b/frappe/website/doctype/website_theme/test_website_theme.py
@@ -30,7 +30,6 @@ class TestWebsiteTheme(FrappeTestCase):
google_font="Inter",
custom_scss="body { font-size: 16.5px; }", # this will get minified!
) as theme:
-
theme_path = frappe.get_site_path("public", theme.theme_url[1:])
with open(theme_path) as theme_file:
css = theme_file.read()
diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py
index db9f420c18..d5d67e325a 100644
--- a/frappe/website/doctype/website_theme/website_theme.py
+++ b/frappe/website/doctype/website_theme/website_theme.py
@@ -1,10 +1,9 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors
# License: MIT. See LICENSE
-from os.path import abspath
+from os.path import abspath, splitext
from os.path import exists as path_exists
from os.path import join as join_path
-from os.path import splitext
from typing import Optional
import frappe
@@ -45,6 +44,7 @@ class WebsiteTheme(Document):
theme_scss: DF.Code | None
theme_url: DF.Data | None
# end: auto-generated types
+
def validate(self):
self.validate_if_customizable()
self.generate_bootstrap_theme()
@@ -56,7 +56,6 @@ class WebsiteTheme(Document):
and not frappe.flags.in_import
and not frappe.flags.in_test
):
-
self.export_doc()
self.clear_cache_if_current_theme()
@@ -70,9 +69,7 @@ class WebsiteTheme(Document):
def on_trash(self):
if self.is_standard_and_not_valid_user():
- frappe.throw(
- _("You are not allowed to delete a standard Website Theme"), frappe.PermissionError
- )
+ frappe.throw(_("You are not allowed to delete a standard Website Theme"), frappe.PermissionError)
def validate_if_customizable(self):
if self.is_standard_and_not_valid_user():
@@ -168,9 +165,7 @@ def get_scss(website_theme):
imports_to_include = [d for d in available_imports if not d.startswith(apps_to_ignore)]
context = website_theme.as_dict()
context["website_theme_scss"] = imports_to_include
- return frappe.render_template(
- "frappe/website/doctype/website_theme/website_theme_template.scss", context
- )
+ return frappe.render_template("frappe/website/doctype/website_theme/website_theme_template.scss", context)
def get_scss_paths():
diff --git a/frappe/website/doctype/website_theme_ignore_app/website_theme_ignore_app.py b/frappe/website/doctype/website_theme_ignore_app/website_theme_ignore_app.py
index 56f84148e0..9fcb9d5418 100644
--- a/frappe/website/doctype/website_theme_ignore_app/website_theme_ignore_app.py
+++ b/frappe/website/doctype/website_theme_ignore_app/website_theme_ignore_app.py
@@ -19,4 +19,5 @@ class WebsiteThemeIgnoreApp(Document):
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types
+
pass
diff --git a/frappe/website/page_renderers/base_template_page.py b/frappe/website/page_renderers/base_template_page.py
index 6921795172..622cd113ef 100644
--- a/frappe/website/page_renderers/base_template_page.py
+++ b/frappe/website/page_renderers/base_template_page.py
@@ -64,9 +64,7 @@ class BaseTemplatePage(BaseRenderer):
self.context.url_prefix += "/"
self.context.path = self.path
- self.context.pathname = (
- getattr(frappe.local, "path", None) if hasattr(frappe, "local") else self.path
- )
+ self.context.pathname = getattr(frappe.local, "path", None) if hasattr(frappe, "local") else self.path
def update_website_context(self):
# apply context from hooks
diff --git a/frappe/website/page_renderers/document_page.py b/frappe/website/page_renderers/document_page.py
index fe80d1b68c..aa230017ee 100644
--- a/frappe/website/page_renderers/document_page.py
+++ b/frappe/website/page_renderers/document_page.py
@@ -26,9 +26,7 @@ class DocumentPage(BaseTemplatePage):
if document := _find_matching_document_webview(self.path):
self.doctype, self.docname = document
doc = frappe.get_cached_doc(self.doctype, self.docname)
- return (
- doc.meta.allow_guest_to_view or doc.has_permission() or frappe.has_website_permission(doc)
- )
+ return doc.meta.allow_guest_to_view or doc.has_permission() or frappe.has_website_permission(doc)
def search_web_page_dynamic_routes(self):
d = get_page_info_from_web_page_with_dynamic_routes(self.path)
diff --git a/frappe/website/page_renderers/template_page.py b/frappe/website/page_renderers/template_page.py
index e04649d89c..84a9d26081 100644
--- a/frappe/website/page_renderers/template_page.py
+++ b/frappe/website/page_renderers/template_page.py
@@ -202,9 +202,7 @@ class TemplatePage(BaseTemplatePage):
and "