diff --git a/frappe/__init__.py b/frappe/__init__.py index 780913344f..9875a46271 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -17,7 +17,7 @@ from faker import Faker from .exceptions import * from .utils.jinja import (get_jenv, get_template, render_template, get_email_from_template, get_jloader) -__version__ = '10.1.50' +__version__ = '10.1.51' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py index 3d8481c696..5dd714f2a3 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.py +++ b/frappe/core/doctype/prepared_report/prepared_report.py @@ -36,7 +36,7 @@ class PreparedReport(Document): def run_background(instance): report = frappe.get_doc("Report", instance.ref_report_doctype) result = generate_report_result(report, filters=json.loads(instance.filters), user=instance.owner) - create_csv_file(remove_header_meta(result['columns']), result['result'], 'Prepared Report', instance.name) + create_csv_file(result['columns'], result['result'], 'Prepared Report', instance.name) instance.status = "Completed" instance.report_end_time = frappe.utils.now() @@ -59,7 +59,25 @@ def remove_header_meta(columns): def create_csv_file(columns, data, dt, dn): csv_filename = '{0}.csv'.format(frappe.utils.data.format_datetime(frappe.utils.now(), "Y-m-d-H:M")) - rows = [tuple(columns)] + data + + rows = [] + + if data: + columns_without_meta = remove_header_meta(columns) + + row = data[0] + if type(row) == list: + rows = [tuple(columns_without_meta)] + data + else: + for row in data: + new_row = [] + for col in columns: + key = col.get('fieldname') or col.get('label') + new_row.append(frappe.format(row.get(key, ''), col)) + rows.append(new_row) + + rows = [tuple(columns_without_meta)] + rows + encoded = base64.b64encode(frappe.safe_encode(to_csv(rows))) # Call save_file function to upload and attach the file save_file( diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index fd5e0671d8..4056267f7b 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -797,24 +797,17 @@ def sign_up(email, full_name, redirect_to): return 2, _("Please ask your administrator to verify your sign-up") @frappe.whitelist(allow_guest=True) -def reset_password(user, send_email=True): +def reset_password(user): if user=="Administrator": return 'not allowed' - if isinstance(send_email, unicode) or isinstance(send_email, basestring): - if send_email=='false': - send_email = False - try: user = frappe.get_doc("User", user) if not user.enabled: return 'disabled' user.validate_reset_password() - link = user.reset_password(send_email=send_email) - - if not send_email: - return { "link": link } + user.reset_password(send_email=True) return frappe.msgprint(_("Password reset instructions have been sent to your email")) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 04b78c0741..c75a7df09e 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -180,7 +180,7 @@ def run(report_name, filters=None, user=None): def get_prepared_report_result(report, filters, dn=""): latest_report_data = {} - doc_list = frappe.get_list("Prepared Report", filters={"status": "Completed", "report_name": report.name}) + doc_list = frappe.get_all("Prepared Report", filters={"status": "Completed", "report_name": report.name}) doc = None if len(doc_list): if dn: diff --git a/frappe/hooks.py b/frappe/hooks.py index ea851cd093..eb6731caa3 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe" app_license = "MIT" develop_version = '11.x.x-develop' -staging_version = '11.0.3-beta.6' +staging_version = '11.0.3-beta.7' app_email = "info@frappe.io" diff --git a/frappe/permissions.py b/frappe/permissions.py index 0c53722de1..bcd2fab0d5 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -117,8 +117,6 @@ def get_doc_permissions(doc, verbose=False, user=None, ptype=None): if(doc.owner == frappe.session.user): permissions = permissions.get("if_owner") - # if_owner does not come with create rights... - permissions['create'] = 0 else: permissions = {} @@ -265,7 +263,7 @@ def get_valid_perms(doctype=None, user=None): perms = get_perms_for(roles) custom_perms = get_perms_for(roles, 'Custom DocPerm') - doctypes_with_custom_perms = list(set([d.parent for d in custom_perms])) + doctypes_with_custom_perms = get_doctypes_with_custom_docperms() for p in perms: if not p.parent in doctypes_with_custom_perms: custom_perms.append(p) @@ -312,11 +310,18 @@ def get_roles(user=None, with_standard=True): def get_perms_for(roles, perm_doctype='DocPerm'): '''Get perms for given roles''' - return frappe.db.sql(""" - select * from `tab{doctype}` where docstatus=0 - and ifnull(permlevel,0)=0 - and role in ({roles})""".format(doctype = perm_doctype, - roles=", ".join(["%s"]*len(roles))), tuple(roles), as_dict=1) + filters = { + 'permlevel': 0, + 'docstatus': 0, + 'role': ['in', roles] + } + return frappe.db.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) + return [d.parent for d in doctypes] def can_set_user_permissions(doctype, docname=None): # System Manager can always set user permissions @@ -460,4 +465,4 @@ def allow_everything(): eg. {"read": 1, "write": 1, ...} ''' perm = {ptype: 1 for ptype in rights} - return perm \ No newline at end of file + return perm diff --git a/frappe/public/js/frappe/model/perm.js b/frappe/public/js/frappe/model/perm.js index cb9f1cf3a6..1461cea7b8 100644 --- a/frappe/public/js/frappe/model/perm.js +++ b/frappe/public/js/frappe/model/perm.js @@ -53,6 +53,10 @@ $.extend(frappe.perm, { perm[0].read = 1; } + if (!meta) { + return perm; + } + frappe.perm.build_role_permissions(perm, meta); if (doc) {