Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

249 rindas
7.1 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # License: See license.txt
  3. from __future__ import unicode_literals
  4. import frappe, json, os
  5. from frappe.utils import strip, cint
  6. from frappe.translate import (set_default_language, get_dict, send_translations)
  7. from frappe.geo.country_info import get_country_info
  8. from frappe.utils.file_manager import save_file
  9. from frappe.utils.password import update_password
  10. from werkzeug.useragents import UserAgent
  11. import install_fixtures
  12. @frappe.whitelist()
  13. def setup_complete(args):
  14. """Calls hooks for `setup_wizard_complete`, sets home page as `desktop`
  15. and clears cache. If wizard breaks, calls `setup_wizard_exception` hook"""
  16. if cint(frappe.db.get_single_value('System Settings', 'setup_complete')):
  17. # do not throw an exception if setup is already complete
  18. # let the user continue to desk
  19. return
  20. #frappe.throw(_('Setup already complete'))
  21. args = process_args(args)
  22. try:
  23. if args.language and args.language != "english":
  24. set_default_language(get_language_code(args.lang))
  25. frappe.clear_cache()
  26. # update system settings
  27. update_system_settings(args)
  28. update_user_name(args)
  29. for method in frappe.get_hooks("setup_wizard_complete"):
  30. frappe.get_attr(method)(args)
  31. disable_future_access()
  32. frappe.db.commit()
  33. frappe.clear_cache()
  34. except:
  35. frappe.db.rollback()
  36. if args:
  37. traceback = frappe.get_traceback()
  38. for hook in frappe.get_hooks("setup_wizard_exception"):
  39. frappe.get_attr(hook)(traceback, args)
  40. raise
  41. else:
  42. for hook in frappe.get_hooks("setup_wizard_success"):
  43. frappe.get_attr(hook)(args)
  44. install_fixtures.install()
  45. def update_system_settings(args):
  46. number_format = get_country_info(args.get("country")).get("number_format", "#,###.##")
  47. # replace these as float number formats, as they have 0 precision
  48. # and are currency number formats and not for floats
  49. if number_format=="#.###":
  50. number_format = "#.###,##"
  51. elif number_format=="#,###":
  52. number_format = "#,###.##"
  53. system_settings = frappe.get_doc("System Settings", "System Settings")
  54. system_settings.update({
  55. "country": args.get("country"),
  56. "language": get_language_code(args.get("language")),
  57. "time_zone": args.get("timezone"),
  58. "float_precision": 3,
  59. 'date_format': frappe.db.get_value("Country", args.get("country"), "date_format"),
  60. 'number_format': number_format,
  61. 'enable_scheduler': 1 if not frappe.flags.in_test else 0,
  62. 'backup_limit': 3 # Default for downloadable backups
  63. })
  64. system_settings.save()
  65. def update_user_name(args):
  66. first_name, last_name = args.get('full_name'), ''
  67. if ' ' in first_name:
  68. first_name, last_name = first_name.split(' ', 1)
  69. if args.get("email"):
  70. args['name'] = args.get("email")
  71. _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True
  72. doc = frappe.get_doc({
  73. "doctype":"User",
  74. "email": args.get("email"),
  75. "first_name": first_name,
  76. "last_name": last_name
  77. })
  78. doc.flags.no_welcome_mail = True
  79. doc.insert()
  80. frappe.flags.mute_emails = _mute_emails
  81. update_password(args.get("email"), args.get("password"))
  82. else:
  83. args.update({
  84. "name": frappe.session.user,
  85. "first_name": first_name,
  86. "last_name": last_name
  87. })
  88. frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s,
  89. last_name=%(last_name)s WHERE name=%(name)s""", args)
  90. if args.get("attach_user"):
  91. attach_user = args.get("attach_user").split(",")
  92. if len(attach_user)==3:
  93. filename, filetype, content = attach_user
  94. fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url
  95. frappe.db.set_value("User", args.get("name"), "user_image", fileurl)
  96. add_all_roles_to(args.get("name"))
  97. def process_args(args):
  98. if not args:
  99. args = frappe.local.form_dict
  100. if isinstance(args, basestring):
  101. args = json.loads(args)
  102. args = frappe._dict(args)
  103. # strip the whitespace
  104. for key, value in args.items():
  105. if isinstance(value, basestring):
  106. args[key] = strip(value)
  107. return args
  108. def add_all_roles_to(name):
  109. user = frappe.get_doc("User", name)
  110. for role in frappe.db.sql("""select name from tabRole"""):
  111. if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]:
  112. d = user.append("roles")
  113. d.role = role[0]
  114. user.save()
  115. def disable_future_access():
  116. frappe.db.set_default('desktop:home_page', 'desktop')
  117. frappe.db.set_value('System Settings', 'System Settings', 'setup_complete', 1)
  118. if not frappe.flags.in_test:
  119. # remove all roles and add 'Administrator' to prevent future access
  120. page = frappe.get_doc('Page', 'setup-wizard')
  121. page.roles = []
  122. page.append('roles', {'role': 'Administrator'})
  123. page.flags.do_not_update_json = True
  124. page.flags.ignore_permissions = True
  125. page.save()
  126. @frappe.whitelist()
  127. def load_messages(language):
  128. """Load translation messages for given language from all `setup_wizard_requires`
  129. javascript files"""
  130. frappe.clear_cache()
  131. set_default_language(get_language_code(language))
  132. m = get_dict("page", "setup-wizard")
  133. for path in frappe.get_hooks("setup_wizard_requires"):
  134. # common folder `assets` served from `sites/`
  135. js_file_path = os.path.abspath(frappe.get_site_path("..", *path.strip("/").split("/")))
  136. m.update(get_dict("jsfile", js_file_path))
  137. m.update(get_dict("boot"))
  138. send_translations(m)
  139. return frappe.local.lang
  140. @frappe.whitelist()
  141. def load_languages():
  142. return {
  143. "default_language": frappe.db.get_value('Language', frappe.local.lang, 'language_name') or frappe.local.lang,
  144. "languages": sorted(frappe.db.sql_list('select language_name from tabLanguage order by name'))
  145. }
  146. def prettify_args(args):
  147. # remove attachments
  148. for key, val in args.items():
  149. if isinstance(val, basestring) and "data:image" in val:
  150. filename = val.split("data:image", 1)[0].strip(", ")
  151. size = round((len(val) * 3 / 4) / 1048576.0, 2)
  152. args[key] = "Image Attached: '{0}' of size {1} MB".format(filename, size)
  153. pretty_args = []
  154. for key in sorted(args):
  155. pretty_args.append("{} = {}".format(key, args[key]))
  156. return pretty_args
  157. def email_setup_wizard_exception(traceback, args):
  158. if not frappe.local.conf.setup_wizard_exception_email:
  159. return
  160. pretty_args = prettify_args(args)
  161. if frappe.local.request:
  162. user_agent = UserAgent(frappe.local.request.headers.get('User-Agent', ''))
  163. else:
  164. user_agent = frappe._dict()
  165. message = """
  166. #### Basic Information
  167. - **Site:** {site}
  168. - **User:** {user}
  169. - **Browser:** {user_agent.platform} {user_agent.browser} version: {user_agent.version} language: {user_agent.language}
  170. - **Browser Languages**: `{accept_languages}`
  171. ---
  172. #### Traceback
  173. <pre>{traceback}</pre>
  174. ---
  175. #### Setup Wizard Arguments
  176. <pre>{args}</pre>
  177. ---
  178. #### Request Headers
  179. <pre>{headers}</pre>""".format(
  180. site=frappe.local.site,
  181. traceback=traceback,
  182. args="\n".join(pretty_args),
  183. user=frappe.session.user,
  184. user_agent=user_agent,
  185. headers=frappe.local.request.headers,
  186. accept_languages=", ".join(frappe.local.request.accept_languages.values()))
  187. frappe.sendmail(recipients=frappe.local.conf.setup_wizard_exception_email,
  188. sender=frappe.session.user,
  189. subject="Exception in Setup Wizard - {}".format(frappe.local.site),
  190. message=message,
  191. delayed=False)
  192. def get_language_code(lang):
  193. return frappe.db.get_value('Language', {'language_name':lang})