merged hotfix branch to developversion-14
@@ -14,7 +14,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.69' | |||||
__version__ = '8.0.70' | |||||
__title__ = "Frappe Framework" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -222,15 +222,10 @@ class TestUser(unittest.TestCase): | |||||
def test_password_strength(self): | def test_password_strength(self): | ||||
# Test Password without Password Strenth Policy | # Test Password without Password Strenth Policy | ||||
frappe.db.set_value("System Settings", "System Settings", "enable_password_policy", 0) | frappe.db.set_value("System Settings", "System Settings", "enable_password_policy", 0) | ||||
frappe.db.set_value("System Settings", "System Settings", "minimum_password_score", "") | |||||
# Score 0; should fail | |||||
# password policy is disabled, test_password_strength should be ignored | |||||
result = test_password_strength("test_password") | result = test_password_strength("test_password") | ||||
self.assertEqual(result['feedback']['password_policy_validation_passed'], False) | |||||
# Score 1; should pass | |||||
result = test_password_strength("bee2ve") | |||||
self.assertEqual(result['feedback']['password_policy_validation_passed'], True) | |||||
self.assertFalse(result.get("feedback", None)) | |||||
# Test Password with Password Strenth Policy Set | # Test Password with Password Strenth Policy Set | ||||
frappe.db.set_value("System Settings", "System Settings", "enable_password_policy", 1) | frappe.db.set_value("System Settings", "System Settings", "enable_password_policy", 1) | ||||
@@ -408,11 +408,12 @@ class User(Document): | |||||
def password_strength_test(self): | def password_strength_test(self): | ||||
""" test password strength """ | """ test password strength """ | ||||
if frappe.db.get_single_value("System Settings", "enable_password_policy") and self.__new_password: | |||||
if self.__new_password: | |||||
user_data = (self.first_name, self.middle_name, self.last_name, self.email, self.birth_date) | user_data = (self.first_name, self.middle_name, self.last_name, self.email, self.birth_date) | ||||
result = test_password_strength(self.__new_password, '', None, user_data) | result = test_password_strength(self.__new_password, '', None, user_data) | ||||
feedback = result.get("feedback", None) | |||||
if not result['feedback']['password_policy_validation_passed']: | |||||
if feedback and not feedback.get('password_policy_validation_passed', False): | |||||
handle_password_test_fail(result) | handle_password_test_fail(result) | ||||
def suggest_username(self): | def suggest_username(self): | ||||
@@ -512,8 +513,9 @@ def get_perm_info(role): | |||||
@frappe.whitelist(allow_guest=True) | @frappe.whitelist(allow_guest=True) | ||||
def update_password(new_password, key=None, old_password=None): | def update_password(new_password, key=None, old_password=None): | ||||
result = test_password_strength(new_password, key, old_password) | result = test_password_strength(new_password, key, old_password) | ||||
feedback = result.get("feedback", None) | |||||
if not result['feedback']['password_policy_validation_passed']: | |||||
if feedback and not feedback.get('password_policy_validation_passed', False): | |||||
handle_password_test_fail(result) | handle_password_test_fail(result) | ||||
res = _get_user_for_update_password(key, old_password) | res = _get_user_for_update_password(key, old_password) | ||||
@@ -544,20 +546,28 @@ def update_password(new_password, key=None, old_password=None): | |||||
def test_password_strength(new_password, key=None, old_password=None, user_data=[]): | def test_password_strength(new_password, key=None, old_password=None, user_data=[]): | ||||
from frappe.utils.password_strength import test_password_strength as _test_password_strength | from frappe.utils.password_strength import test_password_strength as _test_password_strength | ||||
password_policy = frappe.db.get_value("System Settings", None, | |||||
["enable_password_policy", "minimum_password_score"], as_dict=True) | |||||
enable_password_policy = cint(password_policy.get("enable_password_policy", 0)) | |||||
minimum_password_score = cint(password_policy.get("minimum_password_score", 0)) | |||||
if not enable_password_policy: | |||||
return {} | |||||
if not user_data: | if not user_data: | ||||
user_data = frappe.db.get_value('User', frappe.session.user, ['first_name', 'middle_name', 'last_name', 'email', 'birth_date']) | |||||
user_data = frappe.db.get_value('User', frappe.session.user, | |||||
['first_name', 'middle_name', 'last_name', 'email', 'birth_date']) | |||||
if new_password: | if new_password: | ||||
result = _test_password_strength(new_password, user_inputs=user_data) | result = _test_password_strength(new_password, user_inputs=user_data) | ||||
minimum_password_score = cint(frappe.db.get_single_value("System Settings", "minimum_password_score")) or 0 | |||||
password_policy_validation_passed = False | password_policy_validation_passed = False | ||||
if result['score'] > minimum_password_score: | |||||
# score should be greater than 0 and minimum_password_score | |||||
if result.get('score') and result.get('score') >= minimum_password_score: | |||||
password_policy_validation_passed = True | password_policy_validation_passed = True | ||||
result['feedback']['password_policy_validation_passed'] = password_policy_validation_passed | result['feedback']['password_policy_validation_passed'] = password_policy_validation_passed | ||||
return result | return result | ||||
#for login | #for login | ||||
@@ -146,18 +146,17 @@ def export_query(): | |||||
# build table from dict | # build table from dict | ||||
if isinstance(data.result[0], dict): | if isinstance(data.result[0], dict): | ||||
for row in data.result: | |||||
if row: | |||||
for i,row in enumerate(data.result): | |||||
# only rows which are visible in the report | |||||
if row and (i+1 in visible_idx): | |||||
row_list = [] | row_list = [] | ||||
for idx in range(len(data.columns)): | for idx in range(len(data.columns)): | ||||
row_list.append(row.get(columns[idx]["fieldname"],"")) | row_list.append(row.get(columns[idx]["fieldname"],"")) | ||||
result.append(row_list) | result.append(row_list) | ||||
elif not row: | |||||
result.append([]) | |||||
else: | else: | ||||
result = result + data.result | result = result + data.result | ||||
# filter rows by slickgrid's inline filter | |||||
if visible_idx: | |||||
result = [x for idx, x in enumerate(result) if idx == 0 or idx in visible_idx] | |||||
from frappe.utils.xlsxutils import make_xlsx | from frappe.utils.xlsxutils import make_xlsx | ||||
xlsx_file = make_xlsx(result, "Query Report") | xlsx_file = make_xlsx(result, "Query Report") | ||||
@@ -66,7 +66,9 @@ frappe.ui.form.on('Auto Email Report', { | |||||
var filters = JSON.parse(frm.doc.filters || '{}'); | var filters = JSON.parse(frm.doc.filters || '{}'); | ||||
var report_filters = frappe.query_reports[frm.doc.report].filters; | var report_filters = frappe.query_reports[frm.doc.report].filters; | ||||
frm.set_value('filter_meta', JSON.stringify(report_filters)); | |||||
if(report_filters && report_filters.length > 0) { | |||||
frm.set_value('filter_meta', JSON.stringify(report_filters)); | |||||
} | |||||
var report_filters_list = [] | var report_filters_list = [] | ||||
$.each(report_filters, function(key, val){ | $.each(report_filters, function(key, val){ | ||||
@@ -104,7 +104,7 @@ def dropbox_callback(oauth_token=None, not_approved=False): | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def take_backup(): | def take_backup(): | ||||
"Enqueue longjob for taking backup to dropbox" | "Enqueue longjob for taking backup to dropbox" | ||||
enqueue("frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backup_to_dropbox", queue='long') | |||||
enqueue("frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backup_to_dropbox", queue='long', timeout=1500) | |||||
frappe.msgprint(_("Queued for backup. It may take a few minutes to an hour.")) | frappe.msgprint(_("Queued for backup. It may take a few minutes to an hour.")) | ||||
def take_backups_daily(): | def take_backups_daily(): | ||||
@@ -53,7 +53,7 @@ frappe.upload = { | |||||
$uploaded_files_wrapper.removeClass('hidden').empty(); | $uploaded_files_wrapper.removeClass('hidden').empty(); | ||||
file_array = file_array.map( | file_array = file_array.map( | ||||
file => Object.assign(file, {is_private: opts.is_private || 0}) | |||||
file => Object.assign(file, {is_private: opts.is_private || 1}) | |||||
) | ) | ||||
$upload.data('attached_files', file_array); | $upload.data('attached_files', file_array); | ||||
@@ -391,4 +391,4 @@ frappe.upload = { | |||||
} | } | ||||
}); | }); | ||||
} | } | ||||
} | |||||
} |
@@ -834,7 +834,7 @@ frappe.views.QueryReport = Class.extend({ | |||||
var view_data = frappe.slickgrid_tools.get_view_data(me.columns, me.dataView); | var view_data = frappe.slickgrid_tools.get_view_data(me.columns, me.dataView); | ||||
var result = view_data.map(row => row.splice(1)); | var result = view_data.map(row => row.splice(1)); | ||||
// rows filtered by inline_filter of slickgrid | |||||
// to download only visible rows | |||||
var visible_idx = view_data.map(row => row[0]).filter(sr_no => sr_no !== 'Sr No'); | var visible_idx = view_data.map(row => row[0]).filter(sr_no => sr_no !== 'Sr No'); | ||||
if (data.file_format_type == "CSV") { | if (data.file_format_type == "CSV") { | ||||