Commit f7b9e6d6 authored by Nabin Hait's avatar Nabin Hait
Browse files

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
Showing with 232 additions and 297 deletions
+232 -297
......@@ -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 UserPermissions
if not local.user_perms:
local.user_perms = UserPermissions(local.session.user)
return local.user_perms
def get_roles(username=None):
"""Returns roles of current user."""
......
from __future__ import unicode_literals
__version__ = "6.26.6"
__version__ = "6.27.0"
......@@ -171,11 +171,13 @@ def put_log(line_no, line, task_id=None):
def get_redis_server():
"""Returns memcache connection."""
"""returns 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
......
......@@ -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 = {}
......
......@@ -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))
......
......@@ -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:
......
......@@ -17,7 +17,7 @@ def get_data():
"type": "doctype",
"name": "Event",
"label": _("Calendar"),
"view": "Calendar",
"link": "Calendar/Event",
"description": _("Event and other calendars."),
},
{
......
......@@ -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
}
},
]
......@@ -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 on Website."),
"name": "Website Slideshow",
"description": _("Embed image slideshows in website pages."),
},
]
},
{
"label": _("Blog"),
"items": [
{
"type": "doctype",
"name": "Blogger",
"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."),
}
]
},
]
......@@ -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:
context = frappe.get_attr("{app}.{module}.page.{page}.{page}.get_context".format(
out = 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
......
......@@ -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 Permissions"), function() {
frm.add_custom_button(__("Set Desktop Icons"), 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">\
......
......@@ -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
......
......@@ -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) {
......
<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>
......
......@@ -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 %}"
......
<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>
<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>
<!-- 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" %}
frappe.pages['modules_setup'].on_page_load = function(wrapper) {
var page = frappe.ui.make_app_page({
parent: wrapper,
title: __('Show or Hide Modules'),
title: __('Show or Hide Desktop Icons'),
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);
}
});
}
{
"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": "2013-07-11 14:43:37.000000",
"modified": "2016-02-26 00:21:05.501007",
"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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment