Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

215 righe
6.0 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
  6. from frappe.translate import (set_default_language, get_dict,
  7. get_lang_dict, send_translations, get_language_from_code)
  8. from frappe.geo.country_info import get_country_info
  9. from frappe.utils.file_manager import save_file
  10. from frappe.utils.password import update_password
  11. from werkzeug.useragents import UserAgent
  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. args = process_args(args)
  17. try:
  18. if args.language and args.language != "english":
  19. set_default_language(args.language)
  20. frappe.clear_cache()
  21. # update system settings
  22. update_system_settings(args)
  23. update_user_name(args)
  24. for method in frappe.get_hooks("setup_wizard_complete"):
  25. frappe.get_attr(method)(args)
  26. frappe.db.set_default('desktop:home_page', 'desktop')
  27. frappe.db.commit()
  28. frappe.clear_cache()
  29. except:
  30. if args:
  31. traceback = frappe.get_traceback()
  32. for hook in frappe.get_hooks("setup_wizard_exception"):
  33. frappe.get_attr(hook)(traceback, args)
  34. raise
  35. else:
  36. for hook in frappe.get_hooks("setup_wizard_success"):
  37. frappe.get_attr(hook)(args)
  38. def update_system_settings(args):
  39. number_format = get_country_info(args.get("country")).get("number_format", "#,###.##")
  40. # replace these as float number formats, as they have 0 precision
  41. # and are currency number formats and not for floats
  42. if number_format=="#.###":
  43. number_format = "#.###,##"
  44. elif number_format=="#,###":
  45. number_format = "#,###.##"
  46. system_settings = frappe.get_doc("System Settings", "System Settings")
  47. system_settings.update({
  48. "language": args.get("language"),
  49. "time_zone": args.get("timezone"),
  50. "float_precision": 3,
  51. 'date_format': frappe.db.get_value("Country", args.get("country"), "date_format"),
  52. 'number_format': number_format,
  53. 'enable_scheduler': 1 if not frappe.flags.in_test else 0
  54. })
  55. system_settings.save()
  56. def update_user_name(args):
  57. if args.get("email"):
  58. args['name'] = args.get("email")
  59. _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True
  60. doc = frappe.get_doc({
  61. "doctype":"User",
  62. "email": args.get("email"),
  63. "first_name": args.get("first_name"),
  64. "last_name": args.get("last_name")
  65. })
  66. doc.flags.no_welcome_mail = True
  67. doc.insert()
  68. frappe.flags.mute_emails = _mute_emails
  69. update_password(args.get("email"), args.get("password"))
  70. else:
  71. args['name'] = frappe.session.user
  72. # Update User
  73. if not args.get('last_name') or args.get('last_name')=='None':
  74. args['last_name'] = None
  75. frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s,
  76. last_name=%(last_name)s WHERE name=%(name)s""", args)
  77. if args.get("attach_user"):
  78. attach_user = args.get("attach_user").split(",")
  79. if len(attach_user)==3:
  80. filename, filetype, content = attach_user
  81. fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url
  82. frappe.db.set_value("User", args.get("name"), "user_image", fileurl)
  83. add_all_roles_to(args.get("name"))
  84. def process_args(args):
  85. if not args:
  86. args = frappe.local.form_dict
  87. if isinstance(args, basestring):
  88. args = json.loads(args)
  89. args = frappe._dict(args)
  90. # strip the whitespace
  91. for key, value in args.items():
  92. if isinstance(value, basestring):
  93. args[key] = strip(value)
  94. return args
  95. def add_all_roles_to(name):
  96. user = frappe.get_doc("User", name)
  97. for role in frappe.db.sql("""select name from tabRole"""):
  98. if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]:
  99. d = user.append("user_roles")
  100. d.role = role[0]
  101. user.save()
  102. @frappe.whitelist()
  103. def load_messages(language):
  104. """Load translation messages for given language from all `setup_wizard_requires`
  105. javascript files"""
  106. frappe.clear_cache()
  107. set_default_language(language)
  108. m = get_dict("page", "setup-wizard")
  109. for path in frappe.get_hooks("setup_wizard_requires"):
  110. # common folder `assets` served from `sites/`
  111. js_file_path = os.path.abspath(frappe.get_site_path("..", *path.strip("/").split("/")))
  112. m.update(get_dict("jsfile", js_file_path))
  113. m.update(get_dict("boot"))
  114. send_translations(m)
  115. return frappe.local.lang
  116. @frappe.whitelist()
  117. def load_languages():
  118. return {
  119. "default_language": get_language_from_code(frappe.local.lang),
  120. "languages": sorted(get_lang_dict().keys())
  121. }
  122. def prettify_args(args):
  123. # remove attachments
  124. for key, val in args.items():
  125. if isinstance(val, basestring) and "data:image" in val:
  126. filename = val.split("data:image", 1)[0].strip(", ")
  127. size = round((len(val) * 3 / 4) / 1048576.0, 2)
  128. args[key] = "Image Attached: '{0}' of size {1} MB".format(filename, size)
  129. pretty_args = []
  130. for key in sorted(args):
  131. pretty_args.append("{} = {}".format(key, args[key]))
  132. return pretty_args
  133. def email_setup_wizard_exception(traceback, args):
  134. if not frappe.local.conf.setup_wizard_exception_email:
  135. return
  136. pretty_args = prettify_args(args)
  137. if frappe.local.request:
  138. user_agent = UserAgent(frappe.local.request.headers.get('User-Agent', ''))
  139. else:
  140. user_agent = frappe._dict()
  141. message = """
  142. #### Basic Information
  143. - **Site:** {site}
  144. - **User:** {user}
  145. - **Browser:** {user_agent.platform} {user_agent.browser} version: {user_agent.version} language: {user_agent.language}
  146. - **Browser Languages**: `{accept_languages}`
  147. ---
  148. #### Traceback
  149. <pre>{traceback}</pre>
  150. ---
  151. #### Setup Wizard Arguments
  152. <pre>{args}</pre>
  153. ---
  154. #### Request Headers
  155. <pre>{headers}</pre>""".format(
  156. site=frappe.local.site,
  157. traceback=traceback,
  158. args="\n".join(pretty_args),
  159. user=frappe.session.user,
  160. user_agent=user_agent,
  161. headers=frappe.local.request.headers,
  162. accept_languages=", ".join(frappe.local.request.accept_languages.values()))
  163. frappe.sendmail(recipients=frappe.local.conf.setup_wizard_exception_email,
  164. sender=frappe.session.user,
  165. subject="Exception in Setup Wizard - {}".format(frappe.local.site),
  166. message=message)