seitime-frappe/frappe/utils/install.py

332 lines
8.1 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import getpass
import frappe
from frappe.utils.password import update_password
def before_install():
frappe.reload_doc("core", "doctype", "doctype_state")
frappe.reload_doc("core", "doctype", "docfield")
frappe.reload_doc("core", "doctype", "docperm")
frappe.reload_doc("core", "doctype", "doctype_action")
frappe.reload_doc("core", "doctype", "doctype_link")
frappe.reload_doc("desk", "doctype", "form_tour_step")
frappe.reload_doc("desk", "doctype", "form_tour")
frappe.reload_doc("core", "doctype", "doctype")
def after_install():
# reset installed apps for re-install
frappe.db.set_global("installed_apps", '["frappe"]')
create_user_type()
install_basic_docs()
from frappe.core.doctype.file.utils import make_home_folder
make_home_folder()
import_country_and_currency()
from frappe.core.doctype.language.language import sync_languages
sync_languages()
# save default print setting
print_settings = frappe.get_doc("Print Settings")
print_settings.save()
# all roles to admin
frappe.get_doc("User", "Administrator").add_roles(*frappe.get_all("Role", pluck="name"))
# update admin password
update_password("Administrator", get_admin_password())
if not frappe.conf.skip_setup_wizard:
frappe.db.set_default("desktop:home_page", "setup-wizard")
# clear test log
with open(frappe.get_site_path(".test_log"), "w") as f:
f.write("")
add_standard_navbar_items()
frappe.db.commit()
def create_user_type():
for user_type in ["System User", "Website User"]:
if not frappe.db.exists("User Type", user_type):
frappe.get_doc({"doctype": "User Type", "name": user_type, "is_standard": 1}).insert(
ignore_permissions=True
)
def install_basic_docs():
# core users / roles
install_docs = [
{
"doctype": "User",
"name": "Administrator",
"first_name": "Administrator",
"email": "admin@example.com",
"enabled": 1,
"is_admin": 1,
"roles": [{"role": "Administrator"}],
"thread_notify": 0,
"send_me_a_copy": 0,
},
{
"doctype": "User",
"name": "Guest",
"first_name": "Guest",
"email": "guest@example.com",
"enabled": 1,
"is_guest": 1,
"roles": [{"role": "Guest"}],
"thread_notify": 0,
"send_me_a_copy": 0,
},
{"doctype": "Role", "role_name": "Report Manager"},
{"doctype": "Role", "role_name": "Translator"},
{
"doctype": "Workflow State",
"workflow_state_name": "Pending",
"icon": "question-sign",
"style": "",
},
{
"doctype": "Workflow State",
"workflow_state_name": "Approved",
"icon": "ok-sign",
"style": "Success",
},
{
"doctype": "Workflow State",
"workflow_state_name": "Rejected",
"icon": "remove",
"style": "Danger",
},
{"doctype": "Workflow Action Master", "workflow_action_name": "Approve"},
{"doctype": "Workflow Action Master", "workflow_action_name": "Reject"},
{"doctype": "Workflow Action Master", "workflow_action_name": "Review"},
{
"doctype": "Email Domain",
"domain_name": "example.com",
"email_id": "account@example.com",
"password": "pass",
"email_server": "imap.example.com",
"use_imap": 1,
"smtp_server": "smtp.example.com",
},
{
"doctype": "Email Account",
"domain": "example.com",
"email_id": "notifications@example.com",
"default_outgoing": 1,
},
{
"doctype": "Email Account",
"domain": "example.com",
"email_id": "replies@example.com",
"default_incoming": 1,
},
]
for d in install_docs:
try:
frappe.get_doc(d).insert(ignore_if_duplicate=True)
except frappe.NameError:
pass
def get_admin_password():
def ask_admin_password():
admin_password = getpass.getpass("Set Administrator password: ")
admin_password2 = getpass.getpass("Re-enter Administrator password: ")
if not admin_password == admin_password2:
print("\nPasswords do not match")
return ask_admin_password()
return admin_password
admin_password = frappe.conf.get("admin_password")
if not admin_password:
return ask_admin_password()
return admin_password
def before_tests():
if len(frappe.get_installed_apps()) > 1:
# don't run before tests if any other app is installed
return
frappe.db.truncate("Custom Field")
frappe.db.truncate("Event")
frappe.clear_cache()
# complete setup if missing
if not int(frappe.db.get_single_value("System Settings", "setup_complete") or 0):
complete_setup_wizard()
frappe.db.commit()
frappe.clear_cache()
def complete_setup_wizard():
from frappe.desk.page.setup_wizard.setup_wizard import setup_complete
setup_complete(
{
"language": "English",
"email": "test@erpnext.com",
"full_name": "Test User",
"password": "test",
"country": "United States",
"timezone": "America/New_York",
"currency": "USD",
}
)
def import_country_and_currency():
from frappe.geo.country_info import get_all
from frappe.utils import update_progress_bar
data = get_all()
for i, name in enumerate(data):
update_progress_bar("Updating country info", i, len(data))
country = frappe._dict(data[name])
add_country_and_currency(name, country)
print("")
# enable frequently used currencies
for currency in ("INR", "USD", "GBP", "EUR", "AED", "AUD", "JPY", "CNY", "CHF"):
frappe.db.set_value("Currency", currency, "enabled", 1)
def add_country_and_currency(name, country):
if not frappe.db.exists("Country", name):
frappe.get_doc(
{
"doctype": "Country",
"country_name": name,
"code": country.code,
"date_format": country.date_format or "dd-mm-yyyy",
"time_format": country.time_format or "HH:mm:ss",
"time_zones": "\n".join(country.timezones or []),
"docstatus": 0,
}
).db_insert()
if country.currency and not frappe.db.exists("Currency", country.currency):
frappe.get_doc(
{
"doctype": "Currency",
"currency_name": country.currency,
"fraction": country.currency_fraction,
"symbol": country.currency_symbol,
"fraction_units": country.currency_fraction_units,
"smallest_currency_fraction_value": country.smallest_currency_fraction_value,
"number_format": country.number_format,
"docstatus": 0,
}
).db_insert()
def add_standard_navbar_items():
navbar_settings = frappe.get_single("Navbar Settings")
standard_navbar_items = [
{
"item_label": "My Profile",
"item_type": "Route",
"route": "/app/user-profile",
"is_standard": 1,
},
{
"item_label": "My Settings",
"item_type": "Action",
"action": "frappe.ui.toolbar.route_to_user()",
"is_standard": 1,
},
{
"item_label": "Session Defaults",
"item_type": "Action",
"action": "frappe.ui.toolbar.setup_session_defaults()",
"is_standard": 1,
},
{
"item_label": "Reload",
"item_type": "Action",
"action": "frappe.ui.toolbar.clear_cache()",
"is_standard": 1,
},
{
"item_label": "View Website",
"item_type": "Action",
"action": "frappe.ui.toolbar.view_website()",
"is_standard": 1,
},
{
"item_label": "Toggle Full Width",
"item_type": "Action",
"action": "frappe.ui.toolbar.toggle_full_width()",
"is_standard": 1,
},
{
"item_label": "Toggle Theme",
"item_type": "Action",
"action": "new frappe.ui.ThemeSwitcher().show()",
"is_standard": 1,
},
{
"item_label": "Background Jobs",
"item_type": "Route",
"route": "/app/background_jobs",
"is_standard": 1,
},
{"item_type": "Separator", "is_standard": 1},
{
"item_label": "Log out",
"item_type": "Action",
"action": "frappe.app.logout()",
"is_standard": 1,
},
]
standard_help_items = [
{
"item_label": "About",
"item_type": "Action",
"action": "frappe.ui.toolbar.show_about()",
"is_standard": 1,
},
{
"item_label": "Keyboard Shortcuts",
"item_type": "Action",
"action": "frappe.ui.toolbar.show_shortcuts(event)",
"is_standard": 1,
},
{
"item_label": "Frappe Support",
"item_type": "Route",
"route": "https://frappe.io/support",
"is_standard": 1,
},
]
navbar_settings.settings_dropdown = []
navbar_settings.help_dropdown = []
for item in standard_navbar_items:
navbar_settings.append("settings_dropdown", item)
for item in standard_help_items:
navbar_settings.append("help_dropdown", item)
navbar_settings.save()