You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

166 line
4.9 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. """
  5. bootstrap client session
  6. """
  7. import frappe
  8. import frappe.defaults
  9. import frappe.desk.desk_page
  10. from frappe.utils import get_gravatar, get_url
  11. from frappe.desk.form.load import get_meta_bundle
  12. from frappe.utils.change_log import get_versions
  13. def get_bootinfo():
  14. """build and return boot info"""
  15. frappe.set_user_lang(frappe.session.user)
  16. bootinfo = frappe._dict()
  17. hooks = frappe.get_hooks()
  18. doclist = []
  19. # user
  20. get_user(bootinfo)
  21. # system info
  22. bootinfo['sysdefaults'] = frappe.defaults.get_defaults()
  23. bootinfo['server_date'] = frappe.utils.nowdate()
  24. if frappe.session['user'] != 'Guest':
  25. bootinfo['user_info'] = get_fullnames()
  26. bootinfo['sid'] = frappe.session['sid'];
  27. # home page
  28. bootinfo.modules = {}
  29. for app in frappe.get_installed_apps():
  30. try:
  31. bootinfo.modules.update(frappe.get_attr(app + ".config.desktop.get_data")() or {})
  32. except ImportError:
  33. pass
  34. except AttributeError:
  35. pass
  36. bootinfo.module_app = frappe.local.module_app
  37. bootinfo.hidden_modules = frappe.db.get_global("hidden_modules")
  38. bootinfo.doctype_icons = dict(frappe.db.sql("""select name, icon from
  39. tabDocType where ifnull(icon,'')!=''"""))
  40. bootinfo.single_types = frappe.db.sql_list("""select name from tabDocType where ifnull(issingle,0)=1""")
  41. add_home_page(bootinfo, doclist)
  42. bootinfo.page_info = get_allowed_pages()
  43. load_translations(bootinfo)
  44. add_timezone_info(bootinfo)
  45. load_conf_settings(bootinfo)
  46. load_print(bootinfo, doclist)
  47. doclist.extend(get_meta_bundle("Page"))
  48. # ipinfo
  49. if frappe.session['data'].get('ipinfo'):
  50. bootinfo['ipinfo'] = frappe.session['data']['ipinfo']
  51. # add docs
  52. bootinfo['docs'] = doclist
  53. for method in hooks.boot_session or []:
  54. frappe.get_attr(method)(bootinfo)
  55. if bootinfo.lang:
  56. bootinfo.lang = unicode(bootinfo.lang)
  57. bootinfo['versions'] = {k: v['version'] for k, v in get_versions().items()}
  58. bootinfo.error_report_email = frappe.get_hooks("error_report_email")
  59. bootinfo.default_background_image = get_url("/assets/frappe/images/ui/into-the-dawn.jpg")
  60. bootinfo.calendars = sorted(frappe.get_hooks("calendars"))
  61. return bootinfo
  62. def load_conf_settings(bootinfo):
  63. from frappe import conf
  64. bootinfo.max_file_size = conf.get('max_file_size') or 5242880
  65. for key in ['developer_mode']:
  66. if key in conf: bootinfo[key] = conf.get(key)
  67. def get_allowed_pages():
  68. roles = frappe.get_roles()
  69. page_info = {}
  70. for p in frappe.db.sql("""select distinct
  71. tabPage.name, tabPage.modified, tabPage.title
  72. from `tabPage Role`, `tabPage`
  73. where `tabPage Role`.role in (%s)
  74. and `tabPage Role`.parent = `tabPage`.name""" % ', '.join(['%s']*len(roles)),
  75. roles, as_dict=True):
  76. page_info[p.name] = {"modified":p.modified, "title":p.title}
  77. # pages where role is not set are also allowed
  78. for p in frappe.db.sql("""select name, modified, title
  79. from `tabPage` where
  80. (select count(*) from `tabPage Role`
  81. where `tabPage Role`.parent=tabPage.name) = 0""", as_dict=1):
  82. page_info[p.name] = {"modified":p.modified, "title":p.title}
  83. return page_info
  84. def load_translations(bootinfo):
  85. if frappe.local.lang != 'en':
  86. messages = frappe.get_lang_dict("boot")
  87. bootinfo["lang"] = frappe.lang
  88. # load translated report names
  89. for name in bootinfo.user.all_reports:
  90. messages[name] = frappe._(name)
  91. bootinfo["__messages"] = messages
  92. def get_fullnames():
  93. """map of user fullnames"""
  94. ret = frappe.db.sql("""select name,
  95. concat(ifnull(first_name, ''),
  96. if(ifnull(last_name, '')!='', ' ', ''), ifnull(last_name, '')) as fullname,
  97. user_image as image, gender, email
  98. from tabUser where ifnull(enabled, 0)=1 and user_type!="Website User" """, as_dict=1)
  99. d = {}
  100. for r in ret:
  101. if not r.image:
  102. r.image = get_gravatar()
  103. d[r.name] = r
  104. return d
  105. def get_user(bootinfo):
  106. """get user info"""
  107. bootinfo.user = frappe.get_user().load_user()
  108. def add_home_page(bootinfo, docs):
  109. """load home page"""
  110. if frappe.session.user=="Guest":
  111. return
  112. home_page = frappe.db.get_default("desktop:home_page")
  113. try:
  114. page = frappe.desk.desk_page.get(home_page)
  115. except (frappe.DoesNotExistError, frappe.PermissionError):
  116. frappe.message_log.pop()
  117. page = frappe.desk.desk_page.get('desktop')
  118. bootinfo['home_page'] = page.name
  119. docs.append(page)
  120. def add_timezone_info(bootinfo):
  121. system = bootinfo.sysdefaults.get("time_zone")
  122. import frappe.utils.momentjs
  123. bootinfo.timezone_info = {"zones":{}, "rules":{}, "links":{}}
  124. frappe.utils.momentjs.update(system, bootinfo.timezone_info)
  125. def load_print(bootinfo, doclist):
  126. print_settings = frappe.db.get_singles_dict("Print Settings")
  127. print_settings.doctype = ":Print Settings"
  128. doclist.append(print_settings)
  129. load_print_css(bootinfo, print_settings)
  130. def load_print_css(bootinfo, print_settings):
  131. bootinfo.print_css = frappe.get_attr("frappe.templates.pages.print.get_print_style")(print_settings.print_style or "Modern", for_legacy=True)