Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
仰若水
frappe
Commits
f7b9e6d6
Commit
f7b9e6d6
authored
9 years ago
by
Nabin Hait
Browse files
Options
Download
Plain Diff
Merge branch 'develop'
parents
98a230a5
0c5b6ffe
develop
v11.1.5
v11.1.4
v11.1.3
v11.1.2
v11.1.1
v11.1.0
v11.0.3
v11.0.3-beta.51
v11.0.3-beta.50
v11.0.3-beta.49
v11.0.3-beta.48
v11.0.3-beta.47
v11.0.3-beta.46
v11.0.3-beta.45
v11.0.3-beta.44
v11.0.3-beta.43
v11.0.3-beta.42
v11.0.3-beta.41
v11.0.3-beta.40
v11.0.3-beta.39
v11.0.3-beta.38
v11.0.3-beta.37
v11.0.3-beta.36
v11.0.3-beta.35
v11.0.3-beta.34
v11.0.3-beta.33
v11.0.3-beta.32
v11.0.3-beta.31
v11.0.3-beta.30
v11.0.3-beta.29
v11.0.3-beta.28
v11.0.3-beta.27
v11.0.3-beta.26
v11.0.3-beta.25
v11.0.3-beta.24
v11.0.3-beta.23
v11.0.3-beta.22
v11.0.3-beta.21
v11.0.3-beta.20
v11.0.3-beta.19
v11.0.3-beta.18
v11.0.3-beta.17
v11.0.3-beta.16
v11.0.3-beta.15
v11.0.3-beta.14
v11.0.3-beta.13
v11.0.3-beta.12
v11.0.3-beta.11
v11.0.3-beta.10
v11.0.3-beta.9
v11.0.3-beta.8
v11.0.3-beta.7
v11.0.3-beta.6
v11.0.3-beta.5
v11.0.3-beta.4
v11.0.3-beta.3
v11.0.3-beta.2
v11.0.3-beta.1
v11.0.2
v11.0.1
v11.0.0-beta
v10.1.71
v10.1.70
v10.1.69
v10.1.68
v10.1.67
v10.1.66
v10.1.65
v10.1.64
v10.1.63
v10.1.62
v10.1.61
v10.1.60
v10.1.59
v10.1.58
v10.1.57
v10.1.56
v10.1.55
v10.1.54
v10.1.53
v10.1.52
v10.1.51
v10.1.50
v10.1.49
v10.1.49-beta.1
v10.1.48
v10.1.47
v10.1.46
v10.1.45
v10.1.44
v10.1.43
v10.1.42
v10.1.41
v10.1.40
v10.1.39
v10.1.38
v10.1.37
v10.1.36
v10.1.35
v10.1.34
v10.1.33
v10.1.32
v10.1.31
v10.1.30
v10.1.29
v10.1.28
v10.1.27
v10.1.26
v10.1.25
v10.1.24
v10.1.23
v10.1.22
v10.1.21
v10.1.20
v10.1.19
v10.1.18
v10.1.17
v10.1.16
v10.1.15
v10.1.14
v10.1.13
v10.1.12
v10.1.11
v10.1.10
v10.1.9
v10.1.8
v10.1.7
v10.1.6
v10.1.5
v10.1.4
v10.1.3
v10.1.2
v10.1.1
v10.1.0
v10.0.25
v10.0.24
v10.0.23
v10.0.22
v10.0.21
v10.0.20
v10.0.19
v10.0.18
v10.0.17
v10.0.16
v10.0.15
v10.0.14
v10.0.13
v10.0.12
v10.0.11
v10.0.10
v10.0.9
v10.0.8
v10.0.7
v10.0.6
v10.0.5
v10.0.4
v10.0.3
v10.0.2
v10.0.1
v10.0.0
v9.2.25
v9.2.24
v9.2.23
v9.2.22
v9.2.21
v9.2.20
v9.2.19
v9.2.18
v9.2.17
v9.2.16
v9.2.15
v9.2.14
v9.2.13
v9.2.12
v9.2.11
v9.2.10
v9.2.9
v9.2.8
v9.2.7
v9.2.6
v9.2.5
v9.2.4
v9.2.3
v9.2.2
v9.2.1
v9.2.0
v9.1.11
v9.1.10
v9.1.9
v9.1.8
v9.1.7
v9.1.6
v9.1.5
v9.1.4
v9.1.3
v9.1.2
v9.1.1
v9.1.0
v9.0.10
v9.0.9
v9.0.8
v9.0.7
v9.0.6
v9.0.5
v9.0.4
v9.0.3
v9.0.2
v9.0.1
v9.0.0
v8.10.9
v8.10.8
v8.10.7
v8.10.6
v8.10.5
v8.10.4
v8.10.3
v8.10.2
v8.10.1
v8.10.0
v8.9.4
v8.9.3
v8.9.2
v8.9.1
v8.9.0
v8.8.5
v8.8.4
v8.8.3
v8.8.2
v8.8.1
v8.8.0
v8.7.11
v8.7.10
v8.7.9
v8.7.8
v8.7.7
v8.7.6
v8.7.5
v8.7.4
v8.7.3
v8.7.2
v8.7.1
v8.7.0
v8.6.8
v8.6.7
v8.6.6
v8.6.5
v8.6.4
v8.6.3
v8.6.2
v8.6.1
v8.6.0
v8.5.8
v8.5.7
v8.5.6
v8.5.5
v8.5.4
v8.5.3
v8.5.2
v8.5.1
v8.5.0
v8.4.1
v8.4.0
v8.3.10
v8.3.9
v8.3.8
v8.3.7
v8.3.6
v8.3.5
v8.3.4
v8.3.3
v8.3.2
v8.3.1
v8.3.0
v8.2.7
v8.2.6
v8.2.5
v8.2.4
v8.2.3
v8.2.2
v8.2.1
v8.2.0
v8.1.4
v8.1.3
v8.1.2
v8.1.1
v8.1.0
v8.0.71
v8.0.70
v8.0.69
v8.0.68
v8.0.67
v8.0.66
v8.0.65
v8.0.64
v8.0.63
v8.0.62
v8.0.61
v8.0.60
v8.0.59
v8.0.58
v8.0.57
v8.0.56
v8.0.55
v8.0.54
v8.0.53
v8.0.52
v8.0.51
v8.0.50
v8.0.49
v8.0.48
v8.0.47
v8.0.46
v8.0.45
v8.0.44
v8.0.43
v8.0.42
v8.0.41
v8.0.40
v8.0.39
v8.0.38
v8.0.37
v8.0.36
v8.0.35
v8.0.34
v8.0.33
v8.0.32
v8.0.31
v8.0.30
v8.0.29
v8.0.28
v8.0.27
v8.0.26
v8.0.25
v8.0.24
v8.0.23
v8.0.22
v8.0.21
v8.0.20
v8.0.19
v8.0.18
v8.0.17
v8.0.16
v8.0.15
v8.0.14
v8.0.13
v8.0.12
v8.0.11
v8.0.10
v8.0.9
v8.0.8
v8.0.7
v8.0.6
v8.0.5
v8.0.4
v8.0.3
v8.0.2
v8.0.1
v8.0.0
v7.2.31
v7.2.30
v7.2.29
v7.2.28
v7.2.27
v7.2.26
v7.2.25
v7.2.24
v7.2.23
v7.2.22
v7.2.21
v7.2.20
v7.2.19
v7.2.18
v7.2.17
v7.2.16
v7.2.15
v7.2.14
v7.2.13
v7.2.12
v7.2.11
v7.2.10
v7.2.9
v7.2.8
v7.2.7
v7.2.6
v7.2.5
v7.2.4
v7.2.3
v7.2.2
v7.2.1
v7.2.0
v7.1.29
v7.1.28
v7.1.27
v7.1.26
v7.1.25
v7.1.24
v7.1.23
v7.1.22
v7.1.21
v7.1.20
v7.1.19
v7.1.18
v7.1.17
v7.1.16
v7.1.15
v7.1.14
v7.1.13
v7.1.12
v7.1.11
v7.1.10
v7.1.9
v7.1.8
v7.1.7
v7.1.6
v7.1.5
v7.1.4
v7.1.3
v7.1.2
v7.1.1
v7.1.0
v7.0.47
v7.0.46
v7.0.45
v7.0.44
v7.0.43
v7.0.42
v7.0.41
v7.0.40
v7.0.39
v7.0.38
v7.0.37
v7.0.36
v7.0.35
v7.0.34
v7.0.33
v7.0.32
v7.0.31
v7.0.30
v7.0.29
v7.0.28
v7.0.27
v7.0.26
v7.0.25
v7.0.24
v7.0.23
v7.0.22
v7.0.21
v7.0.20
v7.0.19
v7.0.18
v7.0.17
v7.0.16
v7.0.15
v7.0.14
v7.0.13
v7.0.12
v7.0.11
v7.0.10
v7.0.9
v7.0.8
v7.0.7
v7.0.6
v7.0.5
v7.0.4
v7.0.3
v7.0.2
v7.0.1
v7.0.0
v6.27.24
v6.27.23
v6.27.22
v6.27.21
v6.27.20
v6.27.19
v6.27.18
v6.27.17
v6.27.16
v6.27.15
v6.27.14
v6.27.13
v6.27.12
v6.27.11
v6.27.10
v6.27.9
v6.27.8
v6.27.7
v6.27.6
v6.27.5
v6.27.4
v6.27.3
v6.27.2
v6.27.1
v6.27.0
No related merge requests found
Changes
90
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
frappe/__init__.py
+9
-7
frappe/__init__.py
frappe/__version__.py
+1
-1
frappe/__version__.py
frappe/async.py
+4
-2
frappe/async.py
frappe/boot.py
+7
-18
frappe/boot.py
frappe/celery_app.py
+2
-2
frappe/celery_app.py
frappe/commands.py
+13
-39
frappe/commands.py
frappe/config/desk.py
+1
-1
frappe/config/desk.py
frappe/config/desktop.py
+1
-2
frappe/config/desktop.py
frappe/config/website.py
+21
-26
frappe/config/website.py
frappe/core/doctype/page/page.py
+5
-2
frappe/core/doctype/page/page.py
frappe/core/doctype/user/user.js
+11
-3
frappe/core/doctype/user/user.js
frappe/core/doctype/user/user.py
+9
-0
frappe/core/doctype/user/user.py
frappe/core/page/desktop/desktop.js
+33
-134
frappe/core/page/desktop/desktop.js
frappe/core/page/desktop/desktop_icon_grid.html
+2
-6
frappe/core/page/desktop/desktop_icon_grid.html
frappe/core/page/desktop/desktop_list_view.html
+1
-2
frappe/core/page/desktop/desktop_list_view.html
frappe/core/page/desktop/desktop_module_icon.html
+5
-5
frappe/core/page/desktop/desktop_module_icon.html
frappe/core/page/modules_setup/includes/module_icons.html
+14
-0
frappe/core/page/modules_setup/includes/module_icons.html
frappe/core/page/modules_setup/modules_setup.html
+23
-0
frappe/core/page/modules_setup/modules_setup.html
frappe/core/page/modules_setup/modules_setup.js
+64
-40
frappe/core/page/modules_setup/modules_setup.js
frappe/core/page/modules_setup/modules_setup.json
+6
-7
frappe/core/page/modules_setup/modules_setup.json
with
232 additions
and
297 deletions
+232
-297
frappe/__init__.py
View file @
f7b9e6d6
...
...
@@ -127,7 +127,7 @@ def init(site, sites_path=None, new_site=False):
local
.
system_settings
=
None
local
.
user
=
None
local
.
user_
obj
=
None
local
.
user_
perms
=
None
local
.
session
=
None
local
.
role_permissions
=
{}
local
.
valid_columns
=
{}
...
...
@@ -190,7 +190,9 @@ def cache():
global
redis_server
if
not
redis_server
:
from
frappe.utils.redis_wrapper
import
RedisWrapper
redis_server
=
RedisWrapper
.
from_url
(
conf
.
get
(
"cache_redis_server"
)
or
"redis://localhost:11311"
)
redis_server
=
RedisWrapper
.
from_url
(
conf
.
get
(
'redis_cache'
)
or
conf
.
get
(
"cache_redis_server"
)
or
"redis://localhost:11311"
)
return
redis_server
def
get_traceback
():
...
...
@@ -285,13 +287,13 @@ def set_user(username):
local
.
session
.
data
=
_dict
()
local
.
role_permissions
=
{}
local
.
new_doc_templates
=
{}
local
.
user_
obj
=
None
local
.
user_
perms
=
None
def
get_user
():
from
frappe.utils.user
import
User
if
not
local
.
user_
obj
:
local
.
user_
obj
=
User
(
local
.
session
.
user
)
return
local
.
user_
obj
from
frappe.utils.user
import
User
Permissions
if
not
local
.
user_
perms
:
local
.
user_
perms
=
User
Permissions
(
local
.
session
.
user
)
return
local
.
user_
perms
def
get_roles
(
username
=
None
):
"""Returns roles of current user."""
...
...
This diff is collapsed.
Click to expand it.
frappe/__version__.py
View file @
f7b9e6d6
from
__future__
import
unicode_literals
__version__
=
"6.2
6.6
"
__version__
=
"6.2
7.0
"
This diff is collapsed.
Click to expand it.
frappe/async.py
View file @
f7b9e6d6
...
...
@@ -171,11 +171,13 @@ def put_log(line_no, line, task_id=None):
def
get_redis_server
():
"""
R
eturns
memcache
connection."""
"""
r
eturns
redis_socketio
connection."""
global
redis_server
if
not
redis_server
:
from
redis
import
Redis
redis_server
=
Redis
.
from_url
(
conf
.
get
(
"async_redis_server"
)
or
"redis://localhost:12311"
)
redis_server
=
Redis
.
from_url
(
conf
.
get
(
"redis_socketio"
)
or
conf
.
get
(
"async_redis_server"
)
or
"redis://localhost:12311"
)
return
redis_server
...
...
This diff is collapsed.
Click to expand it.
frappe/boot.py
View file @
f7b9e6d6
...
...
@@ -34,24 +34,9 @@ def get_bootinfo():
bootinfo
.
modules
=
{}
bootinfo
.
module_list
=
[]
for
app
in
frappe
.
get_installed_apps
(
frappe_last
=
True
):
try
:
modules
=
frappe
.
get_attr
(
app
+
".config.desktop.get_data"
)()
or
{}
if
isinstance
(
modules
,
dict
):
bootinfo
.
modules
.
update
(
modules
)
else
:
for
m
in
modules
:
bootinfo
.
modules
[
m
[
'module_name'
]]
=
m
bootinfo
.
module_list
.
append
(
m
[
'module_name'
])
except
ImportError
:
pass
except
AttributeError
:
pass
load_desktop_icons
(
bootinfo
)
bootinfo
.
module_app
=
frappe
.
local
.
module_app
bootinfo
.
hidden_modules
=
frappe
.
db
.
get_global
(
"hidden_modules"
)
bootinfo
.
doctype_icons
=
dict
(
frappe
.
db
.
sql
(
"""select name, icon from
tabDocType where ifnull(icon,'')!=''"""
))
bootinfo
.
single_types
=
frappe
.
db
.
sql_list
(
"""select name from tabDocType where issingle=1"""
)
add_home_page
(
bootinfo
,
doclist
)
bootinfo
.
page_info
=
get_allowed_pages
()
...
...
@@ -79,15 +64,19 @@ def get_bootinfo():
bootinfo
.
error_report_email
=
frappe
.
get_hooks
(
"error_report_email"
)
bootinfo
.
calendars
=
sorted
(
frappe
.
get_hooks
(
"calendars"
))
bootinfo
[
"lang_dict"
]
=
get_lang_dict
()
return
bootinfo
def
load_conf_settings
(
bootinfo
):
from
frappe
import
conf
bootinfo
.
max_file_size
=
conf
.
get
(
'max_file_size'
)
or
10485760
for
key
in
[
'developer_mode'
]
:
for
key
in
(
'developer_mode'
,
'socketio_port'
)
:
if
key
in
conf
:
bootinfo
[
key
]
=
conf
.
get
(
key
)
def
load_desktop_icons
(
bootinfo
):
from
frappe.desk.doctype.desktop_icon.desktop_icon
import
get_desktop_icons
bootinfo
.
desktop_icons
=
get_desktop_icons
()
def
get_allowed_pages
():
roles
=
frappe
.
get_roles
()
page_info
=
{}
...
...
This diff is collapsed.
Click to expand it.
frappe/celery_app.py
View file @
f7b9e6d6
...
...
@@ -32,8 +32,8 @@ def get_celery():
def
get_celery_app
():
conf
=
get_site_config
()
app
=
Celery
(
'frappe'
,
broker
=
conf
.
celery_broker
or
DEFAULT_CELERY_BROKER
,
backend
=
conf
.
async_redis_server
or
DEFAULT_CELERY_BACKEND
)
broker
=
conf
.
redis_queue
or
conf
.
celery_broker
or
DEFAULT_CELERY_BROKER
,
backend
=
conf
.
redis_queue
or
conf
.
async_redis_server
or
DEFAULT_CELERY_BACKEND
)
app
.
autodiscover_tasks
(
frappe
.
get_all_apps
(
with_internal_apps
=
False
,
sites_path
=
SITES_PATH
))
...
...
This diff is collapsed.
Click to expand it.
frappe/commands.py
View file @
f7b9e6d6
...
...
@@ -195,44 +195,16 @@ def add_system_manager(context, email, first_name, last_name):
@
pass_context
def
migrate
(
context
,
rebuild_website
=
False
):
"Run patches, sync schema and rebuild files/translations"
from
frappe.migrate
import
migrate
for
site
in
context
.
sites
:
print
'Migrating'
,
site
_migrate
(
site
,
verbose
=
context
.
verbose
)
if
rebuild_website
:
call_command
(
build_website
,
context
)
else
:
call_command
(
sync_www
,
context
)
def
prepare_for_update
():
from
frappe.sessions
import
clear_global_cache
clear_global_cache
()
def
_migrate
(
site
,
verbose
=
False
):
import
frappe.modules.patch_handler
import
frappe.model.sync
from
frappe.utils.fixtures
import
sync_fixtures
import
frappe.translate
from
frappe.desk.notifications
import
clear_notifications
frappe
.
init
(
site
=
site
)
frappe
.
connect
()
try
:
prepare_for_update
()
# run patches
frappe
.
modules
.
patch_handler
.
run_all
()
# sync
frappe
.
model
.
sync
.
sync_all
(
verbose
=
verbose
)
frappe
.
translate
.
clear_cache
()
sync_fixtures
()
clear_notifications
()
finally
:
frappe
.
publish_realtime
(
"version-update"
)
frappe
.
destroy
()
frappe
.
init
(
site
=
site
)
frappe
.
connect
()
try
:
migrate
(
context
.
verbose
,
rebuild_website
=
rebuild_website
)
finally
:
frappe
.
destroy
()
@
click
.
command
(
'run-patch'
)
@
click
.
argument
(
'module'
)
...
...
@@ -349,7 +321,7 @@ def build_website(context):
frappe
.
init
(
site
=
site
)
frappe
.
connect
()
render
.
clear_cache
()
statics
.
sync
(
verbose
=
context
.
verbose
).
start
(
True
)
statics
.
sync
(
verbose
=
context
.
verbose
).
start
(
rebuild
=
True
)
frappe
.
db
.
commit
()
finally
:
frappe
.
destroy
()
...
...
@@ -799,8 +771,9 @@ def console(context):
@
click
.
option
(
'--test'
,
multiple
=
True
)
@
click
.
option
(
'--driver'
)
@
click
.
option
(
'--module'
)
@
click
.
option
(
'--profile'
,
is_flag
=
True
,
default
=
False
)
@
pass_context
def
run_tests
(
context
,
app
=
None
,
module
=
None
,
doctype
=
None
,
test
=
(),
driver
=
None
):
def
run_tests
(
context
,
app
=
None
,
module
=
None
,
doctype
=
None
,
test
=
(),
driver
=
None
,
profile
=
False
):
"Run tests"
import
frappe.test_runner
from
frappe.utils
import
sel
...
...
@@ -813,7 +786,8 @@ def run_tests(context, app=None, module=None, doctype=None, test=(), driver=None
sel
.
start
(
context
.
verbose
,
driver
)
try
:
ret
=
frappe
.
test_runner
.
main
(
app
,
module
,
doctype
,
context
.
verbose
,
tests
=
tests
,
force
=
context
.
force
)
ret
=
frappe
.
test_runner
.
main
(
app
,
module
,
doctype
,
context
.
verbose
,
tests
=
tests
,
force
=
context
.
force
,
profile
=
profile
)
if
len
(
ret
.
failures
)
==
0
and
len
(
ret
.
errors
)
==
0
:
ret
=
0
finally
:
...
...
This diff is collapsed.
Click to expand it.
frappe/config/desk.py
View file @
f7b9e6d6
...
...
@@ -17,7 +17,7 @@ def get_data():
"type"
:
"doctype"
,
"name"
:
"Event"
,
"label"
:
_
(
"Calendar"
),
"
view
"
:
"Calendar"
,
"
link
"
:
"Calendar
/Event
"
,
"description"
:
_
(
"Event and other calendars."
),
},
{
...
...
This diff is collapsed.
Click to expand it.
frappe/config/desktop.py
View file @
f7b9e6d6
...
...
@@ -37,9 +37,8 @@ def get_data():
"module_name"
:
"Core"
,
"label"
:
_
(
"Developer"
),
"color"
:
"#589494"
,
"icon"
:
"icon-cog"
,
"icon"
:
"octicon octicon-circuit-board"
,
"type"
:
"module"
,
"system_manager"
:
1
}
}
,
]
This diff is collapsed.
Click to expand it.
frappe/config/website.py
View file @
f7b9e6d6
...
...
@@ -4,7 +4,7 @@ from frappe import _
def
get_data
():
return
[
{
"label"
:
_
(
"
Documents
"
),
"label"
:
_
(
"
Web Site
"
),
"icon"
:
"icon-star"
,
"items"
:
[
{
...
...
@@ -14,23 +14,33 @@ def get_data():
},
{
"type"
:
"doctype"
,
"name"
:
"
Blog Post
"
,
"description"
:
_
(
"
Single Post (article)
."
),
"name"
:
"
Web Form
"
,
"description"
:
_
(
"
User editable form on Website
."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Web
Form
"
,
"description"
:
_
(
"
User editable form o
n
W
ebsite."
),
"name"
:
"Web
site Slideshow
"
,
"description"
:
_
(
"
Embed image slideshows i
n
w
ebsite
pages
."
),
},
]
},
{
"label"
:
_
(
"Blog"
),
"items"
:
[
{
"type"
:
"doctype"
,
"name"
:
"Blog
ger
"
,
"description"
:
_
(
"
User ID of a blog writer
."
),
"name"
:
"Blog
Post
"
,
"description"
:
_
(
"
Single Post (article)
."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Website Slideshow"
,
"description"
:
_
(
"Embed image slideshows in website pages."
),
"name"
:
"Blog Settings"
,
"description"
:
_
(
"Write titles and introductions to your blog."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Blog Category"
,
"description"
:
_
(
"Categorize blog posts."
),
},
]
},
...
...
@@ -45,24 +55,14 @@ def get_data():
},
{
"type"
:
"doctype"
,
"name"
:
"
Style Settings
"
,
"description"
:
_
(
"
Setup of fonts and background
."
),
"name"
:
"
Website Theme
"
,
"description"
:
_
(
"
List of themes for Website
."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Website Script"
,
"description"
:
_
(
"Javascript to append to the head section of the page."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Blog Settings"
,
"description"
:
_
(
"Write titles and introductions to your blog."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Blog Category"
,
"description"
:
_
(
"Categorize blog posts."
),
},
{
"type"
:
"doctype"
,
"name"
:
"About Us Settings"
,
...
...
@@ -73,11 +73,6 @@ def get_data():
"name"
:
"Contact Us Settings"
,
"description"
:
_
(
"Settings for Contact Us Page."
),
},
{
"type"
:
"doctype"
,
"name"
:
"Website Theme"
,
"description"
:
_
(
"List of themes for Website."
),
}
]
},
]
This diff is collapsed.
Click to expand it.
frappe/core/doctype/page/page.py
View file @
f7b9e6d6
...
...
@@ -110,13 +110,16 @@ class Page(Document):
with
open
(
os
.
path
.
join
(
path
,
fname
),
'r'
)
as
f
:
template
=
unicode
(
f
.
read
(),
"utf-8"
)
if
"<!-- jinja -->"
in
template
:
context
=
{}
context
=
frappe
.
_dict
(
{}
)
try
:
contex
t
=
frappe
.
get_attr
(
"{app}.{module}.page.{page}.{page}.get_context"
.
format
(
ou
t
=
frappe
.
get_attr
(
"{app}.{module}.page.{page}.{page}.get_context"
.
format
(
app
=
frappe
.
local
.
module_app
[
scrub
(
self
.
module
)],
module
=
scrub
(
self
.
module
),
page
=
page_name
))(
context
)
if
out
:
context
=
out
except
(
AttributeError
,
ImportError
):
pass
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/user/user.js
View file @
f7b9e6d6
...
...
@@ -48,14 +48,22 @@ frappe.ui.form.on('User', {
frm
.
toggle_display
([
'
sb1
'
,
'
sb3
'
,
'
modules_access
'
],
false
);
if
(
!
doc
.
__islocal
){
frm
.
add_custom_button
(
__
(
"
Set
User Permissi
ons
"
),
function
()
{
frm
.
add_custom_button
(
__
(
"
Set
Desktop Ic
ons
"
),
function
()
{
frappe
.
route_options
=
{
"
user
"
:
doc
.
name
};
frappe
.
set_route
(
"
user-permissions
"
);
frappe
.
set_route
(
"
modules_setup
"
);
},
null
,
"
btn-default
"
)
if
(
has_common
(
user_roles
,
[
"
Administrator
"
,
"
System Manager
"
]))
{
frm
.
add_custom_button
(
__
(
"
Set User Permissions
"
),
function
()
{
frappe
.
route_options
=
{
"
user
"
:
doc
.
name
};
frappe
.
set_route
(
"
user-permissions
"
);
},
null
,
"
btn-default
"
)
frm
.
toggle_display
([
'
sb1
'
,
'
sb3
'
,
'
modules_access
'
],
true
);
}
frm
.
trigger
(
'
enabled
'
);
...
...
@@ -98,7 +106,7 @@ frappe.ModuleEditor = Class.extend({
},
make
:
function
()
{
var
me
=
this
;
$
.
each
(
keys
(
frappe
.
boot
.
modules
),
function
(
i
,
m
)
{
this
.
frm
.
doc
.
__onload
.
all_modules
.
forEach
(
function
(
m
)
{
// TODO: add checkbox
$
(
repl
(
'
<div class="col-sm-6"><div class="checkbox">
\
<label><input type="checkbox" class="block-module-check" data-module="%(module)s">
\
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/user/user.py
View file @
f7b9e6d6
...
...
@@ -24,6 +24,11 @@ class User(Document):
self
.
email
=
self
.
email
.
strip
()
self
.
name
=
self
.
email
def
onload
(
self
):
self
.
set_onload
(
'all_modules'
,
[
m
.
module_name
for
m
in
frappe
.
db
.
get_all
(
'Desktop Icon'
,
fields
=
[
'module_name'
],
filters
=
{
'standard'
:
1
})])
def
validate
(
self
):
self
.
in_insert
=
self
.
get
(
"__islocal"
)
...
...
@@ -343,6 +348,10 @@ class User(Document):
def
username_exists
(
self
,
username
=
None
):
return
frappe
.
db
.
get_value
(
"User"
,
{
"username"
:
username
or
self
.
username
,
"name"
:
(
"!="
,
self
.
name
)})
def
get_blocked_modules
(
self
):
"""Returns list of modules blocked for that user"""
return
[
d
.
module
for
d
in
self
.
block_modules
]
if
self
.
block_modules
else
[]
@
frappe
.
whitelist
()
def
get_timezones
():
import
pytz
...
...
This diff is collapsed.
Click to expand it.
frappe/core/page/desktop/desktop.js
View file @
f7b9e6d6
...
...
@@ -31,19 +31,29 @@ $.extend(frappe.desktop, {
var
template
=
frappe
.
list_desktop
?
"
desktop_list_view
"
:
"
desktop_icon_grid
"
;
this
.
wrapper
.
html
(
frappe
.
render_template
(
template
,
{
var
all_icons
=
frappe
.
get_desktop_icons
();
var
explore_icon
=
{
module_name
:
'
Explore
'
,
label
:
'
Explore
'
,
_label
:
__
(
'
Explore
'
),
_id
:
'
Explore
'
,
icon
:
'
octicon octicon-telescope
'
,
color
:
'
#7578f6
'
,
link
:
'
modules
'
};
explore_icon
.
app_icon
=
frappe
.
ui
.
app_icon
.
get_html
(
explore_icon
);
all_icons
.
push
(
explore_icon
);
frappe
.
desktop
.
wrapper
.
html
(
frappe
.
render_template
(
template
,
{
// all visible icons
desktop_items
:
this
.
get_desktop_items
(),
// user visible icons
user_desktop_items
:
this
.
get_user_desktop_items
(),
desktop_items
:
all_icons
,
}));
this
.
setup_module_click
();
frappe
.
desktop
.
setup_module_click
();
// notifications
this
.
show_pending_notifications
();
frappe
.
desktop
.
show_pending_notifications
();
$
(
document
).
on
(
"
notification-update
"
,
function
()
{
me
.
show_pending_notifications
();
});
...
...
@@ -51,76 +61,14 @@ $.extend(frappe.desktop, {
$
(
document
).
trigger
(
"
desktop-render
"
);
},
get_desktop_items
:
function
(
global
)
{
var
me
=
this
;
frappe
.
modules
[
"
All Applications
"
]
=
{
icon
:
"
octicon octicon-three-bars
"
,
label
:
"
All Applications
"
,
_label
:
__
(
"
All Applications
"
),
_id
:
"
all_applications
"
,
color
:
"
#4aa3df
"
,
link
:
""
,
force_show
:
true
,
onclick
:
function
()
{
me
.
all_applications
.
show
();
}
}
var
desktop_items
=
[].
concat
(
frappe
.
user
.
get_desktop_items
(
global
));
remove_from_list
(
desktop_items
,
"
Setup
"
);
if
(
user_roles
.
indexOf
(
'
System Manager
'
)
!=-
1
)
{
desktop_items
.
push
(
'
Setup
'
);
}
remove_from_list
(
desktop_items
,
"
Core
"
);
if
(
user_roles
.
indexOf
(
'
Administrator
'
)
!=-
1
)
{
desktop_items
.
push
(
'
Core
'
);
}
remove_from_list
(
desktop_items
,
"
All Applications
"
);
desktop_items
.
push
(
'
All Applications
'
);
return
desktop_items
;
},
get_user_desktop_items
:
function
()
{
var
me
=
this
;
var
user_desktop_items
=
[].
concat
(
frappe
.
user
.
get_user_desktop_items
());
for
(
var
m
in
frappe
.
modules
)
{
var
module
=
frappe
.
modules
[
m
];
if
(
module
.
force_show
&&
user_desktop_items
.
indexOf
(
m
)
===-
1
)
{
user_desktop_items
.
push
(
m
);
}
}
// filter valid icons
var
out
=
[];
for
(
var
i
=
0
,
l
=
user_desktop_items
.
length
;
i
<
l
;
i
++
)
{
var
m
=
user_desktop_items
[
i
];
var
module
=
frappe
.
get_module
(
m
);
if
(
module
)
{
module
.
app_icon
=
frappe
.
ui
.
app_icon
.
get_html
(
m
);
out
.
push
(
m
);
}
}
return
out
;
},
setup_module_click
:
function
()
{
var
me
=
this
;
if
(
frappe
.
list_desktop
)
{
this
.
wrapper
.
on
(
"
click
"
,
"
.desktop-list-item
"
,
function
()
{
me
.
open_module
(
$
(
this
));
frappe
.
desktop
.
wrapper
.
on
(
"
click
"
,
"
.desktop-list-item
"
,
function
()
{
frappe
.
desktop
.
open_module
(
$
(
this
));
});
}
else
{
this
.
wrapper
.
on
(
"
click
"
,
"
.app-icon
"
,
function
()
{
me
.
open_module
(
$
(
this
).
parent
());
frappe
.
desktop
.
wrapper
.
on
(
"
click
"
,
"
.app-icon
"
,
function
()
{
frappe
.
desktop
.
open_module
(
$
(
this
).
parent
());
});
}
},
...
...
@@ -128,7 +76,9 @@ $.extend(frappe.desktop, {
open_module
:
function
(
parent
)
{
var
link
=
parent
.
attr
(
"
data-link
"
);
if
(
link
)
{
if
(
link
.
substr
(
0
,
1
)
===
"
/
"
||
link
.
substr
(
0
,
4
)
===
"
http
"
)
{
if
(
link
.
indexOf
(
'
javascript:
'
)
===
0
)
{
eval
(
link
.
substr
(
11
));
}
else
if
(
link
.
substr
(
0
,
1
)
===
"
/
"
||
link
.
substr
(
0
,
4
)
===
"
http
"
)
{
window
.
open
(
link
,
"
_blank
"
);
}
else
{
frappe
.
set_route
(
link
);
...
...
@@ -154,7 +104,14 @@ $.extend(frappe.desktop, {
$
(
"
#icon-grid .case-wrapper
"
).
each
(
function
(
i
,
e
)
{
new_order
.
push
(
$
(
this
).
attr
(
"
data-name
"
));
});
frappe
.
defaults
.
set_default
(
"
_desktop_items
"
,
new_order
);
frappe
.
call
({
method
:
'
frappe.desk.doctype.desktop_icon.desktop_icon.set_order
'
,
args
:
{
'
new_order
'
:
new_order
},
quiet
:
true
});
}
});
},
...
...
@@ -164,64 +121,6 @@ $.extend(frappe.desktop, {
frappe
.
boot
.
user
.
background_style
);
},
all_applications
:
{
show
:
function
()
{
if
(
!
this
.
dialog
)
{
this
.
make_dialog
();
}
$
(
this
.
dialog
.
body
).
find
(
"
.desktop-app-search
"
).
val
(
""
).
trigger
(
"
keyup
"
);
this
.
dialog
.
show
();
},
make_dialog
:
function
()
{
this
.
dialog
=
new
frappe
.
ui
.
Dialog
({
title
:
__
(
"
All Applications
"
)
});
this
.
dialog
.
$wrapper
.
addClass
(
"
all-applications-dialog
"
);
this
.
dialog_body
=
$
(
this
.
dialog
.
body
);
$
(
frappe
.
render_template
(
"
all_applications_dialog
"
,
{
all_modules
:
keys
(
frappe
.
modules
).
sort
(),
desktop_items
:
frappe
.
desktop
.
get_desktop_items
(
true
),
user_desktop_items
:
frappe
.
desktop
.
get_user_desktop_items
()
})).
appendTo
(
this
.
dialog_body
);
this
.
bind_events
();
},
bind_events
:
function
()
{
var
me
=
this
;
this
.
dialog_body
.
find
(
"
.desktop-app-search
"
).
on
(
"
keyup
"
,
function
()
{
var
val
=
(
$
(
this
).
val
()
||
""
).
toLowerCase
();
me
.
dialog_body
.
find
(
"
.list-group-item
"
).
each
(
function
()
{
$
(
this
).
toggle
(
$
(
this
).
attr
(
"
data-label
"
).
toLowerCase
().
indexOf
(
val
)
!==-
1
||
$
(
this
).
attr
(
"
data-name
"
).
toLowerCase
().
indexOf
(
val
)
!==-
1
);
})
});
this
.
dialog_body
.
find
(
'
input[type="checkbox"]
'
).
on
(
"
click
"
,
function
()
{
me
.
save_user_desktop_items
();
frappe
.
user
.
modules
=
null
;
frappe
.
after_ajax
(
function
()
{
frappe
.
desktop
.
refresh
();
});
});
},
save_user_desktop_items
:
function
()
{
var
user_desktop_items
=
[];
this
.
dialog_body
.
find
(
'
input[type="checkbox"]:checked
'
).
each
(
function
(
i
,
element
)
{
user_desktop_items
.
push
(
$
(
element
).
attr
(
"
data-name
"
));
});
frappe
.
defaults
.
set_default
(
"
_user_desktop_items
"
,
user_desktop_items
);
frappe
.
desktop
.
refresh
();
}
},
show_pending_notifications
:
function
()
{
if
(
!
frappe
.
boot
.
notification_info
.
module_doctypes
)
{
...
...
This diff is collapsed.
Click to expand it.
frappe/core/page/desktop/desktop_icon_grid.html
View file @
f7b9e6d6
<div
style=
"text-align: center; padding-top: calc(40px + 3%)"
>
<div
id=
"icon-grid"
>
{% for (var i=0, l=desktop_items.length; i
<
l
;
i
++)
{
var
module =
frappe.get_module(desktop_items[i]);
if
(!
module
||
(user_desktop_items.indexOf(module.name)=
==-1
&&
!
module.force_show
)
||
frappe.user.is_module_blocked
(
module.name
))
{
continue
;
}
%}
{%=
frappe.render_template
("
desktop_module_icon
",
module
)
%}
{% for (var i=0, l=desktop_items.length; i
<
l
;
i
++)
{
%}
{{
frappe.render_template
("
desktop_module_icon
",
desktop_items
[
i
])
}}
{%
}
%}
</
div
>
</div>
...
...
This diff is collapsed.
Click to expand it.
frappe/core/page/desktop/desktop_list_view.html
View file @
f7b9e6d6
...
...
@@ -4,8 +4,7 @@
<div
class=
"page-content desktop-list"
style=
"margin-top: 40px;"
>
{% for (var i=0, l=desktop_items.length; i
<
l
;
i
++)
{
var
module =
frappe.get_module(desktop_items[i]);
if
(!
module
||
(user_desktop_items.indexOf(module.name)=
==-1
&&
!
module.force_show
)
||
frappe.user.is_module_blocked
(
module.name
))
{
continue
;
}
if
(
module
)
{
%}
<
div
class=
"desktop-list-item"
id=
"module-icon-{%= module._id %}"
data-name=
"{%= module.name %}"
data-link=
"{%= module.link %}"
...
...
This diff is collapsed.
Click to expand it.
frappe/core/page/desktop/desktop_module_icon.html
View file @
f7b9e6d6
<div
class=
"case-wrapper"
data-name=
"{
%=
name
%
}"
data-link=
"{
%=
link
%
}"
title=
"{
%=
_label
%
}"
>
{
%=
app_icon
%
}
data-name=
"{
{ module_
name
}
}"
data-link=
"{
{
link
}
}"
title=
"{
{
_label
}
}"
>
{
{
app_icon
}
}
<div
class=
"case-label text-ellipsis"
>
<div
class=
"circle module-count-{
%=
_id
%
}"
style=
"display: none;"
>
<div
class=
"circle module-count-{
{
_id
}
}"
style=
"display: none;"
>
<span
class=
"circle-text"
></span>
</div>
<!-- <span id="module-count-{
%=
_id
%
}" class="octicon octicon-primitive-dot circle" style="display: None"></span> -->
<span
class=
"case-label-text"
>
{
%=
_label
%
}
</span>
<!-- <span id="module-count-{
{
_id
}
}" class="octicon octicon-primitive-dot circle" style="display: None"></span> -->
<span
class=
"case-label-text"
>
{
{
_label
}
}
</span>
</div>
</div>
This diff is collapsed.
Click to expand it.
frappe/core/page/modules_setup/includes/module_icons.html
0 → 100644
View file @
f7b9e6d6
<div
class=
"padding modules-setup-icons"
>
{% for icon in icons %}
<div>
<div
class=
"checkbox"
>
<label>
<input
type=
"checkbox"
data-module=
"{{ icon.module_name }}"
{%
if
not
icon.hidden
%}
checked
{%
endif
%}
>
{{ _(icon.label or icon.module_name) }}
</label>
</div>
</div>
{% endfor %}
</div>
This diff is collapsed.
Click to expand it.
frappe/core/page/modules_setup/modules_setup.html
0 → 100644
View file @
f7b9e6d6
<!-- jinja -->
{% if users %}
<div
class=
"padding modules-setup"
>
<div
class=
"row"
>
<div
class=
"col-sm-3"
name=
"set_for"
>
<select
class=
"form-control"
name=
"setup_for"
>
<option
value=
"everyone"
>
{{ _("For Everyone") }}
</option>
<option
value=
"user"
selected
>
{{ _("For User") }}
</option>
</select>
</div>
<div
class=
"col-sm-3"
>
<select
class=
"form-control"
name=
"user"
>
{% for user in users %}
<option
value=
"{{ user.name }}"
{%
if
user.name =
=
frappe.user
%}
selected
{%
endif
%}
>
{{ user.first_name or "" }} {{ user.last_name or "" }} ({{ user.name }})
</option>
{% endfor %}
</select>
</div>
</div>
</div>
{% endif %}
{% include "frappe/core/page/modules_setup/includes/module_icons.html" %}
This diff is collapsed.
Click to expand it.
frappe/core/page/modules_setup/modules_setup.js
View file @
f7b9e6d6
frappe
.
pages
[
'
modules_setup
'
].
on_page_load
=
function
(
wrapper
)
{
var
page
=
frappe
.
ui
.
make_app_page
({
parent
:
wrapper
,
title
:
__
(
'
Show or Hide
Module
s
'
),
title
:
__
(
'
Show or Hide
Desktop Icon
s
'
),
single_column
:
true
});
frappe
.
modules_setup_page
=
page
;
frappe
.
breadcrumbs
.
add
(
"
Setup
"
);
page
.
content
=
$
(
frappe
.
templates
.
modules_setup
).
appendTo
(
page
.
body
);
wrapper
.
page
.
set_primary_action
(
__
(
"
Update
"
),
function
()
{
frappe
.
modules_setup
.
update
(
this
);
page
.
content
.
find
(
'
select[name="setup_for"]
'
).
on
(
'
change
'
,
function
()
{
page
.
content
.
find
(
'
select[name="user"]
'
).
toggle
(
$
(
this
).
val
()
!==
"
everyone
"
);
frappe
.
reload_modules_setup_icons
(
page
);
});
page
.
main
.
css
({
"
padding
"
:
"
15px
"
});
$
(
'
<p>
'
+
__
(
"
Select modules to be shown (based on permission). If hidden, they will be hidden for all users.
"
)
+
'
</p>
'
).
appendTo
(
$
(
wrapper
).
find
(
"
.layout-main
"
));
$
(
'
<div id="modules-list">
'
).
appendTo
(
page
.
main
);
page
.
content
.
find
(
'
select[name="user"]
'
).
on
(
'
change
'
,
function
()
{
frappe
.
reload_modules_setup_icons
(
page
);
});
frappe
.
modules_setup
.
refresh_page
();
}
// return selected user or null (if everyone)
page
.
get_user
=
function
()
{
var
selected_user
=
null
;
if
(
page
.
content
.
find
(
'
select[name="setup_for"]
'
).
length
)
{
if
(
page
.
content
.
find
(
'
select[name="setup_for"]
'
).
val
()
===
"
everyone
"
)
{
selected_user
=
null
;
}
else
{
selected_user
=
page
.
content
.
find
(
'
select[name="user"]
'
).
val
();
}
}
else
{
selected_user
=
frappe
.
boot
.
user
.
name
;
}
return
selected_user
;
}
frappe
.
modules_setup
=
{
refresh_page
:
function
()
{
$
(
'
#modules-list
'
).
empty
();
var
wrapper
=
$
(
'
<div class="list-group"></div>
'
).
appendTo
(
"
#modules-list
"
);
$
.
each
(
keys
(
frappe
.
modules
).
sort
(),
function
(
i
,
m
)
{
if
(
m
!=
"
Setup
"
)
{
var
row
=
$
(
'
<div class="list-group-item">
\
<span class="check-area" style="margin-right: 10px;"></span>
'
+
"
<span>
"
+
__
(
m
)
+
'
</span></div>
'
).
appendTo
(
"
#modules-list
"
);
var
$chk
=
$
(
"
<input type='checkbox' data-module='
"
+
m
+
"
' style='margin-top: -2px'>
"
)
.
appendTo
(
row
.
find
(
"
.check-area
"
));
if
(
!
frappe
.
boot
.
hidden_modules
||
frappe
.
boot
.
hidden_modules
.
indexOf
(
m
)
==-
1
)
{
$chk
.
prop
(
"
checked
"
,
true
);
}
// save action
page
.
set_primary_action
(
'
Save
'
,
function
()
{
var
hidden_list
=
[];
page
.
content
.
find
(
'
input[type="checkbox"]
'
).
each
(
function
()
{
if
(
!
$
(
this
).
is
(
'
:checked
'
))
{
hidden_list
.
push
(
$
(
this
).
attr
(
'
data-module
'
));
}
});
},
update
:
function
(
btn
)
{
var
ml
=
[];
$
(
'
#modules-list [data-module]:checkbox:not(:checked)
'
).
each
(
function
()
{
ml
.
push
(
$
(
this
).
attr
(
'
data-module
'
));
});
return
frappe
.
call
({
frappe
.
call
({
method
:
'
frappe.core.page.modules_setup.modules_setup.update
'
,
args
:
{
ml
:
ml
hidden_list
:
hidden_list
,
user
:
page
.
get_user
()
},
callback
:
function
(
r
)
{
if
(
r
.
exc
)
msgprint
(
__
(
"
There were errors
"
))
},
btn
:
btn
freeze
:
true
});
});
// application installer
if
(
frappe
.
boot
.
user
.
roles
.
indexOf
(
'
System Manager
'
)
!==-
1
)
{
page
.
add_inner_button
(
'
Install Apps
'
,
function
()
{
frappe
.
set_route
(
'
applications
'
);
});
}
}
frappe
.
pages
[
'
modules_setup
'
].
on_page_show
=
function
(
wrapper
)
{
if
(
frappe
.
route_options
)
{
frappe
.
modules_setup_page
.
content
.
find
(
'
select[name="setup_for"]
'
)
.
val
(
'
user
'
).
trigger
(
'
change
'
);
frappe
.
modules_setup_page
.
content
.
find
(
'
select[name="user"]
'
)
.
val
(
frappe
.
route_options
.
user
).
trigger
(
'
change
'
);
frappe
.
route_options
=
null
;
}
}
// reload modules html (with new hidden / blocked settings for given user)
frappe
.
reload_modules_setup_icons
=
function
(
page
)
{
frappe
.
call
({
method
:
'
frappe.core.page.modules_setup.modules_setup.get_module_icons_html
'
,
args
:
{
user
:
page
.
get_user
()
},
freeze
:
true
,
callback
:
function
(
r
)
{
page
.
content
.
find
(
'
.modules-setup-icons
'
).
replaceWith
(
r
.
message
);
}
});
}
This diff is collapsed.
Click to expand it.
frappe/core/page/modules_setup/modules_setup.json
View file @
f7b9e6d6
{
"creation"
:
"2012-10-04 18:45:29.000000"
,
"content"
:
null
,
"creation"
:
"2012-10-04 18:45:29"
,
"docstatus"
:
0
,
"doctype"
:
"Page"
,
"icon"
:
"icon-cog"
,
"idx"
:
1
,
"modified"
:
"201
3
-0
7-11 14:43:37.0000
00"
,
"modified"
:
"201
6
-0
2-26 00:21:05.501
00
7
"
,
"modified_by"
:
"Administrator"
,
"module"
:
"Core"
,
"name"
:
"modules_setup"
,
"owner"
:
"Administrator"
,
"page_name"
:
"modules_setup"
,
"roles"
:
[
{
"role"
:
"System Manager"
}
],
"roles"
:
[],
"script"
:
null
,
"standard"
:
"Yes"
,
"style"
:
null
,
"title"
:
"Modules Setup"
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help