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.
 
 
 
 
 
 

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