Anand Doshi | 885e074 | 2015-03-03 14:55:30 +0530 | [diff] [blame] | 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
Rushabh Mehta | e67d1fb | 2013-08-05 14:59:54 +0530 | [diff] [blame] | 2 | # License: GNU General Public License v3. See license.txt |
| 3 | |
Rushabh Mehta | 6f9915c | 2013-01-16 17:48:17 +0530 | [diff] [blame] | 4 | |
Ankush Menat | 1e8ee93 | 2023-06-12 19:20:52 +0530 | [diff] [blame] | 5 | import click |
Rushabh Mehta | 793ba6b | 2014-02-14 15:47:51 +0530 | [diff] [blame] | 6 | import frappe |
Rushabh Mehta | d42167e | 2016-05-11 16:47:14 +0530 | [diff] [blame] | 7 | from frappe import _ |
Sagar Vora | aafb735 | 2022-08-18 15:31:20 +0000 | [diff] [blame] | 8 | from frappe.custom.doctype.custom_field.custom_field import create_custom_fields |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 9 | from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 10 | from frappe.utils import cint |
Rushabh Mehta | 6f9915c | 2013-01-16 17:48:17 +0530 | [diff] [blame] | 11 | |
Ankush Menat | 1e8ee93 | 2023-06-12 19:20:52 +0530 | [diff] [blame] | 12 | import erpnext |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 13 | from erpnext.setup.default_energy_point_rules import get_default_energy_point_rules |
barredterra | ce83f02 | 2022-11-17 22:17:19 +0100 | [diff] [blame] | 14 | from erpnext.setup.doctype.incoterm.incoterm import create_incoterms |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 15 | |
| 16 | from .default_success_action import get_default_success_action |
| 17 | |
Anand Doshi | 56198f4 | 2014-06-26 12:47:45 +0530 | [diff] [blame] | 18 | default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>Sent via |
Anand Doshi | 7f41ff2 | 2014-06-26 12:02:55 +0530 | [diff] [blame] | 19 | <a style="color: #888" href="http://erpnext.org">ERPNext</a></div>""" |
| 20 | |
tundebabzy | cad22db | 2018-02-22 06:38:36 +0100 | [diff] [blame] | 21 | |
Rushabh Mehta | 1f84799 | 2013-12-12 19:12:19 +0530 | [diff] [blame] | 22 | def after_install(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 23 | frappe.get_doc({"doctype": "Role", "role_name": "Analytics"}).insert() |
Rushabh Mehta | 33003c6 | 2014-04-30 11:16:02 +0530 | [diff] [blame] | 24 | set_single_defaults() |
Ankush Menat | 9a99f99 | 2022-01-23 17:38:04 +0530 | [diff] [blame] | 25 | create_print_setting_custom_fields() |
Rushabh Mehta | db7139a | 2013-01-17 18:22:22 +0530 | [diff] [blame] | 26 | add_all_roles_to("Administrator") |
Suraj Shetty | 00cced1 | 2018-05-03 19:06:32 +0530 | [diff] [blame] | 27 | create_default_success_action() |
Suraj Shetty | 627a3dc | 2019-09-17 15:54:41 +0530 | [diff] [blame] | 28 | create_default_energy_point_rules() |
barredterra | ce83f02 | 2022-11-17 22:17:19 +0100 | [diff] [blame] | 29 | create_incoterms() |
Deepesh Garg | 76197cc | 2023-06-07 10:11:32 +0530 | [diff] [blame] | 30 | create_default_role_profiles() |
Rucha Mahabal | 4865eab | 2019-07-24 13:37:54 +0530 | [diff] [blame] | 31 | add_company_to_session_defaults() |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 32 | add_standard_navbar_items() |
Shivam Mishra | 1323a9a | 2020-09-30 16:33:14 +0530 | [diff] [blame] | 33 | add_app_name() |
Rohit Waghchaure | 5949a7e | 2022-12-01 15:59:42 +0530 | [diff] [blame] | 34 | setup_log_settings() |
Nabin Hait | 243c49c | 2023-05-24 16:49:27 +0530 | [diff] [blame] | 35 | hide_workspaces() |
Anand Doshi | e9baaa6 | 2014-02-26 12:35:33 +0530 | [diff] [blame] | 36 | frappe.db.commit() |
Rushabh Mehta | db7139a | 2013-01-17 18:22:22 +0530 | [diff] [blame] | 37 | |
tundebabzy | cad22db | 2018-02-22 06:38:36 +0100 | [diff] [blame] | 38 | |
Rushabh Mehta | d55bdcf | 2015-12-31 11:12:48 +0530 | [diff] [blame] | 39 | def check_setup_wizard_not_completed(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 40 | if cint(frappe.db.get_single_value("System Settings", "setup_complete") or 0): |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 41 | message = """ERPNext can only be installed on a fresh site where the setup wizard is not completed. |
Faris Ansari | f3a6e30 | 2020-07-08 10:45:55 +0530 | [diff] [blame] | 42 | You can reinstall this site (after saving your data) using: bench --site [sitename] reinstall""" |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 43 | frappe.throw(message) # nosemgrep |
Rushabh Mehta | d55bdcf | 2015-12-31 11:12:48 +0530 | [diff] [blame] | 44 | |
tundebabzy | cad22db | 2018-02-22 06:38:36 +0100 | [diff] [blame] | 45 | |
Ankush Menat | 1e8ee93 | 2023-06-12 19:20:52 +0530 | [diff] [blame] | 46 | def check_frappe_version(): |
| 47 | def major_version(v: str) -> str: |
| 48 | return v.split(".")[0] |
| 49 | |
| 50 | frappe_version = major_version(frappe.__version__) |
| 51 | erpnext_version = major_version(erpnext.__version__) |
| 52 | |
| 53 | if frappe_version == erpnext_version: |
| 54 | return |
| 55 | |
| 56 | click.secho( |
| 57 | f"You're attempting to install ERPNext version {erpnext_version} with Frappe version {frappe_version}. " |
| 58 | "This is not supported and will result in broken install. Switch to correct branch before installing.", |
| 59 | fg="red", |
| 60 | ) |
| 61 | |
| 62 | raise SystemExit(1) |
| 63 | |
| 64 | |
Pratik Vyas | 28da752 | 2014-02-19 20:53:45 +0530 | [diff] [blame] | 65 | def set_single_defaults(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 66 | for dt in ( |
| 67 | "Accounts Settings", |
| 68 | "Print Settings", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 69 | "Buying Settings", |
| 70 | "Selling Settings", |
| 71 | "Stock Settings", |
| 72 | ): |
| 73 | default_values = frappe.db.sql( |
| 74 | """select fieldname, `default` from `tabDocField` |
| 75 | where parent=%s""", |
| 76 | dt, |
| 77 | ) |
Anand Doshi | eb7fea6 | 2014-03-19 17:10:01 +0530 | [diff] [blame] | 78 | if default_values: |
| 79 | try: |
Ankush Menat | c3e1f0e | 2022-03-27 11:52:31 +0530 | [diff] [blame] | 80 | doc = frappe.get_doc(dt, dt) |
Anand Doshi | eb7fea6 | 2014-03-19 17:10:01 +0530 | [diff] [blame] | 81 | for fieldname, value in default_values: |
Ankush Menat | c3e1f0e | 2022-03-27 11:52:31 +0530 | [diff] [blame] | 82 | doc.set(fieldname, value) |
| 83 | doc.flags.ignore_mandatory = True |
| 84 | doc.save() |
Rushabh Mehta | b62ed7a | 2016-10-13 11:00:00 +0530 | [diff] [blame] | 85 | except frappe.ValidationError: |
| 86 | pass |
Rushabh Mehta | d42167e | 2016-05-11 16:47:14 +0530 | [diff] [blame] | 87 | |
rtdany10 | 227466c | 2021-09-04 14:04:56 +0530 | [diff] [blame] | 88 | frappe.db.set_default("date_format", "dd-mm-yyyy") |
Deepesh Garg | e2dab6f | 2022-01-10 17:31:38 +0530 | [diff] [blame] | 89 | |
| 90 | setup_currency_exchange() |
| 91 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 92 | |
Deepesh Garg | e2dab6f | 2022-01-10 17:31:38 +0530 | [diff] [blame] | 93 | def setup_currency_exchange(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 94 | ces = frappe.get_single("Currency Exchange Settings") |
rtdany10 | 227466c | 2021-09-04 14:04:56 +0530 | [diff] [blame] | 95 | try: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 96 | ces.set("result_key", []) |
| 97 | ces.set("req_params", []) |
Deepesh Garg | e2dab6f | 2022-01-10 17:31:38 +0530 | [diff] [blame] | 98 | |
| 99 | ces.api_endpoint = "https://frankfurter.app/{transaction_date}" |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 100 | ces.append("result_key", {"key": "rates"}) |
| 101 | ces.append("result_key", {"key": "{to_currency}"}) |
| 102 | ces.append("req_params", {"key": "base", "value": "{from_currency}"}) |
| 103 | ces.append("req_params", {"key": "symbols", "value": "{to_currency}"}) |
rtdany10 | 227466c | 2021-09-04 14:04:56 +0530 | [diff] [blame] | 104 | ces.save() |
| 105 | except frappe.ValidationError: |
| 106 | pass |
tundebabzy | cad22db | 2018-02-22 06:38:36 +0100 | [diff] [blame] | 107 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 108 | |
Ankush Menat | 9a99f99 | 2022-01-23 17:38:04 +0530 | [diff] [blame] | 109 | def create_print_setting_custom_fields(): |
Sagar Vora | aafb735 | 2022-08-18 15:31:20 +0000 | [diff] [blame] | 110 | create_custom_fields( |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 111 | { |
Sagar Vora | aafb735 | 2022-08-18 15:31:20 +0000 | [diff] [blame] | 112 | "Print Settings": [ |
| 113 | { |
| 114 | "label": _("Compact Item Print"), |
| 115 | "fieldname": "compact_item_print", |
| 116 | "fieldtype": "Check", |
| 117 | "default": "1", |
| 118 | "insert_after": "with_letterhead", |
| 119 | }, |
| 120 | { |
| 121 | "label": _("Print UOM after Quantity"), |
| 122 | "fieldname": "print_uom_after_quantity", |
| 123 | "fieldtype": "Check", |
| 124 | "default": "0", |
| 125 | "insert_after": "compact_item_print", |
| 126 | }, |
| 127 | { |
| 128 | "label": _("Print taxes with zero amount"), |
| 129 | "fieldname": "print_taxes_with_zero_amount", |
| 130 | "fieldtype": "Check", |
| 131 | "default": "0", |
| 132 | "insert_after": "allow_print_for_cancelled", |
| 133 | }, |
| 134 | ] |
| 135 | } |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 136 | ) |
tundebabzy | cad22db | 2018-02-22 06:38:36 +0100 | [diff] [blame] | 137 | |
| 138 | |
Suraj Shetty | 00cced1 | 2018-05-03 19:06:32 +0530 | [diff] [blame] | 139 | def create_default_success_action(): |
| 140 | for success_action in get_default_success_action(): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 141 | if not frappe.db.exists("Success Action", success_action.get("ref_doctype")): |
Suraj Shetty | 00cced1 | 2018-05-03 19:06:32 +0530 | [diff] [blame] | 142 | doc = frappe.get_doc(success_action) |
| 143 | doc.insert(ignore_permissions=True) |
Rucha Mahabal | 4865eab | 2019-07-24 13:37:54 +0530 | [diff] [blame] | 144 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 145 | |
Suraj Shetty | 627a3dc | 2019-09-17 15:54:41 +0530 | [diff] [blame] | 146 | def create_default_energy_point_rules(): |
| 147 | |
| 148 | for rule in get_default_energy_point_rules(): |
| 149 | # check if any rule for ref. doctype exists |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 150 | rule_exists = frappe.db.exists( |
| 151 | "Energy Point Rule", {"reference_doctype": rule.get("reference_doctype")} |
| 152 | ) |
| 153 | if rule_exists: |
| 154 | continue |
Suraj Shetty | 627a3dc | 2019-09-17 15:54:41 +0530 | [diff] [blame] | 155 | doc = frappe.get_doc(rule) |
| 156 | doc.insert(ignore_permissions=True) |
| 157 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 158 | |
Rucha Mahabal | 4865eab | 2019-07-24 13:37:54 +0530 | [diff] [blame] | 159 | def add_company_to_session_defaults(): |
| 160 | settings = frappe.get_single("Session Default Settings") |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 161 | settings.append("session_defaults", {"ref_doctype": "Company"}) |
Rucha Mahabal | 4865eab | 2019-07-24 13:37:54 +0530 | [diff] [blame] | 162 | settings.save() |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 163 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 164 | |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 165 | def add_standard_navbar_items(): |
| 166 | navbar_settings = frappe.get_single("Navbar Settings") |
| 167 | |
| 168 | erpnext_navbar_items = [ |
| 169 | { |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 170 | "item_label": "Documentation", |
| 171 | "item_type": "Route", |
Deepesh Garg | be723bb | 2023-03-17 15:39:33 +0530 | [diff] [blame] | 172 | "route": "https://docs.erpnext.com/docs/v14/user/manual/en/introduction", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 173 | "is_standard": 1, |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 174 | }, |
| 175 | { |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 176 | "item_label": "User Forum", |
| 177 | "item_type": "Route", |
MohsinAli | dd93ea0 | 2023-04-17 17:00:52 +0530 | [diff] [blame] | 178 | "route": "https://discuss.frappe.io", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 179 | "is_standard": 1, |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 180 | }, |
| 181 | { |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 182 | "item_label": "Report an Issue", |
| 183 | "item_type": "Route", |
| 184 | "route": "https://github.com/frappe/erpnext/issues", |
| 185 | "is_standard": 1, |
| 186 | }, |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 187 | ] |
| 188 | |
prssanna | 194dd12 | 2021-03-24 16:45:32 +0530 | [diff] [blame] | 189 | current_navbar_items = navbar_settings.help_dropdown |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 190 | navbar_settings.set("help_dropdown", []) |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 191 | |
| 192 | for item in erpnext_navbar_items: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 193 | current_labels = [item.get("item_label") for item in current_navbar_items] |
| 194 | if not item.get("item_label") in current_labels: |
| 195 | navbar_settings.append("help_dropdown", item) |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 196 | |
prssanna | 194dd12 | 2021-03-24 16:45:32 +0530 | [diff] [blame] | 197 | for item in current_navbar_items: |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 198 | navbar_settings.append( |
| 199 | "help_dropdown", |
| 200 | { |
| 201 | "item_label": item.item_label, |
| 202 | "item_type": item.item_type, |
| 203 | "route": item.route, |
| 204 | "action": item.action, |
| 205 | "is_standard": item.is_standard, |
| 206 | "hidden": item.hidden, |
| 207 | }, |
| 208 | ) |
Deepesh Garg | a306af8 | 2020-08-06 20:52:02 +0530 | [diff] [blame] | 209 | |
| 210 | navbar_settings.save() |
Shivam Mishra | 1323a9a | 2020-09-30 16:33:14 +0530 | [diff] [blame] | 211 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 212 | |
Shivam Mishra | 1323a9a | 2020-09-30 16:33:14 +0530 | [diff] [blame] | 213 | def add_app_name(): |
Ankush Menat | a3ea985 | 2023-06-13 17:30:38 +0530 | [diff] [blame] | 214 | frappe.db.set_single_value("System Settings", "app_name", "ERPNext") |
Rohit Waghchaure | 5949a7e | 2022-12-01 15:59:42 +0530 | [diff] [blame] | 215 | |
| 216 | |
| 217 | def setup_log_settings(): |
| 218 | log_settings = frappe.get_single("Log Settings") |
| 219 | log_settings.append("logs_to_clear", {"ref_doctype": "Repost Item Valuation", "days": 60}) |
| 220 | |
| 221 | log_settings.save(ignore_permissions=True) |
Nabin Hait | 243c49c | 2023-05-24 16:49:27 +0530 | [diff] [blame] | 222 | |
| 223 | |
| 224 | def hide_workspaces(): |
Nabin Hait | 86f8881 | 2023-05-26 17:25:20 +0530 | [diff] [blame] | 225 | for ws in ["Integration", "Settings"]: |
| 226 | frappe.db.set_value("Workspace", ws, "public", 0) |
Deepesh Garg | 76197cc | 2023-06-07 10:11:32 +0530 | [diff] [blame] | 227 | |
| 228 | |
| 229 | def create_default_role_profiles(): |
Ankush Menat | 0166f69 | 2023-06-07 15:09:49 +0530 | [diff] [blame] | 230 | for role_profile_name, roles in DEFAULT_ROLE_PROFILES.items(): |
| 231 | role_profile = frappe.new_doc("Role Profile") |
| 232 | role_profile.role_profile = role_profile_name |
| 233 | for role in roles: |
| 234 | role_profile.append("roles", {"role": role}) |
| 235 | |
| 236 | role_profile.insert(ignore_permissions=True) |
Deepesh Garg | 76197cc | 2023-06-07 10:11:32 +0530 | [diff] [blame] | 237 | |
| 238 | |
Ankush Menat | 0166f69 | 2023-06-07 15:09:49 +0530 | [diff] [blame] | 239 | DEFAULT_ROLE_PROFILES = { |
| 240 | "Inventory": [ |
| 241 | "Stock User", |
| 242 | "Stock Manager", |
| 243 | "Item Manager", |
| 244 | ], |
| 245 | "Manufacturing": [ |
| 246 | "Stock User", |
| 247 | "Manufacturing User", |
| 248 | "Manufacturing Manager", |
| 249 | ], |
| 250 | "Accounts": [ |
| 251 | "Accounts User", |
| 252 | "Accounts Manager", |
| 253 | ], |
| 254 | "Sales": [ |
| 255 | "Sales User", |
| 256 | "Stock User", |
| 257 | "Sales Manager", |
| 258 | ], |
| 259 | "Purchase": [ |
| 260 | "Item Manager", |
| 261 | "Stock User", |
| 262 | "Purchase User", |
| 263 | "Purchase Manager", |
| 264 | ], |
| 265 | } |