@@ -21,19 +21,17 @@ class Workspace:
self.extended_charts = []
self.extended_shortcuts = []
user = frappe.get_user()
user.build_permissions()
user_doc = frappe.get_doc('User', frappe.session.user)
self.blocked_modules = user_doc.get_blocked_modules()
self.user = frappe.get_user()
self.allowed_modules = self.get_cached_value('user_allowed_modules', self.get_allowed_modules)
self.doc = self.get_page_for_user()
if self.doc.module in self.block ed_modules:
if self.doc.module not in self.allowed_modules:
raise frappe.PermissionError
self.user = user
self.allowed_pages = get_allowed_pages()
self.allowed_reports = get_allowed_reports()
self.can_read = self.get_cached_value('user_perm_can_read', self.get_can_read_items)
self.allowed_pages = get_allowed_pages(cache=True)
self.allowed_reports = get_allowed_reports(cache=True)
self.onboarding_doc = self.get_onboarding_doc()
self.onboarding = None
@@ -41,6 +39,31 @@ class Workspace:
self.restricted_doctypes = frappe.cache().get_value("domain_restricted_doctypes") or build_domain_restriced_doctype_cache()
self.restricted_pages = frappe.cache().get_value("domain_restricted_pages") or build_domain_restriced_page_cache()
def get_cached_value(self, cache_key, fallback_fn):
_cache = frappe.cache()
value = _cache.get_value(cache_key, user=frappe.session.user)
if value:
return value
value = fallback_fn()
# Expire every six hour
_cache.set_value(cache_key, value, frappe.session.user, 21600)
return value
def get_can_read_items(self):
if not self.user.can_read:
self.user.build_permissions()
return self.user.can_read
def get_allowed_modules(self):
if not self.user.allow_modules:
self.user.build_permissions()
return self.user.allow_modules
def get_page_for_user(self):
filters = {
'extends': self.page_name,
@@ -68,7 +91,7 @@ class Workspace:
# Check if user is allowed
allowed_roles = set(doc.get_allowed_roles())
user_roles = set(self.user .get_roles())
user_roles = set(frappe .get_roles())
if not allowed_roles & user_roles:
return None
@@ -83,7 +106,7 @@ class Workspace:
"extends": self.page_name,
'restrict_to_domain': ['in', frappe.get_active_domains()],
'for_user': '',
'module': ['not in', self.block ed_modules]
'module': ['in', self.allow ed_modules]
})
pages = [frappe.get_doc("Desk Page", page['name']) for page in pages]
@@ -97,7 +120,7 @@ class Workspace:
item_type = item_type.lower()
if item_type == "doctype":
return (name in self.user. can_read and name in self.restricted_doctypes)
return (name in self.can_read and name in self.restricted_doctypes)
if item_type == "page":
return (name in self.allowed_pages and name in self.restricted_pages)
if item_type == "report":
@@ -140,9 +163,9 @@ class Workspace:
default_country = frappe.db.get_default("country")
def _doctype_contains_a_record(name):
exists = self.table_counts.get(name)
if not exists:
if not frappe.db.get_value('DocType', name, 'issingle'):
exists = self.table_counts.get(name, None )
if exists is None :
if not frappe.db.get_value('DocType', name, 'issingle', cache=True ):
exists = frappe.db.count(name)
else:
exists = True