Merge branch '4.0.0-wip' of github.com:webnotes/wnframework into 4.0-hotfix
This commit is contained in:
commit
895dd3e16c
24 changed files with 372 additions and 119 deletions
38
hooks.md
Normal file
38
hooks.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
### List of Hooks
|
||||
|
||||
#### Application Name and Details
|
||||
|
||||
1. `app_name` - slugified name e.g. "webnotes"
|
||||
1. `app_title` - full title name e.g. "Web Notes"
|
||||
1. `app_publisher`
|
||||
1. `app_description`
|
||||
1. `app_version`
|
||||
1. `app_icon` - font-awesome icon or image url
|
||||
1. `app_color` - hex colour background of the app icon
|
||||
|
||||
#### Install
|
||||
|
||||
1. `before_install` - method
|
||||
1. `after_install` - method
|
||||
|
||||
|
||||
#### Javascript / CSS Builds
|
||||
|
||||
1. `app_include_js` - include in "app"
|
||||
1. `app_include_css` - assets/webnotes/css/splash.css
|
||||
|
||||
1. `web_include_js` - assets/js/webnotes-web.min.js
|
||||
1. `web_include_css` - assets/css/webnotes-web.css
|
||||
|
||||
#### Desktop
|
||||
|
||||
1. `get_desktop_icons` - method to get list of desktop icons
|
||||
|
||||
#### Notifications
|
||||
|
||||
1. `notification_config` - method to get notification configuration
|
||||
|
||||
#### Permissions
|
||||
|
||||
1. `permission_query_conditions:[doctype]` - method to return additional query conditions at time of report / list etc.
|
||||
1. `has_permission:[doctype]` - method to call permissions to check at individual level
|
||||
|
|
@ -393,7 +393,7 @@ def get_installed_apps():
|
|||
installed = json.loads(conn.get_global("installed_apps") or "[]")
|
||||
return installed
|
||||
|
||||
def get_hooks(app_name=None):
|
||||
def get_hooks(hook=None, app_name=None):
|
||||
def load_app_hooks(app_name=None):
|
||||
hooks = {}
|
||||
for app in [app_name] if app_name else get_installed_apps():
|
||||
|
|
@ -404,9 +404,14 @@ def get_hooks(app_name=None):
|
|||
hooks[key].append(value)
|
||||
return hooks
|
||||
if app_name:
|
||||
return _dict(load_app_hooks(app_name))
|
||||
hooks = _dict(load_app_hooks(app_name))
|
||||
else:
|
||||
return _dict(cache().get_value("app_hooks", load_app_hooks))
|
||||
hooks = _dict(cache().get_value("app_hooks", load_app_hooks))
|
||||
|
||||
if hook:
|
||||
return hooks.get(hook) or []
|
||||
else:
|
||||
return hooks
|
||||
|
||||
def setup_module_map():
|
||||
_cache = cache()
|
||||
|
|
@ -544,7 +549,7 @@ def set_filters(jenv):
|
|||
|
||||
# load jenv_filters from hooks.txt
|
||||
for app in get_all_apps(True):
|
||||
for jenv_filter in (get_hooks(app).jenv_filter or []):
|
||||
for jenv_filter in (get_hooks(app_name=app).jenv_filter or []):
|
||||
filter_name, filter_function = jenv_filter.split(":")
|
||||
jenv.filters[filter_name] = get_attr(filter_function)
|
||||
|
||||
|
|
|
|||
|
|
@ -331,8 +331,10 @@ def make_module_and_roles(doclist, perm_doctype="DocPerm"):
|
|||
m = webnotes.bean({"doctype": "Module Def", "module_name": doclist[0].module})
|
||||
m.insert()
|
||||
|
||||
roles = list(set(p.role for p in doclist.get({"doctype": perm_doctype})))
|
||||
for role in roles:
|
||||
default_roles = ["Administrator", "Guest", "All"]
|
||||
roles = [p.role for p in doclist.get({"doctype": perm_doctype})] + default_roles
|
||||
|
||||
for role in list(set(roles)):
|
||||
if not webnotes.conn.exists("Role", role):
|
||||
r = webnotes.bean({"doctype": "Role", "role_name": role})
|
||||
r.doc.role_name = role
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ class DocType:
|
|||
if self.doc.starts_on and self.doc.ends_on and self.doc.starts_on > self.doc.ends_on:
|
||||
webnotes.msgprint(webnotes._("Event End must be after Start"), raise_exception=True)
|
||||
|
||||
def get_match_conditions():
|
||||
def get_permission_query_conditions():
|
||||
return """(tabEvent.event_type='Public' or tabEvent.owner='%(user)s'
|
||||
or exists(select * from `tabEvent User` where
|
||||
`tabEvent User`.parent=tabEvent.name and `tabEvent User`.person='%(user)s')
|
||||
|
|
@ -27,7 +27,26 @@ def get_match_conditions():
|
|||
"user": webnotes.session.user,
|
||||
"roles": "', '".join(webnotes.get_roles(webnotes.session.user))
|
||||
}
|
||||
|
||||
|
||||
def has_permission(doc):
|
||||
if doc.event_type=="Public" or doc.owner==webnotes.session.user:
|
||||
return True
|
||||
|
||||
# need full doclist to check roles and users
|
||||
bean = webnotes.bean("Event", doc.name)
|
||||
|
||||
if len(bean.doclist)==1:
|
||||
return False
|
||||
|
||||
if bean.doclist.get({"doctype":"Event User", "person":webnotes.session.user}):
|
||||
return True
|
||||
|
||||
if bean.doclist.get({"doctype":"Event Role", "role":("in", webnotes.get_roles())}):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def send_event_digest():
|
||||
today = nowdate()
|
||||
for user in webnotes.conn.sql("""select name, email, language
|
||||
|
|
|
|||
67
webnotes/core/doctype/event/test_event.py
Normal file
67
webnotes/core/doctype/event/test_event.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# MIT License. See license.txt
|
||||
|
||||
"""Use blog post test to test permission restriction logic"""
|
||||
|
||||
test_records = [
|
||||
[{
|
||||
"doctype": "Event",
|
||||
"subject":"_Test Event 1",
|
||||
"starts_on": "2014-01-01",
|
||||
"event_type": "Public",
|
||||
}],
|
||||
[{
|
||||
"doctype": "Event",
|
||||
"starts_on": "2014-01-01",
|
||||
"subject":"_Test Event 2",
|
||||
"event_type": "Private",
|
||||
}],
|
||||
[{
|
||||
"doctype": "Event",
|
||||
"starts_on": "2014-01-01",
|
||||
"subject":"_Test Event 3",
|
||||
"event_type": "Private",
|
||||
}, {
|
||||
"doctype": "Event User",
|
||||
"parentfield": "event_individuals",
|
||||
"person": "test1@example.com"
|
||||
}],
|
||||
|
||||
]
|
||||
|
||||
import webnotes
|
||||
import webnotes.defaults
|
||||
import unittest
|
||||
|
||||
class TestEvent(unittest.TestCase):
|
||||
# def setUp(self):
|
||||
# profile = webnotes.bean("Profile", "test1@example.com")
|
||||
# profile.get_controller().add_roles("Website Manager")
|
||||
|
||||
def tearDown(self):
|
||||
webnotes.set_user("Administrator")
|
||||
|
||||
def test_allowed_public(self):
|
||||
webnotes.set_user("test1@example.com")
|
||||
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 1"}))
|
||||
self.assertTrue(webnotes.has_permission("Event", refdoc=doc))
|
||||
|
||||
def test_not_allowed_private(self):
|
||||
webnotes.set_user("test1@example.com")
|
||||
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 2"}))
|
||||
self.assertFalse(webnotes.has_permission("Event", refdoc=doc))
|
||||
|
||||
def test_allowed_private_if_in_event_user(self):
|
||||
webnotes.set_user("test1@example.com")
|
||||
doc = webnotes.doc("Event", webnotes.conn.get_value("Event", {"subject":"_Test Event 3"}))
|
||||
self.assertTrue(webnotes.has_permission("Event", refdoc=doc))
|
||||
|
||||
def test_event_list(self):
|
||||
webnotes.set_user("test1@example.com")
|
||||
res = webnotes.get_list("Event", filters=[["Event", "subject", "like", "_Test Event%"]], fields=["name", "subject"])
|
||||
self.assertEquals(len(res), 2)
|
||||
subjects = [r.subject for r in res]
|
||||
self.assertTrue("_Test Event 1" in subjects)
|
||||
self.assertTrue("_Test Event 3" in subjects)
|
||||
self.assertFalse("_Test Event 2" in subjects)
|
||||
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
{
|
||||
"creation": "2013-03-07 11:54:44",
|
||||
"docstatus": 0,
|
||||
"modified": "2014-01-22 16:05:34",
|
||||
"modified": "2014-01-23 13:27:37",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "Administrator"
|
||||
},
|
||||
|
|
@ -30,8 +30,7 @@
|
|||
"name": "__common__",
|
||||
"parent": "Profile",
|
||||
"parentfield": "fields",
|
||||
"parenttype": "DocType",
|
||||
"permlevel": 0
|
||||
"parenttype": "DocType"
|
||||
},
|
||||
{
|
||||
"cancel": 0,
|
||||
|
|
@ -46,6 +45,13 @@
|
|||
"doctype": "DocType",
|
||||
"name": "Profile"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "sb0_5",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Personal Info",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"default": "1",
|
||||
"doctype": "DocField",
|
||||
|
|
@ -55,19 +61,16 @@
|
|||
"label": "Enabled",
|
||||
"oldfieldname": "enabled",
|
||||
"oldfieldtype": "Check",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "sb0_5",
|
||||
"fieldtype": "Section Break"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "unsubscribed",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 1,
|
||||
"label": "Unsubscribed"
|
||||
"label": "Unsubscribed",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
|
|
@ -77,6 +80,7 @@
|
|||
"label": "Email",
|
||||
"oldfieldname": "email",
|
||||
"oldfieldtype": "Data",
|
||||
"permlevel": 0,
|
||||
"reqd": 1,
|
||||
"search_index": 0
|
||||
},
|
||||
|
|
@ -88,6 +92,7 @@
|
|||
"label": "First Name",
|
||||
"oldfieldname": "first_name",
|
||||
"oldfieldtype": "Data",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -96,7 +101,8 @@
|
|||
"fieldtype": "Data",
|
||||
"label": "Middle Name (Optional)",
|
||||
"oldfieldname": "middle_name",
|
||||
"oldfieldtype": "Data"
|
||||
"oldfieldtype": "Data",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
|
|
@ -105,13 +111,15 @@
|
|||
"in_list_view": 1,
|
||||
"label": "Last Name",
|
||||
"oldfieldname": "last_name",
|
||||
"oldfieldtype": "Data"
|
||||
"oldfieldtype": "Data",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "column_break0",
|
||||
"fieldtype": "Column Break",
|
||||
"oldfieldtype": "Column Break",
|
||||
"permlevel": 0,
|
||||
"print_width": "50%",
|
||||
"width": "50%"
|
||||
},
|
||||
|
|
@ -121,7 +129,8 @@
|
|||
"fieldname": "language",
|
||||
"fieldtype": "Select",
|
||||
"label": "Language",
|
||||
"options": "Loading..."
|
||||
"options": "Loading...",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
|
|
@ -129,7 +138,8 @@
|
|||
"fieldtype": "Date",
|
||||
"label": "Birth Date",
|
||||
"oldfieldname": "birth_date",
|
||||
"oldfieldtype": "Date"
|
||||
"oldfieldtype": "Date",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"default": "System User",
|
||||
|
|
@ -140,6 +150,7 @@
|
|||
"oldfieldname": "user_type",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "System User\nWebsite User",
|
||||
"permlevel": 0,
|
||||
"read_only": 1,
|
||||
"reqd": 1
|
||||
},
|
||||
|
|
@ -151,19 +162,22 @@
|
|||
"oldfieldname": "gender",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "\nMale\nFemale\nOther",
|
||||
"permlevel": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "change_password",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Set Password"
|
||||
"label": "Set Password",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "new_password",
|
||||
"fieldtype": "Password",
|
||||
"label": "New Password"
|
||||
"label": "New Password",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
|
|
@ -171,6 +185,7 @@
|
|||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Reset Password Key",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
|
|
@ -179,45 +194,52 @@
|
|||
"doctype": "DocField",
|
||||
"fieldname": "display_settings",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Display Settings"
|
||||
"label": "Display Settings",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "user_image",
|
||||
"fieldtype": "Attach",
|
||||
"hidden": 0,
|
||||
"label": "User Image"
|
||||
"label": "User Image",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "background_image",
|
||||
"fieldtype": "Attach",
|
||||
"hidden": 0,
|
||||
"label": "Background Image"
|
||||
"label": "Background Image",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "cb21",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "user_image_show",
|
||||
"fieldtype": "Image",
|
||||
"label": "user_image_show",
|
||||
"options": "user_image"
|
||||
"options": "user_image",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "short_bio",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Short Bio"
|
||||
"label": "Short Bio",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "bio",
|
||||
"fieldtype": "Small Text",
|
||||
"label": "Bio"
|
||||
"label": "Bio",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "Check / Uncheck roles assigned to the Profile. Click on the Role to find out what permissions that Role has.",
|
||||
|
|
@ -225,6 +247,7 @@
|
|||
"fieldname": "sb1",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Roles",
|
||||
"permlevel": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -232,29 +255,34 @@
|
|||
"fieldname": "roles_html",
|
||||
"fieldtype": "HTML",
|
||||
"label": "Roles HTML",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "incoming_email_settings",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Email Settings"
|
||||
"label": "Email Settings",
|
||||
"permlevel": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "cb18",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "email_signature",
|
||||
"fieldtype": "Small Text",
|
||||
"label": "Email Signature"
|
||||
"label": "Email Signature",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "cb20",
|
||||
"fieldtype": "Column Break"
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "Pull Emails from the Inbox and attach them as Communication records (for known contacts).",
|
||||
|
|
@ -262,7 +290,8 @@
|
|||
"fieldname": "sync_inbox",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 1,
|
||||
"label": "Sync Inbox"
|
||||
"label": "Sync Inbox",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "POP3 Mail Server (e.g. pop.gmail.com)",
|
||||
|
|
@ -270,28 +299,32 @@
|
|||
"fieldname": "email_host",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Email Host"
|
||||
"label": "Email Host",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "email_use_ssl",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 1,
|
||||
"label": "Email Use SSL"
|
||||
"label": "Email Use SSL",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "email_login",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Email Login"
|
||||
"label": "Email Login",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "email_password",
|
||||
"fieldtype": "Password",
|
||||
"hidden": 1,
|
||||
"label": "Email Password"
|
||||
"label": "Email Password",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "These values will be automatically updated in transactions and also will be useful to restrict permissions for this user on transactions containing these values.",
|
||||
|
|
@ -301,6 +334,7 @@
|
|||
"hidden": 1,
|
||||
"label": "Defaults",
|
||||
"oldfieldtype": "Column Break",
|
||||
"permlevel": 1,
|
||||
"print_width": "50%",
|
||||
"read_only": 1,
|
||||
"width": "50%"
|
||||
|
|
@ -312,7 +346,8 @@
|
|||
"fieldtype": "Table",
|
||||
"hidden": 1,
|
||||
"label": "Profile Defaults",
|
||||
"options": "DefaultValue"
|
||||
"options": "DefaultValue",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
|
|
@ -320,6 +355,7 @@
|
|||
"fieldtype": "Section Break",
|
||||
"label": "Security Settings",
|
||||
"oldfieldtype": "Section Break",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -328,6 +364,7 @@
|
|||
"fieldname": "login_after",
|
||||
"fieldtype": "Int",
|
||||
"label": "Login After",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -336,6 +373,7 @@
|
|||
"fieldname": "login_before",
|
||||
"fieldtype": "Int",
|
||||
"label": "Login Before",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -344,6 +382,7 @@
|
|||
"fieldname": "restrict_ip",
|
||||
"fieldtype": "Data",
|
||||
"label": "Restrict IP",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -351,6 +390,7 @@
|
|||
"fieldname": "column_break1",
|
||||
"fieldtype": "Column Break",
|
||||
"oldfieldtype": "Column Break",
|
||||
"permlevel": 0,
|
||||
"print_width": "50%",
|
||||
"width": "50%"
|
||||
},
|
||||
|
|
@ -362,6 +402,7 @@
|
|||
"label": "Last Login",
|
||||
"oldfieldname": "last_login",
|
||||
"oldfieldtype": "Read Only",
|
||||
"permlevel": 0,
|
||||
"read_only": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0
|
||||
|
|
@ -373,6 +414,7 @@
|
|||
"label": "Last IP",
|
||||
"oldfieldname": "last_ip",
|
||||
"oldfieldtype": "Read Only",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -382,6 +424,7 @@
|
|||
"hidden": 1,
|
||||
"label": "Roles Assigned To User",
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
|
|
@ -392,6 +435,7 @@
|
|||
"hidden": 1,
|
||||
"label": "Roles Assigned",
|
||||
"options": "UserRole",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1
|
||||
},
|
||||
|
|
@ -417,19 +461,6 @@
|
|||
"role": "All",
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"create": 0,
|
||||
"delete": 0,
|
||||
"doctype": "DocPerm",
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"report": 1,
|
||||
"restricted": 1,
|
||||
"role": "All",
|
||||
"submit": 0,
|
||||
"write": 0
|
||||
},
|
||||
{
|
||||
"amend": 0,
|
||||
"create": 0,
|
||||
|
|
|
|||
|
|
@ -6,4 +6,19 @@ import webnotes
|
|||
|
||||
class DocType:
|
||||
def __init__(self, d, dl):
|
||||
self.doc, self.doclist = d, dl
|
||||
self.doc, self.doclist = d, dl
|
||||
|
||||
# todo is viewable if either owner or assigned_to or System Manager in roles
|
||||
|
||||
def get_permission_query_conditions():
|
||||
if "System Manager" in webnotes.get_roles():
|
||||
return None
|
||||
else:
|
||||
return """(tabToDo.owner = '{user}' or tabToDo.assigned_to = '{user}')""".format(user=webnotes.session.user)
|
||||
|
||||
def has_permission(doc):
|
||||
if "System Manager" in webnotes.get_roles():
|
||||
return True
|
||||
else:
|
||||
return doc.owner==webnotes.session.user or doc.assigned_to==webnotes.session.user
|
||||
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
{
|
||||
"creation": "2012-07-03 13:30:35",
|
||||
"docstatus": 0,
|
||||
"modified": "2013-12-20 19:24:39",
|
||||
"modified": "2014-01-23 12:15:38",
|
||||
"modified_by": "Administrator",
|
||||
"owner": "Administrator"
|
||||
},
|
||||
|
|
@ -15,13 +15,13 @@
|
|||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"icon": "icon-check",
|
||||
"in_create": 1,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"issingle": 0,
|
||||
"max_attachments": 0,
|
||||
"module": "Core",
|
||||
"name": "__common__",
|
||||
"read_only": 1,
|
||||
"read_only": 0,
|
||||
"read_only_onload": 0
|
||||
},
|
||||
{
|
||||
|
|
@ -34,6 +34,7 @@
|
|||
},
|
||||
{
|
||||
"create": 1,
|
||||
"delete": 0,
|
||||
"doctype": "DocPerm",
|
||||
"email": 1,
|
||||
"name": "__common__",
|
||||
|
|
@ -42,12 +43,20 @@
|
|||
"parenttype": "DocType",
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1
|
||||
"read": 1,
|
||||
"report": 1,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"doctype": "DocType",
|
||||
"name": "ToDo"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "description_and_status",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Description and Status"
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"doctype": "DocField",
|
||||
|
|
@ -55,6 +64,7 @@
|
|||
"fieldtype": "Text",
|
||||
"hidden": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 1,
|
||||
"label": "Description",
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "description",
|
||||
|
|
@ -66,6 +76,37 @@
|
|||
"search_index": 0,
|
||||
"width": "300px"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "column_break_2",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 1,
|
||||
"label": "Status",
|
||||
"options": "Open\nClosed"
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"doctype": "DocField",
|
||||
"fieldname": "priority",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
"in_filter": 0,
|
||||
"in_list_view": 1,
|
||||
"label": "Priority",
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "priority",
|
||||
"oldfieldtype": "Data",
|
||||
"options": "High\nMedium\nLow",
|
||||
"print_hide": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"doctype": "DocField",
|
||||
|
|
@ -73,7 +114,8 @@
|
|||
"fieldtype": "Date",
|
||||
"hidden": 0,
|
||||
"in_filter": 0,
|
||||
"label": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Due Date",
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "date",
|
||||
"oldfieldtype": "Date",
|
||||
|
|
@ -83,20 +125,10 @@
|
|||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"doctype": "DocField",
|
||||
"fieldname": "priority",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
"in_filter": 0,
|
||||
"label": "Priority",
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "priority",
|
||||
"oldfieldtype": "Data",
|
||||
"print_hide": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0
|
||||
"fieldname": "section_break_6",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Reference"
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
|
|
@ -137,7 +169,8 @@
|
|||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
"in_filter": 0,
|
||||
"label": "Checked",
|
||||
"in_list_view": 1,
|
||||
"label": "Completed",
|
||||
"no_copy": 0,
|
||||
"oldfieldname": "checked",
|
||||
"oldfieldtype": "Check",
|
||||
|
|
@ -146,6 +179,11 @@
|
|||
"reqd": 0,
|
||||
"search_index": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"fieldname": "column_break_10",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"allow_on_submit": 0,
|
||||
"doctype": "DocField",
|
||||
|
|
@ -171,14 +209,16 @@
|
|||
"options": "Profile"
|
||||
},
|
||||
{
|
||||
"cancel": 0,
|
||||
"doctype": "DocPerm",
|
||||
"report": 0,
|
||||
"export": 0,
|
||||
"restricted": 1,
|
||||
"role": "All",
|
||||
"submit": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocPerm",
|
||||
"report": 1,
|
||||
"export": 1,
|
||||
"role": "System Manager"
|
||||
}
|
||||
]
|
||||
|
|
@ -10,7 +10,7 @@ def get_app_list():
|
|||
installed = webnotes.get_installed_apps()
|
||||
for app in webnotes.get_all_apps(True):
|
||||
out[app] = {}
|
||||
app_hooks = webnotes.get_hooks(app)
|
||||
app_hooks = webnotes.get_hooks(app_name=app)
|
||||
for key in ("app_name", "app_title", "app_description", "app_icon",
|
||||
"app_publisher", "app_version", "app_url", "app_color"):
|
||||
out[app][key] = app_hooks.get(key)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
from __future__ import unicode_literals
|
||||
import webnotes
|
||||
from core.doctype.notification_count.notification_count import delete_notification_count_for
|
||||
from webnotes.core.doctype.notification_count.notification_count import delete_notification_count_for
|
||||
|
||||
|
||||
@webnotes.whitelist()
|
||||
|
|
|
|||
|
|
@ -21,4 +21,12 @@ scheduler_event = daily:webnotes.utils.email_lib.bulk.clear_outbox
|
|||
scheduler_event = daily:webnotes.core.doctype.notification_count.notification_count.delete_event_notification_count
|
||||
scheduler_event = daily:webnotes.core.doctype.event.event.send_event_digest
|
||||
|
||||
on_session_creation = webnotes.auth.notify_administrator_login
|
||||
on_session_creation = webnotes.auth.notify_administrator_login
|
||||
|
||||
# permissions
|
||||
|
||||
permission_query_conditions:Event = webnotes.core.doctype.event.event.get_permission_query_conditions
|
||||
has_permission:Event = webnotes.core.doctype.event.event.has_permission
|
||||
|
||||
permission_query_conditions:ToDo = webnotes.core.doctype.todo.todo.get_permission_query_conditions
|
||||
has_permission:ToDo = webnotes.core.doctype.todo.todo.has_permission
|
||||
|
|
@ -87,7 +87,7 @@ def install_app(name, verbose=False):
|
|||
webnotes.flags.in_install_app = name
|
||||
webnotes.clear_cache()
|
||||
|
||||
app_hooks = webnotes.get_hooks(name)
|
||||
app_hooks = webnotes.get_hooks(app_name=name)
|
||||
installed_apps = webnotes.get_installed_apps()
|
||||
|
||||
if name in installed_apps:
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ class Bean:
|
|||
if hasattr(self.controller, 'custom_' + method):
|
||||
getattr(self.controller, 'custom_' + method)(*args, **kwargs)
|
||||
|
||||
notify(self, method)
|
||||
notify(self, method, *args, **kwargs)
|
||||
|
||||
self.set_doclist(self.controller.doclist)
|
||||
|
||||
|
|
@ -487,11 +487,11 @@ def clone(source_wrapper):
|
|||
|
||||
return new_wrapper
|
||||
|
||||
def notify(bean, caller):
|
||||
def notify(bean, caller, *args, **kwargs):
|
||||
for hook in webnotes.get_hooks().bean_event or []:
|
||||
doctype, trigger, handler = hook.split(":")
|
||||
if ((doctype=="*") or (doctype==bean.doc.doctype)) and caller==trigger:
|
||||
webnotes.get_attr(handler)(bean, trigger)
|
||||
webnotes.get_attr(handler)(bean, trigger, *args, **kwargs)
|
||||
|
||||
# for bc
|
||||
def getlist(doclist, parentfield):
|
||||
|
|
|
|||
|
|
@ -7,18 +7,6 @@ from webnotes import msgprint, _
|
|||
from webnotes.utils import flt, cint, cstr
|
||||
from webnotes.model.meta import get_field_precision
|
||||
|
||||
error_condition_map = {
|
||||
"=": "!=",
|
||||
"!=": "=",
|
||||
"<": ">=",
|
||||
">": "<=",
|
||||
">=": "<",
|
||||
"<=": ">",
|
||||
"in": _("not in"),
|
||||
"not in": _("in"),
|
||||
"^": _("cannot start with"),
|
||||
}
|
||||
|
||||
class EmptyTableError(webnotes.ValidationError): pass
|
||||
|
||||
class DocListController(object):
|
||||
|
|
@ -37,6 +25,18 @@ class DocListController(object):
|
|||
def validate_value(self, fieldname, condition, val2, doc=None, raise_exception=None):
|
||||
"""check that value of fieldname should be 'condition' val2
|
||||
else throw exception"""
|
||||
error_condition_map = {
|
||||
"=": "!=",
|
||||
"!=": "=",
|
||||
"<": ">=",
|
||||
">": "<=",
|
||||
">=": "<",
|
||||
"<=": ">",
|
||||
"in": _("not in"),
|
||||
"not in": _("in"),
|
||||
"^": _("cannot start with"),
|
||||
}
|
||||
|
||||
if not doc:
|
||||
doc = self.doc
|
||||
|
||||
|
|
|
|||
|
|
@ -30,16 +30,18 @@ def has_permission(doctype, ptype="read", refdoc=None, verbose=True):
|
|||
# get user permissions
|
||||
if not get_user_perms(meta).get(ptype):
|
||||
return False
|
||||
elif refdoc:
|
||||
|
||||
if refdoc:
|
||||
if isinstance(refdoc, basestring):
|
||||
refdoc = webnotes.doc(meta[0].name, refdoc)
|
||||
|
||||
if has_unrestricted_access(meta, refdoc, verbose=verbose):
|
||||
return True
|
||||
else:
|
||||
if not has_unrestricted_access(meta, refdoc, verbose=verbose):
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
if not has_additional_permission(refdoc):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
rights = ["read", "write", "create", "submit", "cancel", "amend",
|
||||
"report", "import", "export", "print", "email", "restrict", "delete", "restricted"]
|
||||
|
|
@ -98,6 +100,14 @@ def has_unrestricted_access(meta, refdoc, verbose=True):
|
|||
# check all restrictions before returning
|
||||
return False if has_restricted_data else True
|
||||
|
||||
def has_additional_permission(doc):
|
||||
condition_methods = webnotes.get_hooks("has_permission:" + doc.doctype)
|
||||
for method in webnotes.get_hooks("has_permission:" + doc.doctype):
|
||||
if not webnotes.get_attr(method)(doc):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def can_restrict_user(user, doctype, docname=None):
|
||||
if not can_restrict(doctype, docname):
|
||||
return False
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ def get_system_managers(only_name=False):
|
|||
return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers]
|
||||
|
||||
def add_role(profile, role):
|
||||
profile_wrapper = webnotes.bean("Profile", profile).get_controller().add_roles([role])
|
||||
profile_wrapper = webnotes.bean("Profile", profile).get_controller().add_roles(role)
|
||||
|
||||
def add_system_manager(email, first_name=None, last_name=None):
|
||||
# add profile
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ div#freeze {
|
|||
/* listing */
|
||||
|
||||
.show_filters {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 1px solid #c7c7c7;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ wn.Application = Class.extend({
|
|||
wn.provide('wn.boot');
|
||||
wn.boot = r;
|
||||
if(wn.boot.profile.name==='Guest' || wn.boot.profile.user_type==="Website User") {
|
||||
window.location = 'index.html';
|
||||
window.location = 'index';
|
||||
return;
|
||||
}
|
||||
me.startup();
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ wn.ui.form.AssignTo = Class.extend({
|
|||
{fieldtype:'Button', label:wn._("Add"), fieldname:'add_btn'}
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
me.dialog.fields_dict.restrict.$wrapper
|
||||
.find(".assign-user-properties")
|
||||
.on("click", function() {
|
||||
|
|
@ -141,6 +141,11 @@ wn.ui.form.AssignTo = Class.extend({
|
|||
})();
|
||||
|
||||
me.dialog.show();
|
||||
|
||||
if(!wn.perm.get_perm(me.frm.doctype)[0].restricted) {
|
||||
me.dialog.fields_dict.restrict.set_input(0);
|
||||
me.dialog.fields_dict.restrict.$wrapper.toggle(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -460,7 +460,7 @@ wn.ui.form.ControlCheck = wn.ui.form.ControlData.extend({
|
|||
input_type: "checkbox",
|
||||
make_wrapper: function() {
|
||||
this.$wrapper = $('<div class="form-group row" style="margin: 0px;">\
|
||||
<div class="col-md-offset-4 col-md-8">\
|
||||
<div class="col-md-offset-3 col-md-8">\
|
||||
<div class="checkbox" style="margin: 5px 0px">\
|
||||
<label>\
|
||||
<span class="input-area"></span>\
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ login.do_login = function(){
|
|||
statusCode: {
|
||||
200: function(data) {
|
||||
if(data.message=="Logged In") {
|
||||
window.location.href = "app.html";
|
||||
window.location.href = "app";
|
||||
} else if(data.message=="No App") {
|
||||
if(localStorage) {
|
||||
var last_visited = localStorage.getItem("last_visited") || "index";
|
||||
|
|
|
|||
|
|
@ -5,9 +5,8 @@ from __future__ import unicode_literals
|
|||
import webnotes
|
||||
from webnotes.webutils import WebsiteGenerator
|
||||
from webnotes import _
|
||||
from webnotes.model.controller import DocListController
|
||||
|
||||
class DocType(DocListController, WebsiteGenerator):
|
||||
class DocType(WebsiteGenerator):
|
||||
def autoname(self):
|
||||
from webnotes.webutils import cleanup_page_name
|
||||
self.doc.name = cleanup_page_name(self.doc.title)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import webnotes
|
|||
import json, os, time
|
||||
from webnotes import _
|
||||
import webnotes.utils
|
||||
from webnotes.model.controller import DocListController
|
||||
import mimetypes
|
||||
from webnotes.website.doctype.website_sitemap.website_sitemap import add_to_sitemap
|
||||
|
||||
|
|
@ -175,7 +176,6 @@ def get_website_settings():
|
|||
|
||||
return context
|
||||
|
||||
|
||||
def clear_cache(page_name=None):
|
||||
if page_name:
|
||||
delete_page_cache(page_name)
|
||||
|
|
@ -203,8 +203,11 @@ def is_signup_enabled():
|
|||
webnotes.local.is_signup_enabled = False
|
||||
|
||||
return webnotes.local.is_signup_enabled
|
||||
|
||||
class WebsiteGenerator(object):
|
||||
|
||||
def call_website_generator(bean, method):
|
||||
getattr(WebsiteGenerator(bean.doc, bean.doclist), method)()
|
||||
|
||||
class WebsiteGenerator(DocListController):
|
||||
def setup_generator(self):
|
||||
if webnotes.flags.in_install_app:
|
||||
return
|
||||
|
|
@ -251,7 +254,7 @@ class WebsiteGenerator(object):
|
|||
def on_trash(self):
|
||||
self.setup_generator()
|
||||
remove_page(self.doc.fields[self._website_config.page_name_field])
|
||||
|
||||
|
||||
def remove_page(page_name):
|
||||
if page_name:
|
||||
delete_page_cache(page_name)
|
||||
|
|
|
|||
|
|
@ -171,7 +171,12 @@ def build_filter_conditions(filters, conditions):
|
|||
if isinstance(f, basestring):
|
||||
conditions.append(f)
|
||||
else:
|
||||
|
||||
if not isinstance(f, (list, tuple)):
|
||||
webnotes.throw("Filter must be a tuple or list (in a list)")
|
||||
|
||||
if len(f) != 4:
|
||||
webnotes.throw("Filter must have 4 values (doctype, fieldname, condition, value): " + str(f))
|
||||
|
||||
tname = ('`tab' + f[0] + '`')
|
||||
if not tname in webnotes.local.reportview_tables:
|
||||
webnotes.local.reportview_tables.append(tname)
|
||||
|
|
@ -240,7 +245,7 @@ def build_match_conditions(doctype, fields=None, as_condition=True):
|
|||
|
||||
if as_condition:
|
||||
conditions = " and ".join(match_conditions)
|
||||
doctype_conditions = get_doctype_conditions(doctype)
|
||||
doctype_conditions = get_permission_query_conditions(doctype)
|
||||
if doctype_conditions:
|
||||
conditions += ' and ' + doctype_conditions if conditions else doctype_conditions
|
||||
|
||||
|
|
@ -255,12 +260,17 @@ def build_match_conditions(doctype, fields=None, as_condition=True):
|
|||
else:
|
||||
return match_filters
|
||||
|
||||
def get_doctype_conditions(doctype):
|
||||
from webnotes.model.code import load_doctype_module
|
||||
module = load_doctype_module(doctype)
|
||||
if module and hasattr(module, 'get_match_conditions'):
|
||||
return getattr(module, 'get_match_conditions')()
|
||||
|
||||
def get_permission_query_conditions(doctype):
|
||||
condition_methods = webnotes.get_hooks("permission_query_conditions:" + doctype)
|
||||
if condition_methods:
|
||||
conditions = []
|
||||
for method in condition_methods:
|
||||
c = webnotes.get_attr(method)()
|
||||
if c:
|
||||
conditions.append(c)
|
||||
|
||||
return " and ".join(conditions) if conditions else None
|
||||
|
||||
def get_tables(doctype, fields):
|
||||
"""extract tables from fields"""
|
||||
tables = ['`tab' + doctype + '`']
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue