Skip to content

Commit

Permalink
Merge pull request #20755 from frappe/version-13-hotfix
Browse files Browse the repository at this point in the history
chore: release v13
  • Loading branch information
phot0n committed Apr 18, 2023
2 parents 49b16b0 + c852197 commit 213ab94
Show file tree
Hide file tree
Showing 30 changed files with 252 additions and 196 deletions.
1 change: 1 addition & 0 deletions .github/helper/consumer_db/mariadb.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@
"root_login": "root",
"root_password": "travis",
"host_name": "http://test_site:8000",
"monitor": 1,
"server_script_enabled": true
}
2 changes: 1 addition & 1 deletion cypress/integration/sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ context("Sidebar", () => {
cy.get('.group-by-field.show > .dropdown-menu > .group-by-item > .dropdown-item').should('contain', '1');

//To check if there is no filter added to the listview
cy.get('.filter-selector > .btn').should('contain', 'Filter');
cy.get(".filter-button").should("contain", "Filter");

//To add a filter to display data into the listview
cy.get('.group-by-field.show > .dropdown-menu > .group-by-item > .dropdown-item').click();
Expand Down
4 changes: 2 additions & 2 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -331,8 +331,8 @@ Cypress.Commands.add('click_listview_row_item_with_text', (text) => {
.click({force: true});
});

Cypress.Commands.add('click_filter_button', () => {
cy.get('.filter-selector > .btn').click();
Cypress.Commands.add("click_filter_button", () => {
cy.get(".filter-button").click();
});

Cypress.Commands.add('click_listview_primary_button', (btn_name) => {
Expand Down
4 changes: 2 additions & 2 deletions frappe/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,9 @@ def set_user_lang(user, user_language=None):
# end: static analysis hack


def init(site, sites_path=None, new_site=False):
def init(site, sites_path=".", new_site=False, force=False):
"""Initialize frappe for the current site. Reset thread locals `frappe.local`"""
if getattr(local, "initialised", None):
if getattr(local, "initialised", None) and not force:
return

if not sites_path:
Expand Down
22 changes: 18 additions & 4 deletions frappe/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,18 @@ def application(request):
rollback = after_request(rollback)

finally:
# Important note:
# this function *must* always return a response, hence any exception thrown outside of
# try..catch block like this finally block needs to be handled appropriately.

if request.method in ("POST", "PUT") and frappe.db and rollback:
frappe.db.rollback()

if getattr(frappe.local, "initialised", False):
for after_request_task in frappe.get_hooks("after_request"):
frappe.call(after_request_task, response=response, request=request)
try:
run_after_request_hooks(request, response)
except Exception as e:
# We can not handle exceptions safely here.
frappe.logger().error("Failed to run after request hook", exc_info=True)

log_request(request, response)
process_response(response)
Expand All @@ -104,12 +110,20 @@ def application(request):
return response


def run_after_request_hooks(request, response):
if not getattr(frappe.local, "initialised", False):
return

for after_request_task in frappe.get_hooks("after_request"):
frappe.call(after_request_task, response=response, request=request)


def init_request(request):
frappe.local.request = request
frappe.local.is_ajax = frappe.get_request_header("X-Requested-With") == "XMLHttpRequest"

site = _site or request.headers.get("X-Frappe-Site-Name") or get_site_name(request.host)
frappe.init(site=site, sites_path=_sites_path)
frappe.init(site=site, sites_path=_sites_path, force=True)

if not (frappe.local.conf and frappe.local.conf.db_name):
# site does not exist
Expand Down
13 changes: 4 additions & 9 deletions frappe/core/doctype/language/language.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"icon": "fa fa-globe",
"in_create": 1,
"links": [],
"modified": "2021-10-18 14:02:06.818219",
"modified": "2023-04-13 13:48:38.127995",
"modified_by": "Administrator",
"module": "Core",
"name": "Language",
Expand All @@ -66,18 +66,13 @@
"write": 1
},
{
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Guest",
"share": 1
"role": "All",
"read": 1
}
],
"search_fields": "language_name",
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "language_name",
"track_changes": 1
}
}
3 changes: 3 additions & 0 deletions frappe/core/doctype/prepared_report/prepared_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from frappe.desk.form.load import get_attachments
from frappe.desk.query_report import generate_report_result
from frappe.model.document import Document
from frappe.monitor import add_data_to_monitor
from frappe.utils import gzip_compress, gzip_decompress
from frappe.utils.background_jobs import enqueue

Expand All @@ -28,6 +29,8 @@ def run_background(prepared_report):
instance = frappe.get_doc("Prepared Report", prepared_report)
report = frappe.get_doc("Report", instance.ref_report_doctype)

add_data_to_monitor(report=instance.ref_report_doctype)

try:
report.custom_columns = []

Expand Down
6 changes: 5 additions & 1 deletion frappe/core/doctype/report/report.json
Original file line number Diff line number Diff line change
Expand Up @@ -157,11 +157,13 @@
{
"collapsible": 1,
"collapsible_depends_on": "filters",
"depends_on": "eval:doc.report_type != \"Custom Report\"",
"fieldname": "filters_section",
"fieldtype": "Section Break",
"label": "Filters"
},
{
"depends_on": "eval:doc.report_type != \"Custom Report\"",
"fieldname": "filters",
"fieldtype": "Table",
"label": "Filters",
Expand All @@ -170,11 +172,13 @@
{
"collapsible": 1,
"collapsible_depends_on": "columns",
"depends_on": "eval:doc.report_type != \"Custom Report\"",
"fieldname": "columns_section",
"fieldtype": "Section Break",
"label": "Columns"
},
{
"depends_on": "eval:doc.report_type != \"Custom Report\"",
"fieldname": "columns",
"fieldtype": "Table",
"label": "Columns",
Expand All @@ -191,7 +195,7 @@
"idx": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2022-09-15 13:37:24.531848",
"modified": "2023-04-07 18:18:11.782178",
"modified_by": "Administrator",
"module": "Core",
"name": "Report",
Expand Down
2 changes: 1 addition & 1 deletion frappe/core/doctype/report/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def get_data(

return columns, result

def run_query_report(self, filters, user, ignore_prepared_report=False):
def run_query_report(self, filters=None, user=None, ignore_prepared_report=False):
columns, result = [], []
data = frappe.desk.query_report.run(
self.name, filters=filters, user=user, ignore_prepared_report=ignore_prepared_report
Expand Down
5 changes: 2 additions & 3 deletions frappe/core/doctype/report/test_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,10 @@ def test_custom_report(self):
}
]
),
json.dumps({"user": "Administrator", "doctype": "User"}),
)
custom_report = frappe.get_doc("Report", custom_report_name)
columns, result = custom_report.run_query_report(
filters={"user": "Administrator", "doctype": "User"}, user=frappe.session.user
)
columns, result = custom_report.run_query_report(user=frappe.session.user)

self.assertListEqual(["email"], [column.get("fieldname") for column in columns])
admin_dict = frappe.core.utils.find(result, lambda d: d["name"] == "Administrator")
Expand Down
19 changes: 7 additions & 12 deletions frappe/desk/doctype/bulk_update/bulk_update.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,18 @@ frappe.ui.form.on('Bulk Update', {

frm.page.set_primary_action(__('Update'), function() {
if (!frm.doc.update_value) {
frappe.throw(__('Field "value" is mandatory. Please specify value to be updated'));
frappe.throw(
__('Field "value" is mandatory. Please specify value to be updated')
);
} else {
frappe.call({
method: 'frappe.desk.doctype.bulk_update.bulk_update.update',
args: {
doctype: frm.doc.document_type,
field: frm.doc.field,
value: frm.doc.update_value,
condition: frm.doc.condition,
limit: frm.doc.limit
},
}).then(r => {
frm.call('bulk_update').then(r => {
let failed = r.message;
if (!failed) failed = [];

if (failed.length && !r._server_messages) {
frappe.throw(__('Cannot update {0}', [failed.map(f => f.bold ? f.bold(): f).join(', ')]));
frappe.throw(
__('Cannot update {0}', [failed.map(f => (f.bold ? f.bold() : f)).join(", ")])
);
} else {
frappe.msgprint({
title: __('Success'),
Expand Down
38 changes: 18 additions & 20 deletions frappe/desk/doctype/bulk_update/bulk_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,24 @@


class BulkUpdate(Document):
pass


@frappe.whitelist()
def update(doctype, field, value, condition="", limit=500):
if not limit or cint(limit) > 500:
limit = 500

if condition:
condition = " where " + condition

if ";" in condition:
frappe.throw(_("; not allowed in condition"))

docnames = frappe.db.sql_list(
"""select name from `tab{0}`{1} limit 0, {2}""".format(doctype, condition, limit)
)
data = {}
data[field] = value
return submit_cancel_or_update_docs(doctype, docnames, "update", data)
@frappe.whitelist()
def bulk_update(self):
self.check_permission("write")
limit = self.limit if self.limit and cint(self.limit) < 500 else 500

condition = ""
if self.condition:
if ";" in self.condition:
frappe.throw(_("; not allowed in condition"))

condition = f" where {self.condition}"

docnames = frappe.db.sql_list(
f"""select name from `tab{self.document_type}`{condition} limit {limit} offset 0"""
)
return submit_cancel_or_update_docs(
self.document_type, docnames, "update", {self.field: self.update_value}
)


@frappe.whitelist()
Expand Down
3 changes: 3 additions & 0 deletions frappe/desk/form/save.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import frappe
from frappe.desk.form.load import run_onload
from frappe.monitor import add_data_to_monitor


@frappe.whitelist()
Expand All @@ -27,6 +28,8 @@ def savedocs(doc, action):
run_onload(doc)
send_updated_docs(doc)

add_data_to_monitor(doctype=doc.doctype, action=action)

frappe.msgprint(frappe._("Saved"), indicator="green", alert=True)


Expand Down
19 changes: 16 additions & 3 deletions frappe/desk/query_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from frappe.core.utils import ljust_list
from frappe.model.utils import render_include
from frappe.modules import get_module_path, scrub
from frappe.monitor import add_data_to_monitor
from frappe.permissions import get_role_permissions
from frappe.utils import (
cint,
Expand All @@ -24,12 +25,14 @@
get_html_format,
get_url_to_form,
gzip_decompress,
sbool,
)


def get_report_doc(report_name):
doc = frappe.get_doc("Report", report_name)
doc.custom_columns = []
doc.custom_filters = []

if doc.report_type == "Custom Report":
custom_report_doc = doc
Expand All @@ -39,7 +42,8 @@ def get_report_doc(report_name):
if custom_report_doc.json:
data = json.loads(custom_report_doc.json)
if data:
doc.custom_columns = data["columns"]
doc.custom_columns = data.get("columns")
doc.custom_filters = data.get("filters")
doc.is_custom_report = True

if not doc.is_permitted():
Expand Down Expand Up @@ -220,6 +224,7 @@ def run(
custom_columns=None,
is_tree=False,
parent_field=None,
are_default_filters=True,
):
report = get_report_doc(report_name)
if not user:
Expand All @@ -232,6 +237,9 @@ def run(

result = None

if sbool(are_default_filters) and report.custom_filters:
filters = report.custom_filters

if (
report.prepared_report
and not report.disable_prepared_report
Expand All @@ -249,9 +257,13 @@ def run(
result = get_prepared_report_result(report, filters, dn, user)
else:
result = generate_report_result(report, filters, user, custom_columns, is_tree, parent_field)
add_data_to_monitor(report=report.reference_report or report.name)

result["add_total_row"] = report.add_total_row and not result.get("skip_total_row", False)

if sbool(are_default_filters) and report.custom_filters:
result["custom_filters"] = report.custom_filters

return result


Expand Down Expand Up @@ -535,7 +547,7 @@ def get_data_for_custom_report(columns):


@frappe.whitelist()
def save_report(reference_report, report_name, columns):
def save_report(reference_report, report_name, columns, filters):
report_doc = get_report_doc(reference_report)

docname = frappe.db.exists(
Expand All @@ -551,6 +563,7 @@ def save_report(reference_report, report_name, columns):
report = frappe.get_doc("Report", docname)
existing_jd = json.loads(report.json)
existing_jd["columns"] = json.loads(columns)
existing_jd["filters"] = json.loads(filters)
report.update({"json": json.dumps(existing_jd, separators=(",", ":"))})
report.save()
frappe.msgprint(_("Report updated successfully"))
Expand All @@ -561,7 +574,7 @@ def save_report(reference_report, report_name, columns):
{
"doctype": "Report",
"report_name": report_name,
"json": f'{{"columns":{columns}}}',
"json": f'{{"columns":{columns},"filters":{filters}}}',
"ref_doctype": report_doc.ref_doctype,
"is_standard": "No",
"report_type": "Custom Report",
Expand Down
2 changes: 1 addition & 1 deletion frappe/desk/reportview.py
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ def get_filters_cond(
for f in filters:
if isinstance(f[1], string_types) and f[1][0] == "!":
flt.append([doctype, f[0], "!=", f[1][1:]])
elif isinstance(f[1], (list, tuple)) and f[1][0] in (
elif isinstance(f[1], (list, tuple)) and f[1][0].lower() in (
">",
"<",
">=",
Expand Down
1 change: 1 addition & 0 deletions frappe/integrations/doctype/webhook/webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ def enqueue_webhook(doc, webhook):
webhook = frappe.get_doc("Webhook", webhook.get("name"))
headers = get_webhook_headers(doc, webhook)
data = get_webhook_data(doc, webhook)
r = None

for i in range(3):
try:
Expand Down

0 comments on commit 213ab94

Please sign in to comment.