@@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json | |||||
from .exceptions import * | from .exceptions import * | ||||
from .utils.jinja import get_jenv, get_template, render_template | from .utils.jinja import get_jenv, get_template, render_template | ||||
__version__ = '8.0.35' | |||||
__version__ = '8.0.36' | |||||
__title__ = "Frappe Framework" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -37,7 +37,7 @@ def get_form_params(): | |||||
data["save_user_settings"] = json.loads(data["save_user_settings"]) | data["save_user_settings"] = json.loads(data["save_user_settings"]) | ||||
else: | else: | ||||
data["save_user_settings"] = True | data["save_user_settings"] = True | ||||
doctype = data["doctype"] | doctype = data["doctype"] | ||||
fields = data["fields"] | fields = data["fields"] | ||||
@@ -51,9 +51,9 @@ def get_form_params(): | |||||
fieldname = fieldname.strip("`") | fieldname = fieldname.strip("`") | ||||
df = frappe.get_meta(parenttype).get_field(fieldname) | df = frappe.get_meta(parenttype).get_field(fieldname) | ||||
report_hide = df.report_hide if df else None | report_hide = df.report_hide if df else None | ||||
# remove the field from the query if the report hide flag is set | # remove the field from the query if the report hide flag is set | ||||
if report_hide: | if report_hide: | ||||
fields.remove(field) | fields.remove(field) | ||||
@@ -331,7 +331,7 @@ def build_match_conditions(doctype, as_condition=True): | |||||
else: | else: | ||||
return match_conditions | return match_conditions | ||||
def get_filters_cond(doctype, filters, conditions): | |||||
def get_filters_cond(doctype, filters, conditions, ignore_permissions=None): | |||||
if filters: | if filters: | ||||
flt = filters | flt = filters | ||||
if isinstance(filters, dict): | if isinstance(filters, dict): | ||||
@@ -347,7 +347,7 @@ def get_filters_cond(doctype, filters, conditions): | |||||
query = DatabaseQuery(doctype) | query = DatabaseQuery(doctype) | ||||
query.filters = flt | query.filters = flt | ||||
query.conditions = conditions | query.conditions = conditions | ||||
query.build_filter_conditions(flt, conditions) | |||||
query.build_filter_conditions(flt, conditions, ignore_permissions) | |||||
cond = ' and ' + ' and '.join(query.conditions) | cond = ' and ' + ' and '.join(query.conditions) | ||||
else: | else: | ||||
@@ -4,7 +4,7 @@ | |||||
from __future__ import unicode_literals | from __future__ import unicode_literals | ||||
import frappe | import frappe | ||||
def load_address_and_contact(doc, key): | |||||
def load_address_and_contact(doc, key=None): | |||||
"""Loads address list and contact list in `__onload`""" | """Loads address list and contact list in `__onload`""" | ||||
from frappe.geo.doctype.address.address import get_address_display | from frappe.geo.doctype.address.address import get_address_display | ||||
@@ -250,8 +250,11 @@ class DatabaseQuery(object): | |||||
if match_conditions: | if match_conditions: | ||||
self.conditions.append("(" + match_conditions + ")") | self.conditions.append("(" + match_conditions + ")") | ||||
def build_filter_conditions(self, filters, conditions): | |||||
def build_filter_conditions(self, filters, conditions, ignore_permissions=None): | |||||
"""build conditions from user filters""" | """build conditions from user filters""" | ||||
if ignore_permissions is not None: | |||||
self.flags.ignore_permissions = ignore_permissions | |||||
if isinstance(filters, dict): | if isinstance(filters, dict): | ||||
filters = [filters] | filters = [filters] | ||||
@@ -157,7 +157,6 @@ frappe.patches.v7_0.cleanup_list_settings | |||||
execute:frappe.db.set_default('language', '') | execute:frappe.db.set_default('language', '') | ||||
frappe.patches.v7_1.refactor_integration_broker | frappe.patches.v7_1.refactor_integration_broker | ||||
frappe.patches.v7_1.set_backup_limit | frappe.patches.v7_1.set_backup_limit | ||||
frappe.patches.v7_1.disabled_print_settings_for_custom_print_format | |||||
frappe.patches.v7_2.set_doctype_engine | frappe.patches.v7_2.set_doctype_engine | ||||
frappe.patches.v7_2.merge_knowledge_base | frappe.patches.v7_2.merge_knowledge_base | ||||
frappe.patches.v7_0.update_report_builder_json | frappe.patches.v7_0.update_report_builder_json | ||||
@@ -181,4 +180,5 @@ frappe.patches.v8_0.fix_non_english_desktop_icons # 2017-04-12 | |||||
frappe.patches.v8_0.set_doctype_values_in_custom_role | frappe.patches.v8_0.set_doctype_values_in_custom_role | ||||
frappe.patches.v8_0.install_new_build_system_requirements | frappe.patches.v8_0.install_new_build_system_requirements | ||||
frappe.patches.v8_0.set_currency_field_precision | frappe.patches.v8_0.set_currency_field_precision | ||||
frappe.patches.v8_0.rename_print_to_printing | |||||
frappe.patches.v8_0.rename_print_to_printing | |||||
frappe.patches.v7_1.disabled_print_settings_for_custom_print_format |
@@ -176,13 +176,12 @@ frappe.ui.form.Toolbar = Class.extend({ | |||||
// feedback | // feedback | ||||
if(!this.frm.doc.__unsaved) { | if(!this.frm.doc.__unsaved) { | ||||
if(is_submittable && docstatus != 1) | |||||
return | |||||
this.page.add_menu_item(__("Request Feedback"), function() { | |||||
feedback = new frappe.utils.Feedback(); | |||||
feedback.manual_feedback_request(me.frm.doc); | |||||
}, true) | |||||
if(is_submittable && docstatus == 1) { | |||||
this.page.add_menu_item(__("Request Feedback"), function() { | |||||
feedback = new frappe.utils.Feedback(); | |||||
feedback.manual_feedback_request(me.frm.doc); | |||||
}, true) | |||||
} | |||||
} | } | ||||
// New | // New | ||||
@@ -196,10 +196,15 @@ frappe.socket = { | |||||
}, | }, | ||||
setup_file_watchers: function() { | setup_file_watchers: function() { | ||||
var host = window.location.origin; | var host = window.location.origin; | ||||
var port = '6787'; | |||||
// remove the port number from string | |||||
host = host.split(':').slice(0, -1).join(":"); | |||||
host = host + ':' + port; | |||||
if(window.dev_server) { | |||||
var port = '6787'; | |||||
var parts = host.split(":"); | |||||
// remove the port number from string if exists | |||||
if (parts.length > 2) { | |||||
host = host.split(':').slice(0, -1).join(":"); | |||||
} | |||||
host = host + ':' + port; | |||||
} | |||||
frappe.socket.file_watcher = io.connect(host); | frappe.socket.file_watcher = io.connect(host); | ||||
// css files auto reload | // css files auto reload | ||||
@@ -5,6 +5,7 @@ from __future__ import unicode_literals | |||||
import frappe, unittest | import frappe, unittest | ||||
from frappe.model.db_query import DatabaseQuery | from frappe.model.db_query import DatabaseQuery | ||||
from frappe.desk.reportview import get_filters_cond | |||||
class TestReportview(unittest.TestCase): | class TestReportview(unittest.TestCase): | ||||
def test_basic(self): | def test_basic(self): | ||||
@@ -70,6 +71,12 @@ class TestReportview(unittest.TestCase): | |||||
self.assertTrue({ "name": todays_event.name } in data) | self.assertTrue({ "name": todays_event.name } in data) | ||||
self.assertTrue({ "name": event.name } in data) | self.assertTrue({ "name": event.name } in data) | ||||
def test_ignore_permissions_for_get_filters_cond(self): | |||||
frappe.set_user('test1@example.com') | |||||
self.assertRaises(frappe.PermissionError, get_filters_cond, 'DocType', dict(istable=1), []) | |||||
self.assertTrue(get_filters_cond('DocType', dict(istable=1), [], ignore_permissions=True)) | |||||
frappe.set_user('Administrator') | |||||
def create_event(subject="_Test Event", starts_on=None): | def create_event(subject="_Test Event", starts_on=None): | ||||
""" create a test event """ | """ create a test event """ | ||||