Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

281 linhas
8.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. 'enable_two_factor_auth':args.get("twofactor_enable"),
  64. 'two_factor_method':args.get('twofactor_method')
  65. })
  66. if args.get("twofactor_enable") == 1:
  67. enable_twofactor_all_roles()
  68. system_settings.save()
  69. def update_user_name(args):
  70. first_name, last_name = args.get('full_name'), ''
  71. if ' ' in first_name:
  72. first_name, last_name = first_name.split(' ', 1)
  73. if args.get("email"):
  74. if frappe.db.exists('User', args.get('email')):
  75. # running again
  76. return
  77. args['name'] = args.get("email")
  78. _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True
  79. doc = frappe.get_doc({
  80. "doctype":"User",
  81. "email": args.get("email"),
  82. "first_name": first_name,
  83. "last_name": last_name
  84. })
  85. doc.flags.no_welcome_mail = True
  86. doc.insert()
  87. frappe.flags.mute_emails = _mute_emails
  88. update_password(args.get("email"), args.get("password"))
  89. else:
  90. args.update({
  91. "name": frappe.session.user,
  92. "first_name": first_name,
  93. "last_name": last_name
  94. })
  95. frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s,
  96. last_name=%(last_name)s WHERE name=%(name)s""", args)
  97. if args.get("attach_user"):
  98. attach_user = args.get("attach_user").split(",")
  99. if len(attach_user)==3:
  100. filename, filetype, content = attach_user
  101. fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url
  102. frappe.db.set_value("User", args.get("name"), "user_image", fileurl)
  103. add_all_roles_to(args.get("name"))
  104. def process_args(args):
  105. if not args:
  106. args = frappe.local.form_dict
  107. if isinstance(args, basestring):
  108. args = json.loads(args)
  109. args = frappe._dict(args)
  110. # strip the whitespace
  111. for key, value in args.items():
  112. if isinstance(value, basestring):
  113. args[key] = strip(value)
  114. return args
  115. def add_all_roles_to(name):
  116. user = frappe.get_doc("User", name)
  117. for role in frappe.db.sql("""select name from tabRole"""):
  118. if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]:
  119. d = user.append("roles")
  120. d.role = role[0]
  121. user.save()
  122. def disable_future_access():
  123. frappe.db.set_default('desktop:home_page', 'desktop')
  124. frappe.db.set_value('System Settings', 'System Settings', 'setup_complete', 1)
  125. if not frappe.flags.in_test:
  126. # remove all roles and add 'Administrator' to prevent future access
  127. page = frappe.get_doc('Page', 'setup-wizard')
  128. page.roles = []
  129. page.append('roles', {'role': 'Administrator'})
  130. page.flags.do_not_update_json = True
  131. page.flags.ignore_permissions = True
  132. page.save()
  133. @frappe.whitelist()
  134. def load_messages(language):
  135. """Load translation messages for given language from all `setup_wizard_requires`
  136. javascript files"""
  137. frappe.clear_cache()
  138. set_default_language(get_language_code(language))
  139. m = get_dict("page", "setup-wizard")
  140. for path in frappe.get_hooks("setup_wizard_requires"):
  141. # common folder `assets` served from `sites/`
  142. js_file_path = os.path.abspath(frappe.get_site_path("..", *path.strip("/").split("/")))
  143. m.update(get_dict("jsfile", js_file_path))
  144. m.update(get_dict("boot"))
  145. send_translations(m)
  146. return frappe.local.lang
  147. @frappe.whitelist()
  148. def load_languages():
  149. language_codes = frappe.db.sql('select language_code, language_name from tabLanguage order by name', as_dict=True)
  150. codes_to_names = {}
  151. for d in language_codes:
  152. codes_to_names[d.language_code] = d.language_name
  153. return {
  154. "default_language": frappe.db.get_value('Language', frappe.local.lang, 'language_name') or frappe.local.lang,
  155. "languages": sorted(frappe.db.sql_list('select language_name from tabLanguage order by name')),
  156. "codes_to_names": codes_to_names
  157. }
  158. @frappe.whitelist()
  159. def load_country():
  160. from frappe.sessions import get_geo_ip_country
  161. return get_geo_ip_country(frappe.local.request_ip) if frappe.local.request_ip else None
  162. @frappe.whitelist()
  163. def load_user_details():
  164. return {
  165. "full_name": frappe.cache().hget("full_name", "signup"),
  166. "email": frappe.cache().hget("email", "signup")
  167. }
  168. def prettify_args(args):
  169. # remove attachments
  170. for key, val in args.items():
  171. if isinstance(val, basestring) and "data:image" in val:
  172. filename = val.split("data:image", 1)[0].strip(", ")
  173. size = round((len(val) * 3 / 4) / 1048576.0, 2)
  174. args[key] = "Image Attached: '{0}' of size {1} MB".format(filename, size)
  175. pretty_args = []
  176. for key in sorted(args):
  177. pretty_args.append("{} = {}".format(key, args[key]))
  178. return pretty_args
  179. def email_setup_wizard_exception(traceback, args):
  180. if not frappe.local.conf.setup_wizard_exception_email:
  181. return
  182. pretty_args = prettify_args(args)
  183. if frappe.local.request:
  184. user_agent = UserAgent(frappe.local.request.headers.get('User-Agent', ''))
  185. else:
  186. user_agent = frappe._dict()
  187. message = """
  188. #### Basic Information
  189. - **Site:** {site}
  190. - **User:** {user}
  191. - **Browser:** {user_agent.platform} {user_agent.browser} version: {user_agent.version} language: {user_agent.language}
  192. - **Browser Languages**: `{accept_languages}`
  193. ---
  194. #### Traceback
  195. <pre>{traceback}</pre>
  196. ---
  197. #### Setup Wizard Arguments
  198. <pre>{args}</pre>
  199. ---
  200. #### Request Headers
  201. <pre>{headers}</pre>""".format(
  202. site=frappe.local.site,
  203. traceback=traceback,
  204. args="\n".join(pretty_args),
  205. user=frappe.session.user,
  206. user_agent=user_agent,
  207. headers=frappe.local.request.headers,
  208. accept_languages=", ".join(frappe.local.request.accept_languages.values()))
  209. frappe.sendmail(recipients=frappe.local.conf.setup_wizard_exception_email,
  210. sender=frappe.session.user,
  211. subject="Exception in Setup Wizard - {}".format(frappe.local.site),
  212. message=message,
  213. delayed=False)
  214. def get_language_code(lang):
  215. return frappe.db.get_value('Language', {'language_name':lang})
  216. def enable_twofactor_all_roles():
  217. all_role = frappe.get_doc('Role',{'role_name':'All'})
  218. all_role.two_factor_auth = True
  219. all_role.save(ignore_permissions=True)