diff --git a/frappe/__init__.py b/frappe/__init__.py index 3c4e1ebbdd..0978d469cd 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -307,9 +307,7 @@ def init(site: str, sites_path: str = ".", new_site: bool = False, force=False) local.initialised = True -def connect( - site: str | None = None, db_name: str | None = None, set_admin_as_user: bool = True -) -> None: +def connect(site: str | None = None, db_name: str | None = None, set_admin_as_user: bool = True) -> None: """Connect to site database instance. :param site: (Deprecated) If site is given, calls `frappe.init`. @@ -432,9 +430,7 @@ def get_site_config(sites_path: str | None = None, site_path: str | None = None) ) # Set the user as database name if not set in config - config["db_user"] = ( - os.environ.get("FRAPPE_DB_USER") or config.get("db_user") or config.get("db_name") - ) + config["db_user"] = os.environ.get("FRAPPE_DB_USER") or config.get("db_user") or config.get("db_name") # Allow externally extending the config with hooks if extra_config := config.get("extra_config"): @@ -920,9 +916,7 @@ def is_whitelisted(method): is_guest = session["user"] == "Guest" if method not in whitelisted or is_guest and method not in guest_methods: summary = _("You are not permitted to access this resource.") - detail = _("Function {0} is not whitelisted.").format( - bold(f"{method.__module__}.{method.__name__}") - ) + detail = _("Function {0} is not whitelisted.").format(bold(f"{method.__module__}.{method.__name__}")) msg = f"
{summary}{detail}
" throw(msg, PermissionError, title="Method Not Allowed") @@ -937,7 +931,6 @@ def is_whitelisted(method): def read_only(): def innfn(fn): def wrapper_fn(*args, **kwargs): - # frappe.read_only could be called from nested functions, in such cases don't swap the # connection again. switched_connection = False @@ -1109,9 +1102,7 @@ def has_permission( ) if throw and not out: - document_label = ( - f"{_(doctype)} {doc if isinstance(doc, str) else doc.name}" if doc else _(doctype) - ) + document_label = f"{_(doctype)} {doc if isinstance(doc, str) else doc.name}" if doc else _(doctype) frappe.flags.error_message = _("No permission for {0}").format(document_label) raise frappe.PermissionError @@ -1286,9 +1277,7 @@ def clear_document_cache(doctype: str, name: str | None = None) -> None: delattr(local, "website_settings") -def get_cached_value( - doctype: str, name: str, fieldname: str = "name", as_dict: bool = False -) -> Any: +def get_cached_value(doctype: str, name: str, fieldname: str = "name", as_dict: bool = False) -> Any: try: doc = get_cached_doc(doctype, name) except DoesNotExistError: @@ -1654,9 +1643,7 @@ def _load_app_hooks(app_name: str | None = None): return hooks -def get_hooks( - hook: str = None, default: Any | None = "_KEEP_DEFAULT_LIST", app_name: str = None -) -> _dict: +def get_hooks(hook: str = None, default: Any | None = "_KEEP_DEFAULT_LIST", app_name: str = None) -> _dict: """Get hooks via `app/hooks.py` :param hook: Name of the hook. Will gather all hooks for this name and return as a list. @@ -1757,11 +1744,7 @@ def read_file(path, raise_not_found=False): def get_attr(method_string: str) -> Any: """Get python method object from its name.""" app_name = method_string.split(".", 1)[0] - if ( - not local.flags.in_uninstall - and not local.flags.in_install - and app_name not in get_installed_apps() - ): + if not local.flags.in_uninstall and not local.flags.in_install and app_name not in get_installed_apps(): throw(_("App {0} is not installed").format(app_name), AppNotInstalledError) modulename = ".".join(method_string.split(".")[:-1]) @@ -1783,7 +1766,8 @@ def get_newargs(fn: Callable, kwargs: dict[str, Any]) -> dict[str, Any]: """Remove any kwargs that are not supported by the function. Example: - >>> def fn(a=1, b=2): pass + >>> def fn(a=1, b=2): + ... pass >>> get_newargs(fn, {"a": 2, "c": 1}) {"a": 2} @@ -2346,9 +2330,7 @@ loggers = {} log_level = None -def logger( - module=None, with_more_info=False, allow_site=True, filter=None, max_size=100_000, file_count=20 -): +def logger(module=None, with_more_info=False, allow_site=True, filter=None, max_size=100_000, file_count=20): """Return a python logger that uses StreamHandler.""" from frappe.utils.logger import get_logger @@ -2363,9 +2345,7 @@ def logger( def get_desk_link(doctype, name): - html = ( - '{doctype_local} {name}' - ) + html = '{doctype_local} {name}' return html.format(doctype=doctype, name=name, doctype_local=_(doctype)) @@ -2418,7 +2398,7 @@ def get_version(doctype, name, limit=None, head=False, raise_err=True): Note: Applicable only if DocType has changes tracked. Example - >>> frappe.get_version('User', 'foobar@gmail.com') + >>> frappe.get_version("User", "foobar@gmail.com") >>> [ { diff --git a/frappe/app.py b/frappe/app.py index 6d6a747119..4ce356ecc8 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -272,9 +272,7 @@ def set_cors_headers(response): # only required for preflight requests if request.method == "OPTIONS": - cors_headers["Access-Control-Allow-Methods"] = request.headers.get( - "Access-Control-Request-Method" - ) + cors_headers["Access-Control-Allow-Methods"] = request.headers.get("Access-Control-Request-Method") if allowed_headers := request.headers.get("Access-Control-Request-Headers"): cors_headers["Access-Control-Allow-Headers"] = allowed_headers @@ -513,9 +511,7 @@ def serve( def application_with_statics(): global application, _sites_path - application = SharedDataMiddleware( - application, {"/assets": str(os.path.join(_sites_path, "assets"))} - ) + application = SharedDataMiddleware(application, {"/assets": str(os.path.join(_sites_path, "assets"))}) application = StaticDataMiddleware(application, {"/files": str(os.path.abspath(_sites_path))}) diff --git a/frappe/auth.py b/frappe/auth.py index 521b0a6289..ae19e0558b 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -61,9 +61,7 @@ class HTTPRequest: def set_request_ip(self): if frappe.get_request_header("X-Forwarded-For"): - frappe.local.request_ip = ( - frappe.get_request_header("X-Forwarded-For").split(",", 1)[0] - ).strip() + frappe.local.request_ip = (frappe.get_request_header("X-Forwarded-For").split(",", 1)[0]).strip() elif frappe.get_request_header("REMOTE_ADDR"): frappe.local.request_ip = frappe.get_request_header("REMOTE_ADDR") @@ -107,9 +105,7 @@ class LoginManager: self.full_name = None self.user_type = None - if ( - frappe.local.form_dict.get("cmd") == "login" or frappe.local.request.path == "/api/method/login" - ): + if frappe.local.form_dict.get("cmd") == "login" or frappe.local.request.path == "/api/method/login": if self.login() is False: return self.resume = False @@ -138,9 +134,7 @@ class LoginManager: self.authenticate(user=user, pwd=pwd) if self.force_user_to_reset_password(): doc = frappe.get_doc("User", self.user) - frappe.local.response["redirect_to"] = doc.reset_password( - send_email=False, password_expired=True - ) + frappe.local.response["redirect_to"] = doc.reset_password(send_email=False, password_expired=True) frappe.local.response["message"] = "Password Reset" return False @@ -413,9 +407,7 @@ def get_logged_user(): def clear_cookies(): if hasattr(frappe.local, "session"): frappe.session.sid = "" - frappe.local.cookie_manager.delete_cookie( - ["full_name", "user_id", "sid", "user_image", "system_user"] - ) + frappe.local.cookie_manager.delete_cookie(["full_name", "user_id", "sid", "user_image", "system_user"]) def validate_ip_address(user): @@ -613,9 +605,7 @@ def validate_oauth(authorization_header): req = frappe.request parsed_url = urlparse(req.url) access_token = {"access_token": token} - uri = ( - parsed_url.scheme + "://" + parsed_url.netloc + parsed_url.path + "?" + urlencode(access_token) - ) + uri = parsed_url.scheme + "://" + parsed_url.netloc + parsed_url.path + "?" + urlencode(access_token) http_method = req.method headers = req.headers body = req.get_data() diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py index 82f1c7d799..4a70c3a21a 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py @@ -39,6 +39,7 @@ class AssignmentRule(Document): unassign_condition: DF.Code | None users: DF.TableMultiSelect[AssignmentRuleUser] # end: auto-generated types + def validate(self): self.validate_document_types() self.validate_assignment_days() @@ -50,9 +51,7 @@ class AssignmentRule(Document): def validate_document_types(self): if self.document_type == "ToDo": - frappe.throw( - _("Assignment Rule is not allowed on {0} document type").format(frappe.bold("ToDo")) - ) + frappe.throw(_("Assignment Rule is not allowed on {0} document type").format(frappe.bold("ToDo"))) def validate_assignment_days(self): assignment_days = self.get_assignment_days() @@ -357,9 +356,7 @@ def update_due_date(doc, state=None): rule_doc = frappe.get_cached_doc("Assignment Rule", rule.get("name")) due_date_field = rule_doc.due_date_based_on field_updated = ( - doc.meta.has_field(due_date_field) - and doc.has_value_changed(due_date_field) - and rule.get("name") + doc.meta.has_field(due_date_field) and doc.has_value_changed(due_date_field) and rule.get("name") ) if field_updated: diff --git a/frappe/automation/doctype/assignment_rule/test_assignment_rule.py b/frappe/automation/doctype/assignment_rule/test_assignment_rule.py index 7ae034f896..ed5fca7902 100644 --- a/frappe/automation/doctype/assignment_rule/test_assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/test_assignment_rule.py @@ -138,7 +138,9 @@ class TestAutoAssign(FrappeTestCase): # check if auto assigned to doc owner, test1@example.com self.assertEqual( frappe.db.get_value( - "ToDo", dict(reference_type=TEST_DOCTYPE, reference_name=note.name, status="Open"), "owner" + "ToDo", + dict(reference_type=TEST_DOCTYPE, reference_name=note.name, status="Open"), + "owner", ), test_user, ) diff --git a/frappe/automation/doctype/assignment_rule_day/assignment_rule_day.py b/frappe/automation/doctype/assignment_rule_day/assignment_rule_day.py index 1fe9af4e21..4b387fb400 100644 --- a/frappe/automation/doctype/assignment_rule_day/assignment_rule_day.py +++ b/frappe/automation/doctype/assignment_rule_day/assignment_rule_day.py @@ -19,4 +19,5 @@ class AssignmentRuleDay(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/automation/doctype/assignment_rule_user/assignment_rule_user.py b/frappe/automation/doctype/assignment_rule_user/assignment_rule_user.py index 68ceb6b018..54edd74747 100644 --- a/frappe/automation/doctype/assignment_rule_user/assignment_rule_user.py +++ b/frappe/automation/doctype/assignment_rule_user/assignment_rule_user.py @@ -19,4 +19,5 @@ class AssignmentRuleUser(Document): parenttype: DF.Data user: DF.Link # end: auto-generated types + pass diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index e8db131ebb..72a750cd59 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -70,6 +70,7 @@ class AutoRepeat(Document): submit_on_creation: DF.Check template: DF.Link | None # end: auto-generated types + def validate(self): self.update_status() self.validate_reference_doctype() diff --git a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py index 740b329851..65d26a154c 100644 --- a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py @@ -53,9 +53,7 @@ class TestAutoRepeat(FrappeTestCase): todo = frappe.get_doc(doc.reference_doctype, doc.reference_document) self.assertEqual(todo.auto_repeat, doc.name) - new_todo = frappe.db.get_value( - "ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name" - ) + new_todo = frappe.db.get_value("ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name") new_todo = frappe.get_doc("ToDo", new_todo) @@ -81,9 +79,7 @@ class TestAutoRepeat(FrappeTestCase): todo = frappe.get_doc(doc.reference_doctype, doc.reference_document) self.assertEqual(todo.auto_repeat, doc.name) - new_todo = frappe.db.get_value( - "ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name" - ) + new_todo = frappe.db.get_value("ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name") new_todo = frappe.get_doc("ToDo", new_todo) @@ -128,7 +124,9 @@ class TestAutoRepeat(FrappeTestCase): # test without end_date todo = frappe.get_doc( dict( - doctype="ToDo", description="test recurring todo without end_date", assigned_by="Administrator" + doctype="ToDo", + description="test recurring todo without end_date", + assigned_by="Administrator", ) ).insert() self.monthly_auto_repeat("ToDo", todo.name, start_date) @@ -183,13 +181,9 @@ class TestAutoRepeat(FrappeTestCase): create_repeated_entries(data) frappe.db.commit() - new_todo = frappe.db.get_value( - "ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name" - ) + new_todo = frappe.db.get_value("ToDo", {"auto_repeat": doc.name, "name": ("!=", todo.name)}, "name") - email_queue = frappe.db.exists( - "Email Queue", dict(reference_doctype="ToDo", reference_name=new_todo) - ) + email_queue = frappe.db.exists("Email Queue", dict(reference_doctype="ToDo", reference_name=new_todo)) self.assertTrue(email_queue) def test_next_schedule_date(self): @@ -208,9 +202,7 @@ class TestAutoRepeat(FrappeTestCase): self.assertTrue(doc.next_schedule_date >= current_date) todo = frappe.get_doc( - dict( - doctype="ToDo", description="test next schedule date for daily", assigned_by="Administrator" - ) + dict(doctype="ToDo", description="test next schedule date for daily", assigned_by="Administrator") ).insert() doc = make_auto_repeat( frequency="Daily", reference_document=todo.name, start_date=add_days(today(), -2) diff --git a/frappe/automation/doctype/auto_repeat_day/auto_repeat_day.py b/frappe/automation/doctype/auto_repeat_day/auto_repeat_day.py index b237f94610..b51d1f78ae 100644 --- a/frappe/automation/doctype/auto_repeat_day/auto_repeat_day.py +++ b/frappe/automation/doctype/auto_repeat_day/auto_repeat_day.py @@ -19,4 +19,5 @@ class AutoRepeatDay(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/automation/doctype/milestone/milestone.py b/frappe/automation/doctype/milestone/milestone.py index e980fb17b5..28db183f52 100644 --- a/frappe/automation/doctype/milestone/milestone.py +++ b/frappe/automation/doctype/milestone/milestone.py @@ -20,6 +20,7 @@ class Milestone(Document): track_field: DF.Data value: DF.Data # end: auto-generated types + pass diff --git a/frappe/automation/doctype/milestone_tracker/milestone_tracker.py b/frappe/automation/doctype/milestone_tracker/milestone_tracker.py index 414c2319d5..54326b9ebf 100644 --- a/frappe/automation/doctype/milestone_tracker/milestone_tracker.py +++ b/frappe/automation/doctype/milestone_tracker/milestone_tracker.py @@ -20,6 +20,7 @@ class MilestoneTracker(Document): document_type: DF.Link track_field: DF.Literal # end: auto-generated types + def on_update(self): frappe.cache_manager.clear_doctype_map("Milestone Tracker", self.document_type) diff --git a/frappe/automation/doctype/reminder/reminder.py b/frappe/automation/doctype/reminder/reminder.py index fb6f1f222e..c7631d18fe 100644 --- a/frappe/automation/doctype/reminder/reminder.py +++ b/frappe/automation/doctype/reminder/reminder.py @@ -24,6 +24,7 @@ class Reminder(Document): reminder_doctype: DF.Link | None user: DF.Link # end: auto-generated types + @staticmethod def clear_old_logs(days=30): from frappe.query_builder import Interval diff --git a/frappe/automation/doctype/reminder/test_reminder.py b/frappe/automation/doctype/reminder/test_reminder.py index 84cc258701..8085cf876c 100644 --- a/frappe/automation/doctype/reminder/test_reminder.py +++ b/frappe/automation/doctype/reminder/test_reminder.py @@ -10,7 +10,6 @@ from frappe.utils import add_to_date, now_datetime class TestReminder(FrappeTestCase): def test_reminder(self): - description = "TEST_REMINDER" create_new_reminder( diff --git a/frappe/boot.py b/frappe/boot.py index 8caa264443..45a7cfa21c 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -176,9 +176,7 @@ def get_user_pages_or_reports(parent, cache=False): frappe.qb.from_(customRole) .from_(hasRole) .from_(parentTable) - .select( - customRole[parent.lower()].as_("name"), customRole.modified, customRole.ref_doctype, *columns - ) + .select(customRole[parent.lower()].as_("name"), customRole.modified, customRole.ref_doctype, *columns) .where( (hasRole.parent == customRole.name) & (parentTable.name == customRole[parent.lower()]) @@ -201,9 +199,7 @@ def get_user_pages_or_reports(parent, cache=False): .from_(parentTable) .select(parentTable.name.as_("name"), parentTable.modified, *columns) .where( - (hasRole.role.isin(roles)) - & (hasRole.parent == parentTable.name) - & (parentTable.name.notin(subq)) + (hasRole.role.isin(roles)) & (hasRole.parent == parentTable.name) & (parentTable.name.notin(subq)) ) .distinct() ) @@ -225,7 +221,6 @@ def get_user_pages_or_reports(parent, cache=False): # pages with no role are allowed if parent == "Page": - pages_with_no_roles = ( frappe.qb.from_(parentTable) .select(parentTable.name, parentTable.modified, *columns) diff --git a/frappe/build.py b/frappe/build.py index 49021ae6bb..933799b2ce 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -378,9 +378,7 @@ def make_asset_dirs(hard_link=False): symlinks = generate_assets_map() for source, target in symlinks.items(): - start_message = unstrip( - f"{'Copying assets from' if hard_link else 'Linking'} {source} to {target}" - ) + start_message = unstrip(f"{'Copying assets from' if hard_link else 'Linking'} {source} to {target}") fail_message = unstrip(f"Cannot {'copy' if hard_link else 'link'} {source} to {target}") # Used '\r' instead of '\x1b[1K\r' to print entire lines in smaller terminal sizes diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 769be78709..960c72f042 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -197,9 +197,7 @@ def build_table_count_cache(): table_rows = frappe.qb.Field("table_rows").as_("count") information_schema = frappe.qb.Schema("information_schema") - data = (frappe.qb.from_(information_schema.tables).select(table_name, table_rows)).run( - as_dict=True - ) + data = (frappe.qb.from_(information_schema.tables).select(table_name, table_rows)).run(as_dict=True) counts = {d.get("name").replace("tab", "", 1): d.get("count", None) for d in data} frappe.cache.set_value("information_schema:counts", counts) diff --git a/frappe/commands/gettext.py b/frappe/commands/gettext.py index c3e54f2bf6..27f67a65a6 100644 --- a/frappe/commands/gettext.py +++ b/frappe/commands/gettext.py @@ -35,9 +35,7 @@ def compile_translations(context, app: str | None = None, locale: str = None, fo _compile_translations(app, locale, force=force) -@click.command( - "migrate-csv-to-po", help="Translation: migrate from CSV files (old) to PO files (new)" -) +@click.command("migrate-csv-to-po", help="Translation: migrate from CSV files (old) to PO files (new)") @click.option("--app", help="Only migrate for this app. eg: frappe") @click.option("--locale", help="Compile translations only for this locale. eg: de") @pass_context diff --git a/frappe/commands/redis_utils.py b/frappe/commands/redis_utils.py index 07ad8715c4..5b558de126 100644 --- a/frappe/commands/redis_utils.py +++ b/frappe/commands/redis_utils.py @@ -13,9 +13,7 @@ from frappe.utils.redis_queue import RedisQueue default=False, help="Set new Redis admin(default user) password", ) -@click.option( - "--use-rq-auth", is_flag=True, default=False, help="Enable Redis authentication for sites" -) +@click.option("--use-rq-auth", is_flag=True, default=False, help="Enable Redis authentication for sites") def create_rq_users(set_admin_password=False, use_rq_auth=False): """Create Redis Queue users and add to acl and app configs. @@ -46,9 +44,7 @@ def create_rq_users(set_admin_password=False, use_rq_auth=False): validate=False, site_config_path=common_site_config_path, ) - update_site_config( - "use_rq_auth", use_rq_auth, validate=False, site_config_path=common_site_config_path - ) + update_site_config("use_rq_auth", use_rq_auth, validate=False, site_config_path=common_site_config_path) click.secho( "* ACL and site configs are updated with new user credentials. " @@ -65,8 +61,7 @@ def create_rq_users(set_admin_password=False, use_rq_auth=False): ) click.secho(f"`export {env_key}={user_credentials['default'][1]}`") click.secho( - "NOTE: Please save the admin password as you " - "can not access redis server without the password", + "NOTE: Please save the admin password as you " "can not access redis server without the password", fg="yellow", ) diff --git a/frappe/commands/scheduler.py b/frappe/commands/scheduler.py index cf760cf4f0..49acc8d7a7 100755 --- a/frappe/commands/scheduler.py +++ b/frappe/commands/scheduler.py @@ -74,9 +74,7 @@ def disable_scheduler(context): @click.command("scheduler") @click.option("--site", help="site name") @click.argument("state", type=click.Choice(["pause", "resume", "disable", "enable", "status"])) -@click.option( - "--format", "-f", default="text", type=click.Choice(["json", "text"]), help="Output format" -) +@click.option("--format", "-f", default="text", type=click.Choice(["json", "text"]), help="Output format") @click.option("--verbose", "-v", is_flag=True, help="Verbose output") @pass_context def scheduler(context, state: str, format: str, verbose: bool = False, site: str | None = None): @@ -128,9 +126,7 @@ def set_maintenance_mode(context, state, site=None): frappe.destroy() -@click.command( - "doctor" -) # Passing context always gets a site and if there is no use site it breaks +@click.command("doctor") # Passing context always gets a site and if there is no use site it breaks @click.option("--site", help="site name") @pass_context def doctor(context, site=None): @@ -199,9 +195,7 @@ def start_scheduler(): type=click.Choice(["round_robin", "random"]), help="Dequeuing strategy to use", ) -def start_worker( - queue, quiet=False, rq_username=None, rq_password=None, burst=False, strategy=None -): +def start_worker(queue, quiet=False, rq_username=None, rq_password=None, burst=False, strategy=None): """Start a background worker""" from frappe.utils.background_jobs import start_worker diff --git a/frappe/commands/site.py b/frappe/commands/site.py index 3b6fcb32f1..28932ba5e5 100644 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -29,9 +29,7 @@ from frappe.exceptions import SiteNotSpecifiedError "--mariadb-root-username", help='Root username for MariaDB or PostgreSQL, Default is "root"', ) -@click.option( - "--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL" -) +@click.option("--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL") @click.option( "--no-mariadb-socket", is_flag=True, @@ -40,14 +38,10 @@ from frappe.exceptions import SiteNotSpecifiedError ) @click.option("--admin-password", help="Administrator password for new site", default=None) @click.option("--verbose", is_flag=True, default=False, help="Verbose") -@click.option( - "--force", help="Force restore if site/database already exists", is_flag=True, default=False -) +@click.option("--force", help="Force restore if site/database already exists", is_flag=True, default=False) @click.option("--source-sql", "--source_sql", help="Initiate database with a SQL file") @click.option("--install-app", multiple=True, help="Install app after installation") -@click.option( - "--set-default", is_flag=True, default=False, help="Set the new site as default site" -) +@click.option("--set-default", is_flag=True, default=False, help="Set the new site as default site") @click.option( "--setup-db/--no-setup-db", default=True, @@ -108,15 +102,11 @@ def new_site( "--mariadb-root-username", help='Root username for MariaDB or PostgreSQL, Default is "root"', ) -@click.option( - "--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL" -) +@click.option("--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL") @click.option("--db-name", help="Database name for site in case it is a new one") @click.option("--admin-password", help="Administrator password for new site") @click.option("--install-app", multiple=True, help="Install app after installation") -@click.option( - "--with-public-files", help="Restores the public files of the site, given path to its tar file" -) +@click.option("--with-public-files", help="Restores the public files of the site, given path to its tar file") @click.option( "--with-private-files", help="Restores the private files of the site, given path to its tar file", @@ -299,8 +289,7 @@ def restore_backup( # Check if the backup is of an older version of frappe and the user hasn't specified force if is_downgrade(sql_file_path, verbose=True) and not force: warn_message = ( - "This is not recommended and may lead to unexpected behaviour. " - "Do you want to continue anyway?" + "This is not recommended and may lead to unexpected behaviour. " "Do you want to continue anyway?" ) click.confirm(warn_message, abort=True) @@ -391,14 +380,10 @@ def partial_restore(context, sql_file_path, verbose, encryption_key=None): "--mariadb-root-username", help='Root username for MariaDB or PostgreSQL, Default is "root"', ) -@click.option( - "--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL" -) +@click.option("--db-root-password", "--mariadb-root-password", help="Root password for MariaDB or PostgreSQL") @click.option("--yes", is_flag=True, default=False, help="Pass --yes to skip confirmation") @pass_context -def reinstall( - context, admin_password=None, db_root_username=None, db_root_password=None, yes=False -): +def reinstall(context, admin_password=None, db_root_username=None, db_root_password=None, yes=False): "Reinstall site ie. wipe all data and start over" site = get_site(context) _reinstall(site, admin_password, db_root_username, db_root_password, yes, verbose=context.verbose) @@ -860,9 +845,7 @@ def use(site, sites_path="."): type=str, help="Specify the DocTypes to not backup seperated by commas", ) -@click.option( - "--backup-path", default=None, help="Set path for saving all the files in this operation" -) +@click.option("--backup-path", default=None, help="Set path for saving all the files in this operation") @click.option("--backup-path-db", default=None, help="Set path for saving database file") @click.option("--backup-path-files", default=None, help="Set path for saving public file") @click.option("--backup-path-private-files", default=None, help="Set path for saving private file") @@ -875,9 +858,7 @@ def use(site, sites_path="."): ) @click.option("--verbose", default=False, is_flag=True, help="Add verbosity") @click.option("--compress", default=False, is_flag=True, help="Compress private and public files") -@click.option( - "--old-backup-metadata", default=False, is_flag=True, help="Use older backup metadata" -) +@click.option("--old-backup-metadata", default=False, is_flag=True, help="Use older backup metadata") @pass_context def backup( context, @@ -977,9 +958,7 @@ def remove_from_installed_apps(context, app): is_flag=True, default=False, ) -@click.option( - "--dry-run", help="List all doctypes that will be deleted", is_flag=True, default=False -) +@click.option("--dry-run", help="List all doctypes that will be deleted", is_flag=True, default=False) @click.option("--no-backup", help="Do not backup the site", is_flag=True, default=False) @click.option("--force", help="Force remove app from site", is_flag=True, default=False) @pass_context @@ -1016,9 +995,7 @@ def uninstall(context, app, dry_run, yes, no_backup, force): ) @click.option("--archived-sites-path") @click.option("--no-backup", is_flag=True, default=False) -@click.option( - "--force", help="Force drop-site even if an error is encountered", is_flag=True, default=False -) +@click.option("--force", help="Force drop-site even if an error is encountered", is_flag=True, default=False) def drop_site( site, db_root_username="root", @@ -1105,9 +1082,7 @@ def move(dest_dir, site): @click.command("set-password") @click.argument("user") @click.argument("password", required=False) -@click.option( - "--logout-all-sessions", help="Log out from all sessions", is_flag=True, default=False -) +@click.option("--logout-all-sessions", help="Log out from all sessions", is_flag=True, default=False) @pass_context def set_password(context, user, password=None, logout_all_sessions=False): "Set password for a user on a site" @@ -1120,9 +1095,7 @@ def set_password(context, user, password=None, logout_all_sessions=False): @click.command("set-admin-password") @click.argument("admin-password", required=False) -@click.option( - "--logout-all-sessions", help="Log out from all sessions", is_flag=True, default=False -) +@click.option("--logout-all-sessions", help="Log out from all sessions", is_flag=True, default=False) @pass_context def set_admin_password(context, admin_password=None, logout_all_sessions=False): "Set Administrator password for a site" @@ -1279,9 +1252,7 @@ def stop_recording(context): @click.command("ngrok") -@click.option( - "--bind-tls", is_flag=True, default=False, help="Returns a reference to the https tunnel." -) +@click.option("--bind-tls", is_flag=True, default=False, help="Returns a reference to the https tunnel.") @click.option( "--use-default-authtoken", is_flag=True, @@ -1389,9 +1360,7 @@ def clear_log_table(context, doctype, days, no_backup): @click.command("trim-database") @click.option("--dry-run", is_flag=True, default=False, help="Show what would be deleted") -@click.option( - "--format", "-f", default="text", type=click.Choice(["json", "text"]), help="Output format" -) +@click.option("--format", "-f", default="text", type=click.Choice(["json", "text"]), help="Output format") @click.option("--no-backup", is_flag=True, default=False, help="Do not backup the site") @click.option( "--yes", @@ -1501,9 +1470,7 @@ def get_standard_tables(): @click.command("trim-tables") @click.option("--dry-run", is_flag=True, default=False, help="Show what would be deleted") -@click.option( - "--format", "-f", default="table", type=click.Choice(["json", "table"]), help="Output format" -) +@click.option("--format", "-f", default="table", type=click.Choice(["json", "table"]), help="Output format") @click.option("--no-backup", is_flag=True, default=False, help="Do not backup the site") @pass_context def trim_tables(context, dry_run, format, no_backup): diff --git a/frappe/commands/translate.py b/frappe/commands/translate.py index 247d4a77d5..5ebae3bfb8 100644 --- a/frappe/commands/translate.py +++ b/frappe/commands/translate.py @@ -39,13 +39,9 @@ def new_language(context, lang_code, app): frappe.translate.write_translations_file(app, lang_code) print( - "File created at ./apps/{app}/{app}/translations/{lang_code}.csv".format( - app=app, lang_code=lang_code - ) - ) - print( - "You will need to add the language in frappe/geo/languages.json, if you haven't done it already." + "File created at ./apps/{app}/{app}/translations/{lang_code}.csv".format(app=app, lang_code=lang_code) ) + print("You will need to add the language in frappe/geo/languages.json, if you haven't done it already.") @click.command("get-untranslated") diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index 333c37669f..6151a844e0 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -437,14 +437,10 @@ def import_doc(context, path, force=False): default="Insert", help="Insert New Records or Update Existing Records", ) -@click.option( - "--submit-after-import", default=False, is_flag=True, help="Submit document after importing it" -) +@click.option("--submit-after-import", default=False, is_flag=True, help="Submit document after importing it") @click.option("--mute-emails", default=True, is_flag=True, help="Mute emails during import") @pass_context -def data_import( - context, file_path, doctype, import_type=None, submit_after_import=False, mute_emails=True -): +def data_import(context, file_path, doctype, import_type=None, submit_after_import=False, mute_emails=True): "Import documents in bulk from CSV or XLSX using data import" from frappe.core.doctype.data_import.data_import import import_file @@ -570,9 +566,7 @@ frappe.connect() frappe.local.lang = frappe.db.get_default('lang') frappe.db.connect() ``` - """.format( - site=site, sites_path=sites_path - ) + """.format(site=site, sites_path=sites_path) ) os.execv( f"{bin_path}/jupyter", @@ -630,9 +624,7 @@ def console(context, autoreload=False): terminal() -@click.command( - "transform-database", help="Change tables' internal settings changing engine and row formats" -) +@click.command("transform-database", help="Change tables' internal settings changing engine and row formats") @click.option( "--table", required=True, @@ -731,9 +723,7 @@ def transform_database(context, table, engine, row_format, failfast): @click.option("--profile", is_flag=True, default=False) @click.option("--coverage", is_flag=True, default=False) @click.option("--skip-test-records", is_flag=True, default=False, help="Don't create test records") -@click.option( - "--skip-before-tests", is_flag=True, default=False, help="Don't run before tests hook" -) +@click.option("--skip-before-tests", is_flag=True, default=False, help="Don't run before tests hook") @click.option("--junit-xml-output", help="Destination file path for junit xml report") @click.option( "--failfast", is_flag=True, default=False, help="Stop the test run on the first error or failure" @@ -983,7 +973,9 @@ def request(context, args=None, path=None): frappe.connect() if args: if "?" in args: - frappe.local.form_dict = frappe._dict([a.split("=") for a in args.split("?")[-1].split("&")]) + frappe.local.form_dict = frappe._dict( + [a.split("=") for a in args.split("?")[-1].split("&")] + ) else: frappe.local.form_dict = frappe._dict() @@ -1007,9 +999,7 @@ def request(context, args=None, path=None): @click.command("make-app") @click.argument("destination") @click.argument("app_name") -@click.option( - "--no-git", is_flag=True, default=False, help="Do not initialize git repository for the app" -) +@click.option("--no-git", is_flag=True, default=False, help="Do not initialize git repository for the app") def make_app(destination, app_name, no_git=False): "Creates a boilerplate app" from frappe.utils.boilerplate import make_boilerplate @@ -1030,9 +1020,7 @@ def create_patch(): @click.command("set-config") @click.argument("key") @click.argument("value") -@click.option( - "-g", "--global", "global_", is_flag=True, default=False, help="Set value in bench config" -) +@click.option("-g", "--global", "global_", is_flag=True, default=False, help="Set value in bench config") @click.option("-p", "--parse", is_flag=True, default=False, help="Evaluate as Python Object") @pass_context def set_config(context, key, value, global_=False, parse=False): @@ -1109,9 +1097,7 @@ def get_version(output): @click.command("rebuild-global-search") -@click.option( - "--static-pages", is_flag=True, default=False, help="Rebuild global search for static pages" -) +@click.option("--static-pages", is_flag=True, default=False, help="Rebuild global search for static pages") @pass_context def rebuild_global_search(context, static_pages=False): """Setup help table in the current site (called after migrate)""" diff --git a/frappe/config/__init__.py b/frappe/config/__init__.py index 02626aedf5..6f97efbfdf 100644 --- a/frappe/config/__init__.py +++ b/frappe/config/__init__.py @@ -30,9 +30,7 @@ def get_modules_from_all_apps(): def get_modules_from_app(app): - return frappe.get_all( - "Module Def", filters={"app_name": app}, fields=["module_name", "app_name as app"] - ) + return frappe.get_all("Module Def", filters={"app_name": app}, fields=["module_name", "app_name as app"]) def get_all_empty_tables_by_module(): diff --git a/frappe/contacts/doctype/address/address.py b/frappe/contacts/doctype/address/address.py index a008f4638c..bd57b44a1b 100644 --- a/frappe/contacts/doctype/address/address.py +++ b/frappe/contacts/doctype/address/address.py @@ -52,6 +52,7 @@ class Address(Document): pincode: DF.Data | None state: DF.Data | None # end: auto-generated types + def __setup__(self): self.flags.linked = False @@ -140,9 +141,7 @@ def get_preferred_address(doctype, name, preferred_key="is_primary_address"): @frappe.whitelist() -def get_default_address( - doctype: str, name: str | None, sort_key: str = "is_primary_address" -) -> str | None: +def get_default_address(doctype: str, name: str | None, sort_key: str = "is_primary_address") -> str | None: """Return default Address name for the given doctype, name.""" if sort_key not in ["is_shipping_address", "is_primary_address"]: return None diff --git a/frappe/contacts/doctype/address_template/address_template.py b/frappe/contacts/doctype/address_template/address_template.py index 2c9b27e585..d993a54af1 100644 --- a/frappe/contacts/doctype/address_template/address_template.py +++ b/frappe/contacts/doctype/address_template/address_template.py @@ -20,6 +20,7 @@ class AddressTemplate(Document): is_default: DF.Check template: DF.Code | None # end: auto-generated types + def validate(self): validate_template(self.template) diff --git a/frappe/contacts/doctype/address_template/test_address_template.py b/frappe/contacts/doctype/address_template/test_address_template.py index c3c5b544d6..80c4ee73ac 100644 --- a/frappe/contacts/doctype/address_template/test_address_template.py +++ b/frappe/contacts/doctype/address_template/test_address_template.py @@ -25,9 +25,7 @@ class TestAddressTemplate(FrappeTestCase): self.assertEqual(frappe.db.get_value("Address Template", "Brazil", "is_default"), 1) def test_delete_address_template(self): - india = frappe.get_doc( - {"doctype": "Address Template", "country": "India", "is_default": 0} - ).insert() + india = frappe.get_doc({"doctype": "Address Template", "country": "India", "is_default": 0}).insert() brazil = frappe.get_doc( {"doctype": "Address Template", "country": "Brazil", "is_default": 1} diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index b40a27ca13..8d549d9c5a 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -47,6 +47,7 @@ class Contact(Document): unsubscribed: DF.Check user: DF.Link | None # end: auto-generated types + def autoname(self): self.name = self._get_full_name() @@ -248,10 +249,7 @@ def contact_query(doctype, txt, searchfield, start, page_len, filters): from frappe.desk.reportview import get_match_cond doctype = "Contact" - if ( - not frappe.get_meta(doctype).get_field(searchfield) - and searchfield not in frappe.db.DEFAULT_COLUMNS - ): + if not frappe.get_meta(doctype).get_field(searchfield) and searchfield not in frappe.db.DEFAULT_COLUMNS: return [] link_doctype = filters.pop("link_doctype") @@ -272,9 +270,7 @@ def contact_query(doctype, txt, searchfield, start, page_len, filters): order by if(locate(%(_txt)s, `tabContact`.full_name), locate(%(_txt)s, `tabContact`.company_name), 99999), `tabContact`.idx desc, `tabContact`.full_name - limit %(start)s, %(page_len)s """.format( - mcond=get_match_cond(doctype), key=searchfield - ), + limit %(start)s, %(page_len)s """.format(mcond=get_match_cond(doctype), key=searchfield), { "txt": "%" + txt + "%", "_txt": txt.replace("%", ""), @@ -291,8 +287,7 @@ def address_query(links): import json links = [ - {"link_doctype": d.get("link_doctype"), "link_name": d.get("link_name")} - for d in json.loads(links) + {"link_doctype": d.get("link_doctype"), "link_name": d.get("link_name")} for d in json.loads(links) ] result = [] @@ -335,9 +330,7 @@ def get_contact_with_phone_number(number): def get_contact_name(email_id): - contact = frappe.get_all( - "Contact Email", filters={"email_id": email_id}, fields=["parent"], limit=1 - ) + contact = frappe.get_all("Contact Email", filters={"email_id": email_id}, fields=["parent"], limit=1) return contact[0].parent if contact else None diff --git a/frappe/contacts/doctype/contact_email/contact_email.py b/frappe/contacts/doctype/contact_email/contact_email.py index 2667263f39..5d9458ab8d 100644 --- a/frappe/contacts/doctype/contact_email/contact_email.py +++ b/frappe/contacts/doctype/contact_email/contact_email.py @@ -20,4 +20,5 @@ class ContactEmail(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/contacts/doctype/contact_phone/contact_phone.py b/frappe/contacts/doctype/contact_phone/contact_phone.py index 45f164e4c1..f1b1608151 100644 --- a/frappe/contacts/doctype/contact_phone/contact_phone.py +++ b/frappe/contacts/doctype/contact_phone/contact_phone.py @@ -21,4 +21,5 @@ class ContactPhone(Document): parenttype: DF.Data phone: DF.Data # end: auto-generated types + pass diff --git a/frappe/contacts/doctype/gender/gender.py b/frappe/contacts/doctype/gender/gender.py index 69e4e8f75c..812b07d2b7 100644 --- a/frappe/contacts/doctype/gender/gender.py +++ b/frappe/contacts/doctype/gender/gender.py @@ -15,4 +15,5 @@ class Gender(Document): gender: DF.Data | None # end: auto-generated types + pass diff --git a/frappe/contacts/doctype/salutation/salutation.py b/frappe/contacts/doctype/salutation/salutation.py index 2d10dc18b5..161f19dfbb 100644 --- a/frappe/contacts/doctype/salutation/salutation.py +++ b/frappe/contacts/doctype/salutation/salutation.py @@ -15,4 +15,5 @@ class Salutation(Document): salutation: DF.Data | None # end: auto-generated types + pass diff --git a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py index 70ac273e57..9bb661d90c 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -76,12 +76,8 @@ def get_reference_addresses_and_contact(reference_doctype, reference_name): for d in reference_list: reference_details.setdefault(d, frappe._dict()) - reference_details = get_reference_details( - reference_doctype, "Address", reference_list, reference_details - ) - reference_details = get_reference_details( - reference_doctype, "Contact", reference_list, reference_details - ) + reference_details = get_reference_details(reference_doctype, "Address", reference_list, reference_details) + reference_details = get_reference_details(reference_doctype, "Contact", reference_list, reference_details) for reference_name, details in reference_details.items(): addresses = details.get("address", []) diff --git a/frappe/core/doctype/access_log/access_log.py b/frappe/core/doctype/access_log/access_log.py index f62343ea66..15723ac1a7 100644 --- a/frappe/core/doctype/access_log/access_log.py +++ b/frappe/core/doctype/access_log/access_log.py @@ -27,6 +27,7 @@ class AccessLog(Document): timestamp: DF.Datetime | None user: DF.Link | None # end: auto-generated types + @staticmethod def clear_old_logs(days=30): from frappe.query_builder import Interval diff --git a/frappe/core/doctype/activity_log/activity_log.py b/frappe/core/doctype/activity_log/activity_log.py index d58899f6cd..b24f7368b4 100644 --- a/frappe/core/doctype/activity_log/activity_log.py +++ b/frappe/core/doctype/activity_log/activity_log.py @@ -34,6 +34,7 @@ class ActivityLog(Document): timeline_name: DF.DynamicLink | None user: DF.Link | None # end: auto-generated types + def before_insert(self): self.full_name = get_fullname(self.user) self.date = now() diff --git a/frappe/core/doctype/activity_log/test_activity_log.py b/frappe/core/doctype/activity_log/test_activity_log.py index 0017d8f870..f2f029f220 100644 --- a/frappe/core/doctype/activity_log/test_activity_log.py +++ b/frappe/core/doctype/activity_log/test_activity_log.py @@ -9,7 +9,6 @@ from frappe.tests.utils import FrappeTestCase class TestActivityLog(FrappeTestCase): def test_activity_log(self): - # test user login log frappe.local.form_dict = frappe._dict( { diff --git a/frappe/core/doctype/amended_document_naming_settings/amended_document_naming_settings.py b/frappe/core/doctype/amended_document_naming_settings/amended_document_naming_settings.py index 3a25d9fe6c..cc55a66495 100644 --- a/frappe/core/doctype/amended_document_naming_settings/amended_document_naming_settings.py +++ b/frappe/core/doctype/amended_document_naming_settings/amended_document_naming_settings.py @@ -20,4 +20,5 @@ class AmendedDocumentNamingSettings(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/core/doctype/audit_trail/audit_trail.py b/frappe/core/doctype/audit_trail/audit_trail.py index 2b2e843f46..e0959b92cc 100644 --- a/frappe/core/doctype/audit_trail/audit_trail.py +++ b/frappe/core/doctype/audit_trail/audit_trail.py @@ -24,6 +24,7 @@ class AuditTrail(Document): end_date: DF.Date | None start_date: DF.Date | None # end: auto-generated types + pass def validate(self): diff --git a/frappe/core/doctype/block_module/block_module.py b/frappe/core/doctype/block_module/block_module.py index 17dd153d87..cea51f3d81 100644 --- a/frappe/core/doctype/block_module/block_module.py +++ b/frappe/core/doctype/block_module/block_module.py @@ -18,4 +18,5 @@ class BlockModule(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/core/doctype/comment/comment.py b/frappe/core/doctype/comment/comment.py index b33b7e6f63..3534297a73 100644 --- a/frappe/core/doctype/comment/comment.py +++ b/frappe/core/doctype/comment/comment.py @@ -52,6 +52,7 @@ class Comment(Document): seen: DF.Check subject: DF.Text | None # end: auto-generated types + def after_insert(self): notify_mentions(self.reference_doctype, self.reference_name, self.content) self.notify_change("add") diff --git a/frappe/core/doctype/comment/test_comment.py b/frappe/core/doctype/comment/test_comment.py index 9ee0e4dd00..af18b1fd9e 100644 --- a/frappe/core/doctype/comment/test_comment.py +++ b/frappe/core/doctype/comment/test_comment.py @@ -57,9 +57,7 @@ class TestComment(FrappeTestCase): frappe.db.delete("Comment", {"reference_doctype": "Blog Post"}) - add_comment_args.update( - comment="pleez vizits my site http://mysite.com", comment_by="bad commentor" - ) + add_comment_args.update(comment="pleez vizits my site http://mysite.com", comment_by="bad commentor") add_comment(**add_comment_args) self.assertEqual( diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index da985d2772..9b1ec3fa4b 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -119,6 +119,7 @@ class Communication(Document, CommunicationEmailMixin): unread_notification_sent: DF.Check user: DF.Link | None # end: auto-generated types + """Communication represents an external communication like Email.""" no_feed_on_delete = True @@ -133,7 +134,6 @@ class Communication(Document, CommunicationEmailMixin): and self.uid and self.uid != -1 ): - email_flag_queue = frappe.db.get_value( "Email Flag Queue", {"communication": self.name, "is_completed": 0} ) diff --git a/frappe/core/doctype/communication/mixins.py b/frappe/core/doctype/communication/mixins.py index 222778f28e..b48385ce49 100644 --- a/frappe/core/doctype/communication/mixins.py +++ b/frappe/core/doctype/communication/mixins.py @@ -239,9 +239,7 @@ class CommunicationEmailMixin: if not emails: return [] - return frappe.get_all( - "User", pluck="email", filters={"email": ["in", emails], "thread_notify": 0} - ) + return frappe.get_all("User", pluck="email", filters={"email": ["in", emails], "thread_notify": 0}) @staticmethod def filter_disabled_users(emails): @@ -259,7 +257,6 @@ class CommunicationEmailMixin: print_letterhead=None, is_inbound_mail_communcation=None, ) -> dict: - outgoing_email_account = self.get_outgoing_email_account() if not outgoing_email_account: return {} @@ -270,9 +267,7 @@ class CommunicationEmailMixin: cc = self.get_mail_cc_with_displayname( is_inbound_mail_communcation=is_inbound_mail_communcation, include_sender=send_me_a_copy ) - bcc = self.get_mail_bcc_with_displayname( - is_inbound_mail_communcation=is_inbound_mail_communcation - ) + bcc = self.get_mail_bcc_with_displayname(is_inbound_mail_communcation=is_inbound_mail_communcation) if not (recipients or cc): return {} diff --git a/frappe/core/doctype/communication_link/communication_link.py b/frappe/core/doctype/communication_link/communication_link.py index b79ebca236..f6e2a52659 100644 --- a/frappe/core/doctype/communication_link/communication_link.py +++ b/frappe/core/doctype/communication_link/communication_link.py @@ -21,6 +21,7 @@ class CommunicationLink(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/core/doctype/custom_docperm/custom_docperm.py b/frappe/core/doctype/custom_docperm/custom_docperm.py index 97360cf35f..bf3a9b06da 100644 --- a/frappe/core/doctype/custom_docperm/custom_docperm.py +++ b/frappe/core/doctype/custom_docperm/custom_docperm.py @@ -32,5 +32,6 @@ class CustomDocPerm(Document): submit: DF.Check write: DF.Check # end: auto-generated types + def on_update(self): frappe.clear_cache(doctype=self.parent) diff --git a/frappe/core/doctype/custom_role/custom_role.py b/frappe/core/doctype/custom_role/custom_role.py index 9911f2fad2..34879fcbba 100644 --- a/frappe/core/doctype/custom_role/custom_role.py +++ b/frappe/core/doctype/custom_role/custom_role.py @@ -20,6 +20,7 @@ class CustomRole(Document): report: DF.Link | None roles: DF.Table[HasRole] # end: auto-generated types + def validate(self): if self.report and not self.ref_doctype: self.ref_doctype = frappe.db.get_value("Report", self.report, "ref_doctype") diff --git a/frappe/core/doctype/data_export/data_export.py b/frappe/core/doctype/data_export/data_export.py index c8d25dfa38..df2abd4702 100644 --- a/frappe/core/doctype/data_export/data_export.py +++ b/frappe/core/doctype/data_export/data_export.py @@ -17,4 +17,5 @@ class DataExport(Document): file_type: DF.Literal["Excel", "CSV"] reference_doctype: DF.Link # end: auto-generated types + pass diff --git a/frappe/core/doctype/data_export/exporter.py b/frappe/core/doctype/data_export/exporter.py index 1e8df913b7..2cbfc632ec 100644 --- a/frappe/core/doctype/data_export/exporter.py +++ b/frappe/core/doctype/data_export/exporter.py @@ -183,9 +183,7 @@ class DataExporter: self.writer.writerow([_("Notes:")]) self.writer.writerow([_("Please do not change the template headings.")]) self.writer.writerow([_("First data column must be blank.")]) - self.writer.writerow( - [_('If you are uploading new records, leave the "name" (ID) column blank.')] - ) + self.writer.writerow([_('If you are uploading new records, leave the "name" (ID) column blank.')]) self.writer.writerow( [_('If you are uploading new records, "Naming Series" becomes mandatory, if present.')] ) @@ -252,7 +250,9 @@ class DataExporter: "label": "Parent", "fieldtype": "Data", "reqd": 1, - "info": _("Parent is the name of the document to which the data will get added to."), + "info": _( + "Parent is the name of the document to which the data will get added to." + ), } ), True, diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index b63b5cd2a7..8504aa1b04 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -154,9 +154,7 @@ def start_import(data_import): @frappe.whitelist() -def download_template( - doctype, export_fields=None, export_records=None, export_filters=None, file_type="CSV" -): +def download_template(doctype, export_fields=None, export_records=None, export_filters=None, file_type="CSV"): """ Download template from Exporter :param doctype: Document Type diff --git a/frappe/core/doctype/data_import/exporter.py b/frappe/core/doctype/data_import/exporter.py index 691474c3d3..3129ff5447 100644 --- a/frappe/core/doctype/data_import/exporter.py +++ b/frappe/core/doctype/data_import/exporter.py @@ -50,9 +50,7 @@ class Exporter: self.add_data() def get_all_exportable_fields(self): - child_table_fields = [ - df.fieldname for df in self.meta.fields if df.fieldtype in table_fieldtypes - ] + child_table_fields = [df.fieldname for df in self.meta.fields if df.fieldtype in table_fieldtypes] meta = frappe.get_meta(self.doctype) exportable_fields = frappe._dict({}) @@ -206,9 +204,7 @@ class Exporter: if is_parent: label = _(df.label or df.fieldname) else: - label = ( - f"{_(df.label or df.fieldname)} ({_(df.child_table_df.label or df.child_table_df.fieldname)})" - ) + label = f"{_(df.label or df.fieldname)} ({_(df.child_table_df.label or df.child_table_df.fieldname)})" if label in header: # this label is already in the header, diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 84f6acf8af..c83d60ea8b 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -103,10 +103,7 @@ class Importer: log_index = 0 # Do not remove rows in case of retry after an error or pending data import - if ( - self.data_import.status == "Partial Success" - and len(import_log) >= self.data_import.payload_count - ): + if self.data_import.status == "Partial Success" and len(import_log) >= self.data_import.payload_count: # remove previous failures from import log only in case of retry after partial success import_log = [log for log in import_log if log.get("success")] @@ -622,7 +619,9 @@ class Row: if len_row != len_columns: less_than_columns = len_row < len_columns message = ( - "Row has less values than columns" if less_than_columns else "Row has more values than columns" + "Row has less values than columns" + if less_than_columns + else "Row has more values than columns" ) self.warnings.append( { @@ -989,9 +988,7 @@ class Column: if self.df.fieldtype == "Link": # find all values that dont exist values = list({cstr(v) for v in self.column_values if v}) - exists = [ - cstr(d.name) for d in frappe.get_all(self.df.options, filters={"name": ("in", values)}) - ] + exists = [cstr(d.name) for d in frappe.get_all(self.df.options, filters={"name": ("in", values)})] not_exists = list(set(values) - set(exists)) if not_exists: missing_values = ", ".join(not_exists) @@ -1236,9 +1233,7 @@ def get_item_at_index(_list, i, default=None): def get_user_format(date_format): - return ( - date_format.replace("%Y", "yyyy").replace("%y", "yy").replace("%m", "mm").replace("%d", "dd") - ) + return date_format.replace("%Y", "yyyy").replace("%y", "yy").replace("%m", "mm").replace("%d", "dd") def df_as_json(df): diff --git a/frappe/core/doctype/data_import_log/data_import_log.py b/frappe/core/doctype/data_import_log/data_import_log.py index 2135057fea..3abc8d798c 100644 --- a/frappe/core/doctype/data_import_log/data_import_log.py +++ b/frappe/core/doctype/data_import_log/data_import_log.py @@ -22,4 +22,5 @@ class DataImportLog(Document): row_indexes: DF.Code | None success: DF.Check # end: auto-generated types + pass diff --git a/frappe/core/doctype/defaultvalue/defaultvalue.py b/frappe/core/doctype/defaultvalue/defaultvalue.py index 0458ef8452..91b52a3a4d 100644 --- a/frappe/core/doctype/defaultvalue/defaultvalue.py +++ b/frappe/core/doctype/defaultvalue/defaultvalue.py @@ -20,6 +20,7 @@ class DefaultValue(Document): parentfield: DF.Data parenttype: DF.Data # end: auto-generated types + pass diff --git a/frappe/core/doctype/deleted_document/deleted_document.py b/frappe/core/doctype/deleted_document/deleted_document.py index c99b6ad507..fb5fc6f5cb 100644 --- a/frappe/core/doctype/deleted_document/deleted_document.py +++ b/frappe/core/doctype/deleted_document/deleted_document.py @@ -25,6 +25,7 @@ class DeletedDocument(Document): new_name: DF.ReadOnly | None restored: DF.Check # end: auto-generated types + pass @staticmethod diff --git a/frappe/core/doctype/docperm/docperm.py b/frappe/core/doctype/docperm/docperm.py index c508b77ce1..d014d7dae1 100644 --- a/frappe/core/doctype/docperm/docperm.py +++ b/frappe/core/doctype/docperm/docperm.py @@ -33,4 +33,5 @@ class DocPerm(Document): submit: DF.Check write: DF.Check # end: auto-generated types + pass diff --git a/frappe/core/doctype/docshare/docshare.py b/frappe/core/doctype/docshare/docshare.py index ae10d161e0..9d25629328 100644 --- a/frappe/core/doctype/docshare/docshare.py +++ b/frappe/core/doctype/docshare/docshare.py @@ -28,6 +28,7 @@ class DocShare(Document): user: DF.Link | None write: DF.Check # end: auto-generated types + no_feed_on_delete = True def validate(self): @@ -58,13 +59,10 @@ class DocShare(Document): if not self.flags.ignore_share_permission and not frappe.has_permission( self.share_doctype, "share", self.get_doc() ): - frappe.throw(_('You need to have "Share" permission'), frappe.PermissionError) def check_is_submittable(self): - if self.submit and not cint( - frappe.db.get_value("DocType", self.share_doctype, "is_submittable") - ): + if self.submit and not cint(frappe.db.get_value("DocType", self.share_doctype, "is_submittable")): frappe.throw( _("Cannot share {0} with submit permission as the doctype {1} is not submittable").format( frappe.bold(self.share_name), frappe.bold(self.share_doctype) diff --git a/frappe/core/doctype/docshare/test_docshare.py b/frappe/core/doctype/docshare/test_docshare.py index 3b6ec0c396..e9ed34a7b8 100644 --- a/frappe/core/doctype/docshare/test_docshare.py +++ b/frappe/core/doctype/docshare/test_docshare.py @@ -136,9 +136,7 @@ class TestDocShare(FrappeTestCase): doctype = "Test DocShare with Submit" create_submittable_doctype(doctype, submit_perms=0) - submittable_doc = frappe.get_doc( - dict(doctype=doctype, test="test docshare with submit") - ).insert() + submittable_doc = frappe.get_doc(dict(doctype=doctype, test="test docshare with submit")).insert() frappe.set_user(self.user) self.assertFalse(frappe.has_permission(doctype, "submit", user=self.user)) @@ -147,15 +145,11 @@ class TestDocShare(FrappeTestCase): frappe.share.add(doctype, submittable_doc.name, self.user, submit=1) frappe.set_user(self.user) - self.assertTrue( - frappe.has_permission(doctype, "submit", doc=submittable_doc.name, user=self.user) - ) + self.assertTrue(frappe.has_permission(doctype, "submit", doc=submittable_doc.name, user=self.user)) # test cascade self.assertTrue(frappe.has_permission(doctype, "read", doc=submittable_doc.name, user=self.user)) - self.assertTrue( - frappe.has_permission(doctype, "write", doc=submittable_doc.name, user=self.user) - ) + self.assertTrue(frappe.has_permission(doctype, "write", doc=submittable_doc.name, user=self.user)) frappe.share.remove(doctype, submittable_doc.name, self.user) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 4459caf177..fdd6f51e9c 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -133,7 +133,6 @@ class DocType(Document): is_virtual: DF.Check issingle: DF.Check istable: DF.Check - link_filters: DF.JSON links: DF.Table[DocTypeLink] make_attachments_public: DF.Check max_attachments: DF.Int @@ -313,7 +312,9 @@ class DocType(Document): continue frappe.msgprint( - _("{0} should be indexed because it's referred in dashboard connections").format(_(d.label)), + _("{0} should be indexed because it's referred in dashboard connections").format( + _(d.label) + ), alert=True, indicator="orange", ) @@ -330,9 +331,7 @@ class DocType(Document): ) if self.is_virtual and self.custom: - frappe.throw( - _("Not allowed to create custom Virtual DocType."), CannotCreateStandardDoctypeError - ) + frappe.throw(_("Not allowed to create custom Virtual DocType."), CannotCreateStandardDoctypeError) if frappe.conf.get("developer_mode"): self.owner = "Administrator" @@ -485,10 +484,14 @@ class DocType(Document): elif d.fieldtype in ("Section Break", "Column Break", "Tab Break"): d.fieldname = d.fieldtype.lower().replace(" ", "_") + "_" + str(random_string(4)) else: - frappe.throw(_("Row #{}: Fieldname is required").format(d.idx), title="Missing Fieldname") + frappe.throw( + _("Row #{}: Fieldname is required").format(d.idx), title="Missing Fieldname" + ) else: if d.fieldname in restricted: - frappe.throw(_("Fieldname {0} is restricted").format(d.fieldname), InvalidFieldNameError) + frappe.throw( + _("Fieldname {0} is restricted").format(d.fieldname), InvalidFieldNameError + ) d.fieldname = ILLEGAL_FIELDNAME_PATTERN.sub("", d.fieldname) # fieldnames should be lowercase @@ -886,9 +889,7 @@ class DocType(Document): if self.allow_auto_repeat: if not frappe.db.exists( "Custom Field", {"fieldname": "auto_repeat", "dt": self.name} - ) and not frappe.db.exists( - "DocField", {"fieldname": "auto_repeat", "parent": self.name} - ): + ) and not frappe.db.exists("DocField", {"fieldname": "auto_repeat", "parent": self.name}): insert_after = self.fields[len(self.fields) - 1].fieldname df = dict( fieldname="auto_repeat", @@ -997,7 +998,8 @@ class DocType(Document): if len(name) > max_length: # length(tab + ) 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"> test - """.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 "" not in self.source ): self.source = """{{% extends "{0}" %}} - {{% block page_content %}}{1}{{% endblock %}}""".format( - context.base_template, self.source - ) + {{% block page_content %}}{1}{{% endblock %}}""".format(context.base_template, self.source) self.set_properties_via_comments() diff --git a/frappe/website/path_resolver.py b/frappe/website/path_resolver.py index b17031c4bb..12c961fc6e 100644 --- a/frappe/website/path_resolver.py +++ b/frappe/website/path_resolver.py @@ -167,8 +167,7 @@ def resolve_path(path): def resolve_from_map(path): """transform dynamic route to a static one from hooks and route defined in doctype""" rules = [ - Rule(r["from_route"], endpoint=r["to_route"], defaults=r.get("defaults")) - for r in get_website_rules() + Rule(r["from_route"], endpoint=r["to_route"], defaults=r.get("defaults")) for r in get_website_rules() ] return evaluate_dynamic_routes(rules, path) or path diff --git a/frappe/website/report/website_analytics/website_analytics.py b/frappe/website/report/website_analytics/website_analytics.py index 70bc62fc30..a395e5e582 100644 --- a/frappe/website/report/website_analytics/website_analytics.py +++ b/frappe/website/report/website_analytics/website_analytics.py @@ -89,9 +89,7 @@ class WebsiteAnalytics: WHERE creation BETWEEN %s AND %s GROUP BY DATE_FORMAT({0}, %s) ORDER BY creation - """.format( - field - ) + """.format(field) values = (date_format, self.filters.from_date, self.filters.to_date, date_format) @@ -117,9 +115,7 @@ class WebsiteAnalytics: WHERE coalesce("tabWeb Page View".{0}, '0001-01-01') BETWEEN %s AND %s GROUP BY date_trunc(%s, {0}) ORDER BY date - """.format( - field - ) + """.format(field) values = (granularity, self.filters.from_date, self.filters.to_date, granularity) diff --git a/frappe/website/utils.py b/frappe/website/utils.py index d92e4f033f..a92b65415f 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -319,9 +319,9 @@ def extract_title(source, path): # make title from name title = ( os.path.basename( - path.rsplit(".",)[ - 0 - ].rstrip("/") + path.rsplit( + ".", + )[0].rstrip("/") ) .replace("_", " ") .replace("-", " ") diff --git a/frappe/website/website_generator.py b/frappe/website/website_generator.py index 598978dd46..038f22d4bd 100644 --- a/frappe/website/website_generator.py +++ b/frappe/website/website_generator.py @@ -30,9 +30,7 @@ class WebsiteGenerator(Document): self.name = self.scrubbed_title() def onload(self): - self.get("__onload").update( - {"is_website_generator": True, "published": self.is_website_published()} - ) + self.get("__onload").update({"is_website_generator": True, "published": self.is_website_published()}) def validate(self): self.set_route() diff --git a/frappe/workflow/doctype/workflow/test_workflow.py b/frappe/workflow/doctype/workflow/test_workflow.py index 36e11072fa..2ef3cfcf51 100644 --- a/frappe/workflow/doctype/workflow/test_workflow.py +++ b/frappe/workflow/doctype/workflow/test_workflow.py @@ -221,9 +221,7 @@ def create_todo_workflow(): ) workflow.append( "transitions", - dict( - state="Rejected", action="Review", next_state="Pending", allowed="All", allow_self_approval=1 - ), + dict(state="Rejected", action="Review", next_state="Pending", allowed="All", allow_self_approval=1), ) workflow.insert(ignore_permissions=True) diff --git a/frappe/workflow/doctype/workflow/workflow.py b/frappe/workflow/doctype/workflow/workflow.py index 22c9efed8a..04f1a9ceca 100644 --- a/frappe/workflow/doctype/workflow/workflow.py +++ b/frappe/workflow/doctype/workflow/workflow.py @@ -29,8 +29,8 @@ class Workflow(Document): workflow_data: DF.JSON | None workflow_name: DF.Data workflow_state_field: DF.Data - # end: auto-generated types + def validate(self): self.set_active() self.create_custom_field_for_workflow_state() @@ -76,9 +76,7 @@ class Workflow(Document): SET `{field}` = %s WHERE ifnull(`{field}`, '') = '' AND `docstatus` = %s - """.format( - doctype=self.document_type, field=self.workflow_state_field - ), + """.format(doctype=self.document_type, field=self.workflow_state_field), (d.state, d.doc_status), ) @@ -103,9 +101,9 @@ class Workflow(Document): if state.doc_status == "1" and next_state.doc_status == "0": frappe.throw( - frappe._("Submitted Document cannot be converted back to draft. Transition row {0}").format( - t.idx - ) + frappe._( + "Submitted Document cannot be converted back to draft. Transition row {0}" + ).format(t.idx) ) if state.doc_status == "0" and next_state.doc_status == "2": diff --git a/frappe/workflow/doctype/workflow_action/workflow_action.py b/frappe/workflow/doctype/workflow_action/workflow_action.py index 27b868e020..1826a338f3 100644 --- a/frappe/workflow/doctype/workflow_action/workflow_action.py +++ b/frappe/workflow/doctype/workflow_action/workflow_action.py @@ -43,6 +43,7 @@ class WorkflowAction(Document): user: DF.Link | None workflow_state: DF.Data | None # end: auto-generated types + pass @@ -76,9 +77,7 @@ def get_permission_query_conditions(user): return """(`tabWorkflow Action`.`name` in ({permitted_workflow_actions}) or `tabWorkflow Action`.`user`={user}) and `tabWorkflow Action`.`status`='Open' - """.format( - permitted_workflow_actions=permitted_workflow_actions, user=frappe.db.escape(user) - ) + """.format(permitted_workflow_actions=permitted_workflow_actions, user=frappe.db.escape(user)) def has_permission(doc, user): @@ -101,14 +100,10 @@ def process_workflow_actions(doc, state): if is_workflow_action_already_created(doc): return - update_completed_workflow_actions( - doc, workflow=workflow, workflow_state=get_doc_workflow_state(doc) - ) + update_completed_workflow_actions(doc, workflow=workflow, workflow_state=get_doc_workflow_state(doc)) clear_doctype_notifications("Workflow Action") - next_possible_transitions = get_next_possible_transitions( - workflow, get_doc_workflow_state(doc), doc - ) + next_possible_transitions = get_next_possible_transitions(workflow, get_doc_workflow_state(doc), doc) if not next_possible_transitions: return @@ -121,9 +116,7 @@ def process_workflow_actions(doc, state): create_workflow_actions_for_roles(roles, doc) if send_email_alert(workflow): - enqueue( - send_workflow_action_email, queue="short", users_data=list(user_data_map.values()), doc=doc - ) + enqueue(send_workflow_action_email, queue="short", users_data=list(user_data_map.values()), doc=doc) @frappe.whitelist(allow_guest=True) @@ -400,9 +393,7 @@ def deduplicate_actions(action_list): def get_workflow_action_url(action, doc, user): - apply_action_method = ( - "/api/method/frappe.workflow.doctype.workflow_action.workflow_action.apply_action" - ) + apply_action_method = "/api/method/frappe.workflow.doctype.workflow_action.workflow_action.apply_action" params = { "doctype": doc.get("doctype"), diff --git a/frappe/workflow/doctype/workflow_action_master/workflow_action_master.py b/frappe/workflow/doctype/workflow_action_master/workflow_action_master.py index f6d21783b3..63f960e511 100644 --- a/frappe/workflow/doctype/workflow_action_master/workflow_action_master.py +++ b/frappe/workflow/doctype/workflow_action_master/workflow_action_master.py @@ -15,4 +15,5 @@ class WorkflowActionMaster(Document): workflow_action_name: DF.Data # end: auto-generated types + pass diff --git a/frappe/workflow/doctype/workflow_action_permitted_role/workflow_action_permitted_role.py b/frappe/workflow/doctype/workflow_action_permitted_role/workflow_action_permitted_role.py index 926dc77ca6..6cd4d4618b 100644 --- a/frappe/workflow/doctype/workflow_action_permitted_role/workflow_action_permitted_role.py +++ b/frappe/workflow/doctype/workflow_action_permitted_role/workflow_action_permitted_role.py @@ -19,4 +19,5 @@ class WorkflowActionPermittedRole(Document): parenttype: DF.Data role: DF.Link | None # end: auto-generated types + pass diff --git a/frappe/workflow/doctype/workflow_document_state/workflow_document_state.py b/frappe/workflow/doctype/workflow_document_state/workflow_document_state.py index d1644578d8..c374ce7602 100644 --- a/frappe/workflow/doctype/workflow_document_state/workflow_document_state.py +++ b/frappe/workflow/doctype/workflow_document_state/workflow_document_state.py @@ -28,4 +28,5 @@ class WorkflowDocumentState(Document): update_value: DF.Data | None workflow_builder_id: DF.Data | None # end: auto-generated types + pass diff --git a/frappe/workflow/doctype/workflow_state/workflow_state.py b/frappe/workflow/doctype/workflow_state/workflow_state.py index c7d263c684..cd18530098 100644 --- a/frappe/workflow/doctype/workflow_state/workflow_state.py +++ b/frappe/workflow/doctype/workflow_state/workflow_state.py @@ -160,4 +160,5 @@ class WorkflowState(Document): style: DF.Literal["", "Primary", "Info", "Success", "Warning", "Danger", "Inverse"] workflow_state_name: DF.Data # end: auto-generated types + pass diff --git a/frappe/workflow/doctype/workflow_transition/workflow_transition.py b/frappe/workflow/doctype/workflow_transition/workflow_transition.py index 817f8ed6a5..f6f7d2b1da 100644 --- a/frappe/workflow/doctype/workflow_transition/workflow_transition.py +++ b/frappe/workflow/doctype/workflow_transition/workflow_transition.py @@ -23,5 +23,7 @@ class WorkflowTransition(Document): parentfield: DF.Data parenttype: DF.Data state: DF.Link + workflow_builder_id: DF.Data | None # end: auto-generated types + pass diff --git a/frappe/www/app.py b/frappe/www/app.py index 44a146cc63..552f2c1a05 100644 --- a/frappe/www/app.py +++ b/frappe/www/app.py @@ -19,9 +19,7 @@ CLOSING_SCRIPT_TAG_PATTERN = re.compile(r"") def get_context(context): if frappe.session.user == "Guest": frappe.throw(_("Log in to access this page."), frappe.PermissionError) - elif ( - frappe.db.get_value("User", frappe.session.user, "user_type", order_by=None) == "Website User" - ): + elif frappe.db.get_value("User", frappe.session.user, "user_type", order_by=None) == "Website User": frappe.throw(_("You are not permitted to access this page."), frappe.PermissionError) hooks = frappe.get_hooks() diff --git a/frappe/www/error.py b/frappe/www/error.py index f9b6804b92..4f77d8bc91 100644 --- a/frappe/www/error.py +++ b/frappe/www/error.py @@ -16,7 +16,5 @@ def get_context(context): context.error_message = context.error_message or _("There was an error building this page") return { - "error": frappe.get_traceback().replace("<", "<").replace(">", ">") - if allow_traceback - else "" + "error": frappe.get_traceback().replace("<", "<").replace(">", ">") if allow_traceback else "" } diff --git a/frappe/www/login.py b/frappe/www/login.py index ff9c0d2854..b4a43e2a1a 100644 --- a/frappe/www/login.py +++ b/frappe/www/login.py @@ -123,7 +123,6 @@ def login_via_token(login_token: str): @frappe.whitelist(allow_guest=True) @rate_limit(limit=5, seconds=60 * 60) def send_login_link(email: str): - if not frappe.get_system_settings("login_with_email_link"): return @@ -149,9 +148,7 @@ def _generate_temporary_login_link(email: str, expiry: int): assert isinstance(email, str) if not frappe.db.exists("User", email): - frappe.throw( - _("User with email address {0} does not exist").format(email), frappe.DoesNotExistError - ) + frappe.throw(_("User with email address {0} does not exist").format(email), frappe.DoesNotExistError) key = frappe.generate_hash() frappe.cache.set_value(f"one_time_login_key:{key}", email, expires_in_sec=expiry * 60) diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 8bd44c88aa..e17829de10 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -117,7 +117,6 @@ def get_rendered_template( trigger_print: bool = False, settings: dict = None, ) -> str: - print_settings = frappe.get_single("Print Settings").as_dict() print_settings.update(settings or {}) @@ -195,9 +194,7 @@ def get_rendered_template( letter_head = frappe._dict(get_letter_head(doc, no_letterhead, letterhead) or {}) if letter_head.content: - letter_head.content = frappe.utils.jinja.render_template( - letter_head.content, {"doc": doc.as_dict()} - ) + letter_head.content = frappe.utils.jinja.render_template(letter_head.content, {"doc": doc.as_dict()}) if letter_head.header_script: letter_head.content += f"""