diff --git a/frappe/__init__.py b/frappe/__init__.py index 9a83443b02..afc32a0a98 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -523,11 +523,7 @@ def clear_messages(): def get_message_log(): - log = [] - for msg_out in local.message_log: - log.append(json.loads(msg_out)) - - return log + return [json.loads(msg_out) for msg_out in local.message_log] def clear_last_message(): diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py index dfff7626ff..aa447a9330 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py @@ -141,17 +141,20 @@ class AssignmentRule(Document): def get_user_load_balancing(self): """Assign to the user with least number of open assignments""" - counts = [] - for d in self.users: - counts.append( - dict( - user=d.user, - count=frappe.db.count( - "ToDo", dict(reference_type=self.document_type, allocated_to=d.user, status="Open") + counts = [ + dict( + user=d.user, + count=frappe.db.count( + "ToDo", + dict( + reference_type=self.document_type, + allocated_to=d.user, + status="Open", ), - ) + ), ) - + for d in self.users + ] # sort by dict value sorted_counts = sorted(counts, key=lambda k: k["count"]) diff --git a/frappe/client.py b/frappe/client.py index b09f9168f4..ed853f2307 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -208,11 +208,7 @@ def insert_many(docs=None): if len(docs) > 200: frappe.throw(_("Only 200 inserts allowed in one request")) - out = [] - for doc in docs: - out.append(insert_doc(doc).name) - - return out + return [insert_doc(doc).name for doc in docs] @frappe.whitelist(methods=["POST", "PUT"]) diff --git a/frappe/contacts/address_and_contact.py b/frappe/contacts/address_and_contact.py index 74cbcfa6b7..9f700f4e39 100644 --- a/frappe/contacts/address_and_contact.py +++ b/frappe/contacts/address_and_contact.py @@ -51,21 +51,17 @@ def get_permission_query_conditions(doctype): return "" elif not links.get("permitted_links"): - conditions = [] - # when everything is not permitted - for df in links.get("not_permitted_links"): - # like ifnull(customer, '')='' and ifnull(supplier, '')='' - conditions.append(f"ifnull(`tab{doctype}`.`{df.fieldname}`, '')=''") + conditions = [ + f"ifnull(`tab{doctype}`.`{df.fieldname}`, '')=''" for df in links.get("not_permitted_links") + ] return "( " + " and ".join(conditions) + " )" else: - conditions = [] - - for df in links.get("permitted_links"): - # like ifnull(customer, '')!='' or ifnull(supplier, '')!='' - conditions.append(f"ifnull(`tab{doctype}`.`{df.fieldname}`, '')!=''") + conditions = [ + f"ifnull(`tab{doctype}`.`{df.fieldname}`, '')!=''" for df in links.get("permitted_links") + ] return "( " + " or ".join(conditions) + " )" 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 9848e81b63..70ac273e57 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -115,10 +115,7 @@ def get_reference_details(reference_doctype, doctype, reference_list, reference_ fields = ["`tabDynamic Link`.link_name"] + field_map.get(doctype, []) records = frappe.get_list(doctype, filters=filters, fields=fields, as_list=True) - temp_records = list() - - for d in records: - temp_records.append(d[1:]) + temp_records = [d[1:] for d in records] if not reference_list: frappe.throw(_("No records present in {0}").format(reference_doctype)) diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index 3a52fcd334..0b3812486c 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -553,9 +553,7 @@ def get_emails(email_strings: list[str]) -> list[str]: for email_string in email_strings: if email_string: result = getaddresses([email_string]) - for email in result: - email_addrs.append(email[1]) - + email_addrs.extend(email[1] for email in result) return email_addrs diff --git a/frappe/core/doctype/communication/mixins.py b/frappe/core/doctype/communication/mixins.py index 73e94fad09..d6f134127f 100644 --- a/frappe/core/doctype/communication/mixins.py +++ b/frappe/core/doctype/communication/mixins.py @@ -189,9 +189,7 @@ class CommunicationEmailMixin: } final_attachments.append(d) - for a in self.get_attachments() or []: - final_attachments.append({"fid": a["name"]}) - + final_attachments.extend({"fid": a["name"]} for a in self.get_attachments() or []) return final_attachments def get_unsubscribe_message(self): diff --git a/frappe/core/doctype/data_export/exporter.py b/frappe/core/doctype/data_export/exporter.py index bc67087151..6190034308 100644 --- a/frappe/core/doctype/data_export/exporter.py +++ b/frappe/core/doctype/data_export/exporter.py @@ -120,9 +120,10 @@ class DataExporter: self.column_start_end = {} if self.all_doctypes: - self.child_doctypes = [] - for df in frappe.get_meta(self.doctype).get_table_fields(): - self.child_doctypes.append(dict(doctype=df.options, parentfield=df.fieldname)) + self.child_doctypes = [ + dict(doctype=df.options, parentfield=df.fieldname) + for df in frappe.get_meta(self.doctype).get_table_fields() + ] def build_response(self): self.writer = UnicodeWriter() diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 64f125eae2..697aa9a300 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -290,10 +290,11 @@ class Report(Document): columns = params.get("fields") else: columns = [["name", self.ref_doctype]] - for df in frappe.get_meta(self.ref_doctype).fields: - if df.in_list_view: - columns.append([df.fieldname, self.ref_doctype]) - + columns.extend( + [df.fieldname, self.ref_doctype] + for df in frappe.get_meta(self.ref_doctype).fields + if df.in_list_view + ) return columns def get_standard_report_filters(self, params, filters): 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 e8b975f638..ebc2fc9900 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 @@ -95,11 +95,9 @@ class RolePermissionforPageandReport(Document): return {check_for_field: name} def get_roles(self): - roles = [] - for data in self.roles: - if data.role != "All": - roles.append({"role": data.role, "parenttype": "Custom Role"}) - return roles + return [ + {"role": data.role, "parenttype": "Custom Role"} for data in self.roles if data.role != "All" + ] def update_status(self): return frappe.render_template diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index d80dc4b816..1e837258f0 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -569,10 +569,7 @@ class User(Document): tables = frappe.db.get_tables() for tab in tables: desc = frappe.db.get_table_columns_description(tab) - has_fields = [] - for d in desc: - if d.get("name") in ["owner", "modified_by"]: - has_fields.append(d.get("name")) + has_fields = [d.get("name") for d in desc if d.get("name") in ["owner", "modified_by"]] for field in has_fields: frappe.db.sql( """UPDATE `%s` diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py index 6a719d0339..ea00b604c1 100644 --- a/frappe/core/doctype/user_permission/user_permission.py +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -169,11 +169,7 @@ def get_applicable_for_doctype_list(doctype, txt, searchfield, start, page_len, linked_doctypes.sort() - return_list = [] - for doctype in linked_doctypes[start:page_len]: - return_list.append([doctype]) - - return return_list + return [[doctype] for doctype in linked_doctypes[start:page_len]] def get_permitted_documents(doctype): diff --git a/frappe/core/doctype/user_type/user_type.py b/frappe/core/doctype/user_type/user_type.py index f5c86b1ae5..355b390b3f 100644 --- a/frappe/core/doctype/user_type/user_type.py +++ b/frappe/core/doctype/user_type/user_type.py @@ -193,9 +193,7 @@ class UserType(Document): doctypes.append("File") for doctype in ["select_doctypes", "custom_select_doctypes"]: - for dt in self.get(doctype): - doctypes.append(dt.document_type) - + doctypes.extend(dt.document_type for dt in self.get(doctype)) for perm in frappe.get_all( "Custom DocPerm", filters={"role": self.role, "parent": ["not in", doctypes]} ): diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py index fd879095c0..e0a7e3f8c2 100644 --- a/frappe/core/page/permission_manager/permission_manager.py +++ b/frappe/core/page/permission_manager/permission_manager.py @@ -43,9 +43,7 @@ def get_roles_and_doctypes(): restricted_roles = ["Administrator"] if frappe.session.user != "Administrator": custom_user_type_roles = frappe.get_all("User Type", filters={"is_standard": 0}, fields=["role"]) - for row in custom_user_type_roles: - restricted_roles.append(row.role) - + restricted_roles.extend(row.role for row in custom_user_type_roles) restricted_roles.append("All") roles = frappe.get_all( diff --git a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py index 4b455e0ab4..25657e17e8 100644 --- a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py +++ b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py @@ -56,11 +56,9 @@ def query_doctypes(doctype, txt, searchfield, start, page_len, filters): single_doctypes = [d[0] for d in frappe.db.get_values("DocType", {"issingle": 1})] - out = [] - for dt in can_read: - if txt.lower().replace("%", "") in dt.lower() and ( - include_single_doctypes or dt not in single_doctypes - ): - out.append([dt]) - - return out + return [ + [dt] + for dt in can_read + if txt.lower().replace("%", "") in dt.lower() + and (include_single_doctypes or dt not in single_doctypes) + ] diff --git a/frappe/core/utils.py b/frappe/core/utils.py index b445257b7d..5f388f5458 100644 --- a/frappe/core/utils.py +++ b/frappe/core/utils.py @@ -66,11 +66,7 @@ def find_all(list_of_dict, match_function): red_shapes = find_all(colored_shapes, lambda d: d['color'] == 'red') """ - found = [] - for entry in list_of_dict: - if match_function(entry): - found.append(entry) - return found + return [entry for entry in list_of_dict if match_function(entry)] def ljust_list(_list, length, fill_word=None): diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 527f53ea71..ba9e36a86d 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -600,11 +600,8 @@ class CustomizeForm(Document): ), as_dict=True, ) - links = [] label = df.label - for doc in docs: - links.append(frappe.utils.get_link_to_form(self.doc_type, doc.name)) - links_str = ", ".join(links) + links_str = ", ".join(frappe.utils.get_link_to_form(self.doc_type, doc.name) for doc in docs) if docs: frappe.throw( diff --git a/frappe/database/mariadb/schema.py b/frappe/database/mariadb/schema.py index bbdd95d921..63cdca2736 100644 --- a/frappe/database/mariadb/schema.py +++ b/frappe/database/mariadb/schema.py @@ -70,29 +70,26 @@ class MariaDBTable(DBTable): for col in self.columns.values(): col.build_for_alter_table(self.current_columns.get(col.fieldname.lower())) - add_column_query = [] - modify_column_query = [] - add_index_query = [] - drop_index_query = [] - - for col in self.add_column: - add_column_query.append(f"ADD COLUMN `{col.fieldname}` {col.get_definition()}") - + 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) - for col in columns_to_modify: - modify_column_query.append( - f"MODIFY `{col.fieldname}` {col.get_definition(for_modification=True)}" - ) - - for col in self.add_unique: - modify_column_query.append( + 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_index: - # if index key does not exists - if not frappe.db.get_column_index(self.table_name, col.fieldname, unique=False): - add_index_query.append(f"ADD INDEX `{col.fieldname}_index`(`{col.fieldname}`)") + for col in self.add_unique + ] + ) + add_index_query = [ + f"ADD INDEX `{col.fieldname}_index`(`{col.fieldname}`)" + for col in self.add_index + if not frappe.db.get_column_index(self.table_name, col.fieldname, unique=False) + ] + drop_index_query = [] for col in {*self.drop_index, *self.drop_unique}: if col.fieldname == "name": diff --git a/frappe/database/postgres/schema.py b/frappe/database/postgres/schema.py index 5e28c81455..8b9b0f70ba 100644 --- a/frappe/database/postgres/schema.py +++ b/frappe/database/postgres/schema.py @@ -76,10 +76,7 @@ class PostgresTable(DBTable): for col in self.columns.values(): col.build_for_alter_table(self.current_columns.get(col.fieldname.lower())) - query = [] - - for col in self.add_column: - query.append(f"ADD COLUMN `{col.fieldname}` {col.get_definition()}") + query = [f"ADD COLUMN `{col.fieldname}` {col.get_definition()}" for col in self.add_column] for col in self.change_type: using_clause = "" diff --git a/frappe/database/schema.py b/frappe/database/schema.py index ed7d1d16fc..24eea24fa9 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -58,16 +58,16 @@ class DBTable: return ret def get_index_definitions(self): - ret = [] - for key, col in self.columns.items(): + return [ + "index `" + key + "`(`" + key + "`)" + for key, col in self.columns.items() if ( col.set_index and not col.unique and col.fieldtype in frappe.db.type_map and frappe.db.type_map.get(col.fieldtype)[0] not in ("text", "longtext") - ): - ret.append("index `" + key + "`(`" + key + "`)") - return ret + ) + ] def get_columns_from_docfields(self): """ diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 141ac7d013..eac90cee94 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -493,11 +493,15 @@ def get_custom_doctype_list(module): order_by="name", ) - out = [] - for d in doctypes: - out.append({"type": "Link", "link_type": "doctype", "link_to": d.name, "label": _(d.name)}) - - return out + return [ + { + "type": "Link", + "link_type": "doctype", + "link_to": d.name, + "label": _(d.name), + } + for d in doctypes + ] def get_custom_report_list(module): @@ -509,23 +513,20 @@ def get_custom_report_list(module): order_by="name", ) - out = [] - for r in reports: - out.append( - { - "type": "Link", - "link_type": "report", - "doctype": r.ref_doctype, - "dependencies": r.ref_doctype, - "is_query_report": 1 - if r.report_type in ("Query Report", "Script Report", "Custom Report") - else 0, - "label": _(r.name), - "link_to": r.name, - } - ) - - return out + return [ + { + "type": "Link", + "link_type": "report", + "doctype": r.ref_doctype, + "dependencies": r.ref_doctype, + "is_query_report": 1 + if r.report_type in ("Query Report", "Script Report", "Custom Report") + else 0, + "label": _(r.name), + "link_to": r.name, + } + for r in reports + ] def save_new_widget(doc, page, blocks, new_widgets): diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py index cefe55571a..225a8d6435 100644 --- a/frappe/desk/doctype/dashboard/dashboard.py +++ b/frappe/desk/doctype/dashboard/dashboard.py @@ -105,12 +105,8 @@ def get_permitted_charts(dashboard_name): @frappe.whitelist() def get_permitted_cards(dashboard_name): - permitted_cards = [] dashboard = frappe.get_doc("Dashboard", dashboard_name) - for card in dashboard.cards: - if frappe.has_permission("Number Card", doc=card.card): - permitted_cards.append(card) - return permitted_cards + return [card for card in dashboard.cards if frappe.has_permission("Number Card", doc=card.card)] def get_non_standard_charts_in_dashboard(dashboard): diff --git a/frappe/desk/doctype/tag/tag.py b/frappe/desk/doctype/tag/tag.py index b1d45ca8fc..05adaed926 100644 --- a/frappe/desk/doctype/tag/tag.py +++ b/frappe/desk/doctype/tag/tag.py @@ -188,16 +188,19 @@ def get_documents_for_tag(tag): """ # remove hastag `#` from tag tag = tag[1:] - results = [] result = frappe.get_list( "Tag Link", filters={"tag": tag}, fields=["document_type", "document_name", "title", "tag"] ) - for res in result: - results.append({"doctype": res.document_type, "name": res.document_name, "content": res.title}) - - return results + return [ + { + "doctype": res.document_type, + "name": res.document_name, + "content": res.title, + } + for res in result + ] @frappe.whitelist() diff --git a/frappe/desk/form/document_follow.py b/frappe/desk/form/document_follow.py index f12e44fe61..d698c647da 100644 --- a/frappe/desk/form/document_follow.py +++ b/frappe/desk/form/document_follow.py @@ -263,19 +263,17 @@ def get_row_changed(row_changed, time, doctype, doc_name, v): def get_added_row(added, time, doctype, doc_name, v): - items = [] - for d in added: - items.append( - { - "time": v.modified, - "data": {"to": d[0], "time": time}, - "doctype": doctype, - "doc_name": doc_name, - "type": "row added", - "by": v.modified_by, - } - ) - return items + return [ + { + "time": v.modified, + "data": {"to": d[0], "time": time}, + "doctype": doctype, + "doc_name": doc_name, + "type": "row added", + "by": v.modified_by, + } + for d in added + ] def get_field_changed(changed, time, doctype, doc_name, v): diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py index 1ec604c34d..8f569b5a9e 100644 --- a/frappe/desk/form/linked_with.py +++ b/frappe/desk/form/linked_with.py @@ -407,10 +407,7 @@ def validate_linked_doc(docinfo, ignore_doctypes_on_cancel_all=None): def get_exempted_doctypes(): """Get list of doctypes exempted from being auto-cancelled""" - auto_cancel_exempt_doctypes = [] - for doctypes in frappe.get_hooks("auto_cancel_exempted_doctypes"): - auto_cancel_exempt_doctypes.append(doctypes) - return auto_cancel_exempt_doctypes + return list(frappe.get_hooks("auto_cancel_exempted_doctypes")) def get_linked_docs(doctype: str, name: str, linkinfo: dict | None = None) -> dict[str, list]: diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index a82797130c..7a54ac81e9 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -77,9 +77,11 @@ def getdoctype(doctype, with_parent=False, cached_timestamp=None): def get_meta_bundle(doctype): bundle = [frappe.desk.form.meta.get_meta(doctype)] - for df in bundle[0].fields: - if df.fieldtype in frappe.model.table_fields: - bundle.append(frappe.desk.form.meta.get_meta(df.options)) + bundle.extend( + frappe.desk.form.meta.get_meta(df.options) + for df in bundle[0].fields + if df.fieldtype in frappe.model.table_fields + ) return bundle diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index 6c338dbbbc..d0a6b2501c 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -242,9 +242,7 @@ class FormMeta(Meta): workflow = frappe.get_doc("Workflow", workflow_name) workflow_docs.append(workflow) - for d in workflow.get("states"): - workflow_docs.append(frappe.get_doc("Workflow State", d.state)) - + workflow_docs.extend(frappe.get_doc("Workflow State", d.state) for d in workflow.get("states")) self.set("__workflow_docs", workflow_docs) def load_templates(self): diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index d89a15ee8e..c1d1047f3b 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -129,18 +129,20 @@ def get_stages_hooks(args): def get_setup_complete_hooks(args): - stages = [] - for method in frappe.get_hooks("setup_wizard_complete"): - stages.append( - { - "status": "Executing method", - "fail_msg": "Failed to execute method", - "tasks": [ - {"fn": frappe.get_attr(method), "args": args, "fail_msg": "Failed to execute method"} - ], - } - ) - return stages + return [ + { + "status": "Executing method", + "fail_msg": "Failed to execute method", + "tasks": [ + { + "fn": frappe.get_attr(method), + "args": args, + "fail_msg": "Failed to execute method", + } + ], + } + for method in frappe.get_hooks("setup_wizard_complete") + ] def handle_setup_exception(args): @@ -339,8 +341,7 @@ def prettify_args(args): args[key] = f"Image Attached: '{filename}' of size {size} MB" pretty_args = [] - for key in sorted(args): - pretty_args.append(f"{key} = {args[key]}") + pretty_args.extend(f"{key} = {args[key]}" for key in sorted(args)) return pretty_args diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index c6252250fb..102a708895 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -261,10 +261,7 @@ def compress(data, args=None): values = [] keys = list(data[0]) for row in data: - new_row = [] - for key in keys: - new_row.append(row.get(key)) - values.append(new_row) + values.append([row.get(key) for key in keys]) # add user info for assignments (avatar) if row.get("_assign", ""): @@ -644,11 +641,7 @@ def scrub_user_tags(tagcount): rdict[tag] += tagdict[t] - rlist = [] - for tag in rdict: - rlist.append([tag, rdict[tag]]) - - return rlist + return [[tag, rdict[tag]] for tag in rdict] # used in building query in queries.py diff --git a/frappe/email/__init__.py b/frappe/email/__init__.py index 244f942016..5cb9677f3e 100644 --- a/frappe/email/__init__.py +++ b/frappe/email/__init__.py @@ -94,11 +94,9 @@ 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}) ] - out = [] - for dt in com_doctypes: - if txt.lower().replace("%", "") in dt.lower() and dt in can_read: - out.append([dt]) - return out + 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 0a11de21f3..38e627539d 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -115,10 +115,9 @@ class AutoEmailReport(Document): # Check if all Mandatory Report Filters are filled by the User filters = frappe.parse_json(self.filters) if self.filters else {} filter_meta = frappe.parse_json(self.filter_meta) if self.filter_meta else {} - throw_list = [] - for meta in filter_meta: - if meta.get("reqd") and not filters.get(meta["fieldname"]): - throw_list.append(meta["label"]) + throw_list = [ + meta["label"] for meta in filter_meta if meta.get("reqd") and not filters.get(meta["fieldname"]) + ] if throw_list: frappe.throw( title=_("Missing Filters Required"), diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 78c2a5a77c..bdae8d1d3c 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -734,19 +734,21 @@ def get_append_to( doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None ): txt = txt if txt else "" - email_append_to_list = [] - # Set Email Append To DocTypes via DocType filters = {"istable": 0, "issingle": 0, "email_append_to": 1} - for dt in frappe.get_all("DocType", filters=filters, fields=["name", "email_append_to"]): - email_append_to_list.append(dt.name) - + # Set Email Append To DocTypes via DocType + email_append_to_list = [ + dt.name for dt in frappe.get_all("DocType", filters=filters, fields=["name", "email_append_to"]) + ] # Set Email Append To DocTypes set via Customize Form - for dt in frappe.get_list( - "Property Setter", filters={"property": "email_append_to", "value": 1}, fields=["doc_type"] - ): - email_append_to_list.append(dt.doc_type) - + email_append_to_list.extend( + dt.doc_type + for dt in frappe.get_list( + "Property Setter", + filters={"property": "email_append_to", "value": 1}, + fields=["doc_type"], + ) + ) return [[d] for d in set(email_append_to_list) if txt in d] diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py index 21920e8235..216b7defec 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py @@ -310,10 +310,7 @@ def get_dropbox_settings(redirect_uri=False): def delete_older_backups(dropbox_client, folder_path, to_keep): res = dropbox_client.files_list_folder(path=folder_path) - files = [] - for f in res.entries: - if isinstance(f, dropbox.files.FileMetadata) and "sql" in f.name: - files.append(f) + files = [f for f in res.entries if isinstance(f, dropbox.files.FileMetadata) and "sql" in f.name] if len(files) <= to_keep: return diff --git a/frappe/integrations/doctype/google_calendar/google_calendar.py b/frappe/integrations/doctype/google_calendar/google_calendar.py index 14a5cb5e7c..695ae7db15 100644 --- a/frappe/integrations/doctype/google_calendar/google_calendar.py +++ b/frappe/integrations/doctype/google_calendar/google_calendar.py @@ -299,9 +299,7 @@ def sync_events_from_google_calendar(g_calendar, method=None): else: frappe.throw(msg) - for event in events.get("items", []): - results.append(event) - + results.extend(event for event in events.get("items", [])) if not events.get("nextPageToken"): if events.get("nextSyncToken"): account.next_sync_token = events.get("nextSyncToken") diff --git a/frappe/integrations/doctype/google_contacts/google_contacts.py b/frappe/integrations/doctype/google_contacts/google_contacts.py index 4edaaf6a8d..cee04a92a1 100644 --- a/frappe/integrations/doctype/google_contacts/google_contacts.py +++ b/frappe/integrations/doctype/google_contacts/google_contacts.py @@ -140,9 +140,7 @@ def sync_contacts_from_google_contacts(g_contact): ).format(account.name, err.resp.status) ) - for contact in contacts.get("connections", []): - results.append(contact) - + results.extend(contact for contact in contacts.get("connections", [])) if not contacts.get("nextPageToken"): if contacts.get("nextSyncToken"): frappe.db.set_value( diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.py b/frappe/integrations/doctype/ldap_settings/ldap_settings.py index 84ea3cc8ab..93d970d95d 100644 --- a/frappe/integrations/doctype/ldap_settings/ldap_settings.py +++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.py @@ -300,10 +300,7 @@ class LDAPSettings(Document): ) # Build search query if len(conn.entries) >= 1: - fetch_ldap_groups = [] - for group in conn.entries: - fetch_ldap_groups.append(group["cn"].value) - + fetch_ldap_groups = [group["cn"].value for group in conn.entries] return fetch_ldap_groups def authenticate(self, username: str, password: str): diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index b724f18f7e..3ecfe6cd61 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -104,10 +104,7 @@ class Webhook(Document): def validate_repeating_fields(self): """Error when Same Field is entered multiple times in webhook_data""" - webhook_data = [] - for entry in self.webhook_data: - webhook_data.append(entry.fieldname) - + webhook_data = [entry.fieldname for entry in self.webhook_data] if len(webhook_data) != len(set(webhook_data)): frappe.throw(_("Same Field is entered more than once")) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 609bfa4b9e..11392fdabb 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -1182,15 +1182,15 @@ class BaseDocument: def reset_values_if_no_permlevel_access(self, has_access_to, high_permlevel_fields): """If the user does not have permissions at permlevel > 0, then reset the values to original / default""" - to_reset = [] - - for df in high_permlevel_fields: + to_reset = [ + df + for df in high_permlevel_fields if ( df.permlevel not in has_access_to and df.fieldtype not in display_fieldtypes and df.fieldname not in self.flags.get("ignore_permlevel_for_fields", []) - ): - to_reset.append(df) + ) + ] if to_reset: if self.is_new(): diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index 85c42b94b2..f54886a4ef 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -376,9 +376,7 @@ class DatabaseQuery: if isinstance(filters, dict): fdict = filters - filters = [] - for key, value in fdict.items(): - filters.append(make_filter_tuple(self.doctype, key, value)) + filters = [make_filter_tuple(self.doctype, key, value) for key, value in fdict.items()] setattr(self, filter_name, filters) def sanitize_fields(self): @@ -564,10 +562,7 @@ class DatabaseQuery: # remove from fields to_remove = [] for fld in self.fields: - for f in optional_fields: - if f in fld and not f in self.columns: - to_remove.append(fld) - + to_remove.extend(fld for f in optional_fields if f in fld and f not in self.columns) for fld in to_remove: del self.fields[self.fields.index(fld)] @@ -577,10 +572,9 @@ class DatabaseQuery: if isinstance(each, str): each = [each] - for element in each: - if element in optional_fields and element not in self.columns: - to_remove.append(each) - + to_remove.extend( + each for element in each if element in optional_fields and element not in self.columns + ) for each in to_remove: if isinstance(self.filters, dict): del self.filters[each] diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 83c21f8502..eee18b48a1 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -421,11 +421,7 @@ class Meta(Document): order = json.loads(self.get(f"{fieldname}_order") or "[]") if order: name_map = {d.name: d for d in self.get(fieldname)} - new_list = [] - for name in order: - if name in name_map: - new_list.append(name_map[name]) - + new_list = [name_map[name] for name in order if name in name_map] # add the missing items that have not be added # maybe these items were added to the standard product # after the customization was done @@ -564,11 +560,7 @@ class Meta(Document): def get_high_permlevel_fields(self): """Build list of fields with high perm level and all the higher perm levels defined.""" if not hasattr(self, "high_permlevel_fields"): - self.high_permlevel_fields = [] - for df in self.fields: - if df.permlevel > 0: - self.high_permlevel_fields.append(df) - + self.high_permlevel_fields = [df for df in self.fields if df.permlevel > 0] return self.high_permlevel_fields def get_permitted_fieldnames(self, parenttype=None, *, user=None, permission_type="read"): @@ -594,10 +586,11 @@ class Meta(Document): self.get_permlevel_access(permission_type=permission_type, parenttype=parenttype, user=user) ) - for df in self.get_fieldnames_with_value(with_field_meta=True, with_virtual_fields=True): - if df.permlevel in permlevel_access: - permitted_fieldnames.append(df.fieldname) - + permitted_fieldnames.extend( + df.fieldname + for df in self.get_fieldnames_with_value(with_field_meta=True, with_virtual_fields=True) + if df.permlevel in permlevel_access + ) return permitted_fieldnames def get_permlevel_access(self, permission_type="read", parenttype=None, *, user=None): diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index cb8e835681..0295fbaaf2 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -42,14 +42,17 @@ ignore_doctypes = [""] def import_files(module, dt=None, dn=None, force=False, pre_process=None, reset_permissions=False): if type(module) is list: - out = [] - for m in module: - out.append( - import_file( - m[0], m[1], m[2], force=force, pre_process=pre_process, reset_permissions=reset_permissions - ) + return [ + import_file( + m[0], + m[1], + m[2], + force=force, + pre_process=pre_process, + reset_permissions=reset_permissions, ) - return out + for m in module + ] else: return import_file( module, dt, dn, force=force, pre_process=pre_process, reset_permissions=reset_permissions diff --git a/frappe/oauth.py b/frappe/oauth.py index 7d5dbd81f2..b338651dab 100644 --- a/frappe/oauth.py +++ b/frappe/oauth.py @@ -149,11 +149,7 @@ class OAuthWebRequestValidator(RequestValidator): filters={"client": client_id, "validity": "Valid"}, ) - checkcodes = [] - for vcode in validcodes: - checkcodes.append(vcode["name"]) - - if code in checkcodes: + if code in [vcode["name"] for vcode in validcodes]: request.scopes = frappe.db.get_value("OAuth Authorization Code", code, "scopes").split( get_url_delimiter() ) diff --git a/frappe/parallel_test_runner.py b/frappe/parallel_test_runner.py index b7c3966df1..0ea6f82a3f 100644 --- a/frappe/parallel_test_runner.py +++ b/frappe/parallel_test_runner.py @@ -230,10 +230,11 @@ def get_all_tests(app): # in /doctype/doctype/boilerplate/ continue - for filename in files: - if filename.startswith("test_") and filename.endswith(".py") and filename != "test_runner.py": - test_file_list.append([path, filename]) - + test_file_list.extend( + [path, filename] + for filename in files + if filename.startswith("test_") and filename.endswith(".py") and filename != "test_runner.py" + ) return test_file_list diff --git a/frappe/patches/v11_0/remove_skip_for_doctype.py b/frappe/patches/v11_0/remove_skip_for_doctype.py index b3471ca4e8..ce0e43302a 100644 --- a/frappe/patches/v11_0/remove_skip_for_doctype.py +++ b/frappe/patches/v11_0/remove_skip_for_doctype.py @@ -55,21 +55,20 @@ def execute(): user_permissions_to_delete.append(user_permission.name) user_permission.name = None user_permission.skip_for_doctype = None - for doctype in applicable_for_doctypes: - if doctype: - # Maintain sequence (name, user, allow, for_value, applicable_for, apply_to_all_doctypes, creation, modified) - new_user_permissions_list.append( - ( - frappe.generate_hash(length=10), - user_permission.user, - user_permission.allow, - user_permission.for_value, - doctype, - 0, - user_permission.creation, - user_permission.modified, - ) - ) + new_user_permissions_list.extend( + ( + frappe.generate_hash(length=10), + user_permission.user, + user_permission.allow, + user_permission.for_value, + doctype, + 0, + user_permission.creation, + user_permission.modified, + ) + for doctype in applicable_for_doctypes + if doctype + ) else: # No skip_for_doctype found! Just update apply_to_all_doctypes. frappe.db.set_value("User Permission", user_permission.name, "apply_to_all_doctypes", 1) diff --git a/frappe/patches/v13_0/remove_duplicate_navbar_items.py b/frappe/patches/v13_0/remove_duplicate_navbar_items.py index 593a529efc..88ab8e399e 100644 --- a/frappe/patches/v13_0/remove_duplicate_navbar_items.py +++ b/frappe/patches/v13_0/remove_duplicate_navbar_items.py @@ -3,11 +3,11 @@ import frappe def execute(): navbar_settings = frappe.get_single("Navbar Settings") - duplicate_items = [] - - for navbar_item in navbar_settings.settings_dropdown: - if navbar_item.item_label == "Toggle Full Width": - duplicate_items.append(navbar_item) + duplicate_items = [ + navbar_item + for navbar_item in navbar_settings.settings_dropdown + if navbar_item.item_label == "Toggle Full Width" + ] if len(duplicate_items) > 1: navbar_settings.remove(duplicate_items[0]) 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 273ad9c4d1..7bae0996eb 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py @@ -37,9 +37,10 @@ class NetworkPrinterSettings(Document): cups.setPort(self.port) conn = cups.Connection() printers = conn.getPrinters() - for printer_id, printer in printers.items(): - printer_list.append({"value": printer_id, "label": printer["printer-make-and-model"]}) - + printer_list.extend( + {"value": printer_id, "label": printer["printer-make-and-model"]} + for printer_id, printer in printers.items() + ) except RuntimeError: frappe.throw(_("Failed to connect to server")) except frappe.ValidationError: diff --git a/frappe/search/full_text_search.py b/frappe/search/full_text_search.py index 6a2cfd9f70..151799a6e1 100644 --- a/frappe/search/full_text_search.py +++ b/frappe/search/full_text_search.py @@ -121,7 +121,6 @@ class FullTextSearch: ix = self.get_index() results = None - out = [] search_fields = self.get_fields_to_search() fieldboosts = {} @@ -143,10 +142,7 @@ class FullTextSearch: filter_scoped = Prefix(self.id, scope) results = searcher.search(query, limit=limit, filter=filter_scoped) - for r in results: - out.append(self.parse_result(r)) - - return out + return [self.parse_result(r) for r in results] class FuzzyTermExtended(FuzzyTerm): diff --git a/frappe/tests/test_boilerplate.py b/frappe/tests/test_boilerplate.py index 9a2b774977..26e7c7a959 100644 --- a/frappe/tests/test_boilerplate.py +++ b/frappe/tests/test_boilerplate.py @@ -175,15 +175,9 @@ class TestBoilerPlate(unittest.TestCase): self.check_parsable_python_files(new_app_dir) def get_paths(self, app_dir, app_name): - all_paths = list() - - for path in self.root_paths: - all_paths.append(os.path.join(app_dir, path)) - + all_paths = [os.path.join(app_dir, path) for path in self.root_paths] all_paths.append(os.path.join(app_dir, app_name)) - - for path in self.paths_inside_app: - all_paths.append(os.path.join(app_dir, app_name, path)) + all_paths.extend(os.path.join(app_dir, app_name, path) for path in self.paths_inside_app) return all_paths diff --git a/frappe/tests/test_caching.py b/frappe/tests/test_caching.py index f3f9d52f25..b423128f9a 100644 --- a/frappe/tests/test_caching.py +++ b/frappe/tests/test_caching.py @@ -48,8 +48,7 @@ class TestCachingUtils(FrappeTestCase): # ensure that external service was called only once # thereby return value of request_specific_api is cached - for _ in range(5): - retval.append(request_specific_api(120, 23)) + retval.extend(request_specific_api(120, 23) for _ in range(5)) external_service.assert_called_once() self.assertTrue(same_output_received()) diff --git a/frappe/translate.py b/frappe/translate.py index 2cc36688a1..a7dfd13f34 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -462,10 +462,7 @@ def get_messages_from_doctype(name): messages.append(d.options) # translations of roles - for d in meta.get("permissions"): - if d.role: - messages.append(d.role) - + messages.extend(d.role for d in meta.get("permissions") if d.role) messages = [message for message in messages if message] messages = [("DocType: " + name, message) for message in messages if is_translatable(message)] @@ -579,10 +576,11 @@ def get_messages_from_custom_fields(app_name): continue messages.append(("Custom Field - {}: {}".format(prop, cf["name"]), cf[prop])) if cf["fieldtype"] == "Selection" and cf.get("options"): - for option in cf["options"].split("\n"): - if option and "icon" not in option and is_translatable(option): - messages.append(("Custom Field - Description: " + cf["name"], option)) - + messages.extend( + ("Custom Field - Description: " + cf["name"], option) + for option in cf["options"].split("\n") + if option and "icon" not in option and is_translatable(option) + ) return messages @@ -1199,12 +1197,9 @@ def send_translations(translation_dict): def deduplicate_messages(messages): - ret = [] op = operator.itemgetter(1) messages = sorted(messages, key=op) - for k, g in itertools.groupby(messages, op): - ret.append(next(g)) - return ret + return [next(g) for k, g in itertools.groupby(messages, op)] @frappe.whitelist() diff --git a/frappe/types/exporter.py b/frappe/types/exporter.py index aa906330d0..57571437eb 100644 --- a/frappe/types/exporter.py +++ b/frappe/types/exporter.py @@ -114,11 +114,14 @@ class TypeExporter: ) def _create_fields_code_block(self): - fields = [] - - for field, typehint in self.field_types.items(): - fields.append(field_template.format(field=field, type=typehint)) - return "\n".join(sorted(fields)) + return "\n".join( + sorted( + [ + field_template.format(field=field, type=typehint) + for field, typehint in self.field_types.items() + ] + ) + ) def _create_imports_block(self) -> str: return "\n".join(sorted(self.imports)) diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index d2566c5fe5..0a8e3e4cbd 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -362,10 +362,7 @@ def dict_to_str(args: dict[str, Any], sep: str = "&") -> str: """ Converts a dictionary to URL """ - t = [] - for k in list(args): - t.append(str(k) + "=" + quote(str(args[k] or ""))) - return sep.join(t) + return sep.join(f"{str(k)}=" + quote(str(args[k] or "")) for k in list(args)) def list_to_str(seq, sep=", "): @@ -758,15 +755,14 @@ def get_installed_apps_info(): out = [] from frappe.utils.change_log import get_versions - for app, version_details in get_versions().items(): - out.append( - { - "app_name": app, - "version": version_details.get("branch_version") or version_details.get("version"), - "branch": version_details.get("branch"), - } - ) - + out.extend( + { + "app_name": app, + "version": version_details.get("branch_version") or version_details.get("version"), + "branch": version_details.get("branch"), + } + for app, version_details in get_versions().items() + ) return out diff --git a/frappe/utils/csvutils.py b/frappe/utils/csvutils.py index 4840c806bb..fdf530b58f 100644 --- a/frappe/utils/csvutils.py +++ b/frappe/utils/csvutils.py @@ -53,9 +53,7 @@ def read_csv_content(fcontent): ) fcontent = fcontent.encode("utf-8") - content = [] - for line in fcontent.splitlines(True): - content.append(frappe.safe_decode(line)) + content = [frappe.safe_decode(line) for line in fcontent.splitlines(True)] try: rows = [] diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 0000e5ddaa..6974d6d636 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1651,10 +1651,9 @@ def get_link_to_report( conditions = [] for k, v in filters.items(): if isinstance(v, list): - for value in v: - conditions.append( - str(k) + "=" + '["' + str(value[0] + '"' + "," + '"' + str(value[1]) + '"]') - ) + conditions.extend( + str(k) + "=" + '["' + str(value[0] + '"' + "," + '"' + str(value[1]) + '"]') for value in v + ) else: conditions.append(str(k) + "=" + str(v)) @@ -1795,9 +1794,7 @@ def get_filter(doctype: str, f: dict | list | tuple, filters_config=None) -> "fr ) + NestedSetHierarchy if filters_config: - additional_operators = [] - for key in filters_config: - additional_operators.append(key.lower()) + additional_operators = [key.lower() for key in filters_config] valid_operators = tuple(set(valid_operators + tuple(additional_operators))) if f.operator.lower() not in valid_operators: diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index af01692b94..d310e1e8d5 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -208,10 +208,10 @@ def get_children_data(doctype, meta): def insert_values_for_multiple_docs(all_contents): - values = [] - for content in all_contents: - values.append("({doctype}, {name}, {content}, {published}, {title}, {route})".format(**content)) - + values = [ + "({doctype}, {name}, {content}, {published}, {title}, {route})".format(**content) + for content in all_contents + ] batch_size = 50000 for i in range(0, len(values), batch_size): batch_values = values[i : i + batch_size] @@ -249,19 +249,21 @@ def update_global_search(doc): ): return - content = [] - for field in doc.meta.get_global_search_fields(): - if doc.get(field.fieldname) and field.fieldtype not in frappe.model.table_fields: - content.append(get_formatted_value(doc.get(field.fieldname), field)) + content = [ + get_formatted_value(doc.get(field.fieldname), field) + for field in doc.meta.get_global_search_fields() + if doc.get(field.fieldname) and field.fieldtype not in frappe.model.table_fields + ] # Get children for child in doc.meta.get_table_fields(): for d in doc.get(child.fieldname): if d.parent == doc.name: - for field in d.meta.get_global_search_fields(): - if d.get(field.fieldname): - content.append(get_formatted_value(d.get(field.fieldname), field)) - + content.extend( + get_formatted_value(d.get(field.fieldname), field) + for field in d.meta.get_global_search_fields() + if d.get(field.fieldname) + ) if content: published = 0 if hasattr(doc, "is_website_published") and doc.meta.allow_guest_to_view: diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 35dec3aa60..11d18bea1f 100644 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -389,19 +389,16 @@ def is_system_user(username: str | None = None) -> str | None: def get_users() -> list[dict]: from frappe.core.doctype.user.user import get_system_users - users = [] system_managers = get_system_managers(only_name=True) - for user in get_system_users(): - users.append( - { - "full_name": get_user_fullname(user), - "email": user, - "is_system_manager": user in system_managers, - } - ) - - return users + return [ + { + "full_name": get_user_fullname(user), + "email": user, + "is_system_manager": user in system_managers, + } + for user in get_system_users() + ] def get_users_with_role(role: str) -> list[str]: diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index 48488120ac..3ad977f9d4 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -88,10 +88,7 @@ def read_xlsx_file_from_attached_file(file_url=None, fcontent=None, filepath=Non wb1 = load_workbook(filename=filename, read_only=True, data_only=True) ws1 = wb1.active for row in ws1.iter_rows(): - tmp_list = [] - for cell in row: - tmp_list.append(cell.value) - rows.append(tmp_list) + rows.append([cell.value for cell in row]) return rows @@ -99,10 +96,7 @@ def read_xls_file_from_attached_file(content): book = xlrd.open_workbook(file_contents=content) sheets = book.sheets() sheet = sheets[0] - rows = [] - for i in range(sheet.nrows): - rows.append(sheet.row_values(i)) - return rows + return [sheet.row_values(i) for i in range(sheet.nrows)] def build_xlsx_response(data, filename): diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 0a2be0c1b8..9671827457 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -96,11 +96,12 @@ class WebForm(WebsiteGenerator): """Validate all fields are present""" from frappe.model import no_value_fields - missing = [] meta = frappe.get_meta(self.doc_type) - for df in self.web_form_fields: - if df.fieldname and (df.fieldtype not in no_value_fields and not meta.has_field(df.fieldname)): - missing.append(df.fieldname) + missing = [ + df.fieldname + for df in self.web_form_fields + if df.fieldname and (df.fieldtype not in no_value_fields and not meta.has_field(df.fieldname)) + ] if missing: frappe.throw(_("Following fields are missing:") + "
" + "
".join(missing)) @@ -387,11 +388,7 @@ def get_context(context): def validate_mandatory(self, doc): """Validate mandatory web form fields""" - missing = [] - for f in self.web_form_fields: - if f.reqd and doc.get(f.fieldname) in (None, [], ""): - missing.append(f) - + missing = [f for f in self.web_form_fields if f.reqd and doc.get(f.fieldname) in (None, [], "")] if missing: frappe.throw( _("Mandatory Information missing:") diff --git a/frappe/website/doctype/website_sidebar/website_sidebar.py b/frappe/website/doctype/website_sidebar/website_sidebar.py index 648652a838..283184a76c 100644 --- a/frappe/website/doctype/website_sidebar/website_sidebar.py +++ b/frappe/website/doctype/website_sidebar/website_sidebar.py @@ -34,9 +34,6 @@ class WebsiteSidebar(Document): else: items_without_group.append(item) - out = [] - for group, items in items_by_group.items(): - out.append({"group_title": group, "group_items": items}) - + out = [{"group_title": group, "group_items": items} for group, items in items_by_group.items()] out += items_without_group return out diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index bf0dd35c3a..942d6e825a 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -144,10 +144,7 @@ class WebsiteTheme(Document): from frappe.utils.change_log import get_versions apps = get_versions() - out = [] - for app, values in apps.items(): - out.append({"name": app, "title": values["title"]}) - return out + return [{"name": app, "title": values["title"]} for app, values in apps.items()] def get_active_theme() -> Optional["WebsiteTheme"]: diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 51c9056273..84864e21cc 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -562,15 +562,9 @@ def set_content_type(response, data, path): def add_preload_for_bundled_assets(response): + links = [f"<{css}>; rel=preload; as=style" for css in frappe.local.preload_assets["style"]] - links = [] - - for css in frappe.local.preload_assets["style"]: - links.append(f"<{css}>; rel=preload; as=style") - - for js in frappe.local.preload_assets["script"]: - links.append(f"<{js}>; rel=preload; as=script") - + links.extend(f"<{js}>; rel=preload; as=script" for js in frappe.local.preload_assets["script"]) if links: response.headers["Link"] = ",".join(links) diff --git a/frappe/workflow/doctype/workflow_action/workflow_action.py b/frappe/workflow/doctype/workflow_action/workflow_action.py index 6591af810a..cd3093b57e 100644 --- a/frappe/workflow/doctype/workflow_action/workflow_action.py +++ b/frappe/workflow/doctype/workflow_action/workflow_action.py @@ -461,13 +461,12 @@ def filter_allowed_users(users, doc, transition): """ from frappe.permissions import has_permission - filtered_users = [] - for user in users: - if has_approval_access(user, doc, transition) and has_permission( - doctype=doc, user=user, raise_exception=False - ): - filtered_users.append(user) - return filtered_users + return [ + user + for user in users + if has_approval_access(user, doc, transition) + and has_permission(doctype=doc, user=user, raise_exception=False) + ] def get_common_email_args(doc): diff --git a/frappe/www/list.py b/frappe/www/list.py index 9b704d5d44..bd0db9fd05 100644 --- a/frappe/www/list.py +++ b/frappe/www/list.py @@ -227,9 +227,11 @@ def get_list( if txt: if meta.search_fields: - for f in meta.get_search_fields(): - if f == "name" or meta.get_field(f).fieldtype in ("Data", "Text", "Small Text", "Text Editor"): - or_filters.append([doctype, f, "like", "%" + txt + "%"]) + or_filters.extend( + [doctype, f, "like", "%" + txt + "%"] + for f in meta.get_search_fields() + if f == "name" or meta.get_field(f).fieldtype in ("Data", "Text", "Small Text", "Text Editor") + ) else: if isinstance(filters, dict): filters["name"] = ("like", "%" + txt + "%") diff --git a/frappe/www/sitemap.py b/frappe/www/sitemap.py index 47d809d384..dbf1f3a5f3 100644 --- a/frappe/www/sitemap.py +++ b/frappe/www/sitemap.py @@ -14,19 +14,19 @@ base_template_path = "www/sitemap.xml" def get_context(context): """generate the sitemap XML""" - links = [] + links = [ + {"loc": get_url(quote(page.name.encode("utf-8"))), "lastmod": nowdate()} + for route, page in get_pages().items() + if page.sitemap + ] - for route, page in get_pages().items(): - if page.sitemap: - links.append({"loc": get_url(quote(page.name.encode("utf-8"))), "lastmod": nowdate()}) - - for route, data in get_public_pages_from_doctypes().items(): - links.append( - { - "loc": get_url(quote((route or "").encode("utf-8"))), - "lastmod": f"{data['modified']:%Y-%m-%d}", - } - ) + links.extend( + { + "loc": get_url(quote((route or "").encode("utf-8"))), + "lastmod": f"{data['modified']:%Y-%m-%d}", + } + for route, data in get_public_pages_from_doctypes().items() + ) return {"links": links}