@@ -5,11 +5,13 @@ from __future__ import unicode_literals | |||||
import frappe | import frappe | ||||
import frappe.defaults | import frappe.defaults | ||||
from frappe.modules.import_file import get_file_path, read_doc_from_file | from frappe.modules.import_file import get_file_path, read_doc_from_file | ||||
from frappe.translate import send_translations | |||||
from frappe.core.doctype.notification_count.notification_count import delete_notification_count_for | from frappe.core.doctype.notification_count.notification_count import delete_notification_count_for | ||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def get_roles_and_doctypes(): | def get_roles_and_doctypes(): | ||||
frappe.only_for("System Manager") | frappe.only_for("System Manager") | ||||
send_translations(frappe.get_lang_dict("doctype", "DocPerm")) | |||||
return { | return { | ||||
"doctypes": [d[0] for d in frappe.db.sql("""select name from `tabDocType` dt where | "doctypes": [d[0] for d in frappe.db.sql("""select name from `tabDocType` dt where | ||||
ifnull(istable,0)=0 and | ifnull(istable,0)=0 and | ||||
@@ -93,9 +93,17 @@ def get_role_permissions(meta, user=None): | |||||
perms["apply_user_permissions"][ptype] = (perms["apply_user_permissions"].get(ptype, 1) | perms["apply_user_permissions"][ptype] = (perms["apply_user_permissions"].get(ptype, 1) | ||||
and p.get("apply_user_permissions")) | and p.get("apply_user_permissions")) | ||||
if p.apply_user_permissions: | |||||
perms["user_permission_doctypes"] = (json.loads(p.user_permission_doctypes) | |||||
if p.user_permission_doctypes else None) | |||||
if p.apply_user_permissions and p.user_permission_doctypes: | |||||
# set user_permission_doctypes in perms | |||||
user_permission_doctypes = (json.loads(p.user_permission_doctypes) | |||||
if p.user_permission_doctypes else None) | |||||
if user_permission_doctypes and (not perms.get("user_permission_doctypes") or | |||||
len(user_permission_doctypes) <= len(perms["user_permission_doctypes"])): | |||||
# selecting the least no. of "user_permission_doctypes" for lesser filtering | |||||
# why? if there is a conflict of two user_permission_doctypes, the least restrictive should win | |||||
# hence, using the simplistic approach of less no. of "user_permission_doctypes" implies least restrictive! | |||||
perms["user_permission_doctypes"] = user_permission_doctypes | |||||
for key, value in perms.get("apply_user_permissions").items(): | for key, value in perms.get("apply_user_permissions").items(): | ||||
if not value: | if not value: | ||||
@@ -84,7 +84,17 @@ $.extend(frappe.perm, { | |||||
}); | }); | ||||
if (permlevel===0 && p.apply_user_permissions && p.user_permission_doctypes) { | if (permlevel===0 && p.apply_user_permissions && p.user_permission_doctypes) { | ||||
perm[permlevel]["user_permission_doctypes"] = JSON.parse(p.user_permission_doctypes); | |||||
// set user_permission_doctypes in perms | |||||
var user_permission_doctypes = p.user_permission_doctypes | |||||
? JSON.parse(p.user_permission_doctypes) : null; | |||||
if (user_permission_doctypes && (!perm[permlevel].user_permission_doctypes || | |||||
user_permission_doctypes.length <= perm[permlevel].user_permission_doctypes.length)) { | |||||
// selecting the least no. of "user_permission_doctypes" for lesser filtering | |||||
// why? if there is a conflict of two user_permission_doctypes, the least restrictive should win | |||||
// hence, using the simplistic approach of less no. of "user_permission_doctypes" implies least restrictive! | |||||
perm[permlevel]["user_permission_doctypes"] = user_permission_doctypes; | |||||
} | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
@@ -106,6 +106,7 @@ def get_dict(fortype, name=None): | |||||
elif fortype=="boot": | elif fortype=="boot": | ||||
messages = get_messages_from_include_files() | messages = get_messages_from_include_files() | ||||
messages += frappe.db.sql_list("select name from tabDocType") | messages += frappe.db.sql_list("select name from tabDocType") | ||||
messages += frappe.db.sql_list("select name from tabRole") | |||||
messages += frappe.db.sql_list("select name from `tabModule Def`") | messages += frappe.db.sql_list("select name from `tabModule Def`") | ||||
translation_assets[asset_key] = make_dict_from_messages(messages) | translation_assets[asset_key] = make_dict_from_messages(messages) | ||||
@@ -193,6 +194,7 @@ def get_messages_from_doctype(name): | |||||
messages = [meta.name, meta.module] | messages = [meta.name, meta.module] | ||||
# translations of field labels, description and options | |||||
for d in meta.get("fields"): | for d in meta.get("fields"): | ||||
messages.extend([d.label, d.description]) | messages.extend([d.label, d.description]) | ||||
@@ -202,6 +204,11 @@ def get_messages_from_doctype(name): | |||||
if not "icon" in options[0]: | if not "icon" in options[0]: | ||||
messages.extend(options) | messages.extend(options) | ||||
# translations of roles | |||||
for d in meta.get("permissions"): | |||||
if d.role: | |||||
messages.append(d.role) | |||||
# extract from js, py files | # extract from js, py files | ||||
doctype_file_path = frappe.get_module_path(meta.module, "doctype", meta.name, meta.name) | doctype_file_path = frappe.get_module_path(meta.module, "doctype", meta.name, meta.name) | ||||
messages.extend(get_messages_from_file(doctype_file_path + ".js")) | messages.extend(get_messages_from_file(doctype_file_path + ".js")) | ||||
@@ -301,6 +308,8 @@ def get_untranslated(lang, untranslated_file, get_all=False): | |||||
for app in apps: | for app in apps: | ||||
messages.extend(get_messages_for_app(app)) | messages.extend(get_messages_for_app(app)) | ||||
messages = list(set(messages)) | |||||
def escape_newlines(s): | def escape_newlines(s): | ||||
return (s.replace("\\\n", "|||||") | return (s.replace("\\\n", "|||||") | ||||
.replace("\\n", "||||") | .replace("\\n", "||||") | ||||
@@ -366,3 +375,10 @@ def write_translations_file(app, lang, full_dict=None): | |||||
frappe.create_folder(tpath) | frappe.create_folder(tpath) | ||||
write_csv_file(os.path.join(tpath, lang + ".csv"), | write_csv_file(os.path.join(tpath, lang + ".csv"), | ||||
app_messages, full_dict or get_full_dict(lang)) | app_messages, full_dict or get_full_dict(lang)) | ||||
def send_translations(translation_dict): | |||||
"""send these translations in response""" | |||||
if "__messages" not in frappe.local.response: | |||||
frappe.local.response["__messages"] = {} | |||||
frappe.local.response["__messages"].update(translation_dict) |
@@ -43,14 +43,14 @@ def build_response(response_type=None): | |||||
def as_csv(): | def as_csv(): | ||||
response = Response() | response = Response() | ||||
response.headers[b"Content-Type"] = b"text/csv; charset: utf-8" | response.headers[b"Content-Type"] = b"text/csv; charset: utf-8" | ||||
response.headers[b"Content-Disposition"] = ("attachment; filename=%s.csv" % frappe.response['doctype'].replace(' ', '_')).encode("utf-8") | |||||
response.headers[b"Content-Disposition"] = ("attachment; filename=\"%s.csv\"" % frappe.response['doctype'].replace(' ', '_')).encode("utf-8") | |||||
response.data = frappe.response['result'] | response.data = frappe.response['result'] | ||||
return response | return response | ||||
def as_raw(): | def as_raw(): | ||||
response = Response() | response = Response() | ||||
response.headers[b"Content-Type"] = frappe.response.get("content_type") or mimetypes.guess_type(frappe.response['filename'])[0] or b"application/unknown" | response.headers[b"Content-Type"] = frappe.response.get("content_type") or mimetypes.guess_type(frappe.response['filename'])[0] or b"application/unknown" | ||||
response.headers[b"Content-Disposition"] = ("filename=%s" % frappe.response['filename'].replace(' ', '_')).encode("utf-8") | |||||
response.headers[b"Content-Disposition"] = ("filename=\"%s\"" % frappe.response['filename'].replace(' ', '_')).encode("utf-8") | |||||
response.data = frappe.response['filecontent'] | response.data = frappe.response['filecontent'] | ||||
return response | return response | ||||
@@ -1,8 +1,9 @@ | |||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | ||||
# MIT License. See license.txt | |||||
# MIT License. See license.txt | |||||
from __future__ import unicode_literals | from __future__ import unicode_literals | ||||
import frappe | import frappe | ||||
from frappe.translate import send_translations | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def get(name): | def get(name): | ||||
@@ -28,14 +29,14 @@ def getpage(): | |||||
# load translations | # load translations | ||||
if frappe.lang != "en": | if frappe.lang != "en": | ||||
frappe.response["__messages"] = frappe.get_lang_dict("page", page) | |||||
send_translations(frappe.get_lang_dict("page", page)) | |||||
frappe.response.docs.append(doc) | frappe.response.docs.append(doc) | ||||
def has_permission(page): | def has_permission(page): | ||||
if frappe.user.name == "Administrator" or "System Manager" in frappe.user.get_roles(): | if frappe.user.name == "Administrator" or "System Manager" in frappe.user.get_roles(): | ||||
return True | return True | ||||
page_roles = [d.role for d in page.get("roles")] | page_roles = [d.role for d in page.get("roles")] | ||||
if page_roles: | if page_roles: | ||||
if frappe.session.user == "Guest" and "Guest" not in page_roles: | if frappe.session.user == "Guest" and "Guest" not in page_roles: | ||||
@@ -43,7 +44,7 @@ def has_permission(page): | |||||
elif not set(page_roles).intersection(set(frappe.get_roles())): | elif not set(page_roles).intersection(set(frappe.get_roles())): | ||||
# check if roles match | # check if roles match | ||||
return False | return False | ||||
if not frappe.has_permission("Page", ptype="read", doc=page): | if not frappe.has_permission("Page", ptype="read", doc=page): | ||||
# check if there are any user_permissions | # check if there are any user_permissions | ||||
return False | return False | ||||
@@ -9,6 +9,7 @@ import os, json | |||||
from frappe import _ | from frappe import _ | ||||
from frappe.modules import scrub, get_module_path | from frappe.modules import scrub, get_module_path | ||||
from frappe.utils import flt, cint, get_html_format | from frappe.utils import flt, cint, get_html_format | ||||
from frappe.translate import send_translations | |||||
import frappe.widgets.reportview | import frappe.widgets.reportview | ||||
def get_report_doc(report_name): | def get_report_doc(report_name): | ||||
@@ -50,7 +51,7 @@ def get_script(report_name): | |||||
# load translations | # load translations | ||||
if frappe.lang != "en": | if frappe.lang != "en": | ||||
frappe.response["__messages"] = frappe.get_lang_dict("report", report_name) | |||||
send_translations(frappe.get_lang_dict("report", report_name)) | |||||
return { | return { | ||||
"script": script, | "script": script, | ||||