Merge branch 'develop' into get-all-mod

This commit is contained in:
Aradhya Tripathi 2022-08-22 14:53:35 +05:30 committed by GitHub
commit caf171b363
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
70 changed files with 172 additions and 143 deletions

View file

@ -31,3 +31,6 @@ c0c5b2ebdddbe8898ce2d5e5365f4931ff73b6bf
# format JS files with pretter
40f27f908a3890c9a90d2d96794fc31fcea63c59
# db.get_all -> get_all
2eec621e95564c359ad22da79501a855c1f32b03

View file

@ -240,6 +240,7 @@ def init(site: str, sites_path: str = ".", new_site: bool = False) -> None:
local.document_cache = {}
local.meta_cache = {}
local.form_dict = _dict()
local.preload_assets = {"style": [], "script": []}
local.session = _dict()
local.dev_server = _dev_server
local.qb = get_query_builder(local.conf.db_type or "mariadb")
@ -2328,7 +2329,7 @@ def get_version(doctype, name, limit=None, head=False, raise_err=True):
"""
meta = get_meta(doctype)
if meta.track_changes:
names = db.get_all(
names = get_all(
"Version",
filters={
"ref_doctype": doctype,

View file

@ -241,7 +241,7 @@ class AutoRepeat(Document):
def set_auto_repeat_period(self, new_doc):
mcount = month_map.get(self.frequency)
if mcount and new_doc.meta.get_field("from_date") and new_doc.meta.get_field("to_date"):
last_ref_doc = frappe.db.get_all(
last_ref_doc = frappe.get_all(
doctype=self.reference_doctype,
fields=["name", "from_date", "to_date"],
filters=[
@ -470,7 +470,7 @@ def create_repeated_entries(data):
def get_auto_repeat_entries(date=None):
if not date:
date = getdate(today())
return frappe.db.get_all(
return frappe.get_all(
"Auto Repeat", filters=[["next_schedule_date", "<=", date], ["status", "=", "Active"]]
)
@ -504,7 +504,7 @@ def make_auto_repeat(doctype, docname, frequency="Daily", start_date=None, end_d
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def get_auto_repeat_doctypes(doctype, txt, searchfield, start, page_len, filters):
res = frappe.db.get_all(
res = frappe.get_all(
"Property Setter",
{
"property": "allow_auto_repeat",
@ -514,7 +514,7 @@ def get_auto_repeat_doctypes(doctype, txt, searchfield, start, page_len, filters
)
docs = [r.doc_type for r in res]
res = frappe.db.get_all(
res = frappe.get_all(
"DocType",
{
"allow_auto_repeat": 1,

View file

@ -227,7 +227,7 @@ class TestAutoRepeat(FrappeTestCase):
data = get_auto_repeat_entries(current_date)
create_repeated_entries(data)
docnames = frappe.db.get_all(
docnames = frappe.get_all(
doc.reference_doctype, filters={"auto_repeat": doc.name}, fields=["docstatus"], limit=1
)
self.assertEqual(docnames[0].docstatus, 1)

View file

@ -336,7 +336,7 @@ def get_success_action():
def get_link_preview_doctypes():
from frappe.utils import cint
link_preview_doctypes = [d.name for d in frappe.db.get_all("DocType", {"show_preview_popup": 1})]
link_preview_doctypes = [d.name for d in frappe.get_all("DocType", {"show_preview_popup": 1})]
customizations = frappe.get_all(
"Property Setter", fields=["doc_type", "value"], filters={"property": "show_preview_popup"}
)

View file

@ -134,7 +134,7 @@ def clear_doctype_cache(doctype=None):
# clear all parent doctypes
for dt in frappe.db.get_all(
for dt in frappe.get_all(
"DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=doctype)
):
clear_single(dt.parent)

View file

@ -41,7 +41,7 @@ class TestActivityLog(FrappeTestCase):
frappe.local.form_dict = frappe._dict()
def get_auth_log(self, operation="Login"):
names = frappe.db.get_all(
names = frappe.get_all(
"Activity Log",
filters={
"user": "Administrator",

View file

@ -183,7 +183,7 @@ class Exporter:
child_fields = ["name", "idx", "parent", "parentfield"] + list(
{format_column_name(df) for df in self.fields if df.parent == child_table_doctype}
)
data = frappe.db.get_all(
data = frappe.get_all(
child_table_doctype,
filters={
"parent": ("in", parent_names),

View file

@ -50,7 +50,7 @@ class Importer:
def get_data_for_import_preview(self):
out = self.import_file.get_data_for_import_preview()
out.import_log = frappe.db.get_all(
out.import_log = frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success"],
filters={"data_import": self.data_import.name},
@ -90,7 +90,7 @@ class Importer:
# setup import log
import_log = (
frappe.db.get_all(
frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success", "log_index"],
filters={"data_import": self.data_import.name},
@ -204,7 +204,7 @@ class Importer:
# Logs are db inserted directly so will have to be fetched again
import_log = (
frappe.db.get_all(
frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success", "log_index"],
filters={"data_import": self.data_import.name},
@ -297,7 +297,7 @@ class Importer:
return
import_log = (
frappe.db.get_all(
frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success"],
filters={"data_import": self.data_import.name},
@ -327,7 +327,7 @@ class Importer:
if not self.data_import:
return
import_log = frappe.db.get_all(
import_log = frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success", "messages", "exception", "docname"],
filters={"data_import": self.data_import.name},
@ -985,7 +985,7 @@ class Column:
# find all values that dont exist
values = list({cstr(v) for v in self.column_values[1:] if v})
exists = [
cstr(d.name) for d in frappe.db.get_all(self.df.options, filters={"name": ("in", values)})
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:

View file

@ -67,7 +67,7 @@ class TestImporter(FrappeTestCase):
data_import.start_import()
data_import.reload()
import_log = frappe.db.get_all(
import_log = frappe.get_all(
"Data Import Log",
fields=["row_indexes", "success", "messages", "exception", "docname"],
filters={"data_import": data_import.name},

View file

@ -325,7 +325,7 @@ class DocType(Document):
"""Change the timestamp of parent DocType if the current one is a child to clear caches."""
if frappe.flags.in_import:
return
parent_list = frappe.db.get_all(
parent_list = frappe.get_all(
"DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=self.name)
)
for p in parent_list:

View file

@ -238,7 +238,7 @@ class TestFile(FrappeTestCase):
pass
def delete_test_data(self):
test_file_data = frappe.db.get_all(
test_file_data = frappe.get_all(
"File",
pluck="name",
filters={"is_home_folder": 0, "is_attachments_folder": 0},

View file

@ -30,7 +30,7 @@ def validate_with_regex(name, label):
def export_languages_json():
"""Export list of all languages"""
languages = frappe.db.get_all("Language", fields=["name", "language_name"])
languages = frappe.get_all("Language", fields=["name", "language_name"])
languages = [{"name": d.language_name, "code": d.name} for d in languages]
languages.sort(key=lambda a: a["code"])

View file

@ -60,7 +60,7 @@ class PackageRelease(Document):
self.make_tarfile(package)
def export_modules(self):
for m in frappe.db.get_all("Module Def", dict(package=self.package)):
for m in frappe.get_all("Module Def", dict(package=self.package)):
module = frappe.get_doc("Module Def", m.name)
for l in module.meta.links:
if l.link_doctype == "Module Def":

View file

@ -129,7 +129,7 @@ class ServerScript(Document):
Returns:
list: Returns list of autocompletion items.
For e.g., ["frappe.utils.cint", "frappe.db.get_all", ...]
For e.g., ["frappe.utils.cint", "frappe.get_all", ...]
"""
def get_keys(obj):

View file

@ -39,7 +39,7 @@ def create_translations(translation_map, language):
# first create / update local user translations
for source_id, translation_dict in translation_map.items():
translation_dict = frappe._dict(translation_dict)
existing_doc_name = frappe.db.get_all(
existing_doc_name = frappe.get_all(
"Translation",
{
"source_text": translation_dict.source_text,

View file

@ -621,7 +621,7 @@ class User(Document):
if login_with_username:
or_filters.append({"username": user_name})
users = frappe.db.get_all("User", fields=["name", "enabled"], or_filters=or_filters, limit=1)
users = frappe.get_all("User", fields=["name", "enabled"], or_filters=or_filters, limit=1)
if not users:
return

View file

@ -27,7 +27,7 @@ class UserPermission(Document):
def validate_user_permission(self):
"""checks for duplicate user permission records"""
duplicate_exists = frappe.db.get_all(
duplicate_exists = frappe.get_all(
self.doctype,
filters={
"allow": self.allow,

View file

@ -2,7 +2,7 @@ import frappe
def execute():
for web_form_name in frappe.db.get_all("Web Form", pluck="name"):
for web_form_name in frappe.get_all("Web Form", pluck="name"):
web_form = frappe.get_doc("Web Form", web_form_name)
doctype_layout = frappe.get_doc(
dict(

View file

@ -172,7 +172,7 @@ class Workspace:
if not exists and frappe.db.exists(name):
if not frappe.db.get_value("DocType", name, "issingle"):
exists = bool(frappe.db.get_all(name, limit=1))
exists = bool(frappe.get_all(name, limit=1))
else:
exists = True
self.table_counts[name] = exists

View file

@ -249,7 +249,7 @@ def get_heatmap_chart_config(chart, filters, heatmap_year):
timestamp_field = f"extract(epoch from timestamp {datefield})"
data = dict(
frappe.db.get_all(
frappe.get_all(
doctype,
fields=[
timestamp_field,

View file

@ -61,7 +61,7 @@ def get_desktop_icons(user=None):
blocked_doctypes = [d.get("name") for d in blocked_doctypes]
standard_icons = frappe.db.get_all("Desktop Icon", fields=fields, filters={"standard": 1})
standard_icons = frappe.get_all("Desktop Icon", fields=fields, filters={"standard": 1})
standard_map = {}
for icon in standard_icons:
@ -69,7 +69,7 @@ def get_desktop_icons(user=None):
icon.blocked = 1
standard_map[icon.module_name] = icon
user_icons = frappe.db.get_all(
user_icons = frappe.get_all(
"Desktop Icon", fields=fields, filters={"standard": 0, "owner": user}
)
@ -430,7 +430,7 @@ def get_context(context):
context.user = frappe.session.user
if "System Manager" in frappe.get_roles():
context.users = frappe.db.get_all(
context.users = frappe.get_all(
"User",
filters={"user_type": "System User", "enabled": 1},
fields=["name", "first_name", "last_name"],
@ -443,7 +443,7 @@ def get_module_icons(user=None):
frappe.only_for("System Manager")
if not user:
icons = frappe.db.get_all("Desktop Icon", fields="*", filters={"standard": 1}, order_by="idx")
icons = frappe.get_all("Desktop Icon", fields="*", filters={"standard": 1}, order_by="idx")
else:
frappe.cache().hdel("desktop_icons", user)
icons = get_user_icons(user)

View file

@ -151,7 +151,7 @@ def get_notification_logs(limit=20):
@frappe.whitelist()
def mark_all_as_read():
unread_docs_list = frappe.db.get_all(
unread_docs_list = frappe.get_all(
"Notification Log", filters={"read": 0, "for_user": frappe.session.user}
)
unread_docnames = [doc.name for doc in unread_docs_list]

View file

@ -37,7 +37,7 @@ class TestNotificationLog(FrappeTestCase):
def get_last_email_queue():
res = frappe.db.get_all("Email Queue", fields=["message"], order_by="creation desc", limit=1)
res = frappe.get_all("Email Queue", fields=["message"], order_by="creation desc", limit=1)
return res[0]

View file

@ -192,4 +192,4 @@ def get_documents_for_tag(tag):
@frappe.whitelist()
def get_tags_list_for_awesomebar():
return [t.name for t in frappe.get_list("Tag")]
return frappe.get_list("Tag", pluck="name", order_by=None)

View file

@ -138,7 +138,7 @@ def add_multiple(args=None):
def close_all_assignments(doctype, name):
assignments = frappe.db.get_all(
assignments = frappe.get_all(
"ToDo",
fields=["allocated_to"],
filters=dict(reference_type=doctype, reference_name=name, status=("!=", "Cancelled")),
@ -189,7 +189,7 @@ def clear(doctype, name):
"""
Clears assignments, return False if not assigned.
"""
assignments = frappe.db.get_all(
assignments = frappe.get_all(
"ToDo", fields=["allocated_to"], filters=dict(reference_type=doctype, reference_name=name)
)
if not assignments:

View file

@ -136,7 +136,7 @@ class SubmittableDocumentTree:
def get_submittable_doctypes(self) -> list[str]:
"""Returns list of submittable doctypes."""
if not self._submittable_doctypes:
self._submittable_doctypes = frappe.db.get_all("DocType", {"is_submittable": 1}, pluck="name")
self._submittable_doctypes = frappe.get_all("DocType", {"is_submittable": 1}, pluck="name")
return self._submittable_doctypes
@ -288,9 +288,7 @@ def get_references_across_doctypes_by_dynamic_link_field(
for doctype, fieldname, doctype_fieldname in links:
try:
filters = [[doctype_fieldname, "in", to_doctypes]] if to_doctypes else []
for linked_to in frappe.db.get_all(
doctype, pluck=doctype_fieldname, filters=filters, distinct=1
):
for linked_to in frappe.get_all(doctype, pluck=doctype_fieldname, filters=filters, distinct=1):
if linked_to:
links_by_doctype[linked_to].append(
{"doctype": doctype, "fieldname": fieldname, "doctype_fieldname": doctype_fieldname}
@ -330,17 +328,17 @@ def get_referencing_documents(
if not link_info.get("is_child"):
filters.extend(parent_filters or [])
return {from_table: frappe.db.get_all(from_table, filters, pluck="name")}
return {from_table: frappe.get_all(from_table, filters, pluck="name")}
filters.extend(child_filters or [])
res = frappe.db.get_all(from_table, filters=filters, fields=["name", "parenttype", "parent"])
res = frappe.get_all(from_table, filters=filters, fields=["name", "parenttype", "parent"])
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.db.get_all(parent, filters=filters, pluck="name") or [])
documents[parent].extend(frappe.get_all(parent, filters=filters, pluck="name") or [])
return documents

View file

@ -178,7 +178,7 @@ def add_comments(doc, docinfo):
def get_milestones(doctype, name):
return frappe.db.get_all(
return frappe.get_all(
"Milestone",
fields=["creation", "owner", "track_field", "value"],
filters=dict(reference_type=doctype, reference_name=name),
@ -249,7 +249,7 @@ def get_comments(
def get_point_logs(doctype, docname):
return frappe.db.get_all(
return frappe.get_all(
"Energy Point Log",
filters={"reference_doctype": doctype, "reference_name": docname, "type": ["!=", "Review"]},
fields=["*"],
@ -452,7 +452,9 @@ def get_title_values_for_link_and_dynamic_link_fields(doc, link_fields=None):
if not meta or not (meta.title_field and meta.show_title_field_in_link):
continue
link_title = frappe.db.get_value(doctype, doc.get(field.fieldname), meta.title_field, cache=True)
link_title = frappe.db.get_value(
doctype, doc.get(field.fieldname), meta.title_field, cache=True, order_by=None
)
link_titles.update({doctype + "::" + doc.get(field.fieldname): link_title})
return link_titles

View file

@ -146,7 +146,7 @@ class FormMeta(Meta):
"""embed all require files"""
# custom script
client_scripts = (
frappe.db.get_all(
frappe.get_all(
"Client Script",
filters={"dt": self.name, "enabled": 1},
fields=["name", "script", "view"],

View file

@ -16,7 +16,7 @@ def get_leaderboards():
@frappe.whitelist()
def get_energy_point_leaderboard(date_range, company=None, field=None, limit=None):
all_users = frappe.db.get_all(
all_users = frappe.get_all(
"User",
filters={
"name": ["not in", ["Administrator", "Guest"]],
@ -31,7 +31,7 @@ def get_energy_point_leaderboard(date_range, company=None, field=None, limit=Non
if date_range:
date_range = frappe.parse_json(date_range)
filters.append(["creation", "between", [date_range[0], date_range[1]]])
energy_point_users = frappe.db.get_all(
energy_point_users = frappe.get_all(
"Energy Point Log",
fields=["user as name", "sum(points) as value"],
filters=filters,

View file

@ -31,7 +31,7 @@ def get_energy_points_heatmap_data(user, date):
@frappe.whitelist()
def get_energy_points_percentage_chart_data(user, field):
result = frappe.db.get_all(
result = frappe.get_all(
"Energy Point Log",
filters={"user": user, "type": ["!=", "Review"]},
group_by=field,
@ -49,7 +49,7 @@ def get_energy_points_percentage_chart_data(user, field):
@frappe.whitelist()
def get_user_rank(user):
month_start = datetime.today().replace(day=1)
monthly_rank = frappe.db.get_all(
monthly_rank = frappe.get_all(
"Energy Point Log",
group_by="user",
filters={"creation": [">", month_start], "type": ["!=", "Review"]},
@ -58,7 +58,7 @@ def get_user_rank(user):
as_list=True,
)
all_time_rank = frappe.db.get_all(
all_time_rank = frappe.get_all(
"Energy Point Log",
group_by="user",
filters={"type": ["!=", "Review"]},

View file

@ -846,7 +846,7 @@ def get_max_email_uid(email_account):
# get maximum uid of emails
max_uid = 1
result = frappe.db.get_all(
result = frappe.get_all(
"Communication",
filters={
"communication_medium": "Email",

View file

@ -9,10 +9,10 @@ from frappe.utils import parse_addr, validate_email_address
class EmailGroup(Document):
def onload(self):
singles = [d.name for d in frappe.db.get_all("DocType", "name", {"issingle": 1})]
singles = [d.name for d in frappe.get_all("DocType", "name", {"issingle": 1})]
self.get("__onload").import_types = [
{"value": d.parent, "label": f"{d.parent} ({d.label})"}
for d in frappe.db.get_all("DocField", ("parent", "label"), {"options": "Email"})
for d in frappe.get_all("DocField", ("parent", "label"), {"options": "Email"})
if d.parent not in singles
]
@ -27,7 +27,7 @@ class EmailGroup(Document):
unsubscribed_field = "unsubscribed" if meta.get_field("unsubscribed") else None
added = 0
for user in frappe.db.get_all(doctype, [email_field, unsubscribed_field or "name"]):
for user in frappe.get_all(doctype, [email_field, unsubscribed_field or "name"]):
try:
email = parse_addr(user.get(email_field))[1] if user.get(email_field) else None
if email:

View file

@ -107,7 +107,7 @@ class TestNewsletterMixin:
"content_type": "Rich Text",
"message": "Testing my news.",
}
similar_newsletters = frappe.db.get_all(doctype, newsletter_content, pluck="name")
similar_newsletters = frappe.get_all(doctype, newsletter_content, pluck="name")
for similar_newsletter in similar_newsletters:
frappe.delete_doc(doctype, similar_newsletter)
@ -180,7 +180,7 @@ class TestNewsletter(TestNewsletterMixin, FrappeTestCase):
newsletter.save = MagicMock()
self.assertFalse(newsletter.save.called)
# check if the test email is in the queue
email_queue = frappe.db.get_all(
email_queue = frappe.get_all(
"Email Queue",
filters=[
["reference_doctype", "=", "Newsletter"],

View file

@ -2723,7 +2723,7 @@
"currency_fraction": "Kuru\u015f",
"currency_fraction_units": 100,
"currency_symbol": "\u20ba",
"number_format": "#,###.##",
"number_format": "#.###,##",
"timezones": [
"Europe/Istanbul"
],

View file

@ -177,7 +177,7 @@ class TestWebhook(FrappeTestCase):
webhook = frappe.get_doc("Webhook", {"webhook_doctype": "User"})
enqueue_webhook(user, webhook)
self.assertTrue(frappe.db.get_all("Webhook Request Log", pluck="name"))
self.assertTrue(frappe.get_all("Webhook Request Log", pluck="name"))
def test_webhook_with_array_body(self):
"""Check if array request body are supported."""

View file

@ -15,6 +15,7 @@ from frappe.model import optional_fields, table_fields
from frappe.model.base_document import BaseDocument, get_controller
from frappe.model.docstatus import DocStatus
from frappe.model.naming import set_new_name, validate_name
from frappe.model.utils import is_virtual_doctype
from frappe.model.workflow import set_workflow_state_on_action, validate_workflow
from frappe.utils import cstr, date_diff, file_lock, flt, get_datetime_str, now
from frappe.utils.data import get_absolute_url
@ -154,11 +155,7 @@ class Document(BaseDocument):
# Make sure not to query the DB for a child table, if it is a virtual one.
# During frappe is installed, the property "is_virtual" is not available in tabDocType, so
# we need to filter those cases for the access to frappe.db.get_value() as it would crash otherwise.
if (
hasattr(self, "doctype")
and not hasattr(self, "module")
and frappe.db.get_value("DocType", df.options, "is_virtual", cache=True)
):
if hasattr(self, "doctype") and not hasattr(self, "module") and is_virtual_doctype(df.options):
self.set(df.fieldname, [])
continue

View file

@ -666,7 +666,7 @@ def is_single(doctype):
def get_parent_dt(dt):
parent_dt = frappe.db.get_all(
parent_dt = frappe.get_all(
"DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=dt), limit=1
)
return parent_dt and parent_dt[0].parent or ""
@ -764,7 +764,7 @@ def trim_tables(doctype=None, dry_run=False, quiet=False):
if doctype:
filters["name"] = doctype
for doctype in frappe.db.get_all("DocType", filters=filters, pluck="name"):
for doctype in frappe.get_all("DocType", filters=filters, pluck="name"):
try:
dropped_columns = trim_table(doctype, dry_run=dry_run)
if dropped_columns:

View file

@ -237,7 +237,7 @@ def update_assignments(old: str, new: str, doctype: str) -> None:
for user in common_assignments:
# delete todos linked to old doc
todos = frappe.db.get_all(
todos = frappe.get_all(
"ToDo",
{
"owner": user,

View file

@ -128,6 +128,6 @@ def get_fetch_values(doctype, fieldname, value):
return result
@site_cache(maxsize=128)
@site_cache()
def is_virtual_doctype(doctype):
return frappe.db.get_value("DocType", doctype, "is_virtual")

View file

@ -7,7 +7,7 @@ def execute():
if not frappe.db.table_exists("Dashboard Chart"):
return
charts_to_modify = frappe.db.get_all(
charts_to_modify = frappe.get_all(
"Dashboard Chart",
fields=["name", "filters_json", "document_type"],
filters={"chart_type": ["not in", ["Report", "Custom"]]},

View file

@ -8,6 +8,6 @@ def execute():
frappe.reload_doc("desk", "doctype", "notification_settings")
frappe.reload_doc("desk", "doctype", "notification_subscribed_document")
users = frappe.db.get_all("User", fields=["name"])
users = frappe.get_all("User", fields=["name"])
for user in users:
create_notification_settings(user.name)

View file

@ -15,9 +15,7 @@ def execute():
def setup_incoming_email_port_in_email_domains():
email_domains = frappe.db.get_all(
"Email Domain", ["incoming_port", "use_imap", "use_ssl", "name"]
)
email_domains = frappe.get_all("Email Domain", ["incoming_port", "use_imap", "use_ssl", "name"])
for domain in email_domains:
if not domain.incoming_port:
incoming_port = get_port(domain)
@ -33,7 +31,7 @@ def setup_incoming_email_port_in_email_domains():
def setup_incoming_email_port_in_email_accounts():
email_accounts = frappe.db.get_all(
email_accounts = frappe.get_all(
"Email Account", ["incoming_port", "use_imap", "use_ssl", "name", "enable_incoming"]
)

View file

@ -6,7 +6,7 @@ import frappe
def execute():
frappe.reload_doc("website", "doctype", "website_theme_ignore_app")
themes = frappe.db.get_all(
themes = frappe.get_all(
"Website Theme", filters={"theme_url": ("not like", "/files/website_theme/%")}
)
for theme in themes:

View file

@ -15,7 +15,7 @@ def execute():
)
users = [item.parent for item in users_with_permission]
charts = frappe.db.get_all("Dashboard Chart", filters={"owner": ["in", users]})
charts = frappe.get_all("Dashboard Chart", filters={"owner": ["in", users]})
for chart in charts:
frappe.db.set_value("Dashboard Chart", chart.name, "is_public", 1)

View file

@ -5,7 +5,7 @@ import frappe
def execute():
doctypes = frappe.db.get_all("DocType", {"module": "Data Migration", "custom": 0}, pluck="name")
doctypes = frappe.get_all("DocType", {"module": "Data Migration", "custom": 0}, pluck="name")
for doctype in doctypes:
frappe.delete_doc("DocType", doctype, ignore_missing=True)

View file

@ -17,6 +17,6 @@ def execute():
"yellow": "Yellow",
"lightblue": "Light Blue",
}
for d in frappe.db.get_all("Kanban Board Column", fields=["name", "indicator"]):
for d in frappe.get_all("Kanban Board Column", fields=["name", "indicator"]):
color_name = indicator_map.get(d.indicator, "Gray")
frappe.db.set_value("Kanban Board Column", d.name, "indicator", color_name)

View file

@ -4,7 +4,7 @@ import frappe
def execute():
frappe.reload_doctype("Web Form")
for web_form in frappe.db.get_all("Web Form", filters={"is_multi_step_form": 1}):
for web_form in frappe.get_all("Web Form", filters={"is_multi_step_form": 1}):
web_form_fields = frappe.get_doc("Web Form", web_form.name).web_form_fields
for web_form_field in web_form_fields:
if web_form_field.fieldtype == "Section Break" and web_form_field.idx != 1:

View file

@ -9,6 +9,6 @@ def execute():
frappe.reload_doc("website", "doctype", "web_form_list_column")
frappe.reload_doctype("Web Form")
for web_form in frappe.db.get_all("Web Form", fields=["*"]):
for web_form in frappe.get_all("Web Form", fields=["*"]):
if web_form.allow_multiple and not web_form.show_list:
frappe.db.set_value("Web Form", web_form.name, "show_list", True)

View file

@ -451,13 +451,13 @@ def get_doctype_roles(doctype, access_type="read"):
def get_perms_for(roles, perm_doctype="DocPerm"):
"""Get perms for given roles"""
filters = {"permlevel": 0, "docstatus": 0, "role": ["in", roles]}
return frappe.db.get_all(perm_doctype, fields=["*"], filters=filters)
return frappe.get_all(perm_doctype, fields=["*"], filters=filters)
def get_doctypes_with_custom_docperms():
"""Returns all the doctypes with Custom Docperms"""
doctypes = frappe.db.get_all("Custom DocPerm", fields=["parent"], distinct=1)
doctypes = frappe.get_all("Custom DocPerm", fields=["parent"], distinct=1)
return [d.parent for d in doctypes]
@ -525,7 +525,7 @@ def clear_user_permissions_for_doctype(doctype, user=None):
filters = {"allow": doctype}
if user:
filters["user"] = user
user_permissions_for_doctype = frappe.db.get_all("User Permission", filters=filters)
user_permissions_for_doctype = frappe.get_all("User Permission", filters=filters)
for d in user_permissions_for_doctype:
frappe.delete_doc("User Permission", d.name)

View file

@ -13,7 +13,7 @@ from frappe.utils.weasyprint import download_pdf, get_html
class PrintFormat(Document):
def onload(self):
templates = frappe.db.get_all(
templates = frappe.get_all(
"Print Format Field Template",
fields=["template", "field", "name"],
filters={"document_type": self.doc_type},

View file

@ -27,7 +27,7 @@ class PrintFormatFieldTemplate(Document):
filters = {"document_type": self.document_type, "field": self.field}
if not self.is_new():
filters.update({"name": ("!=", self.name)})
result = frappe.db.get_all("Print Format Field Template", filters=filters, limit=1)
result = frappe.get_all("Print Format Field Template", filters=filters, limit=1)
if result:
frappe.throw(
_("A template already exists for field {0} of {1}").format(

View file

@ -278,7 +278,10 @@ frappe.ui.form.Layout = class Layout {
make_section(df = {}) {
this.section_count++;
if (!df.fieldname) df.fieldname = `__section_${this.section_count}`;
if (!df.fieldname) {
df.fieldname = `__section_${this.section_count}`;
df.fieldtype = "Section Break";
}
this.section = new Section(
this.current_tab ? this.current_tab.wrapper : this.page,
@ -300,7 +303,10 @@ frappe.ui.form.Layout = class Layout {
make_column(df = {}) {
this.column_count++;
if (!df.fieldname) df.fieldname = `__column_${this.section_count}`;
if (!df.fieldname) {
df.fieldname = `__column_${this.section_count}`;
df.fieldtype = "Column Break";
}
this.column = new Column(this.section, df);
if (df && df.fieldname) {

View file

@ -25,8 +25,8 @@
<li v-for="(column, index) in table_columns.filter(c => c.sortable)" :key="index" @click="query.sort = column.slug"><a class="option">{{ column.label }}</a></li>
</ul>
</div>
<button class="btn btn-default btn-xs btn-order">
<span class="octicon text-muted" :class="query.order == 'asc' ? 'octicon-arrow-down' : 'octicon-arrow-up'" @click="query.order = (query.order == 'asc') ? 'desc' : 'asc'"></span>
<button class="btn btn-default btn-xs btn-order" @click="query.order = (query.order == 'asc') ? 'desc' : 'asc'">
<span class="octicon text-muted" :class="query.order == 'asc' ? 'octicon-arrow-down' : 'octicon-arrow-up'"></span>
</button>
</div>
</div>

View file

@ -101,7 +101,7 @@ def set_permission(doctype, name, user, permission_to, value=1, everyone=0):
@frappe.whitelist()
def get_users(doctype, name):
"""Get list of users with which this document is shared"""
return frappe.db.get_all(
return frappe.get_all(
"DocShare",
fields=[
"name",
@ -137,7 +137,7 @@ def get_shared(doctype, user=None, rights=None):
if user != "Guest":
or_filters += [["everyone", "=", 1]]
shared_docs = frappe.db.get_all(
shared_docs = frappe.get_all(
"DocShare", fields=["share_name"], filters=filters, or_filters=or_filters
)

View file

@ -42,7 +42,7 @@ class TestReportview(FrappeTestCase):
content="test",
seen_by=[{"user": "Administrator"}],
).insert()
result = frappe.db.get_all(
result = frappe.get_all(
"Note",
filters={"name": note.name},
fields=["name", "seen_by.user as seen_by"],
@ -125,8 +125,8 @@ class TestReportview(FrappeTestCase):
).insert()
# test query
results1 = frappe.db.get_all("Parent DocType 1", fields=["name", "child.title as child_title"])
results2 = frappe.db.get_all("Parent DocType 2", fields=["name", "child.title as child_title"])
results1 = frappe.get_all("Parent DocType 1", fields=["name", "child.title as child_title"])
results2 = frappe.get_all("Parent DocType 2", fields=["name", "child.title as child_title"])
# check both parents have same name
self.assertEqual(results1[0].name, results2[0].name)
# check both parents have different number of child records
@ -141,7 +141,7 @@ class TestReportview(FrappeTestCase):
todo = frappe.get_doc(
doctype="ToDo", description="Test ToDo", allocated_to="Administrator"
).insert()
result = frappe.db.get_all(
result = frappe.get_all(
"ToDo",
filters={"name": todo.name},
fields=["name", "allocated_to.email as allocated_user_email"],

View file

@ -8,7 +8,7 @@ class TestSitemap(FrappeTestCase):
from frappe.test_runner import make_test_records
make_test_records("Blog Post")
blogs = frappe.db.get_all("Blog Post", {"published": 1}, ["route"], limit=1)
blogs = frappe.get_all("Blog Post", {"published": 1}, ["route"], limit=1)
xml = get_html_for_route("sitemap.xml")
self.assertTrue("/about</loc>" in xml)
self.assertTrue("/contact</loc>" in xml)

View file

@ -38,7 +38,7 @@ def create_if_not_exists(doc):
@frappe.whitelist()
def create_todo_records():
if frappe.db.get_all("ToDo", {"description": "this is first todo"}):
if frappe.get_all("ToDo", {"description": "this is first todo"}):
return
frappe.get_doc(
@ -80,7 +80,7 @@ def setup_workflow():
@frappe.whitelist()
def create_contact_phone_nos_records():
if frappe.db.get_all("Contact", {"first_name": "Test Contact"}):
if frappe.get_all("Contact", {"first_name": "Test Contact"}):
return
doc = frappe.new_doc("Contact")
@ -127,7 +127,7 @@ def create_child_doctype(name, fields):
@frappe.whitelist()
def create_contact_records():
if frappe.db.get_all("Contact", {"first_name": "Test Form Contact 1"}):
if frappe.get_all("Contact", {"first_name": "Test Form Contact 1"}):
return
insert_contact("Test Form Contact 1", "12345")
@ -137,7 +137,7 @@ def create_contact_records():
@frappe.whitelist()
def create_multiple_todo_records():
if frappe.db.get_all("ToDo", {"description": "Multiple ToDo 1"}):
if frappe.get_all("ToDo", {"description": "Multiple ToDo 1"}):
return
values = [(f"100{i}", f"Multiple ToDo {i}") for i in range(1, 1002)]
@ -291,7 +291,7 @@ def update_child_table(name):
@frappe.whitelist()
def insert_doctype_with_child_table_record(name):
if frappe.db.get_all(name, {"title": "Test Grid Search"}):
if frappe.get_all(name, {"title": "Test Grid Search"}):
return
def insert_child(doc, data, barcode, check, rating, duration, date):

View file

@ -95,13 +95,33 @@ def get_dom_id(seed=None):
return "id-" + generate_hash(seed, 12)
def include_script(path):
def include_script(path, preload=True):
"""Get path of bundled script files.
If preload is specified the path will be added to preload headers so browsers can prefetch
assets."""
path = bundled_asset(path)
if preload:
import frappe
frappe.local.preload_assets["script"].append(path)
return f'<script type="text/javascript" src="{path}"></script>'
def include_style(path, rtl=None):
def include_style(path, rtl=None, preload=True):
"""Get path of bundled style files.
If preload is specified the path will be added to preload headers so browsers can prefetch
assets."""
path = bundled_asset(path)
if preload:
import frappe
frappe.local.preload_assets["style"].append(path)
return f'<link type="text/css" rel="stylesheet" href="{path}">'

View file

@ -273,7 +273,7 @@ def get_user_fullname(user: str) -> str:
def get_fullname_and_avatar(user: str) -> _dict:
first_name, last_name, avatar, name = frappe.db.get_value(
"User", user, ["first_name", "last_name", "user_image", "name"]
"User", user, ["first_name", "last_name", "user_image", "name"], order_by=None
)
return _dict(
{

View file

@ -33,7 +33,7 @@ class WebTemplate(Document):
def on_update(self):
"""Clear cache for all Web Pages in which this template is used"""
routes = frappe.db.get_all(
routes = frappe.get_all(
"Web Page",
filters=[
["Web Page Block", "web_template", "=", self.name],

View file

@ -103,12 +103,12 @@ class WebsiteSettings(Document):
def get_website_settings(context=None):
hooks = frappe.get_hooks()
context = frappe._dict(context or {})
settings: "WebsiteSettings" = frappe.get_single("Website Settings")
settings: "WebsiteSettings" = frappe.get_cached_doc("Website Settings")
context = context.update(
{
"top_bar_items": get_items("top_bar_items"),
"footer_items": get_items("footer_items"),
"top_bar_items": modify_header_footer_items(settings.top_bar_items),
"footer_items": modify_header_footer_items(settings.footer_items),
"post_login": [
{"label": _("My Account"), "url": "/me"},
{"label": _("Log out"), "url": "/?cmd=web_logout"},
@ -203,22 +203,24 @@ def get_items(parentfield: str) -> list[dict]:
order_by="idx asc",
fields="*",
)
top_items = _items.copy()
return modify_header_footer_items(_items)
def modify_header_footer_items(items: list):
top_items = items.copy()
# attach child items to top bar
for item in _items:
if not item["parent_label"]:
for item in items:
if not item.parent_label:
continue
for top_bar_item in top_items:
if top_bar_item["label"] != item["parent_label"]:
if top_bar_item.label != item.parent_label:
continue
if "child_items" not in top_bar_item:
if not top_bar_item.get("child_items"):
top_bar_item["child_items"] = []
top_bar_item["child_items"].append(item)
top_bar_item.child_items.append(item)
break
return top_items

View file

@ -133,9 +133,9 @@ class WebsiteTheme(Document):
def get_active_theme() -> Optional["WebsiteTheme"]:
if website_theme := frappe.db.get_single_value("Website Settings", "website_theme"):
if website_theme := frappe.get_website_settings("website_theme"):
try:
return frappe.get_doc("Website Theme", website_theme)
return frappe.get_cached_doc("Website Theme", website_theme)
except frappe.DoesNotExistError:
pass

View file

@ -12,6 +12,8 @@ UNSUPPORTED_STATIC_PAGE_TYPES = ("html", "md", "js", "xml", "css", "txt", "py",
class StaticPage(BaseRenderer):
__slots__ = ("path", "file_path")
def __init__(self, path, http_status_code=None):
super().__init__(path=path, http_status_code=http_status_code)
self.set_file_path()

View file

@ -17,6 +17,8 @@ from frappe.website.utils import can_cache, get_home_page
class PathResolver:
__slots__ = ("path",)
def __init__(self, path):
self.path = path.strip("/ ")
@ -36,6 +38,11 @@ class PathResolver:
return frappe.flags.redirect_location, RedirectPage(self.path)
endpoint = resolve_path(self.path)
# WARN: Hardcoded for better performance
if endpoint == "app":
return endpoint, TemplatePage(endpoint, 200)
custom_renderers = self.get_custom_page_renderers()
renderers = custom_renderers + [
StaticPage,
@ -98,7 +105,7 @@ def resolve_redirect(path, query_string=None):
]
"""
redirects = frappe.get_hooks("website_redirects")
redirects += frappe.db.get_all("Website Route Redirect", ["source", "target"])
redirects += frappe.get_all("Website Route Redirect", ["source", "target"], order_by=None)
if not redirects:
return

View file

@ -33,7 +33,7 @@ def get_page_info_from_web_page_with_dynamic_routes(path):
def get_page_info_from_web_form(path):
"""Query published web forms and evaluate if the route matches"""
rules, page_info = [], {}
web_forms = frappe.db.get_all("Web Form", ["name", "route", "modified"], {"published": 1})
web_forms = frappe.get_all("Web Form", ["name", "route", "modified"], {"published": 1})
for d in web_forms:
rules.append(Rule(f"/{d.route}", endpoint=d.name))
rules.append(Rule(f"/{d.route}/list", endpoint=d.name))

View file

@ -527,7 +527,8 @@ def build_response(path, data, http_status_code, headers: dict | None = None):
response.headers["X-Page-Name"] = path.encode("ascii", errors="xmlcharrefreplace")
response.headers["X-From-Cache"] = frappe.local.response.from_cache or False
add_preload_headers(response)
add_preload_for_bundled_assets(response)
if headers:
for key, val in headers.items():
response.headers[key] = val.encode("ascii", errors="xmlcharrefreplace")
@ -557,29 +558,18 @@ def set_content_type(response, data, path):
return data
def add_preload_headers(response):
from bs4 import BeautifulSoup, SoupStrainer
def add_preload_for_bundled_assets(response):
try:
preload = []
strainer = SoupStrainer(re.compile("script|link"))
soup = BeautifulSoup(response.data, "html.parser", parse_only=strainer)
for elem in soup.find_all("script", src=re.compile(".*")):
preload.append(("script", elem.get("src")))
links = []
for elem in soup.find_all("link", rel="stylesheet"):
preload.append(("style", elem.get("href")))
for css in frappe.local.preload_assets["style"]:
links.append(f"<{css}>; rel=preload; as=style")
links = []
for _type, link in preload:
links.append(f"<{link}>; rel=preload; as={_type}")
for js in frappe.local.preload_assets["script"]:
links.append(f"<{js}>; rel=preload; as=script")
if links:
response.headers["Link"] = ",".join(links)
except Exception:
import traceback
traceback.print_exc()
if links:
response.headers["Link"] = ",".join(links)
@lru_cache

View file

@ -18,7 +18,9 @@ CLOSING_SCRIPT_TAG_PATTERN = re.compile(r"</script\>")
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") == "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()

View file

@ -40,7 +40,7 @@ def get_email_groups(user_email):
def get_current_groups(name):
# Return current group by which the mail has been sent.
return frappe.db.get_all(
return frappe.get_all(
"Newsletter Email Group",
fields=["email_group"],
filters={"parent": name, "parenttype": "Newsletter"},

View file

@ -58,6 +58,7 @@ dependencies = [
"pytz==2022.1",
"rauth~=0.7.3",
"redis~=3.5.3",
"hiredis~=2.0.0",
"requests-oauthlib~=1.3.0",
"requests~=2.27.1",
"rq~=1.10.1",