diff --git a/frappe/docs/__init__.py b/frappe/docs/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/__init__.py b/frappe/docs/assets/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/img/00-login-to-idp.png b/frappe/docs/assets/img/00-login-to-idp.png deleted file mode 100644 index 8b60b0bc9e..0000000000 Binary files a/frappe/docs/assets/img/00-login-to-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/01-add-oauth-client-on-idp.png b/frappe/docs/assets/img/01-add-oauth-client-on-idp.png deleted file mode 100644 index 8bea510fda..0000000000 Binary files a/frappe/docs/assets/img/01-add-oauth-client-on-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/02-set-server-url-on-idp.png b/frappe/docs/assets/img/02-set-server-url-on-idp.png deleted file mode 100644 index 7a434332f8..0000000000 Binary files a/frappe/docs/assets/img/02-set-server-url-on-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/03-set-clientid-client-secret-server-on-app-server.png b/frappe/docs/assets/img/03-set-clientid-client-secret-server-on-app-server.png deleted file mode 100644 index 8c35f93421..0000000000 Binary files a/frappe/docs/assets/img/03-set-clientid-client-secret-server-on-app-server.png and /dev/null differ diff --git a/frappe/docs/assets/img/04-login-screen-on-app-server.png b/frappe/docs/assets/img/04-login-screen-on-app-server.png deleted file mode 100644 index d06a51d9d0..0000000000 Binary files a/frappe/docs/assets/img/04-login-screen-on-app-server.png and /dev/null differ diff --git a/frappe/docs/assets/img/05-login-with-user-on-idp.png b/frappe/docs/assets/img/05-login-with-user-on-idp.png deleted file mode 100644 index 496aac16b9..0000000000 Binary files a/frappe/docs/assets/img/05-login-with-user-on-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/06-confirm-grant-access-on-idp.png b/frappe/docs/assets/img/06-confirm-grant-access-on-idp.png deleted file mode 100644 index 3ad305ab95..0000000000 Binary files a/frappe/docs/assets/img/06-confirm-grant-access-on-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/07-logged-in-as-website-user-with-id-from-idp.png b/frappe/docs/assets/img/07-logged-in-as-website-user-with-id-from-idp.png deleted file mode 100644 index 7750ed522a..0000000000 Binary files a/frappe/docs/assets/img/07-logged-in-as-website-user-with-id-from-idp.png and /dev/null differ diff --git a/frappe/docs/assets/img/__init__.py b/frappe/docs/assets/img/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/img/add-vat-number-in-purchase-order.png b/frappe/docs/assets/img/add-vat-number-in-purchase-order.png deleted file mode 100644 index 843974812a..0000000000 Binary files a/frappe/docs/assets/img/add-vat-number-in-purchase-order.png and /dev/null differ diff --git a/frappe/docs/assets/img/add-vat-number-in-supplier.png b/frappe/docs/assets/img/add-vat-number-in-supplier.png deleted file mode 100644 index 024d48f43a..0000000000 Binary files a/frappe/docs/assets/img/add-vat-number-in-supplier.png and /dev/null differ diff --git a/frappe/docs/assets/img/add_user_roles.png b/frappe/docs/assets/img/add_user_roles.png deleted file mode 100644 index 49006acef9..0000000000 Binary files a/frappe/docs/assets/img/add_user_roles.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/__init__.py b/frappe/docs/assets/img/app-development/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/img/app-development/add_custom_button.png b/frappe/docs/assets/img/app-development/add_custom_button.png deleted file mode 100644 index 2a83476b04..0000000000 Binary files a/frappe/docs/assets/img/app-development/add_custom_button.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/confirm-dialog.png b/frappe/docs/assets/img/app-development/confirm-dialog.png deleted file mode 100644 index 236017efd8..0000000000 Binary files a/frappe/docs/assets/img/app-development/confirm-dialog.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/dialog.png b/frappe/docs/assets/img/app-development/dialog.png deleted file mode 100644 index 0a03b4870b..0000000000 Binary files a/frappe/docs/assets/img/app-development/dialog.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/export-custom-1.png b/frappe/docs/assets/img/app-development/export-custom-1.png deleted file mode 100644 index 69bd6c7fec..0000000000 Binary files a/frappe/docs/assets/img/app-development/export-custom-1.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/export-custom-2.png b/frappe/docs/assets/img/app-development/export-custom-2.png deleted file mode 100644 index 4bf3c14925..0000000000 Binary files a/frappe/docs/assets/img/app-development/export-custom-2.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/msgprint.png b/frappe/docs/assets/img/app-development/msgprint.png deleted file mode 100644 index 7676b7a695..0000000000 Binary files a/frappe/docs/assets/img/app-development/msgprint.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/prompt.png b/frappe/docs/assets/img/app-development/prompt.png deleted file mode 100644 index b3600ee6df..0000000000 Binary files a/frappe/docs/assets/img/app-development/prompt.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/show-alert.png b/frappe/docs/assets/img/app-development/show-alert.png deleted file mode 100644 index f19b7900fa..0000000000 Binary files a/frappe/docs/assets/img/app-development/show-alert.png and /dev/null differ diff --git a/frappe/docs/assets/img/app-development/test-runner.png b/frappe/docs/assets/img/app-development/test-runner.png deleted file mode 100644 index 22708e7dec..0000000000 Binary files a/frappe/docs/assets/img/app-development/test-runner.png and /dev/null differ diff --git a/frappe/docs/assets/img/attach_image.gif b/frappe/docs/assets/img/attach_image.gif deleted file mode 100644 index c360c8513e..0000000000 Binary files a/frappe/docs/assets/img/attach_image.gif and /dev/null differ diff --git a/frappe/docs/assets/img/autoname_and_search_field.png b/frappe/docs/assets/img/autoname_and_search_field.png deleted file mode 100644 index ea801805e5..0000000000 Binary files a/frappe/docs/assets/img/autoname_and_search_field.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/add-connector-type.png b/frappe/docs/assets/img/data-migration/add-connector-type.png deleted file mode 100644 index f24dd79bd9..0000000000 Binary files a/frappe/docs/assets/img/data-migration/add-connector-type.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/atlas-connection-py.png b/frappe/docs/assets/img/data-migration/atlas-connection-py.png deleted file mode 100644 index 3c7e191aff..0000000000 Binary files a/frappe/docs/assets/img/data-migration/atlas-connection-py.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/atlas-connector.png b/frappe/docs/assets/img/data-migration/atlas-connector.png deleted file mode 100644 index 74e9c03373..0000000000 Binary files a/frappe/docs/assets/img/data-migration/atlas-connector.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/atlas-sync-plan.png b/frappe/docs/assets/img/data-migration/atlas-sync-plan.png deleted file mode 100644 index 104b7bdb85..0000000000 Binary files a/frappe/docs/assets/img/data-migration/atlas-sync-plan.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/data-migration-run.png b/frappe/docs/assets/img/data-migration/data-migration-run.png deleted file mode 100644 index 584dd930d4..0000000000 Binary files a/frappe/docs/assets/img/data-migration/data-migration-run.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/edit-connector-py.png b/frappe/docs/assets/img/data-migration/edit-connector-py.png deleted file mode 100644 index e8d6cbe024..0000000000 Binary files a/frappe/docs/assets/img/data-migration/edit-connector-py.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/mapping-init-py.png b/frappe/docs/assets/img/data-migration/mapping-init-py.png deleted file mode 100644 index 1cbe941fb9..0000000000 Binary files a/frappe/docs/assets/img/data-migration/mapping-init-py.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/mapping-pre-and-post-process.png b/frappe/docs/assets/img/data-migration/mapping-pre-and-post-process.png deleted file mode 100644 index b465bf3107..0000000000 Binary files a/frappe/docs/assets/img/data-migration/mapping-pre-and-post-process.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/new-connector.png b/frappe/docs/assets/img/data-migration/new-connector.png deleted file mode 100644 index a0b6d473ab..0000000000 Binary files a/frappe/docs/assets/img/data-migration/new-connector.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/new-data-migration-mapping-fields.png b/frappe/docs/assets/img/data-migration/new-data-migration-mapping-fields.png deleted file mode 100644 index 5eaa5a1b3b..0000000000 Binary files a/frappe/docs/assets/img/data-migration/new-data-migration-mapping-fields.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/new-data-migration-mapping.png b/frappe/docs/assets/img/data-migration/new-data-migration-mapping.png deleted file mode 100644 index 783bac8a50..0000000000 Binary files a/frappe/docs/assets/img/data-migration/new-data-migration-mapping.png and /dev/null differ diff --git a/frappe/docs/assets/img/data-migration/new-data-migration-plan.png b/frappe/docs/assets/img/data-migration/new-data-migration-plan.png deleted file mode 100644 index 9a14dc9c91..0000000000 Binary files a/frappe/docs/assets/img/data-migration/new-data-migration-plan.png and /dev/null differ diff --git a/frappe/docs/assets/img/desk.png b/frappe/docs/assets/img/desk.png deleted file mode 100644 index e8f94effa1..0000000000 Binary files a/frappe/docs/assets/img/desk.png and /dev/null differ diff --git a/frappe/docs/assets/img/desk/__init__.py b/frappe/docs/assets/img/desk/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/img/desk/animated_line_graph.gif b/frappe/docs/assets/img/desk/animated_line_graph.gif deleted file mode 100644 index 0b0e7b212c..0000000000 Binary files a/frappe/docs/assets/img/desk/animated_line_graph.gif and /dev/null differ diff --git a/frappe/docs/assets/img/desk/bar_graph.png b/frappe/docs/assets/img/desk/bar_graph.png deleted file mode 100644 index b3bd89cc88..0000000000 Binary files a/frappe/docs/assets/img/desk/bar_graph.png and /dev/null differ diff --git a/frappe/docs/assets/img/desk/line_graph_sales.png b/frappe/docs/assets/img/desk/line_graph_sales.png deleted file mode 100644 index 0e70ae0031..0000000000 Binary files a/frappe/docs/assets/img/desk/line_graph_sales.png and /dev/null differ diff --git a/frappe/docs/assets/img/desk/percentage_graph.png b/frappe/docs/assets/img/desk/percentage_graph.png deleted file mode 100644 index 3a25d59479..0000000000 Binary files a/frappe/docs/assets/img/desk/percentage_graph.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_adding_field.png b/frappe/docs/assets/img/doctype_adding_field.png deleted file mode 100644 index 8ce7fdf284..0000000000 Binary files a/frappe/docs/assets/img/doctype_adding_field.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_adding_permission.png b/frappe/docs/assets/img/doctype_adding_permission.png deleted file mode 100644 index 6853f42b01..0000000000 Binary files a/frappe/docs/assets/img/doctype_adding_permission.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_article.png b/frappe/docs/assets/img/doctype_article.png deleted file mode 100644 index 3532ee2f74..0000000000 Binary files a/frappe/docs/assets/img/doctype_article.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_lib_member.png b/frappe/docs/assets/img/doctype_lib_member.png deleted file mode 100644 index 3257fcf08e..0000000000 Binary files a/frappe/docs/assets/img/doctype_lib_member.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_lib_membership.png b/frappe/docs/assets/img/doctype_lib_membership.png deleted file mode 100644 index c32e348e1d..0000000000 Binary files a/frappe/docs/assets/img/doctype_lib_membership.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_lib_trans.png b/frappe/docs/assets/img/doctype_lib_trans.png deleted file mode 100644 index e7059290e9..0000000000 Binary files a/frappe/docs/assets/img/doctype_lib_trans.png and /dev/null differ diff --git a/frappe/docs/assets/img/doctype_new.png b/frappe/docs/assets/img/doctype_new.png deleted file mode 100644 index e24c605e2b..0000000000 Binary files a/frappe/docs/assets/img/doctype_new.png and /dev/null differ diff --git a/frappe/docs/assets/img/fetch.png b/frappe/docs/assets/img/fetch.png deleted file mode 100644 index 3ac38b8e08..0000000000 Binary files a/frappe/docs/assets/img/fetch.png and /dev/null differ diff --git a/frappe/docs/assets/img/frappe-bird-white.png b/frappe/docs/assets/img/frappe-bird-white.png deleted file mode 100644 index 540a1d0398..0000000000 Binary files a/frappe/docs/assets/img/frappe-bird-white.png and /dev/null differ diff --git a/frappe/docs/assets/img/general-ledger.png b/frappe/docs/assets/img/general-ledger.png deleted file mode 100644 index 6ca37ec939..0000000000 Binary files a/frappe/docs/assets/img/general-ledger.png and /dev/null differ diff --git a/frappe/docs/assets/img/generators.png b/frappe/docs/assets/img/generators.png deleted file mode 100644 index 45fbf37164..0000000000 Binary files a/frappe/docs/assets/img/generators.png and /dev/null differ diff --git a/frappe/docs/assets/img/home.png b/frappe/docs/assets/img/home.png deleted file mode 100644 index 85e8e054b5..0000000000 Binary files a/frappe/docs/assets/img/home.png and /dev/null differ diff --git a/frappe/docs/assets/img/lib_management_module.png b/frappe/docs/assets/img/lib_management_module.png deleted file mode 100644 index be2a5d9820..0000000000 Binary files a/frappe/docs/assets/img/lib_management_module.png and /dev/null differ diff --git a/frappe/docs/assets/img/lib_trans.png b/frappe/docs/assets/img/lib_trans.png deleted file mode 100644 index 6ab4dbfa48..0000000000 Binary files a/frappe/docs/assets/img/lib_trans.png and /dev/null differ diff --git a/frappe/docs/assets/img/link_field.png b/frappe/docs/assets/img/link_field.png deleted file mode 100644 index dac6600809..0000000000 Binary files a/frappe/docs/assets/img/link_field.png and /dev/null differ diff --git a/frappe/docs/assets/img/login.png b/frappe/docs/assets/img/login.png deleted file mode 100644 index ed1108ca36..0000000000 Binary files a/frappe/docs/assets/img/login.png and /dev/null differ diff --git a/frappe/docs/assets/img/naming_doctype.png b/frappe/docs/assets/img/naming_doctype.png deleted file mode 100644 index ca109e7c5d..0000000000 Binary files a/frappe/docs/assets/img/naming_doctype.png and /dev/null differ diff --git a/frappe/docs/assets/img/new_article.png b/frappe/docs/assets/img/new_article.png deleted file mode 100644 index 6e17d82bfc..0000000000 Binary files a/frappe/docs/assets/img/new_article.png and /dev/null differ diff --git a/frappe/docs/assets/img/new_article_blank.png b/frappe/docs/assets/img/new_article_blank.png deleted file mode 100644 index 54c8d9152a..0000000000 Binary files a/frappe/docs/assets/img/new_article_blank.png and /dev/null differ diff --git a/frappe/docs/assets/img/new_lib_membership.png b/frappe/docs/assets/img/new_lib_membership.png deleted file mode 100644 index ea8e16aa8b..0000000000 Binary files a/frappe/docs/assets/img/new_lib_membership.png and /dev/null differ diff --git a/frappe/docs/assets/img/new_member.png b/frappe/docs/assets/img/new_member.png deleted file mode 100644 index 0bf0cea89d..0000000000 Binary files a/frappe/docs/assets/img/new_member.png and /dev/null differ diff --git a/frappe/docs/assets/img/oauth2_client_app.png b/frappe/docs/assets/img/oauth2_client_app.png deleted file mode 100644 index 6b0d90500b..0000000000 Binary files a/frappe/docs/assets/img/oauth2_client_app.png and /dev/null differ diff --git a/frappe/docs/assets/img/oauth_confirmation_page.png b/frappe/docs/assets/img/oauth_confirmation_page.png deleted file mode 100644 index 1a3061a227..0000000000 Binary files a/frappe/docs/assets/img/oauth_confirmation_page.png and /dev/null differ diff --git a/frappe/docs/assets/img/oauth_provider_settings.png b/frappe/docs/assets/img/oauth_provider_settings.png deleted file mode 100644 index f2e12a9f22..0000000000 Binary files a/frappe/docs/assets/img/oauth_provider_settings.png and /dev/null differ diff --git a/frappe/docs/assets/img/portals/__init__.py b/frappe/docs/assets/img/portals/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/assets/img/portals/portal-settings.png b/frappe/docs/assets/img/portals/portal-settings.png deleted file mode 100644 index 3d88c254a8..0000000000 Binary files a/frappe/docs/assets/img/portals/portal-settings.png and /dev/null differ diff --git a/frappe/docs/assets/img/portals/sample-web-form.png b/frappe/docs/assets/img/portals/sample-web-form.png deleted file mode 100644 index ebf4574fc9..0000000000 Binary files a/frappe/docs/assets/img/portals/sample-web-form.png and /dev/null differ diff --git a/frappe/docs/assets/img/query-report-out.png b/frappe/docs/assets/img/query-report-out.png deleted file mode 100644 index fd186ed37c..0000000000 Binary files a/frappe/docs/assets/img/query-report-out.png and /dev/null differ diff --git a/frappe/docs/assets/img/query-report.png b/frappe/docs/assets/img/query-report.png deleted file mode 100644 index b56f069864..0000000000 Binary files a/frappe/docs/assets/img/query-report.png and /dev/null differ diff --git a/frappe/docs/assets/img/report.png b/frappe/docs/assets/img/report.png deleted file mode 100644 index f0fe15bcfc..0000000000 Binary files a/frappe/docs/assets/img/report.png and /dev/null differ diff --git a/frappe/docs/assets/img/roles_creation.png b/frappe/docs/assets/img/roles_creation.png deleted file mode 100644 index e2733d7cd6..0000000000 Binary files a/frappe/docs/assets/img/roles_creation.png and /dev/null differ diff --git a/frappe/docs/assets/img/script-report.png b/frappe/docs/assets/img/script-report.png deleted file mode 100644 index 07abc8ce08..0000000000 Binary files a/frappe/docs/assets/img/script-report.png and /dev/null differ diff --git a/frappe/docs/assets/img/select_field.png b/frappe/docs/assets/img/select_field.png deleted file mode 100644 index 4ac4f213ad..0000000000 Binary files a/frappe/docs/assets/img/select_field.png and /dev/null differ diff --git a/frappe/docs/assets/img/social-logins-1.jpg b/frappe/docs/assets/img/social-logins-1.jpg deleted file mode 100755 index 3c3471e907..0000000000 Binary files a/frappe/docs/assets/img/social-logins-1.jpg and /dev/null differ diff --git a/frappe/docs/assets/img/social-logins.png b/frappe/docs/assets/img/social-logins.png deleted file mode 100644 index 224b47d286..0000000000 Binary files a/frappe/docs/assets/img/social-logins.png and /dev/null differ diff --git a/frappe/docs/assets/img/social_login_key.png b/frappe/docs/assets/img/social_login_key.png deleted file mode 100644 index 4ef84703c3..0000000000 Binary files a/frappe/docs/assets/img/social_login_key.png and /dev/null differ diff --git a/frappe/docs/assets/img/system_settings.png b/frappe/docs/assets/img/system_settings.png deleted file mode 100644 index 934dad3619..0000000000 Binary files a/frappe/docs/assets/img/system_settings.png and /dev/null differ diff --git a/frappe/docs/assets/img/tab_single.png b/frappe/docs/assets/img/tab_single.png deleted file mode 100644 index e341313711..0000000000 Binary files a/frappe/docs/assets/img/tab_single.png and /dev/null differ diff --git a/frappe/docs/assets/img/usage_info.png b/frappe/docs/assets/img/usage_info.png deleted file mode 100644 index 364d9cbc78..0000000000 Binary files a/frappe/docs/assets/img/usage_info.png and /dev/null differ diff --git a/frappe/docs/assets/img/vat-number-fetched.png b/frappe/docs/assets/img/vat-number-fetched.png deleted file mode 100644 index d540b20621..0000000000 Binary files a/frappe/docs/assets/img/vat-number-fetched.png and /dev/null differ diff --git a/frappe/docs/assets/img/web-list-new.png b/frappe/docs/assets/img/web-list-new.png deleted file mode 100644 index 148235705f..0000000000 Binary files a/frappe/docs/assets/img/web-list-new.png and /dev/null differ diff --git a/frappe/docs/assets/img/web-list.png b/frappe/docs/assets/img/web-list.png deleted file mode 100644 index 2f9d91398b..0000000000 Binary files a/frappe/docs/assets/img/web-list.png and /dev/null differ diff --git a/frappe/docs/assets/img/web-view.png b/frappe/docs/assets/img/web-view.png deleted file mode 100644 index 00c8e88f0d..0000000000 Binary files a/frappe/docs/assets/img/web-view.png and /dev/null differ diff --git a/frappe/docs/assets/img/webhook.png b/frappe/docs/assets/img/webhook.png deleted file mode 100644 index 859b5f57bd..0000000000 Binary files a/frappe/docs/assets/img/webhook.png and /dev/null differ diff --git a/frappe/docs/index.md b/frappe/docs/index.md deleted file mode 100644 index f044d23398..0000000000 --- a/frappe/docs/index.md +++ /dev/null @@ -1,25 +0,0 @@ -# Frappe Framework - -### Tutorials, API documentation and Model Reference - -Frappe is a full stack web application framework written in Python, -Javascript, HTML/CSS with MySQL as the backend. It was built for ERPNext -but is pretty generic and can be used to build database driven apps. - -The key differece in Frappe compared to other frameworks is that in Frappe -meta-data is also treated as data and is used to build front-ends -very easily. Frappe comes with a full blown admin UI called the **Desk** -that handles forms, navigation, lists, menus, permissions, file attachment -and much more out of the box. - -Frappe also has a plug-in architecture that can be used to build plugins -to ERPNext. - -Frappe Framework was designed to build [ERPNext](https://erpnext.com), an open source -ERP for managing small and medium sized businesses. - -[Get started with the Tutorial](/docs/user/) - -### Feedback - -You're encouraged to help improve the quality of this documentation, by sending a pull request on the [GitHub Repository](https://github.com/frappe/erpnext). If you would like to have a discussion regarding the documentation, you can do so [at the forum](https://discuss.erpnext.com). diff --git a/frappe/docs/user/__init__.py b/frappe/docs/user/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/user/en/__init__.py b/frappe/docs/user/en/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/user/en/bench/__init__.py b/frappe/docs/user/en/bench/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/user/en/bench/guides/__init__.py b/frappe/docs/user/en/bench/guides/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/user/en/bench/guides/adding-custom-domains.md b/frappe/docs/user/en/bench/guides/adding-custom-domains.md deleted file mode 100755 index 15a54bf7a8..0000000000 --- a/frappe/docs/user/en/bench/guides/adding-custom-domains.md +++ /dev/null @@ -1,28 +0,0 @@ -# Adding Custom Domains to your Site - -You can add **multiple custom domains** for your site, just run: - - bench setup add-domain [desired-domain] - -On running the command you will be asked for which site you want to set the custom domain for. - -You can also setup SSL for your custom domain by using the options: - - --ssl-certificate [path-to-certificate] - --ssl-certificate-key [path-to-certificate-key] - -Example: - - bench setup add-domain custom.erpnext.com --ssl-certificate /etc/letsencrypt/live/erpnext.cert --ssl-certificate-key /etc/letsencrypt/live/erpnext.key - -Domain configuration is stored in the respective site's site_config.json - - "domains": [ - { - "ssl_certificate": "/etc/letsencrypt/live/erpnext.cert", - "domain": "erpnext.com", - "ssl_certificate_key": "/etc/letsencrypt/live/erpnext.key" - } - ], - -**You will need to regenerate the nginx configuration by runnning `bench setup nginx` and reload the nginx service put your custom domain in effect** \ No newline at end of file diff --git a/frappe/docs/user/en/bench/guides/configuring-https.md b/frappe/docs/user/en/bench/guides/configuring-https.md deleted file mode 100755 index 7e2740acf1..0000000000 --- a/frappe/docs/user/en/bench/guides/configuring-https.md +++ /dev/null @@ -1,46 +0,0 @@ -# Configuring HTTPS - -### Get the required files - -You can get a SSL certificate from a trusted Certificate Authority or generate your own. For self signed certificates the browser will show a warning that the certificate is not trusted. [Here's a tutorial for using Let's Encrypt to get a free SSL Certificate](lets-encrypt-ssl-setup.html) - -The files required are - -* Certificate (usually with extension .crt) -* Decrypted private key - -If you have multiple certificates (primary and intermediate), you will have to concatenate them. For example, - - cat your_certificate.crt CA.crt >> certificate_bundle.crt - -Also make sure that your private key is not world readable. Generally, it is owned and readable only by root - - chown root private.key - chmod 600 private.key - -### Move the two files to an appropriate location - - mkdir /etc/nginx/conf.d/ssl - mv private.key /etc/nginx/conf.d/ssl/private.key - mv certificate_bundle.crt /etc/nginx/conf.d/ssl/certificate_bundle.crt - -### Setup nginx config - -Set the paths to the certificate and private key for your site - - bench set-ssl-certificate site1.local /etc/nginx/conf.d/ssl/certificate_bundle.crt - bench set-ssl-key site1.local /etc/nginx/conf.d/ssl/private.key - -### Generate nginx config - - bench setup nginx - -### Reload nginx - - sudo service nginx reload - -or - - systemctl reload nginx # for CentOS 7 - -Now that you have configured SSL, all HTTP traffic will be redirected to HTTPS diff --git a/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md b/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md deleted file mode 100755 index 492205cf5b..0000000000 --- a/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md +++ /dev/null @@ -1,33 +0,0 @@ -# Diagnosing The Scheduler - - - -If you're experiencing delays in scheduled jobs or they don't seem to run, you can run the several commands to diagnose the issue. - -### `bench doctor` - -This will output the following in order: -- Scheduler Status per site -- Number of Workers -- Pending Tasks - - -Desirable output: - - Workers online: 0 - -----None Jobs----- - -### `bench --site [site-name] show-pending-jobs` - -This will output the following in order: -- Queue -- Tasks within Queue - -Desirable output: - - -----Pending Jobs----- - - -### `bench purge-jobs` - -This will remove all pending jobs from all queues \ No newline at end of file diff --git a/frappe/docs/user/en/bench/guides/index.md b/frappe/docs/user/en/bench/guides/index.md deleted file mode 100644 index 8ab035a2f5..0000000000 --- a/frappe/docs/user/en/bench/guides/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Guides - - - -{index} \ No newline at end of file diff --git a/frappe/docs/user/en/bench/guides/index.txt b/frappe/docs/user/en/bench/guides/index.txt deleted file mode 100755 index 4f99377c88..0000000000 --- a/frappe/docs/user/en/bench/guides/index.txt +++ /dev/null @@ -1,11 +0,0 @@ -configuring-https -lets-encrypt-ssl-setup -diagnosing-the-scheduler -how-to-change-host-name-from-localhost -manual-setup -setup-multitenancy -setup-production -setup-ssl -stop-production-and-start-development -updating -setting-limits \ No newline at end of file diff --git a/frappe/docs/user/en/bench/guides/lets-encrypt-ssl-setup.md b/frappe/docs/user/en/bench/guides/lets-encrypt-ssl-setup.md deleted file mode 100755 index c0bb85c943..0000000000 --- a/frappe/docs/user/en/bench/guides/lets-encrypt-ssl-setup.md +++ /dev/null @@ -1,101 +0,0 @@ -# Using Let's Encrypt to setup HTTPS - -##Prequisites - -1. You need to have a DNS Multitenant Setup -2. Your site should be accessible via a valid domain -3. You need root permissions on your server - -**Note : Let's Encrypt Certificates expire every three months** - -## Using Bench Command - -Just run: - - sudo -H bench setup lets-encrypt [site-name] - -You will be faced with several prompts, respond to them accordingly. This command will also add an entry to the crontab of the user that will attempt to renew the certificate every month. - -### Custom Domains - -You can setup Let's Encrypt for [custom domains](adding-custom-domains.html) as well. Just use the `--custom-domain` option - - sudo -H bench setup lets-encrypt [site-name] --custom-domain [custom-domain] - -### Renew Certificates - -To renew certificates manually you can use: - - sudo bench renew-lets-encrypt - -
diff --git a/frappe/docs/user/en/bench/guides/setup-multitenancy.md b/frappe/docs/user/en/bench/guides/setup-multitenancy.md
deleted file mode 100755
index 1404fd707c..0000000000
--- a/frappe/docs/user/en/bench/guides/setup-multitenancy.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Setup Multitenancy
-
-Assuming that you've already got your first site running and you've performed
-the [production deployment steps](setup-production.html), this section explains how to host your second
-site (and more). Your first site is automatically set as default site. You can
-change it with the command,
-
- bench use sitename
-
-
-
-
-Port based multitenancy
------------------------
-
-You can create a new site and make run it on a different port (while the first
-one runs on port 80).
-
-* Switch off DNS based multitenancy (once)
-
- `bench config dns_multitenant off`
-
-* Create a new site
-
- `bench new-site site2name`
-
-* Set port
-
- `bench set-nginx-port site2name 82`
-
-* Re generate nginx config
-
- `bench setup nginx`
-
-* Reload nginx
-
- `sudo service nginx reload`
-
-
-DNS based multitenancy
-----------------------
-
-You can name your sites as the hostnames that would resolve to it. Thus, all the sites you add to the bench would run on the same port and will be automatically selected based on the hostname.
-
-To make a new site under DNS based multitenancy, perform the following steps.
-
-* Switch on DNS based multitenancy (once)
-
- `bench config dns_multitenant on`
-
-* Create a new site
-
- `bench new-site site2name`
-
-* Re generate nginx config
-
- `bench setup nginx`
-
-* Reload nginx
-
- `sudo service nginx reload`
diff --git a/frappe/docs/user/en/bench/guides/setup-production.md b/frappe/docs/user/en/bench/guides/setup-production.md
deleted file mode 100644
index 4c5e2a7dc2..0000000000
--- a/frappe/docs/user/en/bench/guides/setup-production.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Setup Production
-
-You can setup the bench for production use by configuring two programs, Supervisor and nginx. If you want to revert your Production Setup to Development Setup refer to [these commands](https://github.com/frappe/bench/wiki/Stopping-Production-and-starting-Development)
-
-####Easy Production Setup
-These steps are automated if you run `sudo bench setup production`
-
-
-####Manual Production Setup
-Supervisor
-----------
-
-Supervisor makes sure that the process that power the Frappe system keep running
-and it restarts them if they happen to crash. You can generate the required
-configuration for supervisor using the command `bench setup supervisor`. The
-configuration will be available in `config/supervisor.conf` directory. You can
-then copy/link this file to the supervisor config directory and reload it for it to
-take effect.
-
-eg,
-
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf
-```
-
-Note: For CentOS 7, the extension should be `ini`, thus the command becomes
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.ini #for CentOS 7 only
-```
-
-The bench will also need to restart the processes managed by supervisor when you
-update the apps. To automate this, you will have to setup sudoers using the
-command, `sudo bench setup sudoers $(whoami)`.
-
-Nginx
------
-
-Nginx is a web server and we use it to serve static files and proxy rest of the
-requests to frappe. You can generate the required configuration for nginx using
-the command `bench setup nginx`. The configuration will be available in
-`config/nginx.conf` file. You can then copy/link this file to the nginx config
-directory and reload it for it to take effect.
-
-eg,
-
-```
-bench setup nginx
-sudo ln -s `pwd`/config/nginx.conf /etc/nginx/conf.d/frappe-bench.conf
-```
-
-Note: When you restart nginx after the configuration change, it might fail if
-you have another configuration with server block as default for port 80 (in most
-cases for the nginx welcome page). You will have to disable this config. Most
-probable places for it to exist are `/etc/nginx/conf.d/default.conf` and
-`/etc/nginx/conf.d/default`.
diff --git a/frappe/docs/user/en/bench/index.md b/frappe/docs/user/en/bench/index.md
deleted file mode 100644
index 39e8cc0ffe..0000000000
--- a/frappe/docs/user/en/bench/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Bench
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/en/bench/index.txt b/frappe/docs/user/en/bench/index.txt
deleted file mode 100644
index 97c835454b..0000000000
--- a/frappe/docs/user/en/bench/index.txt
+++ /dev/null
@@ -1 +0,0 @@
-guides
\ No newline at end of file
diff --git a/frappe/docs/user/en/bench/resources/__init__.py b/frappe/docs/user/en/bench/resources/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/bench/resources/background-services.md b/frappe/docs/user/en/bench/resources/background-services.md
deleted file mode 100755
index 6e7a20730b..0000000000
--- a/frappe/docs/user/en/bench/resources/background-services.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Background Services
-
-External services
------------------
-
- * MariaDB (Datastore for frappe)
- * Redis (Queue for frappe background workers and caching)
- * nginx (for production deployment)
- * supervisor (for production deployment)
-
-Frappe Processes
-----------------
-
-
-* WSGI Server
-
- * The WSGI server is responsible for responding to the HTTP requests to
- frappe. In development scenario (`bench serve` or `bench start`), the
- Werkzeug WSGI server is used and in production, gunicorn (automatically
- configured in supervisor) is used.
-
-* Redis Worker Processes
-
- * The Celery worker processes execute background jobs in the Frappe system.
- These processes are automatically started when `bench start` is run and
- for production are configured in supervisor configuration.
-
-* Scheduler Process
-
- * The Scheduler process schedules enqeueing of scheduled jobs in the
- Frappe system. This process is automatically started when `bench start` is
- run and for production are configured in supervisor configuration.
\ No newline at end of file
diff --git a/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md b/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md
deleted file mode 100755
index 054cd072f6..0000000000
--- a/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Bench Commands Cheatsheet
-
-### General Usage
-* `bench --version` - Show bench version
-* `bench src` - Show bench repo directory
-* `bench --help` - Show all commands and help
-* `bench [command] --help` - Show help for command
-* `bench init [bench-name]` - Create a new bench (Run from home dir)
-* `bench --site [site-name] COMMAND` - Specify site for command
-* `bench update` - Pulls changes for bench-repo and all apps, applies patches, builds JS and CSS, and then migrates.
- * `--pull` Pull changes in all the apps in bench
- * `--patch` Run migrations for all sites in the bench
- * `--build` Build JS and CSS artifacts for the bench
- * `--bench` Update bench
- * `--requirements` Update requirements
- * `--restart-supervisor` restart supervisor processes after update
- * `--upgrade` Does major upgrade (Eg. ERPNext 6 -> 7)
- * `--no-backup` Don't take a backup before update
-* `bench restart` Restart all bench services
-* `bench backup` Backup
-* `bench backup-all-sites` Backup all sites
- * `--with-files` Backup site with files
-* `bench restore` Restore
- * `--with-private-files` Restore site with private files (Path to tar file)
- * `--with-public-files` Restore site with public files (Path to tar file)
-* `bench migrate` Will read JSON files and make changes to the database accordingly
-
-###Config
-* `bench config` - Change bench configuration
- * `auto_update [on/off]` Enable/Disable auto update for bench
- * `dns_multitenant [on/off]` Enable/Disable DNS Multitenancy
- * `http_timeout` Set http timeout
- * `restart_supervisor_on_update` Enable/Disable auto restart of supervisor
- * `serve_default_site` Configure nginx to serve the default site on
- * `update_bench_on_update` Enable/Disable bench updates on running bench...
-* `bench setup` - Setup components
- * `auto-update` Add cronjob for bench auto update
- * `backups ` Add cronjob for bench backups
- * `config ` overwrite or make config.json
- * `env ` Setup virtualenv for bench
- * `nginx ` generate config for nginx
- * `procfile ` Setup Procfile for bench start
- * `production ` setup bench for production
- * `redis ` generate config for redis cache
- * `socketio ` Setup node deps for socketio server
- * `sudoers ` Add commands to sudoers list for execution...
- * `supervisor ` generate config for supervisor
- * `add-domain ` add custom domain for site
- * `firewall ` setup firewall and block all ports except 22, 80 and 443
- * `ssh-port ` change the default ssh connection port
-
-
-###Development
-* `bench new-app [app-name]` Creates a new app
-* `bench get-app [repo-link]` - Downloads an app from a git repository and installs it
-* `bench install-app [app-name]` Installs existing app
-* `bench remove-from-installed-apps [app-name]` Remove app from the list of apps
-* `bench uninstall-app [app-name]` Delete app and everything linked to the app (Bench needs to be running)
-* `bench remove-app [app-name]` Remove app from the bench entirely
-* `bench --site [sitename] --force reinstall ` Reinstall with fresh database (Caution: Will wipe out old database)
-* `bench new-site [sitename]` - Creates a new site
- * `--db-name` Database name
- * `--mariadb-root-username` Root username for MariaDB
- * `--mariadb-root-password` Root password for MariaDB
- * `--admin-password` Administrator password for new site
- * `--verbose` Verbose
- * `--force` Force restore if site/database already exists
- * `--source_sql` Initiate database with a SQL file
- * `--install-app` Install app after installation`
-* `bench use [site]` Sets a default site
-* `bench drop-site` Removes site from disk and database completely
- * `--root-login`
- * `--root-password`
-* `bench set-config [key] [value]` Adds a key-value pair to site's config file
-* `bench console` Opens a IPython console in the bench venv
-* `bench execute` Execute a method inside any app.
- * Eg : `bench execute frappe.utils.scheduler.enqueue_scheduler_events`
-* `bench mysql` Opens SQL Console
-* `bench run-tests` Run tests
- * `--app` App Name
- * `--doctype` DocType to run tests for
- * `--test` Specific Test
- * `--module` Run a particular module that has tests
- * `--profile` Runs a Python profiler on the test
-* `bench disable-production` Disables production environment
-
-
-###Scheduler
-* `bench enable-scheduler` - Enables Scheduler that will run scheduled tasks
-* `bench doctor` - Get diagnostic info about background workers
-* `bench show-pending-jobs`- Get pending jobs
-* `bench purge-jobs` - Destroy all pending jobs
diff --git a/frappe/docs/user/en/bench/resources/bench-procfile.md b/frappe/docs/user/en/bench/resources/bench-procfile.md
deleted file mode 100755
index 9a9176556c..0000000000
--- a/frappe/docs/user/en/bench/resources/bench-procfile.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Bench Procfile
-
-`bench start` uses [honcho](http://honcho.readthedocs.org) to manage multiple processes in **developer mode**.
-
-### Processes
-
-The various process that are needed to run frappe are:
-
-1. `bench start` - the web server
-4. `redis_cache` for caching (general)
-5. `redis_queue` for managing queue for background workers
-6. `redis_socketio` as a message broker for real-time updates / updates from background workers
-7. `web` for the frappe web server.
-7. `socketio` for real-time messaging.
-3. `schedule` to trigger periodic tasks
-3. `worker_*` redis workers to handle async jobs
-
-Optionally if you are developing for frappe you can add:
-
-`bench watch` to automatically build the desk javascript app.
-
-### Sample
-
- redis_cache: redis-server config/redis_cache.conf
- redis_socketio: redis-server config/redis_socketio.conf
- redis_queue: redis-server config/redis_queue.conf
- web: bench serve --port 8000
- socketio: /usr/bin/node apps/frappe/socketio.js
- watch: bench watch
- schedule: bench schedule
- worker_short: bench worker --queue short
- worker_long: bench worker --queue long
- worker_default: bench worker --queue default
diff --git a/frappe/docs/user/en/bench/resources/index.md b/frappe/docs/user/en/bench/resources/index.md
deleted file mode 100644
index 48852466ed..0000000000
--- a/frappe/docs/user/en/bench/resources/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Resources
-
-
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/en/bench/resources/index.txt b/frappe/docs/user/en/bench/resources/index.txt
deleted file mode 100644
index 4674526df6..0000000000
--- a/frappe/docs/user/en/bench/resources/index.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-background-services
-bench-commands-cheatsheet
-bench-procfile
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/.txt b/frappe/docs/user/en/guides/.txt
deleted file mode 100755
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/__init__.py b/frappe/docs/user/en/guides/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/app-development/__init__.py b/frappe/docs/user/en/guides/app-development/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/app-development/adding-custom-button-to-form.md b/frappe/docs/user/en/guides/app-development/adding-custom-button-to-form.md
deleted file mode 100644
index 1e41bcfa16..0000000000
--- a/frappe/docs/user/en/guides/app-development/adding-custom-button-to-form.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Adding Custom Button To Form
-
-To create a custom button on your form, you need to edit the javascript file associated to your doctype. For example, If you want to add a custom button to User form then you must edit `user.js`.
-
-In this file, you need to write a new method `add_custom_button` which should add a button to your form.
-
-#### Function Signature for `add_custom_button(...)`
- frm.add_custom_button(__(buttonName), function(){
- //perform desired action such as routing to new form or fetching etc.
- }, __(groupName));
-
-#### Example-1: Adding a button to User form
-We should edit `frappe\core\doctype\user\user.js`
-
- frappe.ui.form.on('User', {
- refresh: function(frm) {
- ...
- frm.add_custom_button(__('Get User Email Address'), function(){
- frappe.msgprint(frm.doc.email);
- }, __("Utilities"));
- ...
- }
- });
-
-You should be seeing a button on user form as shown below,
-
-
-
-
-
diff --git a/frappe/docs/user/en/guides/app-development/adding-module-icons-on-desktop.md b/frappe/docs/user/en/guides/app-development/adding-module-icons-on-desktop.md
deleted file mode 100755
index 4fbf6fda1e..0000000000
--- a/frappe/docs/user/en/guides/app-development/adding-module-icons-on-desktop.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Adding Module Icons On Desktop
-
-To create a module icon for a Page, List or Module, you will have to edit the `config/desktop.py` file in your app.
-
-In this file you will have to write the `get_data` method that will return a dict object with the module icon parameters
-
-### Example 1: Module Icon
-
- def get_data():
- return {
- "Accounts": {
- "color": "#3498db",
- "icon": "octicon octicon-repo",
- "type": "module"
- },
- }
-
-### Example 2: List Icon
-
- def get_data():
- return {
- "To Do": {
- "color": "#f1c40f",
- "icon": "fa fa-check",
- "icon": "octicon octicon-check",
- "label": _("To Do"),
- "link": "List/ToDo",
- "doctype": "ToDo",
- "type": "list"
- },
- }
-
-
-Note: Module views are visible based on permissions.
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/app-development/adding-social-login-provider.md b/frappe/docs/user/en/guides/app-development/adding-social-login-provider.md
deleted file mode 100644
index 0a517af14b..0000000000
--- a/frappe/docs/user/en/guides/app-development/adding-social-login-provider.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Adding Social Login Provider
-
-This guide discusses how to add a social login provider to frappe via pull request.
-
-### Add your provider in `SocialLoginKey.get_social_login_provider`
-
-```
-providers["Frappe"] = {
- "provider_name": "Frappe",
- "enable_social_login": 1,
- "custom_base_url": 1,
- "icon":"/assets/frappe/images/favicon.png",
- "redirect_url": "/api/method/frappe.www.login.login_via_frappe",
- "api_endpoint": "/api/method/frappe.integrations.oauth2.openid_profile",
- "api_endpoint_args":None,
- "authorize_url": "/api/method/frappe.integrations.oauth2.authorize",
- "access_token_url": "/api/method/frappe.integrations.oauth2.get_token",
- "auth_url_data": json.dumps({
- "response_type": "code",
- "scope": "openid"
- })
-}
-```
-
-### Add provider key in exact same type case in options of `social_login_provider` select field on `Social Login Key` DocType. e.g. `Frappe`
-
-Once the user adds a social login provider and enables it the `Authorization Code` is sent back by the provider api server on to the redirect_url mentioned on the same server. You will have to add a whitelisted method allowing guest access in `frappe.integrations.oauth2_logins`. e.g. `login_via_office365`
-
-There many implementations of OAuth 2.0 + OpenID Connect. Here we'll discuss two ways of accessing openid information.
-
-#### User Creation via OpenID Profile Endpoint
-
-example:
-
-```
-@frappe.whitelist(allow_guest=True)
-def login_via_frappe(code, state):
- login_via_oauth2("frappe", code, state, decoder=json.loads)
-```
-
-#### User Creation via id_token
-
-example:
-
-```
-@frappe.whitelist(allow_guest=True)
-def login_via_office365(code, state):
- login_via_oauth2_id_token("office_365", code, state, decoder=json.loads)
-```
diff --git a/frappe/docs/user/en/guides/app-development/custom-module-icon.md b/frappe/docs/user/en/guides/app-development/custom-module-icon.md
deleted file mode 100755
index 4a9903fbf7..0000000000
--- a/frappe/docs/user/en/guides/app-development/custom-module-icon.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Custom Module Icon
-
-If you want to create a custom icon for your module, you will have to create an SVG file for your module and set the path to this file in the `desktop/config.py` of your app.
-
-Alert Dialog is used for showing non-obstructive messages.
-
-It has 2 parameters:
-
-- **txt:** The message to be shown in the `Alert Dialog`
-- **seconds:** The duration that the message will be displayed. The default is `3 seconds`.
-
-### Example
-
- show_alert('Hi, do you have a new message', 5);
-
----
-
-## Prompt Dialog
-
-
-
-Prompt Dialog is used for collecting data from users.
-
-It has 4 parameters:
-
-- **fields:** a list with the fields objects
-- **callback:** a function to process the data in the dialog
-- **title:** the title of the dialog
-- **primary_label:** the label of the primary button
-
-### Example
-
- frappe.prompt([
- {'fieldname': 'birth', 'fieldtype': 'Date', 'label': 'Birth Date', 'reqd': 1}
- ],
- function(values){
- show_alert(values, 5);
- },
- 'Age verification',
- 'Subscribe me'
- )
-
----
-## Confirm Dialog
-
-
-
-Confirm Dialog is used to get a confirmation from the user before executing an action.
-
-It has 3 arguments:
-
-- **mesage:** The message to display in the dialog
-- **onyes:** The callback on positive confirmation
-- **oncancel:** The callback on negative confirmation
-
-### Example
-
- frappe.confirm(
- 'Are you sure to leave this page?',
- function(){
- window.close();
- },
- function(){
- show_alert('Thanks for continue here!')
- }
- )
-
----
-
-## Message Print
-
-
-
-Message Print is used for showing information to users.
-
-It has 2 arguments:
-
-- **message:** The message to display. It can be a HTML string
-- **title:** The title of the dialog
-
-### Example
-
- msgprint("Server Status"
- + "
-
-You can extend and build your own custom dialogs using `frappe.ui.Dialog`
-
-### Example
-
- var d = new frappe.ui.Dialog({
- 'fields': [
- {'fieldname': 'ht', 'fieldtype': 'HTML'},
- {'fieldname': 'today', 'fieldtype': 'Date', 'default': frappe.datetime.nowdate()}
- ],
- primary_action: function(){
- d.hide();
- show_alert(d.get_values());
- }
- });
- d.fields_dict.ht.$wrapper.html('Hello World');
- d.show();
-
-
-
-
-
diff --git a/frappe/docs/user/en/guides/app-development/executing-code-on-doctype-events.md b/frappe/docs/user/en/guides/app-development/executing-code-on-doctype-events.md
deleted file mode 100755
index ff03f85236..0000000000
--- a/frappe/docs/user/en/guides/app-development/executing-code-on-doctype-events.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Executing Code On Doctype Events
-
-To execute code when a DocType is inserted, validated (before saving), updated, submitted, cancelled, deleted, you must write in the DocType's controller module.
-
-#### 1. Controller Module
-
-The controller module exists in the `doctype` folder in the Module of the `DocType`. For example, the controller for **ToDo** exists in `frappe/desk/doctype/todo/todo.py` (version 5). A controller template is created when the DocType is created. which looks like
-
- from __future__ import unicode_literals
-
- import frappe
- from frappe.model.document import Document
-
- class CustomType(Document):
- pass
-
-#### 2. Document Properties
-
-All the fields and child tables are available to the class as attributes. For example the **name** property is `self.name`
-
-#### 3. Adding Methods
-
-In this module, you can add standard methods to the class that are called when a document of that type is created. Standard Handlers are:
-
-1. `autoname`: Called while naming. You can set the `self.name` property in the method.
-1. `before_insert`: Called before a document is inserted.
-1. `validate`: Called before document is saved. You can throw an exception if you don't want the document to be saved
-1. `on_update`: Called after the document is inserted or updated in the database.
-1. `on_submit`: Called after submission.
-1. `on_cancel`: Called after cancellation.
-1. `on_trash`: Called after document is deleted.
diff --git a/frappe/docs/user/en/guides/app-development/exporting-customizations.md b/frappe/docs/user/en/guides/app-development/exporting-customizations.md
deleted file mode 100644
index 7010a74d18..0000000000
--- a/frappe/docs/user/en/guides/app-development/exporting-customizations.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Exporting Customizations to your App
-
-A common use case is to extend a DocType via Custom Fields and Property Setters for a particular app. To save these settings to an app, go to **Customize Form**
-
-You will see a button for **Export Customizations**
-
-
-
-Here you can select the module and whether you want these particular customizations to be synced after every update.
-
-The customizations will be exported to a new folder `custom` in the module folder of your app. The customizations will be saved by the name of the DocType
-
-
-
-When you do `bench update` or `bench migrate` these customizations will be synced to the app.
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md b/frappe/docs/user/en/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md
deleted file mode 100755
index ef430a7929..0000000000
--- a/frappe/docs/user/en/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Fetch a Field Value from a Document into a Transaction
-
-Let's say, there is a custom field "VAT Number" in Supplier, which should be fetched in Purchase Order.
-
-#### Steps:
-
-1. Create a Custom Field **VAT Number** for *Supplier* document with *Field Type* as **Data**.
-
-
-1. Create another Custom Field **VAT Number** for *Purchase Order* document, but in this case with *Field Type* as **Read Only** or check **Read Only** checkbox. Set the **Options** as `supplier.vat_number`.
-
-
-1. Go to the user menu and click "Reload".
-1. Now, on selection of Supplier in a new Purchase Order, **VAT Number** will be fetched automatically from the selected Supplier.
-
diff --git a/frappe/docs/user/en/guides/app-development/generating-docs.md b/frappe/docs/user/en/guides/app-development/generating-docs.md
deleted file mode 100755
index 70a2fba7b0..0000000000
--- a/frappe/docs/user/en/guides/app-development/generating-docs.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Generating Documentation Website for your App
-
-Frappe version 6.7 onwards includes a full-blown documentation generator so that you can easily create a website for your app that has both user docs and developers docs (auto-generated).
-
-Version 8.7 onwards, these will be generated in a target app.
-
-## Writing Docs
-
-### 1. Setting up docs
-
-The first step is to setup the docs folder. For that you must create a new file in your app `config/docs.py` if it is not auto-generated. In your `docs.py` file, add the following module properties.
-
-
- source_link = "https://github.com/[orgname]/[reponame]"
- headline = "This is what my app does"
- sub_heading = "Slightly more details with key features"
- long_description = """(long description in markdown)"""
-
- def get_context(context):
- # optional settings
-
- # context.brand_html = 'Brand info on the top left'
- # context.favicon = 'path to favicon'
- #
- # context.top_bar_items = [
- # {"label": "About", "url": context.docs_base_url + "/about"},
- # ]
-
- pass
-
-### 2. Add User Documentation
-
-To add user documentation, add folders and pages in your `/docs/user` folder in the same way you would build a website pages in the `www` folder.
-
-Some quick tips:
-
-1. Add your pages as `.md` or `.html` pages
-2. Optionally add `.css` files with the same name that will be automatically served
-3. Add index by adding `{index}`
-
-### 3. Linking
-
-While linking make sure you add `/docs` to all your links.
-
-
- {% raw %}Link Description{% endraw %}
-
-
-### 4. Adding Images
-
-You can add images in the `/docs/assets` folder. You can add links to the images as follows:
-
- {% raw %}{%= addr_list[i].display %}
-{%= __("No address added yet.") %}
- {% } %}{% endraw %} - - - - - \ No newline at end of file diff --git a/frappe/docs/user/en/guides/automated-testing/__init__.py b/frappe/docs/user/en/guides/automated-testing/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/docs/user/en/guides/automated-testing/index.md b/frappe/docs/user/en/guides/automated-testing/index.md deleted file mode 100644 index 372d90427e..0000000000 --- a/frappe/docs/user/en/guides/automated-testing/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Automated Testing - -Frappe Provides you a test framework to write and execute tests that can be run directly on a Continuous Integration Tool like Travis - -You can write server-side unit tests or UI tests - -{index} \ No newline at end of file diff --git a/frappe/docs/user/en/guides/automated-testing/index.txt b/frappe/docs/user/en/guides/automated-testing/index.txt deleted file mode 100644 index 7d40d39f8a..0000000000 --- a/frappe/docs/user/en/guides/automated-testing/index.txt +++ /dev/null @@ -1,3 +0,0 @@ -unit-testing -integration-testing -qunit-testing \ No newline at end of file diff --git a/frappe/docs/user/en/guides/automated-testing/integration-testing.md b/frappe/docs/user/en/guides/automated-testing/integration-testing.md deleted file mode 100644 index fb99949a61..0000000000 --- a/frappe/docs/user/en/guides/automated-testing/integration-testing.md +++ /dev/null @@ -1,49 +0,0 @@ -# UI Integration Testing - -You can write integration tests using the Selenium Driver. `frappe.utils.selenium_driver` gives you a friendly API to write selenium based tests - -To write integration tests, create a standard test case by creating a python file starting with `test_` - -All integration tests will be run at the end of the unittests. - -### Example - -Here is an example of an integration test to check insertion of a To Do - - from __future__ import print_function - from frappe.utils.selenium_testdriver import TestDriver - import unittest - import time - - class TestToDo(unittest.TestCase): - def setUp(self): - self.driver = TestDriver() - - def test_todo(self): - self.driver.login() - - # list view - self.driver.set_route('List', 'ToDo') - - time.sleep(2) - - # new - self.driver.click_primary_action() - - time.sleep(2) - - # set input - self.driver.set_text_editor('description', 'hello') - - # save - self.driver.click_modal_primary_action() - - time.sleep(2) - - self.assertTrue(self.driver.get_visible_element('.result-list') - .find_element_by_css_selector('.list-item') - .find_element_by_css_selector('.list-id').text=='hello') - - def tearDown(self): - self.driver.close() - diff --git a/frappe/docs/user/en/guides/automated-testing/qunit-testing.md b/frappe/docs/user/en/guides/automated-testing/qunit-testing.md deleted file mode 100644 index 4287712808..0000000000 --- a/frappe/docs/user/en/guides/automated-testing/qunit-testing.md +++ /dev/null @@ -1,75 +0,0 @@ -# UI Testing with Frappe API - -You can either write integration tests, or directly write tests in Javascript using [QUnit](http://api.qunitjs.com/) - -QUnit helps you write UI tests using the UQuit framework and native frappe API. As you might have guessed, this is a much faster way of writing tests. - -### Test Runner - -To write QUnit based tests, add your tests in the `tests/ui` folder of your application. Your test files must begin with `test_` and end with `.js` extension. - -To run your files, you can use the **Test Runner**. The **Test Runner** gives a user interface to load all your QUnit tests and run them in the browser. - -In the CI, all QUnit tests are run by the **Test Runner** using `frappe/tests/test_test_runner.py` - -
-
-### Running Tests
-
-To run a Test Runner based test, use the `run-ui-tests` bench command by passing the name of the file you want to run.
-
- bench run-ui-tests --test frappe/tests/ui/test_list.js
-
-This will pass the filename to `test_test_runner.py` that will load the required JS in the browser and execute the tests
-
-### Debugging Tests
-
-To debug a test, you can open it in the **Test Runner** from your UI and run it manually to see where it is exactly failing.
-
-### Test Sequence
-
-In Frappe UI tests are run in a fixed sequence to ensure dependencies.
-
-The sequence in which the tests will be run will be in `tests/ui/tests.txt`
-file.
-
-### Running All UI Tests
-
-To run all UI tests together for your app run
-
- bench run-ui-tests --app [app_name]
-
-This will run all the files in your `tests/ui` folder one by one.
-
-### Example QUnit Test
-
-Here is the example of the To Do test in QUnit
-
- QUnit.test("Test quick entry", function(assert) {
- assert.expect(2);
- let done = assert.async();
- let random_text = frappe.utils.get_random(10);
-
- frappe.run_serially([
- () => frappe.set_route('List', 'ToDo'),
- () => frappe.new_doc('ToDo'),
- () => frappe.quick_entry.dialog.set_value('description', random_text),
- () => frappe.quick_entry.insert(),
- (doc) => {
- assert.ok(doc && !doc.__islocal);
- return frappe.set_route('Form', 'ToDo', doc.name);
- },
- () => assert.ok(cur_frm.doc.description.includes(random_text)),
-
- // Delete the created ToDo
- () => frappe.tests.click_page_head_item('Menu'),
- () => frappe.tests.click_dropdown_item('Delete'),
- () => frappe.tests.click_page_head_item('Yes'),
-
- () => done()
- ]);
- });
-
-### Writing Test Friendly Code with Promises
-
-Promises are a great way to write test-friendly code. If your method calls an aysnchronous call (ajax), then you should return an `Promise` object. While writing tests, if you encounter a function that does not return a `Promise` object, you should update the code to return a `Promise` object.
diff --git a/frappe/docs/user/en/guides/automated-testing/unit-testing.md b/frappe/docs/user/en/guides/automated-testing/unit-testing.md
deleted file mode 100755
index f1d3c5c623..0000000000
--- a/frappe/docs/user/en/guides/automated-testing/unit-testing.md
+++ /dev/null
@@ -1,199 +0,0 @@
-# Unit Testing
-
-## 1.Introduction
-
-Frappe provides some basic tooling to quickly write automated tests. There are some basic rules:
-
-1. Test can be anywhere in your repository but must begin with `test_` and should be a `.py` file.
-1. Tests must run on a site that starts with `test_`. This is to prevent accidental loss of data.
-1. Test stubs are automatically generated for new DocTypes.
-1. Frappe test runner will automatically build test records for dependant DocTypes identified by the `Link` type field (Foreign Key)
-1. Tests can be executed using `bench run-tests`
-1. For non-DocType tests, you can write simple unittests and prefix your file names with `test_`.
-
-## 2. Running Tests
-
-This function will build all the test dependencies and run your tests.
-You should run tests from "frappe_bench" folder. Without options all tests will be run.
-
- bench run-tests
-
-If you need more information about test execution - you can use verbose log level for bench.
-
- bench --verbose run-tests
-
-### Options:
-
- --app
-
-
-### Data Migration Mapping
-A Data Migration Mapping is a set of rules that specify field-to-field mapping.
-
-Make a new *Data Migration Mapping*. Call it 'Item to Atlas Item'.
-
-To define a mapping, we need to put in some values that define the structure of local and remote data.
-
-1. Remote Objectname: A name that identifies the remote object e.g Atlas Item
-1. Remote primary key: This is the name of the primary key for Atlas Item e.g id
-1. Local DocType: The DocType which will be used for syncing e.g Item
-1. Mapping Type: A Mapping can be of type 'Push' or 'Pull', depending on whether the data is to be mapped remotely or locally. It can also be 'Sync', which will perform both push and pull operations in a single cycle.
-1. Page Length: This defines the batch size of the sync.
-
-
-
-#### Specifying field mappings:
-
-The most basic form of a field mapping would be to specify fieldnames of the remote and local object. However, if the mapping is one-way (push or pull), the source field name can also take literal values in quotes (for e.g `"GadgetTech"`) and eval statements (for e.g `"eval:frappe.db.get_value('Company', 'Gadget Tech', 'default_currency')"`). For example, in the case of a push mapping, the local fieldname can be set to a string in quotes or an `eval` expression, instead of a field name from the local doctype. (This is not possible with a sync mapping, where both local and remote fieldnames serve as a target destination at a some point, and thus cannot be a literal value).
-
-Let's add the field mappings and save:
-
-
-
-We can now add the 'Item to Atlas Item' mapping to our Data Migration Plan and save it.
-
-
-
-#### Additional layer of control with pre and post process:
-
-Migrating data frequently involves more steps in addition to one-to-one mapping. For a Data Migration Mapping that is added to a Plan, a mapping module is generated in the module specified in that plan.
-
-In our case, an `item_to_atlas_item` module is created under the `data_migration_mapping` directory in `Integrations` (module for the 'Atlas Sync' plan).
-
-
-
-You can implement the `pre_process` (receives the source doc) and `post_process` (receives both source and target docs, as well as any additional arguments) methods, to extend the mapping process. Here's what some operations could look like:
-
-
-
-### Data Migration Connector
-Now, to connect to the remote source, we need to create a *Data Migration Connector*.
-
-
-
-We only have two connector types right now, let's add another Connector Type in the Data Migration Connector DocType.
-
-
-
-Now, let's create a new Data Migration Connector.
-
-
-
-As you can see we chose the Connector Type as Atlas. We also added the hostname, username and password for our Atlas instance so that we can authenticate.
-
-Now, we need to write the code for our connector so that we can actually push data.
-
-Create a new file called `atlas_connection.py` in `frappe/data_migration/doctype/data_migration_connector/connectors/` directory. Other connectors also live here.
-
-We just have to implement the `insert`, `update` and `delete` methods for our atlas connector. We also need to write the code to connect to our Atlas instance in the `__init__` method. Just see `frappe_connection.py` for reference.
-
-
-
-After creating the Atlas Connector, we also need to import it into `data_migration_connector.py`
-
-
-
-### Data Migration Run
-Now that we have our connector, the last thing to do is to create a new *Data Migration Run*.
-
-A Data Migration Run takes a Data Migration Plan and Data Migration Connector and execute the plan according to our configuration. It takes care of queueing, batching, delta updates and more.
-
-
-
-Just click Run. It will now push our Items to the remote Atlas instance and you can see the progress which updates in realtime.
-
-After a run is executed successfully, you cannot run it again. You will have to create another run and execute it.
-
-Data Migration Run will try to be as efficient as possible, so the next time you execute it, it will only push those items which were changed or failed in the last run.
-
-
-> Note: Data Migration Tool is still in beta. If you find any issues please report them [here](https://github.com/frappe/erpnext/issues)
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/deployment/__init__.py b/frappe/docs/user/en/guides/deployment/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/deployment/email-notifications-for-failed-background-jobs.md b/frappe/docs/user/en/guides/deployment/email-notifications-for-failed-background-jobs.md
deleted file mode 100755
index cd9f18e1e1..0000000000
--- a/frappe/docs/user/en/guides/deployment/email-notifications-for-failed-background-jobs.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Email Notifications For Failed Background Jobs
-
-
-
-Frappe handles failure of jobs in the following way,
1) If a job fails, (raises exception), it's logged in Scheduler Log and logs/worker.error.log.
2) Keeps a lock file and would not run anymore if lock file is there.
3) Raises LockTimeoutError in case the lock file is more than 10 minutes old.
You can configure email notification for scheduler errors. By writing a file, sites/common_site_config.json with content
{
- "celery_error_emails": {
- "ADMINS": [
- [
- "Person 1",
- "person1@example.com"
- ],
- [
- "Person2 ",
- "person2@example.com"
- ]
- ],
- "SERVER_EMAIL": "exceptions@example.com"
- }
-}
-
-One limitation is that it'll use local mailserver on port 25 to send the emails.
\ No newline at end of file diff --git a/frappe/docs/user/en/guides/deployment/how-to-enable-social-logins.md b/frappe/docs/user/en/guides/deployment/how-to-enable-social-logins.md deleted file mode 100755 index 44eb70ccc0..0000000000 --- a/frappe/docs/user/en/guides/deployment/how-to-enable-social-logins.md +++ /dev/null @@ -1,82 +0,0 @@ -# How To Enable Social Logins - -Use Facebook, Google or GitHub authentication to login to Frappe, and your users will be spared from remembering another password. - -The system uses the **Email Address** supplied by these services to **match with an existing user** in Frappe. If no such user is found, **a new user is created** of the default type **Website User**, if Signup is not disabled in Website Settings. Any System Manager can later change the user type from **Website User** to **System User**, so that the user can access the Desktop. - -#### Login screen with Social Logins enabled -
-
-To enable these signups, you need to have **Client ID** and **Client Secret** from these authentication services for your Frappe site. The Client ID and Client Secret are to be set in Website > Setup > Social Login Keys. Here are the steps to obtain these credentials.
-
-> Use **https://{{ yoursite }}** if your site is HTTPS enabled.
-
----
-
-### Facebook
-
-1. Go to [https://developers.facebook.com](https://developers.facebook.com)
-1. Click on Apps (topbar) > New App, fill in the form.
-1. Go to Settings > Basic, set the **Contact Email** and save the changes.
-1. Go to Settings > Advanced, find the field **Valid OAuth redirect URIs**, and enter:
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_facebook**
-1. Save the changes in Advance tab.
-1. Go to Status & Review and switch on "Do you want to make this app and all its live features available to the general public?"
-1. Go to Dashboard, click on the show button besides App Secret, and copy the App ID and App Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
----
-
-### Google
-
-1. Go to [https://console.developers.google.com](https://console.developers.google.com)
-1. Create a new Project and fill in the form.
-1. Click on APIs & Auth > Credentials > Create new Client ID
-1. Fill the form with:
- - Web Application
- - Authorized JavaScript origins as **http://{{ yoursite }}**
- - Authorized redirect URI as
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_google**
-1. Go to the section **Client ID for web application** and copy the Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
----
-
-### GitHub
-
-1. Go to [https://github.com/settings/applications](https://github.com/settings/applications)
-1. Click on **Register new application**
-1. Fill the form with:
- - Homepage URL as **http://{{ yoursite }}**
- - Authorization callback URL as
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_github**
-1. Click on Register application.
-1. Copy the generated Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
----
-
-### Office 365
-
-1. Go to [https://portal.azure.com](https://portal.azure.com)
-1. Create a new Azure Active Directory > App Registration.
-1. Click on New Application Registration
-1. Fill the form with:
- - Application Name
- - Application Type - Web app / API
- - Single Sign-on URL as
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_office365**
-1. Enable Multi Tenent for the added App.
-1. Go to the section **Application ID** and copy the Client ID and copy Client Secret by adding new password into Social Login Key
-
----
-
diff --git a/frappe/docs/user/en/guides/deployment/how-to-migrate-doctype-changes-to-production.md b/frappe/docs/user/en/guides/deployment/how-to-migrate-doctype-changes-to-production.md
deleted file mode 100755
index 4bf2ab9351..0000000000
--- a/frappe/docs/user/en/guides/deployment/how-to-migrate-doctype-changes-to-production.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# How To Migrate Doctype Changes To Production
-
-#### 1. DocType / Schema Changes
-
-If you are in `developer_mode`, the `.json` files for each **DocType** are automatically updated.
-
-When you update in your production using `--latest` or `bench update`, these changes are updated in the site's schema too!
-
-#### 2. Permissions
-
-Permissions do not get updated because the user may have changed them. To update permissions, you can add a new patch in the `patches.txt` of your app.
-
- execute:frappe.permissions.reset_perms("[docype]")
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/deployment/index.md b/frappe/docs/user/en/guides/deployment/index.md
deleted file mode 100755
index 9487bbf803..0000000000
--- a/frappe/docs/user/en/guides/deployment/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Deployment
-
-Deploying your apps on remote servers
-
-{index}
diff --git a/frappe/docs/user/en/guides/deployment/index.txt b/frappe/docs/user/en/guides/deployment/index.txt
deleted file mode 100755
index 7d11bf514a..0000000000
--- a/frappe/docs/user/en/guides/deployment/index.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-migrations
-how-to-migrate-doctype-changes-to-production
-email-notifications-for-failed-background-jobs
-how-to-enable-social-logins
diff --git a/frappe/docs/user/en/guides/deployment/migrations.md b/frappe/docs/user/en/guides/deployment/migrations.md
deleted file mode 100755
index c40a2a7c4b..0000000000
--- a/frappe/docs/user/en/guides/deployment/migrations.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Migrations
-
-A project often undergoes changes related to database schema during course of
-its life. It may also be required patch existing data. Frappe bundles tools to
-handle these schenarios.
-
-When you pull updates from any Frappe app (including Frappe), you should run
-`bench migrate` to apply schema changes and data migrations if any.
-
-## Schema changes
-
-You can edit a DocType to add, remove or change fields. On saving a DocType,
-a JSON file containing the DocType data is added to source tree of your app.
-When you add an app to a site, the DocTypes are installed using this JSON file.
-For making schema changes, it's required to set `developer_mode` in the
-configuration.
-
-On running a sync (`bench migrate`), doctypes in the system are synced to
-their latest version from the JSON files in the app.
-
-Note: Fields are soft deleted ie. the columns are not removed from the database
-table and however, they will not be visible in the documents. This is done to
-avoid any potential data loss situations and to allow you write related data
-migrations which might need values from deleted fields.
-
-Note: Frappe doesn't support reverse schema migrations.
-
-## Data Migrations
-
-On introducing data related changes, you might want to run one off scripts to
-change existing data to match expectations as per new code.
-
-To add a data migration to your code, you will have to write an `execute`
-function to a python module and add it to `patches.txt` of your app.
-
-It is recommended to make a file with a patch number and name in its path and
-add it to a patches package (directory) in your app. You can then add a line
-with dotted path to the patch module to `patches.txt`.
-
-The directory structure followed in Frappe is as below
-
-
- frappe
- └── patches
- └── 4_0
- └── my_awesome_patch.py
-
-The patch can be added to `patches.txt` by adding a line like
-
- frappe.patches.4_0.my_awesome_patch
-
-The metadata ie. DocType available in the execute function will be the latest as
-per JSON files in the apps. However, you will not be able to access metadata of
-any previous states of the system.
-
-#### One off Python statements
-
-You can also add one off python statements in `patches.txt` using the syntax,
- execute:{python statement}
-
-For example,
- execute:frappe.get_doc("User", "Guest").save()
-
-Note: All lines in patches.txt have to be unique. If you want to run a line
-twice, you can make it unique by adding a distinct comment.
-
-For Example,
-
- execute:frappe.installer.make_site_dirs() #2014-02-19
diff --git a/frappe/docs/user/en/guides/desk/__init__.py b/frappe/docs/user/en/guides/desk/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/desk/formatter_for_link_fields.md b/frappe/docs/user/en/guides/desk/formatter_for_link_fields.md
deleted file mode 100644
index 586477f32e..0000000000
--- a/frappe/docs/user/en/guides/desk/formatter_for_link_fields.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Formatter For Link Fields
-
-In case where a code and a name is maintained for an entity, (for example for Employee there may be an Employee Code and Employee Name) and we want to show both the ID and name in a link field, we can make a formatter.
-
-#### Example:
-
- frappe.form.link_formatters['Employee'] = function(value, doc) {
- if(doc.employee_name && doc.employee_name !== value) {
- return value + ': ' + doc.employee_name;
- } else {
- return value;
- }
- }
-
-Notes:
-
-1. Both the primary key (`name) and the descriptive name (e.g. `employee_name`) must be present in the document. The descriptive name field could be hidden
-1. This needs to be loaded before the document is loaded and can be re-used for all forms. You can also add it in `build.json`
-
diff --git a/frappe/docs/user/en/guides/desk/index.md b/frappe/docs/user/en/guides/desk/index.md
deleted file mode 100755
index c32fa85913..0000000000
--- a/frappe/docs/user/en/guides/desk/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Desk Customization
-
-Articles related to customization of Frappe Desk
-
-{index}
diff --git a/frappe/docs/user/en/guides/desk/making_charts.md b/frappe/docs/user/en/guides/desk/making_charts.md
deleted file mode 100644
index d73ebdc903..0000000000
--- a/frappe/docs/user/en/guides/desk/making_charts.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Making Charts
-
-[**Frappe Charts**](https://frappe.github.io/charts/) enables you to render simple line, bar or percentage graphs for single or multiple discreet sets of data points. You can also set special checkpoint values and summary stats. Check out the docs at https://frappe.github.io/charts/ to learn more.
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/index.md b/frappe/docs/user/en/guides/index.md
deleted file mode 100755
index 9eeed8baa8..0000000000
--- a/frappe/docs/user/en/guides/index.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Guides
-
-The Frappe Framework is a server side and client side framework and is built with the philosophy make it a "battries included" framework. It has libraries and API for everything from authentication to reports.
-
-In this section we will try and cover the most commonly used API on client and server side that will be useful for app development.
-
-{index}
diff --git a/frappe/docs/user/en/guides/index.txt b/frappe/docs/user/en/guides/index.txt
deleted file mode 100755
index d47785065a..0000000000
--- a/frappe/docs/user/en/guides/index.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-basics
-app-development
-deployment
-reports-and-printing
-portal-development
-data
-integration
diff --git a/frappe/docs/user/en/guides/integration/__init__.py b/frappe/docs/user/en/guides/integration/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/integration/google_calendar.md b/frappe/docs/user/en/guides/integration/google_calendar.md
deleted file mode 100644
index e77a89cb45..0000000000
--- a/frappe/docs/user/en/guides/integration/google_calendar.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Google Calendar Integration
-
-Frappe provides an integration with Google Calendar in order for all users to synchronize their events.
-
-## Setup
-
-In order to allow a synchronization with Google Calendar you need to connect to your application in Google Cloud Platform and then create an account for each of your users:
-
-1. Create a new project on Google Cloud Platform and generate new OAuth 2.0 credentials
-2. Add `https://{yoursite}` to Authorized JavaScript origins
-3. Add `https://{yoursite}?cmd=frappe.integrations.doctype.gcalendar_settings.gcalendar_settings.google_callback` as an authorized redirect URI
-4. Add your Client ID and Client Secret in the Gcalendar application: in "Google Calendar>GCalendar Settings"
-
-Once this step is successfully completed, each user can create its account in "Google Calendar>GCalendar Account"
-They will be requested to authorize your Google application to access their calendar information and will then be redirected to a success page.
-
-
-## Features
-
-1. Creation of a new calendar in Google Calendar
- - Each user can choose a dedicated name for its Google Calendar.
-
-2. Events synchronization from ERPNext to GCalendar
- - All events created in ERPNext are created in Google Calendar.
- - Recurring events are created as recurring events too.
-
- - Events modified in ERPNext are updated in Google Calendar.
-
- - Events deleted in ERPNext are deleted in Google Calendar.
-
-3. Events synchronization from GCalendar to ERPNext
- - Events created in Google Calendar are created in ERPNext.
- - Events updated in Google Calendar are updated in ERPNext.
-
-The synchronization module follows ERPNext's authorization rule:
-
-an event will be only synchronized if it is public or if the user his the owner.
-
-
-## Limitations
-
-Currently, if an instance of a recurring event is cancelled in Google Calendar, this change will not be reflected in ERPNext.
diff --git a/frappe/docs/user/en/guides/integration/google_gsuite.md b/frappe/docs/user/en/guides/integration/google_gsuite.md
deleted file mode 100644
index d44773c271..0000000000
--- a/frappe/docs/user/en/guides/integration/google_gsuite.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# Google GSuite
-
-Frappe allows you to use Google's Gsuite documents as templates, generate from them a new Gsuite document that will be placed in a chosen folder. Variables can populated in both the body and the name of the Gsuite document using the standard Jinja2 format. Once generated, the Gsuite document will remain associate to the DocType as an attachment.
-
-The Gsuite document is generated by invoking the "attach file" function of any DocType.
-
-A common use cases of this features is populating contracts from customer/employee/supplier data.
-
-## 1. Enable integration with Google Gsuite
-
-### 1.1 Publish Google apps script
-
-*If you will use the default script you can go to 1.2*
-
-1. Go to [https://script.google.com](https://script.google.com)
-1. Create a new Project. Click on **File > New > Project**
-1. Copy the code of **Desk > Explore > Integrations > GSuite Settings > Google Apps Script** to clipboard and paste to an empty Code.gs in script.google.com
-1. Save the Project. Click on **File > Save > Enter new project name**
-1. Deploy the app. Click on **Publish > Deploy as web app**
-1. Copy "Current web app URL" into **Desk > Explore > Integrations > GSuite Settings > Script URL**
-1. Click on OK but don't close the script
-
-### 1.2
-
-### 1.2 Get Google access
-
-1. Go to your Google project console and select your project or create a new one. [https://console.developers.google.com](https://console.developers.google.com)
-1. In Library click on **Google Drive API** and **Enable**
-1. Click on **Credentials > Create Credentials > OAuth Client ID**
-1. Fill the form with:
- - Web Application
- - Authorized redirect URI as `http://{{ yoursite }}/?cmd=frappe.integrations.doctype.gsuite_settings.gsuite_settings.gsuite_callback`
-1. Copy the Client ID and Client Secret into **Desk > Explore > Integrations > GSuite Settings > Client ID and Client Secret**
-1. Save GSuite Settings
-
-### 1.3 Test Script
-
-1. Click on **Allow GSuite Access** and you will be redirected to select the user and give access. If you have any error please verify you are using the correct Authorized Redirect URI.
- You can find the complete URI Gsuite redirected to in the final part of the URL of the error page. Check that the protocol `http://` or `https://` matches the one your using.
-1. Click on **Run Script test**. You should be asked to give permission.
-
-## 2. GSuite Templates
-
-### 2.1 Google Document as Template
-
-1. Create a new Document or use one you already have. Set variables as you need. Variables are defined with `{{VARIABLE}}` with ***VARIABLE*** is the field of your Doctype
-
- For Example,
- If this document will be used to employee and the Doctype has the field ***name*** then you can use it in Google Docs ad `{{name}}`
-
-1. Get the ID of that Document from url of your document.
- For example: in this document url `https://docs.google.com/document/d/1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso/edit` the document ID is `1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso`
-
-1. Get the ID of the folder where you want to place the generated documents. (You can step this point if you want to place the generated documents in Google Drive root. )
-
- For example: in this folder url `https://drive.google.com/drive/u/0/folders/0BxmFzZZUHbgyQzVJNzY5eG5jbmc` the folder ID is `0BxmFzZZUHbgyQzVJNzY5eG5jbmc`
-
-### 2.2 Associate the Template to a Doctype
-
-1. Go to **Desk > Explore > Integrations > GSuite Templates > New**
-2. Fill the form with:
- - Template Name (Example: `Employee Contract`)
- - Related DocType (Example: `Employee`)
- - Template ID is the Document ID you get from your Google Docs (Example: `1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso`)
- - Document name is the name of the new files. You can use field from DocType (Example: `Employee Contract of {name}`)
- - Destination ID is the folder ID of your files created from this Template. (Example: `0BxmFzZZUHbgyQzVJNzY5eG5jbmc`)
-
-## 3. Create Documents
-
-1. Go to a Document you already have a Template for (Example: Employee > John Doe)
-2. Click on **Attach File**
-3. On **GSuite Document** section select the Template and click **Attach**
-4. You should see the generated document is already created and attached
-5. Clicking on the attached document will open it inside Gsuite
diff --git a/frappe/docs/user/en/guides/integration/how_to_setup_oauth.md b/frappe/docs/user/en/guides/integration/how_to_setup_oauth.md
deleted file mode 100644
index 37fd85de85..0000000000
--- a/frappe/docs/user/en/guides/integration/how_to_setup_oauth.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# How to setup oauth?
-
-OAuth 2.0 provider based on oauthlib is built into frappe. Third party apps can now access resources of users based on Frappe Role and User permission system. To setup an app to access
-
-## OAuth defines four roles
-
-#### resource owner
-An entity capable of granting access to a protected resource. When the resource owner is a person, it is referred to as an end-user.
-
-#### resource server
-The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens.
-
-#### client
-An application making protected resource requests on behalf of the resource owner and with its authorization. The term "client" does not imply any particular implementation characteristics (e.g.,
-whether the application executes on a server, a desktop, or other devices).
-
-#### authorization server
-The server issuing access tokens to the client after successfully authenticating the resource owner and obtaining authorization.
-
-## Setup OAuth Provider
-
-System Managers can setup behavior of confirmation message as `Force` or `Auto` in OAuth Provider Settings.
-If Force is selected the system will always ask for user's confirmation. If Auto is selected system asks for the confirmation only if there are no active tokens for the user.
-
-Go to
-
-> Setup > Integrations > OAuth Provider Settings
-
-
-
-### Add Primary Server
-
-This is the main server hosting all the users. e.g. `https://frappe.io`. To setup this as the main server, go to *Setup* > *Integrations* > *Social Login Keys* and enter `https://frappe.io` in the field `Frappe Server URL`. This URL repeats in all other Frappe servers who connect to this server to authenticate. Effectively, this is the main Identity Provider (IDP).
-
-Under this server add as many `OAuth Client`(s) as required.
-
-## Add a Client App
-
-As a System Manager go to
-
-> Setup > Integrations > OAuth Client
-
-
-
-To add a client fill in the following details
-
-1. **App Name** : Enter App Name e.g. CAVS
-2. **Skip Authorization** : If this is checked, during authentication there won't be me any confirmation message
-3. **Scopes** : List of scopes shown to user along with confirmation message. scopes are separated by semicolon ';'
-4. **Redirect URIs** : List of Redirect URIs separated by semicolon ';'
-5. **Default Redirect URIs** : Default Redirect URI from list of Redirect URIs
-6. **Grant Type**: select `Authorization Code`
-7. **Response Type**: select `Code`
diff --git a/frappe/docs/user/en/guides/integration/index.md b/frappe/docs/user/en/guides/integration/index.md
deleted file mode 100755
index b97815866a..0000000000
--- a/frappe/docs/user/en/guides/integration/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Integrations
-
-{index}
diff --git a/frappe/docs/user/en/guides/integration/index.txt b/frappe/docs/user/en/guides/integration/index.txt
deleted file mode 100755
index 4aaf38daca..0000000000
--- a/frappe/docs/user/en/guides/integration/index.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-rest_api
-how_to_setup_oauth
-using_oauth
-openid_connect_and_frappe_social_login
-google_gsuite
-social_login_key
diff --git a/frappe/docs/user/en/guides/integration/openid_connect_and_frappe_social_login.md b/frappe/docs/user/en/guides/integration/openid_connect_and_frappe_social_login.md
deleted file mode 100644
index 8efb92fd8e..0000000000
--- a/frappe/docs/user/en/guides/integration/openid_connect_and_frappe_social_login.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# OpenID Connect and Frappe social login
-
-## OpenID Connect
-
-Frappe also uses Open ID connect essential standard for authenticating users. To get `id_token` with `access_token`, pass `openid` as the value for the scope parameter during authorization request.
-
-If the scope is `openid` the JSON response with `access_token` will also include a JSON Web Token (`id_token`) signed with `HS256` and `Client Secret`. The decoded `id_token` includes the `at_hash`.
-
-Example Bearer Token with scope `openid`
-
-```
-{
- "token_type": "Bearer",
- "id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJpc3MiOiJodHRwczovL21udGVjaG5pcXVlLmNvbSIsImF0X2hhc2giOiJOQlFXbExJUy1lQ1BXd1d4Y0EwaVpnIiwiYXVkIjoiYjg3NzJhZWQ1YyIsImV4cCI6MTQ3Nzk1NTYzMywic3ViIjoiNWFjNDE2NThkZjFiZTE1MjI4M2QxYTk0YjhmYzcwNDIifQ.1GRvhk5wNoR4GWoeQfleEDgtLS5nvj9nsO4xd8QE-Uk",
- "access_token": "ZJD04ldyyvjuAngjgBrgHwxcOig4vW",
- "scope": "openid",
- "expires_in": 3600,
- "refresh_token": "2pBTDTGhjzs2EWRkcNV1N67yw0nizS"
-}
-```
-
-## Frappe social login setup
-
-In this example there are 2 servers,
-
-### Primary Server
-This is the main server hosting all the users. e.g. `https://frappe.io`. To setup this as the main server, go to *Setup* > *Integrations* > *Social Login Keys* and enter `https://frappe.io` in the field `Frappe Server URL`. This URL repeats in all other Frappe servers who connect to this server to authenticate. Effectively, this is the main Identity Provider (IDP).
-
-Under this server add as many `OAuth Client`(s) as required. Because we are setting up one app server, add only one `OAuth Client`
-
-### Frappe App Server
-This is the client connecting to the IDP. Go to *Setup* > *Integrations* > *Social Login Keys* on this server and add appropriate values to `Frappe Client ID` and `Frappe Client Secret` (refer to client added in primary server). As mentioned before keep the `Frappe Server URL` as `https://frappe.io`
-
-Now you will see Frappe icon on the login page. Click on this icon to login with account created in primary server (IDP) `https://frappe.io`
-
-**Note**: If `Skip Authorization` is checked while registering a client, page to allow or deny the granting access to resource is not shown. This can be used if the apps are internal to one organization and seamless user experience is needed.
-
-## Steps
-
-### Part 1 : on Frappe Identity Provider (IDP)
-
-Login to IDP
-
-
-Add OAuth Client on IDP
-
-
-Set Server URL on IDP
-
-
-### Part 2 : on Frappe App Server
-
-
-Set `Frappé Client ID` and `Frappé Client Secret` on App server (refer the client set on IDP)
-
-
-
-**Note**: Frappe Server URL is the main server where identities from your organization are stored.
-
-Login Screen on App Server (login with frappe)
-
-
-### Part 3 : Redirected on IDP
-
-login with user on IDP
-
-
-Confirm Access on IDP
-
-
-### Part 4 : Back on App Server
-
-Logged in on app server with ID from IDP
-
diff --git a/frappe/docs/user/en/guides/integration/rest_api.md b/frappe/docs/user/en/guides/integration/rest_api.md
deleted file mode 100755
index 1f78b19990..0000000000
--- a/frappe/docs/user/en/guides/integration/rest_api.md
+++ /dev/null
@@ -1,285 +0,0 @@
-# REST API
-
-Frappe ships with an HTTP API. There are two parts of this API.
-
-1. Remote Procedure Calls (RPC)
-2. REST
-
-## 1. RPC
-
-A request to an endpoint `/api/method/{dotted.path.to.function}` will call
-a whitelisted python function. A function can be whitelisted using the
-`frappe.whitelist` decorator.
-
-For example, Add the following to sample\_app/\_\_init\_\_.py
-
- @frappe.whitelist(allow_guest=True)
- def ping():
- return 'pong'
-
-GET http://frappe.local:8000**/api/method/sample_app.ping**
-
-_Response:_
-
- {
- "message": "pong"
- }
-
-
-## 2. REST
-
-All documents in Frappe are available via a RESTful API with prefix
-`/api/resource/`.
-
-### Login
-
-To login, you will have to send a POST request to the login method.
-
-POST http://frappe.local:8000**/api/method/login**
-
- usr=Administrator&pwd=admin
-
-_Response:_
-
- {
- "full_name": "Administrator",
- "message": "Logged In"
- }
-
-
-Try to make an authenticated request
-
-GET http://frappe.local:8000**/api/method/frappe.auth.get\_logged\_user**
-
-_Response:_
-
- {
- "message": "Administrator"
- }
-
-
-### Listing Documents
-
-To list documents, the URL endpoint is `/api/resource/{doctype}` and the
-expected HTTP verb is GET.
-
-Response is returned as JSON Object and the listing is an array in with the key `data`.
-
-GET http://frappe.local:8000**/api/resource/Person**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "000000012"
- },
- {
- "name": "000000008"
- }
- ]
- }
-
-
-#### Fields
-
-By default, only name field is included in the listing, to add more fields, you
-can pass the fields param to GET request. The param has to be a JSON array.
-
-GET http://frappe.local:8000**/api/resource/Person/?fields=["name", "first\_name"]**
-
-_Response:_
-
- {
- "data": [
- {
- "first_name": "Jane",
- "name": "000000012"
- },
- {
- "first_name": "John",
- "name": "000000008"
- }
- ]
- }
-
-
-#### Filters
-
-You can filter the listing using sql conditions by passing them as the `filters`
-GET param. Each condition is an array of the format, [{doctype}, {field},
-{operator}, {operand}].
-
-Eg, to filter persons with name Jane, pass a param `filters=[["Person", "first_name", "=", "Jane"]]`
-
-GET http://frappe.local:8000**/api/resource/Person/**
-
-_Response:_
- {
- "data": [
- {
- "name": "000000012"
- }
- ]
- }
-
-
-#### Pagination
-
-All listings are returned paginated by 20 items. To change the page size, you
-can pass `limit_page_length`. To request succesive pages, pass `limit_start` as
-per your `limit_page_length`.
-
-For Example, to request second page, pass `limit_start` as 20.
-
-GET http://frappe.local:8000**/api/resource/DocType**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "testdoc"
- },
- {
- "name": "Person"
- },
-
- ......
-
- {
- "name": "Website Template"
- }
- ]
- }
-
-
-GET http://frappe.local:8000**/api/resource/DocType?limit_start=20**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "Website Route"
- },
- {
- "name": "Version"
- },
- {
- "name": "Blog Post"
- },
-
- ......
-
- {
- "name": "Custom Field"
- }
- ]
- }
-
-
-### CRUD
-
-#### Create
-
-You can create a document by sending a `POST` request to the url, `/api/resource/{doctype}`.
-
-POST http://frappe.local:8000**/api/resource/Person**
-
-_Body_:
-
- data={"first_name": "Robert"}
-
-_Response:_
-
- {
- "data": {
- "first_name": "Robert",
- "last_name": null,
- "modified_by": "Administrator",
- "name": "000000051",
- "parent": null,
- "creation": "2014-05-04 17:22:38.037685",
- "modified": "2014-05-04 17:22:38.037685",
- "doctype": "Person",
- "idx": null,
- "parenttype": null,
- "owner": "Administrator",
- "docstatus": 0,
- "parentfield": null
- }
- }
-
-Note: `POST` requests are to be sent along with `X-Frappe-CSRF-Token:
-
-1. Select the Social Login Provider or select "Custom"
-2. If required for provider enter "Base URL"
-3. To enable check "Enable Social Login" to show Icon on login screen
-4. Also add Client ID and Client Secret as per provider.
-
-e.g. Social Login Key
-
-- **Social Login Provider** : `Frappe`
-- **Client ID** : `ABCDEFG`
-- **Client Secret** : `123456`
-- **Enable Social Login** : `Check`
-- **Base URL** : `https://erpnext.org` (required for some providers)
-
-#### Generating Client ID and Client Secret for providers
-
-- Creating a Google API Console project and client ID
-- Manually Build a Login Flow for Facebook
-- Creating an OAuth App for GitHub
-- Authorize access to web applications using OpenID Connect and Azure Active Directory
-- Create a Connected App on Salesforce
diff --git a/frappe/docs/user/en/guides/integration/using_oauth.md b/frappe/docs/user/en/guides/integration/using_oauth.md
deleted file mode 100644
index 48bb853d0a..0000000000
--- a/frappe/docs/user/en/guides/integration/using_oauth.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Using OAuth
-
-Once the client and provider settings are entered, following steps can be used to start using OAuth 2.0
-
-### Authorization Code Endpoint
-
-#### Authorization Request
-
-URL:
-```
-[GET] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.authorize
-```
-Params:
-```
-client_id =
-
-Click 'Allow' to receive authorization code in redirect uri.
-
-```
-http://localhost:3000/oauth_code?code=plkj2mqDLwaLJAgDBAkyR1W8Co08Ud
-```
-If user clicks 'Deny' receive error
-```
-http://localhost:3000/oauth_code?error=access_denied
-```
-
-### Token Endpoints
-
-#### Get Access Token
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.get_token
-```
-Params:
-```
-grant_type = "authorization_code"
-code =
-redirect_uri =
-client_id =
-```
-Response:
-```
-{
- "access_token": "pNO2DpTMHTcFHYUXwzs74k6idQBmnI",
- "token_type": "Bearer",
- "expires_in": 3600,
- "refresh_token": "cp74cxbbDgaxFuUZ8Usc7egYlhKbH1",
- "scope": "project"
-}
-```
-
-#### Refresh Access Token
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.get_token
-```
-Params:
-```
-grant_type = "refresh_token"
-refresh_token =
-redirect_uri =
-client_id =
-```
-Response:
-```
-{
- "access_token": "Ywz1iNk0b21iAmjWAYnFWT4CuudHD5",
- "token_type": "Bearer",
- "expires_in": 3600,
- "refresh_token": "PNux3Q8Citr3s9rl2zEsKuU1l8bSN5",
- "scope": "project"
-}
-```
-#### Revoke Token Endpoint
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.revoke_token
-```
-Params:
-```
-token =
-```
-Success Response
-```
-status : 200
-
-{"message": "success"}
-```
-Error Response:
-```
-status : 400
-
-{"message": "bad request"}
-```
-
-### Accessing Resource
-
-Add header `Authorizaton: Bearer ` to Frappe's REST API endpoints to access user's resource
diff --git a/frappe/docs/user/en/guides/integration/webhooks.md b/frappe/docs/user/en/guides/integration/webhooks.md
deleted file mode 100644
index d453791051..0000000000
--- a/frappe/docs/user/en/guides/integration/webhooks.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# Webhooks
-
-Webhooks are "user-defined HTTP callbacks". You can create webhook which triggers on Doc Event of the selected DocType. When the `doc_events` occurs, the source site makes an HTTP request to the URI configured for the webhook. Users can configure them to cause events on one site to invoke behaviour on another.
-
-#### Configure Webhook
-
-To add Webhook go to
-
-> Integrations > External Documents > Webhook
-
-Webhook
-
-
-
-1. Select the DocType for which hook needs to be triggered e.g. Note
-2. Select the DocEvent for which hook needs to be triggered e.g. on_trash
-3. Enter a valid request URL. On occurence of DocEvent, POST request with doc's json as data is made to the URL.
-4. Optionally you can add headers to the request to be made. Useful for sending api key if required.
-5. Optionally you can select fields and set its `key` to be sent as data json
-
-e.g. Webhook
-
-- **DocType** : `Quotation`
-- **Doc Event** : `on_update`
-- **Request URL** : `https://httpbin.org/post`
-- **Webhook Data** :
- 1. **Fieldname** : `name` and **Key** : `id`
- 2. **Fieldname** : `items` and **Key** : `lineItems`
-
-Note: if no headers or data is present, request will be made without any header or body
-
-Example response of request sent by frappe server on `Quotation` - `on_update` to https://httpbin.org/post:
-
-```
-{
- "args": {},
- "data": "{\"lineItems\": [{\"stock_qty\": 1.0, \"base_price_list_rate\": 1.0, \"image\": \"\", \"creation\": \"2017-09-14 13:41:58.373023\", \"base_amount\": 1.0, \"qty\": 1.0, \"margin_rate_or_amount\": 0.0, \"rate\": 1.0, \"owner\": \"Administrator\", \"stock_uom\": \"Unit\", \"base_net_amount\": 1.0, \"page_break\": 0, \"modified_by\": \"Administrator\", \"base_net_rate\": 1.0, \"discount_percentage\": 0.0, \"item_name\": \"I1\", \"amount\": 1.0, \"actual_qty\": 0.0, \"net_rate\": 1.0, \"conversion_factor\": 1.0, \"warehouse\": \"Finished Goods - R\", \"docstatus\": 0, \"prevdoc_docname\": null, \"uom\": \"Unit\", \"description\": \"I1\", \"parent\": \"QTN-00001\", \"brand\": null, \"gst_hsn_code\": null, \"base_rate\": 1.0, \"item_code\": \"I1\", \"projected_qty\": 0.0, \"margin_type\": \"\", \"doctype\": \"Quotation Item\", \"rate_with_margin\": 0.0, \"pricing_rule\": null, \"price_list_rate\": 1.0, \"name\": \"QUOD/00001\", \"idx\": 1, \"item_tax_rate\": \"{}\", \"item_group\": \"Products\", \"modified\": \"2017-09-14 17:09:51.239271\", \"parenttype\": \"Quotation\", \"customer_item_code\": null, \"net_amount\": 1.0, \"prevdoc_doctype\": null, \"parentfield\": \"items\"}], \"id\": \"QTN-00001\"}",
- "files": {},
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "close",
- "Content-Length": "1075",
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.1"
- },
- "json": {
- "id": "QTN-00001",
- "lineItems": [
- {
- "actual_qty": 0.0,
- "amount": 1.0,
- "base_amount": 1.0,
- "base_net_amount": 1.0,
- "base_net_rate": 1.0,
- "base_price_list_rate": 1.0,
- "base_rate": 1.0,
- "brand": null,
- "conversion_factor": 1.0,
- "creation": "2017-09-14 13:41:58.373023",
- "customer_item_code": null,
- "description": "I1",
- "discount_percentage": 0.0,
- "docstatus": 0,
- "doctype": "Quotation Item",
- "gst_hsn_code": null,
- "idx": 1,
- "image": "",
- "item_code": "I1",
- "item_group": "Products",
- "item_name": "I1",
- "item_tax_rate": "{}",
- "margin_rate_or_amount": 0.0,
- "margin_type": "",
- "modified": "2017-09-14 17:09:51.239271",
- "modified_by": "Administrator",
- "name": "QUOD/00001",
- "net_amount": 1.0,
- "net_rate": 1.0,
- "owner": "Administrator",
- "page_break": 0,
- "parent": "QTN-00001",
- "parentfield": "items",
- "parenttype": "Quotation",
- "prevdoc_docname": null,
- "prevdoc_doctype": null,
- "price_list_rate": 1.0,
- "pricing_rule": null,
- "projected_qty": 0.0,
- "qty": 1.0,
- "rate": 1.0,
- "rate_with_margin": 0.0,
- "stock_qty": 1.0,
- "stock_uom": "Unit",
- "uom": "Unit",
- "warehouse": "Finished Goods - R"
- }
- ]
- },
- "url": "https://httpbin.org/post"
-}
-```
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/portal-development/.md b/frappe/docs/user/en/guides/portal-development/.md
deleted file mode 100755
index 9136f09c29..0000000000
--- a/frappe/docs/user/en/guides/portal-development/.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Pages
-
-You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder.
-
-Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html`
diff --git a/frappe/docs/user/en/guides/portal-development/__init__.py b/frappe/docs/user/en/guides/portal-development/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/portal-development/adding-pages.md b/frappe/docs/user/en/guides/portal-development/adding-pages.md
deleted file mode 100755
index c9cd0191c3..0000000000
--- a/frappe/docs/user/en/guides/portal-development/adding-pages.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Adding Pages
-
-To add pages, just add `.html` or `.md` files in the `www` folder. The pages must only have the content, not the `` and `` tags.
-
-You can also write markdown pages
-
-### Index
-
-The first file in a folder must be called `index.md` or `index.html`
-
-Either file must be present for the system to make this a valid folder to build pages.
-
-### Markdown
-
- # This is a title
-
- This is some page content
- a [link](/link/to/page)
-
-### Adding Links
-
-Links urls to pages can be given without the `.html` extension for example `/home/link`
-
-### Title
-
-The first `` block if present will be the page title if not specified in a special tag. If no `` or title is specified, the file name will be the title.
-
-### Adding CSS
-
-You can also add a `.css` file with the same filename (e.g. `index.css` for `index.md`) that will be rendered with the page.
-
-### Special Tags
-
-1. `` will make the page render in Jinja
-2. `` will add a custom title
-3. `` will not add breadcrumbs in the page
-4. `` will enable caching (if you have used Jinja templating)
-
-{next}
diff --git a/frappe/docs/user/en/guides/portal-development/contents.md b/frappe/docs/user/en/guides/portal-development/contents.md
deleted file mode 100755
index fc2fa6936c..0000000000
--- a/frappe/docs/user/en/guides/portal-development/contents.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Table of Contents
-
-You can add a table of contents by adding `{index}` string on a new line.
-
-You can also make Previous and Next buttons by adding `previous` or `next` in `{}`
-
-### Showing contents
-
- # This is a title
-
- Hello paragraph
-
- ### Contents:
-
- {index}
-
-{next}
-
-### Ordering
-
-You can defining the ordering of pages in index by defining the index.txt file in your folder. The index.txt file must have the names (without extensions) of the pages in that folder indicating the order.
-
-For example for this folder the `index.txt` looks like:
-
- adding-pages
- ordering
- contents
- context
- building
diff --git a/frappe/docs/user/en/guides/portal-development/context.md b/frappe/docs/user/en/guides/portal-development/context.md
deleted file mode 100755
index d0fdc3cf63..0000000000
--- a/frappe/docs/user/en/guides/portal-development/context.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Dynamic Pages
-
-You can render pages dynamically using Jinja templating language. To query data, you can update that `context` object that you pass to the template.
-
-This can be done by adding a `.py` file with the same filename (e.g. `index.py` for `index.md`) with a `get_context` method.
-
-### Example
-
-If you want to show a page to see users, make a `users.html` and `users.py` file in the `www/` folder.
-
-In `users.py`:
-
- import frappe
- def get_context(context):
- context.users = frappe.db.sql("select first_name, last_name from `tabUser`")
-
-In `users.html`:
-
- List of Users
-
- {% for user in users %}
- - {{ user.first_name }} {{ user.last_name or "" }}
- {% endfor %}
-
-
-{next}
diff --git a/frappe/docs/user/en/guides/portal-development/generators.md b/frappe/docs/user/en/guides/portal-development/generators.md
deleted file mode 100644
index 78d83d20f6..0000000000
--- a/frappe/docs/user/en/guides/portal-development/generators.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# Generators
-
-If every document in a table (DocType) corresponds to a web-page, you can setup generators.
-
-To setup a generator you must:
-
-1. Add a field `route` that specifies the route of the page
-2. Add a condition field to indicate whether a page is viewable or not.
-3. Add the doctype name in `website_generators` in `hooks.py` of your app.
-4. Subclass the controller from `frappe.website.website_generator.WebsiteGenerator`
-5. Create a template for your page
-6. Add custom properties (context) for the template
-6. Customize route and list view
-
-Let us see this with the help of an example:
-
-## Example
-
-#### 1. Add fields
-
-We added `published`, `route` in the DocType
-
-**Note:** The field `route` is mandatory
-
-
-
-#### 2. Added Website Generator to Hooks
-
-Since Job Opening is in `erpnext`, we have added to the list of existing generator hooks:
-
- website_generators = ["Item Group", "Item", "Sales Partner", "Job Opening"]
-
-If the `website_generators` property does not exist in your hooks.py, add it!
-
-#### 3. Controller
-
-We add the `website` property to the **JobOpening** class in `job_opening.py`
-
-In `get_context`, `parents` property will indicate the breadcrumbs
-
- from frappe.website.website_generator import WebsiteGenerator
- from frappe import _
-
- # subclass from WebsiteGenerator, not Document
- class JobOpening(WebsiteGenerator):
- website = frappe._dict(
- template = "templates/generators/job_opening.html",
- condition_field = "published",
- page_title_field = "job_title",
- )
-
- def get_context(self, context):
- # show breadcrumbs
- context.parents = [{'name': 'jobs', 'title': _('All Jobs') }]
-
-**Note:** Once you do this, you should see the "See in Website" link on the document form.
-
-#### 4. Add the template
-
-Add the template in `erpnext/templates/generators/job_opening.html`
-
- {% raw %}{% extends "templates/web.html" %}
-
- {% block breadcrumbs %}
- {% include "templates/includes/breadcrumbs.html" %}
- {% endblock %}
-
- {% block header %}
- {{ job_title }}
- {% endblock %}
-
- {% block page_content %}
-
- {{ description }}
-
-
- {{ _("Apply Now") }}
-
- {% endblock %}{% endraw %}
-
-#### 5. Customizing List View
-
-If you add a method `get_list_view` in the controller file (job_opening.py), you can set properties for the listview
-
- def get_list_context(context):
- context.title = _("Jobs")
- context.introduction = _('Current Job Openings')
-{next}
diff --git a/frappe/docs/user/en/guides/portal-development/index.md b/frappe/docs/user/en/guides/portal-development/index.md
deleted file mode 100755
index a9aaab4312..0000000000
--- a/frappe/docs/user/en/guides/portal-development/index.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Making Portals
-
-Frappe has powerful tools to build portals where pages can be dynamically generated using templates (Jinja) and users can be shown records after login
-
-#### Adding Pages
-
-You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder.
-
-Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html`
-
-#### Views after Login
-
-After logging in, the user sees a "My Account" page `/me` where user can access certain documents that are shown via a menu
-
-The user can view records based on permissions and also add / edit them with **Web Forms**
-
-{index}
diff --git a/frappe/docs/user/en/guides/portal-development/index.txt b/frappe/docs/user/en/guides/portal-development/index.txt
deleted file mode 100755
index c0822bc8b0..0000000000
--- a/frappe/docs/user/en/guides/portal-development/index.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-adding-pages
-context
-generators
-contents
-web-forms
-ordering
-portal-roles
diff --git a/frappe/docs/user/en/guides/portal-development/ordering.md b/frappe/docs/user/en/guides/portal-development/ordering.md
deleted file mode 100755
index 179951739e..0000000000
--- a/frappe/docs/user/en/guides/portal-development/ordering.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Ordering
-
-You can defining the ordering of pages in index by defining the index.txt file in your folder. The index.txt file must have the names (without extensions) of the pages in that folder indicating the order.
-
-For example for this folder the `index.txt` looks like:
-
- adding-pages
- ordering
- contents
- context
- building
-
-{next}
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/portal-development/portal-roles.md b/frappe/docs/user/en/guides/portal-development/portal-roles.md
deleted file mode 100644
index d3f5be7287..0000000000
--- a/frappe/docs/user/en/guides/portal-development/portal-roles.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Portal Roles
-
-Version: 7.1+
-
-Roles can be assigned to Website Users and they will see menu based on their role
-
-1. A default role can be set in **Portal Settings**
-1. Each Portal Menu Item can have a role associated with it. If that role is set, then only those users having that role can see that menu item
-1. Rules can be set for default roles that will be set on default users on hooks
-
-
-
-#### Rules for Default Role
-
-For example if the Email Address matches with a contact id, then set role Customer or Supplier:
-
- default_roles = [
- {'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(customer, "")': ('!=', '')}},
- {'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(supplier, "")': ('!=', '')}},
- {'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'}
- ]
-
-
diff --git a/frappe/docs/user/en/guides/portal-development/web-forms.md b/frappe/docs/user/en/guides/portal-development/web-forms.md
deleted file mode 100644
index 533790952e..0000000000
--- a/frappe/docs/user/en/guides/portal-development/web-forms.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Customizing Web Forms
-
-Web Forms are a powerful way to add forms to your website. Web forms are powerful and scriptable and from Version 7.1+ they also include tables, paging and other utilities
-
-
-
-### Standard Web Forms
-
-If you check on the "Is Standard" checkbox, a new folder will be created in the `module` of the Web Form for that web form. In this folder, you will see a `.py` and `.js` file that you can customize the web form with.
-
-{next}
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/reports-and-printing/__init__.py b/frappe/docs/user/en/guides/reports-and-printing/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md b/frappe/docs/user/en/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md
deleted file mode 100755
index afe87c04f8..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Getting Information From Another Document In Print Format
-
-In a print format, you can get data from another document. For example in if you have a fields called `sales_order` in Sales Invoice, then you can get the sales order details using `frappe.get_doc`:
-
-{% raw %}
- {% set sales_order_doc = frappe.get_doc("Sales Order", sales_order) %}
-
- {{ sales_order_doc.customer }}
-{% endraw %}
diff --git a/frappe/docs/user/en/guides/reports-and-printing/how-to-make-query-report.md b/frappe/docs/user/en/guides/reports-and-printing/how-to-make-query-report.md
deleted file mode 100755
index b6ff813cbb..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/how-to-make-query-report.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# How To Make Query Report
-
-You can create tabulated reports using complex SQL queries by creating a new Report. These reports can be created by a System Manager and are stored in the Database
-
-> Note: You will need System Manager Permissions for this.
-
-To create a new Query Report:
-
-### 1. Create a new Report
-
-
-
-1. Set type as "Query Report"
-1. Set the reference DocType - Users that have access to the reference DocType will have access to the report
-1. Set the module - The report will appear in the "Custom Reports" section of the module.
-1. Add your Query
-
-### 2. Set the Query
-
-You can define complex queries such as:
-
-
- SELECT
- `tabWork Order`.name as "Work Order:Link/Work Order:200",
- `tabWork Order`.creation as "Date:Date:120",
- `tabWork Order`.production_item as "Item:Link/Item:150",
- `tabWork Order`.qty as "To Produce:Int:100",
- `tabWork Order`.produced_qty as "Produced:Int:100"
- FROM
- `tabWork Order`
- WHERE
- `tabWork Order`.docstatus=1
- AND ifnull(`tabWork Order`.produced_qty,0) < `tabWork Order`.qty
- AND EXISTS (SELECT name from `tabStock Entry` where work_order =`tabWork Order`.name)
-
-1. To format the columns, set labels for each column in the format: [Label]:[Field Type]/[Options]:[Width]
-
-### 3. Check the Report
-
-
-
-### 4. Advanced (adding filters)
-
-If you are making a standard report, you can add filters in your query report just like [script reports](https://frappe.io/docs/user/en/guides/reports-and-printing/how-to-make-script-reports) by adding a `.js` file in your query report folder. To include filters in your query, use `%(filter_key)s` where your filter value will be shown.
-
-For example
-
- SELECT ... FROM ... WHERE item_code = %(item_code)s ORDER BY ...
-
----
-
-### Note: Standard Script Report
-
-If you are developing a standard report for an app, make sure to set "Is Standard" as "Yes"
-
-
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/reports-and-printing/how-to-make-script-reports.md b/frappe/docs/user/en/guides/reports-and-printing/how-to-make-script-reports.md
deleted file mode 100755
index 74479a8b9c..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/how-to-make-script-reports.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Script Report
-
-You can create tabulated reports using server side scripts by creating a new Report.
-
-> Note: You will need Administrator Permissions for this.
-
-Since these reports give you unrestricted access via Python scripts, they can only be created by Administrators. The script part of the report becomes a part of the repository of the application. If you have not created an app, [read this](https://frappe.io/docs/user/en/guides/app-development/).
-
-> Note: You must be in [Developer Mode](https://frappe.io/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe) to do this
-
-### 1. Create a new Report
-
-
-
-1. Set Report Type as "Script Report"
-1. Set "Is Standard" as "Yes"
-1. Select the Module in which you want to add this report
-1. In the module folder (for example if it is Accounts in ERPnext the folder will be `erpnext/accounts/report/[report-name]`) you will see that templates for the report files will be created.
-1. In the `.js` file, you can set filters for the reports
-1. In the `.py` file, you can write the script that will generate the report
-
-### 2. Add Filters
-
-You can add filters in the `.js`. See an example below:
-
- frappe.query_reports["Accounts Receivable"] = {
- "filters": [
- {
- "fieldname":"company",
- "label": __("Company"),
- "fieldtype": "Link",
- "options": "Company",
- "default": frappe.defaults.get_user_default("company")
- },
- ]
- }
-
-1. These properties are the same as you would set in a DocField in a DocType
-
-### 3. Add the Script
-
-In the `.py` file you can add the script for generating the report.
-
-1. In the `execute` method, two lists `columns` and `data` are returned
-2. Columns must be a list of labels in the same format as query report. **[Label]:[Field Type]/[Options]:[Width]**. For example `Item:Link/Item:150`
-3. You can use all server side modules to build your report.
-4. For example see existing reports. ([Balance Sheet](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/balance_sheet/balance_sheet.py))
-
-### 4. Commit and Push the app
-
-Don't forget to commit and push your app.
diff --git a/frappe/docs/user/en/guides/reports-and-printing/index.md b/frappe/docs/user/en/guides/reports-and-printing/index.md
deleted file mode 100755
index 42a169f9f0..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Reports and Printing
-
-{index}
diff --git a/frappe/docs/user/en/guides/reports-and-printing/index.txt b/frappe/docs/user/en/guides/reports-and-printing/index.txt
deleted file mode 100755
index ec34e2b102..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/index.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-how-to-make-script-reports
-how-to-make-query-report
-getting-information-from-another-document-in-print-format
-where-do-i-find-standard-print-formats
-print-format-for-reports
diff --git a/frappe/docs/user/en/guides/reports-and-printing/print-format-for-reports.md b/frappe/docs/user/en/guides/reports-and-printing/print-format-for-reports.md
deleted file mode 100755
index f663816757..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/print-format-for-reports.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Report Print Formats
-
-In version 4.1 we introduce Report Print Formats. These are HTML templates that you can use to format Query Report data for printing.
-
-### 1. Creating New Print Formats
-
-To create a new Print Format, just drop in a `.html` file in the folder of the query report. For example, for the [General Ledger](https://github.com/frappe/erpnext/tree/develop/erpnext/accounts/report/general_ledger) report in ERPNext, you can drop in a file called `general_ledger.html` along side the `.js` and `.py` files.
-
-##### Tree Of `erpnext/accounts/general_ledger`
-
- general_ledger/
- ├── __init__.py
- ├── general_ledger.html
- ├── general_ledger.js
- ├── general_ledger.json
- └── general_ledger.py
-
-
-### 2. Templating
-
-For templating, we use an adapted version of [John Resig's microtemplating script](http://ejohn.org/blog/javascript-micro-templating/). If you know Javascript, it is very easy to follow this templating language.
-
-##### Here are some examples (from John Resig's Blog):
-
-Example: Properities:
-
- ">
-
-
-
-
-
- <%=from_user%>: <%=text%>
-
-
-
-Example: Code structures, Loops
-
- <% for ( var i = 0; i < users.length; i++ ) { %>
-
<%=users[i].name%>
- <% } %>
-
-> **Note**: It is important to note that you should not use single quotes (') in your template as the engine cannot handle them effectively.
-
-### 3. Data
-
-Data is available to the template as:
-
-- `data`: this is a list of records, with each record as an object with slugified properties from labels. For example "Posting Date" becomes "posting_date"
-- `filters`: filters set in the report
-- `report`: reportview object
-
-### 4. Example
-
-Here is how the General Ledger Report is built:
-
-[General Ledger Print Format Template](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/general_ledger/general_ledger.html)
-
-Here is what the report looks like:
-
-
-
-##### Comments:
-
-1. [Bootstrap Stylesheet](http://getbootstrap.com) is pre-loaded.
-1. You can use all global functions like `fmt_money` and dateutil.
-1. Translatable strings should be written as `__("text")`
-1. You can create modules and import using `{% raw %}{% include "templates/includes/formats/common_format" %}{% endraw %}`
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/en/guides/reports-and-printing/where-do-i-find-standard-print-formats.md b/frappe/docs/user/en/guides/reports-and-printing/where-do-i-find-standard-print-formats.md
deleted file mode 100755
index c1816751dd..0000000000
--- a/frappe/docs/user/en/guides/reports-and-printing/where-do-i-find-standard-print-formats.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Where Do I Find Standard Print Formats
-
-Standard Print formats are auto generated from the layout of the DocType. You can customize the standard format by
-
-
-
-1. Customizing Standard Print
-Go to Setup > Customize > Customize Form View and you can:
-
-
- - Re-arranging fields by dragging and dropping
- - Add static elements by adding HTML type fields and adding your HTML in Options
-
-
- - Hiding fields by setting the Print Hide property
-
-
-
-2. Creating new layouts based on Print Formats
-
-As there are not templates that are generated for standard Print Formats, you will have to create new templates from scratch using the Jinja Templating Language via
-Setup > Printing and Branding > Print Format
-
-
-
- - See Print Format help.
-
-
- - You can use the Bootstrap CSS framework to layout your print formats
-
-
-
-
-Tip: You can import Standard Template macros for building your print formats.
-
-
-Example, adding the standard header:
-
-
-{% raw %}{%- from "templates/print_formats/standard_macros.html" import add_header -%}
-{{ add_header() }}{% endraw %}
-
diff --git a/frappe/docs/user/en/index.md b/frappe/docs/user/en/index.md
deleted file mode 100755
index a25785e59e..0000000000
--- a/frappe/docs/user/en/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Develop Apps with Frappe
-
-{index}
diff --git a/frappe/docs/user/en/index.txt b/frappe/docs/user/en/index.txt
deleted file mode 100755
index 85c302b8cf..0000000000
--- a/frappe/docs/user/en/index.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial
-bench
-guides
-videos
diff --git a/frappe/docs/user/en/tutorial/__init__.py b/frappe/docs/user/en/tutorial/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/tutorial/app.md b/frappe/docs/user/en/tutorial/app.md
deleted file mode 100755
index e338ce8a17..0000000000
--- a/frappe/docs/user/en/tutorial/app.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# What is an Application
-
-An Application in Frappe is just a standard Python application. You can structure a Frappe Application the same way you structure a standard Python Application. For deployment, Frappe uses the standard Python Setuptools, so you can easily port and install the application on any machine.
-
-Frappe Framework provides a WSGI interface and for development you can use the built-in Werkzeug server. For implementing in production, we recommend using nginx and gunicorn.
-
-Frappe also has a multi-tenant architecture, grounds up. This means that you can run multiple "sites" in your setup, each could be serving a different set of applications and users. The database for each site is separate.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/before.md b/frappe/docs/user/en/tutorial/before.md
deleted file mode 100755
index 6806183fca..0000000000
--- a/frappe/docs/user/en/tutorial/before.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Before You Start
-
-A list of resources to help you get started with building apps using Frappe
-
----
-
-#### 1. Python
-
-Frappe uses Python (v2.7) for server-side programming. It is highly recommended to learn Python before you start building apps with Frappe.
-
-To write quality server-side code, you must also include automated tests.
-
-Resources:
-
- 1. [Codecademy Tutorial for Python](https://www.codecademy.com/learn/python)
- 1. [Official Python Tutorial](https://docs.python.org/2.7/tutorial/index.html)
- 1. [Basics of Test-driven development](http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137)
-
----
-
-#### 2. MariaDB / MySQL
-
-To create database-driven apps with Frappe, you must understand the basics of database management, like how to install, login, create new databases, and basic SQL queries.
-
-Resources:
-
- 1. [Codecademy Tutorial for SQL](https://www.codecademy.com/learn/learn-sql)
- 1. [A basic MySQL tutorial by DigitalOcean](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial)
- 1. [Getting started with MariaDB](https://mariadb.com/kb/en/mariadb/documentation/getting-started/)
-
----
-
-#### 3. HTML / CSS
-
-If you want to build user interfaces using Frappe, you will need to learn basic HTML / CSS and the Boostrap CSS Framework.
-
-Resources:
-
- 1. [Codecademy Tutorial for HTML/CSS](https://www.codecademy.com/learn/learn-html-css)
- 1. [Getting started with Bootstrap](https://getbootstrap.com/getting-started/)
-
----
-
-#### 4. JavaScript and jQuery
-
-To customize forms and create rich user interfaces, you should learn JavaScript and the popular library jQuery.
-
-
-Resources:
-
- 1. [Codecademy Tutorial for JavaScript](https://www.codecademy.com/learn/learn-javascript)
- 1. [Codecademy Tutorial for jQuery](https://www.codecademy.com/learn/jquery)
-
----
-
-#### 5. Jinja Templating
-
-If you are customizing Print templates or Web pages, you need to learn the Jinja Templating language. It is an easy way to create dynamic web pages (HTML).
-
-Resources:
-
- 1. [Primer on Jinja Templating](https://realpython.com/blog/python/primer-on-jinja-templating/)
- 1. [Official Documentation](http://jinja.pocoo.org/)
-
----
-
-#### 6. Git and GitHub
-
-Learn how to contribute back to an open source project using Git and GitHub, two great tools to help you manage your code and share it with others.
-
-Resources:
-
- 1. [Basic Git Tutorial](https://try.github.io)
- 2. [How to contribute to Open Source](https://opensource.guide/how-to-contribute/)
-
----
-
-When you are ready, you can try [building a sample application](/docs/user/en/tutorial/app) using Frappe.
-
diff --git a/frappe/docs/user/en/tutorial/bench.md b/frappe/docs/user/en/tutorial/bench.md
deleted file mode 100755
index e720d9dc98..0000000000
--- a/frappe/docs/user/en/tutorial/bench.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Installing the Frappe Bench
-
-Easiest way to setup frappe on a Unix Like system is to use frappe-bench. Read the detailed instructions on how to install using Frappe Bench.
-
-> [https://github.com/frappe/bench](https://github.com/frappe/bench)
-
-With Frappe Bench you will be able to setup and host multiple applications and sites and it will also setup a Python Virtualenv so that you can have an isolated environment to run your applications (and will not have version conflict with other development environments).
-
-The `bench` command line tool will also be installed that will help you in development and management of the installation.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/conclusion.md b/frappe/docs/user/en/tutorial/conclusion.md
deleted file mode 100755
index f45b64ba23..0000000000
--- a/frappe/docs/user/en/tutorial/conclusion.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Conclusion
-
-
-We hope this will give you an overview of how applications are developed in Frappe. The objective was to briefly touch on the various aspects of application development and give a broad overview. To get help on specific issues, look at the API.
-
-For help, join the community at the [chat channel on Gitter](https://gitter.im/frappe/erpnext) or the [developer forum](https://discuss.erpnext.com)
-
diff --git a/frappe/docs/user/en/tutorial/controllers.md b/frappe/docs/user/en/tutorial/controllers.md
deleted file mode 100755
index b994f71971..0000000000
--- a/frappe/docs/user/en/tutorial/controllers.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Controllers
-
-Next step would be adding methods and event handlers to models. In the app, we should ensure that if a Library Transaction is made, the Article in question must be in stock and the member loaning the Article must have a valid membership.
-
-For this, we can write a validation just before the Library Transaction object is saved. To do this, open the `library_management/doctype/library_transaction/library_transaction.py` template.
-
-This file is the controller for the Library Transaction object. In this you can write methods for:
-
-1. `before_insert`
-1. `validate` (before inserting or updating)
-1. `on_update` (after saving)
-1. `on_submit` (when document is set as submitted)
-1. `on_cancel`
-1. `on_trash` (before it is about to be deleted)
-
-You can write methods for these events and they will be called by the framework when the document is saved etc.
-
-Here is the finished controller:
-
- from __future__ import unicode_literals
- import frappe
- from frappe import _
- from frappe.model.document import Document
-
- class LibraryTransaction(Document):
- def validate(self):
- last_transaction = frappe.get_list("Library Transaction",
- fields=["transaction_type", "transaction_date"],
- filters = {
- "article": self.article,
- "transaction_date": ("<=", self.transaction_date),
- "name": ("!=", self.name)
- })
- if self.transaction_type=="Issue":
- msg = _("Article {0} {1} has not been recorded as returned since {2}")
- if last_transaction and last_transaction[0].transaction_type=="Issue":
- frappe.throw(msg.format(self.article, self.article_name,
- last_transaction[0].transaction_date))
- else:
- if not last_transaction or last_transaction[0].transaction_type!="Issue":
- frappe.throw(_("Cannot return article not issued"))
-
-In this script:
-
-1. We get the last transaction before the current transaction date using the query function `frappe.get_list`
-1. If the last transaction is something we don't like we throw an exception using `frappe.throw`
-1. We use `_("text")` method to identify translatable strings.
-
-Check if your validations work by creating new records
-
-
-
-#### Debugging
-
-To Debug, always keep your JS Console open. Lookout for both Javascript and server tracebacks.
-
-Also check your terminal window for exceptions. Any **500 Internal Server Errors** will get printed in your terminal where on which your server is running.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/doctype-directory-structure.md b/frappe/docs/user/en/tutorial/doctype-directory-structure.md
deleted file mode 100755
index b5e1b10006..0000000000
--- a/frappe/docs/user/en/tutorial/doctype-directory-structure.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# DocType Directory Structure
-
-After saving the DocTypes, check that the model `.json` and `.py` files are created in the `apps/library_management/library_management` module. The directory structure after creating the models should look like this:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- ..
- │ ├── library_management
- │ │ ├── __init__.py
- │ │ └── doctype
- │ │ ├── __init__.py
- │ │ ├── article
- │ │ │ ├── __init__.py
- │ │ │ ├── article.json
- │ │ │ └── article.py
- │ │ ├── library_member
- │ │ │ ├── __init__.py
- │ │ │ ├── library_member.json
- │ │ │ └── library_member.py
- │ │ ├── library_membership
- │ │ │ ├── __init__.py
- │ │ │ ├── library_membership.json
- │ │ │ └── library_membership.py
- │ │ └── library_transaction
- │ │ ├── __init__.py
- │ │ ├── library_transaction.json
- │ │ └── library_transaction.py
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/doctypes.md b/frappe/docs/user/en/tutorial/doctypes.md
deleted file mode 100755
index 2e70ab4146..0000000000
--- a/frappe/docs/user/en/tutorial/doctypes.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# DocType
-
-After creating the Roles, let us create the **DocTypes**
-
-To create a new **DocType**, go to:
-
-> Developer > Documents > Doctype > New
-
-
-
-In the DocType, first the Module, which in our case is **Library Management**
-
-#### Adding Fields
-
-In the Fields Table, you can add the fields (properties) of the DocType (Article).
-
-Fields are much more than database columns, they can be:
-
-1. Columns in the database
-1. Layout helpers (section / column breaks)
-1. Child tables (Table type field)
-1. HTML
-1. Actions (button)
-1. Attachments or Images
-
-Let us add the fields of the Article.
-
-
-
-When you add fields, you need to enter the **Type**. **Label** is optional for Section Break and Column Break. **Name** (`fieldname`) is the name of the database table column and also the property of the controller. This has to be *code friendly*, i.e. it has to have small cases are _ instead of " ". If you leave the Fieldname blank, it will be automatically set when you save it.
-
-You can also set other properties of the field like whether it is mandatory, read only etc.
-
-We can add the following fields:
-
-1. Article Name (Data)
-2. Author (Data)
-3. Description
-4. ISBN
-5. Status (Select): For Select fields, you will enter the Options. Enter **Issued** and **Available** each on a new line in the Options box. See diagram below
-6. Publisher (Data)
-7. Language (Data)
-8. Image (Attach Image)
-
-
-#### Add Permissions
-
-After adding the fields, hit done and add a new row in the Permission Rules section. For now, let us give Read, Write, Create, Delete and Report access to **Librarian**. Frappe has a finely grained Role based permission model. You can also change permissions later using the **Role Permissions Manager** from **Setup**.
-
-
-
-#### Saving
-
-Click on the **Save** button. When the button is clicked, a popup will ask you for the name. Give it the name **Article** and save the DocType.
-
-Now login into mysql and check the database table created:
-
- $ bench mysql
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MariaDB connection id is 3931
- Server version: 5.5.36-MariaDB-log Homebrew
-
- Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- MariaDB [library]> DESC tabArticle;
- +--------------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+--------------+------+-----+---------+-------+
- | name | varchar(255) | NO | PRI | NULL | |
- | creation | datetime(6) | YES | | NULL | |
- | modified | datetime(6) | YES | | NULL | |
- | modified_by | varchar(40) | YES | | NULL | |
- | owner | varchar(60) | YES | | NULL | |
- | docstatus | int(1) | YES | | 0 | |
- | parent | varchar(255) | YES | MUL | NULL | |
- | parentfield | varchar(255) | YES | | NULL | |
- | parenttype | varchar(255) | YES | | NULL | |
- | idx | int(8) | YES | | NULL | |
- | article_name | varchar(255) | YES | | NULL | |
- | status | varchar(255) | YES | | NULL | |
- | description | text | YES | | NULL | |
- | image | varchar(255) | YES | | NULL | |
- | publisher | varchar(255) | YES | | NULL | |
- | isbn | varchar(255) | YES | | NULL | |
- | language | varchar(255) | YES | | NULL | |
- | author | varchar(255) | YES | | NULL | |
- +--------------+--------------+------+-----+---------+-------+
- 18 rows in set (0.00 sec)
-
-
-As you can see, along with the DocFields, several standard columns have also been added to the table. Important to note here are, the primary key, `name`, `owner`(the user who has created the record), `creation` and `modified` (timestamps for creation and last modification).
-
-{next}
-
diff --git a/frappe/docs/user/en/tutorial/form-client-scripting.md b/frappe/docs/user/en/tutorial/form-client-scripting.md
deleted file mode 100755
index d4673c55d4..0000000000
--- a/frappe/docs/user/en/tutorial/form-client-scripting.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Form Client Scripting
-
-## Scripting Forms
-
-Now we have created a basic system that works out of the box without us having to write any code. Let us now write some scripts to make the application richer and add validations so that the user does not enter wrong data.
-
-### Client Side Scripting
-
-In the **Library Transaction** DocType, we have only field for Member Name. We have not made two fields. Now this could well be two fields (and probably should), but for the sake of example, let us consider we have to implement this. To do this we would have to write a event handler for the event when the user selects the `library_member` field and then access the member resource from the server using REST API and set the values in the form.
-
-To start the script, in the `library_management/doctype/library_transaction` folder, create a new file `library_transaction.js`. This file will be automatically executed when the first Library Transaction is opened by the user. So in this file, we can bind events and write other functions.
-
-#### library_transaction.js
-
- frappe.ui.form.on("Library Transaction", "library_member",
- function(frm) {
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Library Member",
- name: frm.doc.library_member
- },
- callback: function (data) {
- frappe.model.set_value(frm.doctype,
- frm.docname, "member_name",
- data.message.first_name
- + (data.message.last_name ?
- (" " + data.message.last_name) : ""))
- }
- })
- });
-
-1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** is used to bind a handler to the event when the property library_member is set.
-1. In the handler, we trigger an AJAX call to `frappe.client.get`. In response we get the requested object as JSON. [Learn more about the API](/frappe/user/en/guides/integration/rest_api).
-1. Using **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** we set the value in the form.
-
-**Note:** To check if your script works, remember to 'reload' the page before testing your script. Client script changes are not automatically picked up when you are in developer mode.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/index.md b/frappe/docs/user/en/tutorial/index.md
deleted file mode 100755
index 43f04583e9..0000000000
--- a/frappe/docs/user/en/tutorial/index.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Frappe Tutorial
-
-In this guide, we will show you how to create an application from scratch using **Frappe**. Using the example of a Library Management System, we will cover:
-
-1. Installation
-1. Making a New App
-1. Making Models
-1. Creating Users and Records
-1. Creating Controllers
-1. Creating Web Views
-1. Setting Hooks and Tasks
-
-## Who is This For?
-
-This guide is intended for software developers who are familiar with how the web applications are built and served. Frappe Framework is built on Python and uses MariaDB database and for creating web views, HTML/CSS/Javascript is used. So it would be great if you are familiar with all these technologies. At the minimum, if you have never used Python before, you should take a quick tutorial before your use this Guide.
-
-Frappe uses the git version control system on GitHub. It is also important that you are familiar with basic git and have an account on GitHub to manage your applications.
-
-## Example
-
-For this guide book, we will build a simple **Library Management** application. In this application we will have models:
-
-1. Article (Book or any other item that can be loaned)
-1. Library Member
-1. Library Transaction (Issue or Return of an article)
-1. Library Membership (A period in which a member is allowed to transact)
-1. Library Management Setting (Global settings like period of loan)
-
-The user interface (UI) for the librarian will be the **Frappe Desk**, a built-in browser based UI environment where forms are automatically generated from the models and roles and permissions are also applied.
-
-We will also create web views for library where users can browse articles from a website.
-
-{index}
diff --git a/frappe/docs/user/en/tutorial/index.txt b/frappe/docs/user/en/tutorial/index.txt
deleted file mode 100755
index 1fed6aed93..0000000000
--- a/frappe/docs/user/en/tutorial/index.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-before
-app
-bench
-new-app
-setting-up-the-site
-start
-models
-roles
-doctypes
-naming-and-linking
-doctype-directory-structure
-users-and-records
-form-client-scripting
-controllers
-reports
-web-views
-single-doctypes
-task-runner
-conclusion
diff --git a/frappe/docs/user/en/tutorial/models.md b/frappe/docs/user/en/tutorial/models.md
deleted file mode 100755
index 04114e1369..0000000000
--- a/frappe/docs/user/en/tutorial/models.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Making Models
-
-The next step is to create the models as we discussed in the introduction. In Frappe, models are called **DocTypes**. You can create new DocTypes from the Desk UI. **DocTypes** are made of fields called **DocField** and role based permissions are integrated into the models, these are called **DocPerms**.
-
-When a DocType is saved, a new table is created in the database. This table is named as `tab[doctype]`.
-
-When you create a **DocType** a new folder is created in the **Module** and a model JSON file and a controller template in Python are automatically created. When you update the DocType, the JSON model file is updated and whenever `bench migrate` is executed, it is synced with the database. This makes it easy to propagate schema changes and migrate.
-
-### Developer Mode
-
-To create models, you must set `developer_mode` as 1 in the `site_config.json` file located in /sites/library and execute command `bench clear-cache` or use the user menu in UI and click on "Reload" for the changes to take effect. You should now see the "Developer" app on your desk
-
- {
- "db_name": "bcad64afbf",
- "db_password": "v3qHDeVKvWVi7s97",
- "developer_mode": 1
- }
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/naming-and-linking.md b/frappe/docs/user/en/tutorial/naming-and-linking.md
deleted file mode 100755
index dd0fca7245..0000000000
--- a/frappe/docs/user/en/tutorial/naming-and-linking.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# DocType Naming and Linking
-
-Then let us create the other DocType and save it too:
-
-1. Library Member (First Name, Last Name, Email Address, Phone, Address)
-
-
-
-
-#### Naming of DocTypes
-
-DocTypes can be named in different ways:
-
-1. Based on a field
-1. Based on a series
-1. By controller (code)
-1. Prompt
-
-This can be set by entering the **Autoname** field. For controller, leave blank.
-
-> **Search Fields**: A DocType may be named on a series but it still needs to be searched by name. In our case, the Article will be searched by the title or the author name. So this can be entered in search field.
-
-
-
-#### Link and Select Fields
-
-Foreign keys are specified in Frappe as **Link** type fields. The target DocType must be mentioned in the Options text area.
-
-In our example, in the Library Transaction DocType, we have to link both the Library Member and the Article.
-
-**Note:** Remeber that Link fields are not automatically set as Foreign Keys in the MariaDB database, because that will implicitly index the column. This may not be optimum hence the Foreign Key validation is done by the Framework.
-
-
-
-For select fields, as we mentioned earlier, add the various options in the **Options** input box, each option on a new row.
-
-
-
-Similary complete making the other models.
-
-#### Linked Values
-
-A standard pattern is when you select an ID, say **Library Member** in **Library Membership**, then the Member's first and last names should be copied into relevant fields in the Library Membership Transaction.
-
-To do this, we can use Read Only fields and in options, we can set the the name of the link and the fieldname of the property we want to fetch. For this example in **Member First Name** we can set `library_member.first_name`
-
-
-
-### Complete the Models
-
-In the same way, you can complete all the models so that the final fields look like this:
-
-#### Article
-
-
-
-#### Library Member
-
-
-
-#### Library Membership
-
-
-
-#### Library Transaction
-
-
-
-> Make sure to give permissions to **Librarian** on each DocType
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/new-app.md b/frappe/docs/user/en/tutorial/new-app.md
deleted file mode 100755
index cbb60cc3d3..0000000000
--- a/frappe/docs/user/en/tutorial/new-app.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Make a New App
-
-Once the bench is installed, you will see two main folders, `apps` and `sites`. All the applications will be installed in apps.
-
-To make a new application, go to your bench folder and run, `bench new-app {app_name}` and fill in details about the application. This will create a boilerplate application for you.
-
- $ bench new-app library_management
- App Title (defaut: Lib Mgt): Library Management
- App Description: App for managing Articles, Members, Memberships and Transactions for Libraries
- App Publisher: Frappe
- App Email: info@frappe.io
- App Icon (default 'octicon octicon-file-directory'): octicon octicon-book
- App Color (default 'grey'): #589494
- App License (default 'MIT'): GNU General Public License
-
-### App Structure
-
-The application will be created in a folder called `library_management` and will have the following structure:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- │ ├── __init__.py
- │ ├── config
- │ │ ├── __init__.py
- │ │ └── desktop.py
- │ ├── hooks.py
- │ ├── library_management
- │ │ └── __init__.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── __init__.py
- │ ├── generators
- │ │ └── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- ├── license.txt
- ├── requirements.txt
- └── setup.py
-
-1. `config` folder contains application configuration info
-1. `desktop.py` is where desktop icons can be added to the Desk
-1. `hooks.py` is where integrations with the environment and other applications is mentioned.
-1. `library_management` (inner) is a **module** that is bootstrapped. In Frappe, a **module** is where model and controller files reside.
-1. `modules.txt` contains list of **modules** in the app. When you create a new module, it is required that you update it in this file.
-1. `patches.txt` is where migration patches are written. They are python module references using the dot notation.
-1. `templates` is the folder where web view templates are maintained. Templates for **Login** and other standard pages are bootstrapped in frappe.
-1. `generators` are where templates for models are maintained, where each model instance has a separte web route, for example a **Blog Post** where each post has its unique web url. In Frappe, the templating engine used is Jinja2
-1. `pages` is where single route templates are maintained. For example for a "/blog" type of page.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/reports.md b/frappe/docs/user/en/tutorial/reports.md
deleted file mode 100755
index 03b61822f2..0000000000
--- a/frappe/docs/user/en/tutorial/reports.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Reports
-
-You can also click on the Reports text on the sidebar (left) to see tabulated records
-
-
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/roles.md b/frappe/docs/user/en/tutorial/roles.md
deleted file mode 100755
index d358556083..0000000000
--- a/frappe/docs/user/en/tutorial/roles.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Creating Roles
-
-Before creating Models, we must create Roles so that we can set permissions on the Model. There are two Roles we will create:
-
-1. Librarian
-1. Library Member
-
-To create a new Role, go to:
-
-> Setup > Users > Role > New
-
-
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/setting-up-the-site.md b/frappe/docs/user/en/tutorial/setting-up-the-site.md
deleted file mode 100755
index 30f4b86d1f..0000000000
--- a/frappe/docs/user/en/tutorial/setting-up-the-site.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Setting up the Site
-
-Let us create a new site and call it `library`.
-
-*Note: Before you create any new site, you need to activate the Barracuda storage engine on your MariaDB installation.*
-*Copy the following default ERPNext database settings into your `my.cnf` file.*
-
- [mysqld]
- innodb-file-format=barracuda
- innodb-file-per-table=1
- innodb-large-prefix=1
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
-
- [mysql]
- default-character-set = utf8mb4
-
-You can then install a new site, by the command `bench new-site library`.
-
-This will create a new database and site folder and install `frappe` (which is also an application!) in the new site. The `frappe` application has two built-in modules **Core** and **Website**. The Core module contains the basic models for the application. Frappe is a batteries included framework and comes with a lot of built-in models. These models are called **DocTypes**. More on that later.
-
- $ bench new-site library
- MySQL root password:
- Installing frappe...
- Updating frappe : [========================================]
- Updating country info : [========================================]
- Set Administrator password:
- Re-enter Administrator password:
- Installing fixtures...
- *** Scheduler is disabled ***
-
-### Site Structure
-
-A new folder called `library` will be created in the `sites` folder. Here is the standard folder structure for a site.
-
- .
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- └── site_config.json
-
-1. `public/files` is where user uploaded files are stored.
-1. `private/backups` is where backups are dumped
-1. `site_config.json` is where site level configurations are maintained.
-
-### Setting Default Site
-
-In case you have multiple sites on you bench use `bench use [site_name]` to set the default site.
-
-Example:
-
- $ bench use library
-
-### Install App
-
-Now let us install our app `library_management` in our site `library`
-
-1. Install library_management in library with: `bench --site [site_name] install-app [app_name]`
-
-Example:
-
- $ bench --site library install-app library_management
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/single-doctypes.md b/frappe/docs/user/en/tutorial/single-doctypes.md
deleted file mode 100755
index 9b0e4171b1..0000000000
--- a/frappe/docs/user/en/tutorial/single-doctypes.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Single DocTypes
-
-A application will usually have a Settings page. In our application, we can define a page where we can set the loan period. We also need to save this property. In Frappe, this can be done using a **Single** type DocType. A Single DocType is like the Singleton pattern in Java. It is an object with only one instance. Let us call this as **Library Managment Settings**.
-
-To create an new Single DocType, mark the **Is Single** property as checked.
-
-
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/start.md b/frappe/docs/user/en/tutorial/start.md
deleted file mode 100755
index 0182654494..0000000000
--- a/frappe/docs/user/en/tutorial/start.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Starting the Bench
-
-Now we can login and check if everything works.
-
-To start the development server, run `bench start`
-
- $ bench start
- 13:58:51 web.1 | started with pid 22135
- 13:58:51 worker.1 | started with pid 22136
- 13:58:51 workerbeat.1 | started with pid 22137
- 13:58:52 web.1 | * Running on http://0.0.0.0:8000/
- 13:58:52 web.1 | * Restarting with reloader
- 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting...
-
-You can now open your browser and go to `http://localhost:8000`. You should see this login page if all goes well:
-
-
-
-Now login with :
-
-Login ID: **Administrator**
-
-Password : **Use the password that was created during installation**
-
-When you login, you should see the "Desk" home page
-
-
-
-As you can see, the Frappe basic system comes with several pre-loaded applications like To Do, File Manager etc. These apps can integrated in your app workflow as we progress.
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/task-runner.md b/frappe/docs/user/en/tutorial/task-runner.md
deleted file mode 100755
index ef532874be..0000000000
--- a/frappe/docs/user/en/tutorial/task-runner.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# Scheduled Tasks
-
-Finally, an application also has to send email notifications and do other kind of scheduled tasks. In Frappe, if you have setup the bench, the task / scheduler is setup via RQ using Redis Queue.
-
-To add a new task handler, go to `hooks.py` and add a new handler. Default handlers are `all`, `daily`, `weekly`, `monthly`, `cron`. The `all` handler is called every 4 minutes by default.
-
- # Scheduled Tasks
- # ---------------
-
- scheduler_events = {
- "daily": [
- "library_management.tasks.daily"
- ],
- "cron": {
- "0/10 * * * *": [
- "library_management.task.run_every_ten_mins"
- ],
- "15 18 * * *": [
- "library_management.task.every_day_at_18_15"
- ]
- }
-
- }
-
-Here we can point to a Python function and that function will be executed every day. Let us look what this function looks like:
-
- # Copyright (c) 2013, Frappe
- # For license information, please see license.txt
-
- from __future__ import unicode_literals
- import frappe
- from frappe.utils import datediff, nowdate, format_date, add_days
-
- def every_ten_minutes():
- # stuff to do every 10 minutes
- pass
-
- def every_day_at_18_15():
- # stuff to do every day at 6:15pm
- pass
-
- def daily():
- loan_period = frappe.db.get_value("Library Management Settings",
- None, "loan_period")
-
- overdue = get_overdue(loan_period)
-
- for member, items in overdue.iteritems():
- content = """Following Items are Overdue
- Please return them as soon as possible
"""
-
- for i in items:
- content += "- {0} ({1}) due on {2}
".format(i.article_name,
- i.article,
- format_date(add_days(i.transaction_date, loan_period)))
-
- content += "
"
-
- recipient = frappe.db.get_value("Library Member", member, "email_id")
- frappe.sendmail(recipients=[recipient],
- sender="test@example.com",
- subject="Library Articles Overdue", content=content, bulk=True)
-
- def get_overdue(loan_period):
- # check for overdue articles
- today = nowdate()
-
- overdue_by_member = {}
- articles_transacted = []
-
- for d in frappe.db.sql("""select name, article, article_name,
- library_member, member_name
- from `tabLibrary Transaction`
- order by transaction_date desc, modified desc""", as_dict=1):
-
- if d.article in articles_transacted:
- continue
-
- if d.transaction_type=="Issue" and \
- datediff(today, d.transaction_date) > loan_period:
- overdue_by_member.setdefault(d.library_member, [])
- overdue_by_member[d.library_member].append(d)
-
- articles_transacted.append(d.article)
-
-We can place the above code in any accessible Python module. The route is defined in `hooks.py`, so for our purposes we would place this code in `library_management/tasks.py`.
-
-Note:
-
-1. We get the loan period from **Library Management Settings** by using `frappe.db.get_value`.
-1. We run a query in the database with `frappe.db.sql`
-1. Email is sent via `frappe.sendmail`
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/users-and-records.md b/frappe/docs/user/en/tutorial/users-and-records.md
deleted file mode 100755
index 394899a795..0000000000
--- a/frappe/docs/user/en/tutorial/users-and-records.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Making Users and Records
-
-Now that we have created the models, we can directly start making records using Frappe Desk UI. You do not have to create views! Views in Frappe are automatically made based on the DocType properties.
-
-### 4.1 Creating User
-
-To make records, we will first create a User. To create a user, go to:
-
-> Setup > Users > User > New
-
-Create a new User and set the name and first name and new password.
-
-Also give the Librarian and Library Member Roles to this user
-
-
-
-Now logout and login using the new user id and password.
-
-### 4.2 Creating Records
-
-You will now see an icon for the Library Management module. Click on that icon and you will see the Module page:
-
-
-
-Here you can see the DocTypes that we have created for the application. Let us start creating a few records.
-
-First let us create a new Article:
-
-
-
-Here you will see that the DocType you had created has been rendered as a form. The validations and other rules will also apply as designed. Let us fill out one Article.
-
-
-
-You can also add an image.
-
-
-
-Now let us create a new member:
-
-
-
-After this, let us create a new membership record for the member.
-
-Here if you remember we had set the values of Member First Name and Member Last Name to be directly fetched from the Member records and as soon as you will select the member id, the names will be updated.
-
-
-
-As you can see that the date is formatted as year-month-day which is a system format. To set / change date, time and number formats, go to
-
-> Setup > Settings > System Settings
-
-
-
-{next}
diff --git a/frappe/docs/user/en/tutorial/web-views.md b/frappe/docs/user/en/tutorial/web-views.md
deleted file mode 100755
index 2953104958..0000000000
--- a/frappe/docs/user/en/tutorial/web-views.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Web Views
-
-Frappe has two main user environments, the Desk and Web. Desk is a controlled UI environment with a rich AJAX application and the web is more traditional HTML templates served for public consumption. Web views can also be generated to create more controlled views for users who may login but still do not have access to the Desk.
-
-In Frappe, Web Views are managed by templates and they are usually in the `templates` folder. There are 2 main types of templates.
-
-1. Pages: These are Jinja templates where a single view exists for a single web route e.g. `/blog`.
-2. Generators: These are templates where each instance of a DocType has a separate web route `/blog/a-blog`, `blog/b-blog` etc.
-3. Lists and Views: These are standard lists and views with the route `[doctype]/[name]` and are rendered based on permission.
-
-### Standard Web Views
-
-> This features is still under development.
-
-Let us look at the standard Web Views:
-
-If you are logged in as the test user, go to `/article` and you should see the list of articles:
-
-
-
-Click on one article and you will see the default web view
-
-
-
-Now if you want to make a better list view for the article, drop a file called `row_template.html` in the
-`library_management/templates/includes/list/` folder. Here is an example file:
-
- {% raw %}
-
-
-
-
-
-
- {{ doc.article_name }}
- {{ doc.author }}
- {{ (doc.description[:200] + "...")
- if doc.description|len > 200 else doc.description }}
- Publisher: {{ doc.publisher }}
-
- {% endraw %}
-
-
-Here, you will get all the properties of the article in the `doc` object.
-
-The updated list view looks like this!
-
-
-
-#### Home Page
-
-Frappe also has a built-in signup workflow which also includes 3rd party signups via Google, Facebook and GitHub. When a user signs up on the web, she does not have access to the desk interface by default.
-
-> To allow user access into the Desk, open set the user from Setup > User and set the User Type as "System User"
-
-Now for the non system users, we can set a home page when they login via `hooks.py` based on the role.
-
-To when library members sign in, they must be redirected to the `article` page, to set this open `library_management/hooks.py` and add this:
-
- role_home_page = {
- "Library Member": "article"
- }
-
-{next}
diff --git a/frappe/docs/user/en/videos/__init__.py b/frappe/docs/user/en/videos/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/en/videos/index.md b/frappe/docs/user/en/videos/index.md
deleted file mode 100755
index e2c5948e37..0000000000
--- a/frappe/docs/user/en/videos/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Video Tutorials for Frappe Framework
-
-This 10-part video tutorial will teach you how to build complex apps in Frappe
-
-Pre-requisites: You must have some understanding of Python, Javascript and MySQL before you start this tutorial.
-
----
-
-
diff --git a/frappe/docs/user/es/__init__.py b/frappe/docs/user/es/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/bench/__init_.py b/frappe/docs/user/es/bench/__init_.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/bench/__init__.py b/frappe/docs/user/es/bench/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/bench/guides/__init__.py b/frappe/docs/user/es/bench/guides/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/bench/guides/adding-custom-domains.md b/frappe/docs/user/es/bench/guides/adding-custom-domains.md
deleted file mode 100644
index d7ba202a7d..0000000000
--- a/frappe/docs/user/es/bench/guides/adding-custom-domains.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Agregando dominios personalizados a su Site
-
-Puedes agregar **multiples dominios personalizados** para un site, ejecutando el comando:
-
- bench setup add-domain [dominio]
-
-Al ejecutar el comando debes especificar para cual site quieres establecer el dominio personalizado.
-
-También, puedes configurar el SSL para su dominio personalizado usando las opciones:
-
- --ssl-certificate [ruta-al-certificado]
- --ssl-certificate-key [ruta-a-la--clave-certificado]
-
-Ejemplo:
-
- bench setup add-domain custom.erpnext.com --ssl-certificate /etc/letsencrypt/live/erpnext.cert --ssl-certificate-key /etc/letsencrypt/live/erpnext.key
-
-La configuración el dominio es almacenada en las configuraciones del site en su archivo site_config.json
-
- "domains": [
- {
- "ssl_certificate": "/etc/letsencrypt/live/erpnext.cert",
- "domain": "erpnext.com",
- "ssl_certificate_key": "/etc/letsencrypt/live/erpnext.key"
- }
- ],
-
-**Luego debes regenerar las configuraciones de nginx ejecutando el comando `bench setup nginx` y reiniciando el servicio de nginx para que los cambios de los dominios tomen efecto**
diff --git a/frappe/docs/user/es/bench/guides/configuring-https.md b/frappe/docs/user/es/bench/guides/configuring-https.md
deleted file mode 100644
index 6a199d1ab6..0000000000
--- a/frappe/docs/user/es/bench/guides/configuring-https.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Configurando HTTPS
-
-### Obtener los archivos requeridos
-
-
-Puede obtener un certificado SSL de una entidad emisora de certificados de confianza o generar su propio certificado.
-Para los certificados auto-firmados, el navegador mostrará una advertencia de que el certificado no es de confianza. [Aquí hay un tutorial para usar Let's Encrypt para obtener un certificado SSL gratuito](lets-encrypt-ssl-setup.html)
-
-Los archivos obligatorios son:
-
-* Certificado (Normalmente con extensión .crt)
-* Clave privada descifrada
-
-Si tienes varios certificados (primario e intermedios), tendrás que unirlos. Por ejemplo,
-
- cat su_certificado.crt CA.crt >> certificate_bundle.crt
-
-También asegúrese que su clave privada no sea legible. Generalmente, solo puede ser leída por root ya que normalmente es el dueño de la misma.
-
- chown root private.key
- chmod 600 private.key
-
-### Mueva los dos archivos a una ruta confiable
-
- mkdir /etc/nginx/conf.d/ssl
- mv private.key /etc/nginx/conf.d/ssl/private.key
- mv certificate_bundle.crt /etc/nginx/conf.d/ssl/certificate_bundle.crt
-
-### Establecer configuraciones de nginx
-
-Configura las rutas al certificado y la clave privada de su site.
-
- bench set-ssl-certificate site1.local /etc/nginx/conf.d/ssl/certificate_bundle.crt
- bench set-ssl-key site1.local /etc/nginx/conf.d/ssl/private.key
-
-### Generar la configuració de nginx
-
- bench setup nginx
-
-### Reiniciar nginx
-
- sudo service nginx reload
-
-o
-
- systemctl reload nginx # for CentOS 7
-
-Ahora que tienes configurado el SSL, todo el tráfico HTTP va a ser redireccionado a HTTPS
diff --git a/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md b/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md
deleted file mode 100644
index 18faa2fbe2..0000000000
--- a/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Diagnosing The Scheduler
-
-
-
-En caso que estes experimentando inconvenientes con las tareas programadas, puedes ejecutar varios comandos para diagnosticar el problema.
-
-### `bench doctor`
-
-Esto va a mostrar en la consola lo siguiente en orden:
-- El estado del Scheduler por site
-- Número de Workers
-- Tareas Pendientes
-
-
-Salida deseada:
-
- Workers online: 0
- -----None Jobs-----
-
-### `bench --site [site-name] show-pending-jobs`
-
-Esto va a mostrar en la consola lo siguiente en orden:
-- Cola
-- Tareas dentro de Cola
-
-Salida deseada:
-
- -----Pending Jobs-----
-
-
-### `bench purge-jobs`
-
-Esto va a remover todas las tareas programadas de todas las colas.
diff --git a/frappe/docs/user/es/bench/guides/index.md b/frappe/docs/user/es/bench/guides/index.md
deleted file mode 100644
index 8ab035a2f5..0000000000
--- a/frappe/docs/user/es/bench/guides/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Guides
-
-
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/es/bench/guides/index.txt b/frappe/docs/user/es/bench/guides/index.txt
deleted file mode 100644
index 4f99377c88..0000000000
--- a/frappe/docs/user/es/bench/guides/index.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-configuring-https
-lets-encrypt-ssl-setup
-diagnosing-the-scheduler
-how-to-change-host-name-from-localhost
-manual-setup
-setup-multitenancy
-setup-production
-setup-ssl
-stop-production-and-start-development
-updating
-setting-limits
\ No newline at end of file
diff --git a/frappe/docs/user/es/bench/guides/lets-encrypt-ssl-setup.md b/frappe/docs/user/es/bench/guides/lets-encrypt-ssl-setup.md
deleted file mode 100644
index 9ff0d0cb10..0000000000
--- a/frappe/docs/user/es/bench/guides/lets-encrypt-ssl-setup.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# Uso de Let's Encrypt para configurar HTTPS
-
-##Prerrequisitos
-
-1. Necesitas tener una configuración Multitenant
-2. Su sitio debería ser accesible a traves de un dominio válido
-3. Necesitas permisos de administrados en el servidor
-
-**Nota : Los certificados de Let's Encrypt expiran cada 3 meses**
-
-## Usando el comando bench
-
-Ejecutar:
-
- sudo -H bench setup lets-encrypt [site-name]
-
-Van a aparecer varios prompts, responde a todo. Este comando también va a agregar una entrada a crontab del usuario que esta intentando renovar el certificado cada mes.
-
-### Dominios personalizados
-
-Puedes configurar Let's Encrypt para [dominios personalizados](adding-custom-domains.html). Solo usando la opción `--custom-domain`
-
- sudo -H bench setup lets-encrypt [site-name] --custom-domain [custom-domain]
-
-### Renovar Certificados
-
-Para la renovación manual de certificados puedes usar:
-
- sudo bench renew-lets-encrypt
-
-
-
-## Método Manual
-### Descarga el script apropiado de Certbot-auto en el directorio /opt
-
- https://certbot.eff.org/
-
-### Detener el servicio / proceso nginx
-
- $ sudo service nginx stop
-
-### Ejecutar Certbot
-
- $ ./opt/certbot-auto certonly --standalone
-
-Despues que letsencrypt se inicializa, vas a tener que llenar algunas informaciones. Los prompts pueden variar de si haz usado o no Let's Encrypt antes, pero vamos a guiarte en su primera vez.
-
-En el prompt, ingresar la dirección de correo eléctronico que será usada para notificaciones y recuperación de claves perdidas:
-
-
-
-Debes aceptar el acuerdo de subscripción de Let's Encrypt, selecciona Agree:
-
-
-
-Luego ingresa el nombre de su dominio(s). Nota que si deseas un simple certificado para trabajar con
-varios nombres de dominios (ejemplo: example.com y www.example.com), asegurate de incluirlos todos:
-
-
-
-### Archivos de certificados
-
-Despues de obtener el certificado, va a tener los siguientes archivos PEM-encoded:
-
-* **cert.pem**: El certificado de su dominio
-* **chain.pem**: La cadena del certificado de Let's Encrypt
-* **fullchain.pem**: cert.pem y chain.pem combinados
-* **privkey.pem**: La clave privada de su certificado.
-
-Estos certificados estan almacenados en el directorio `/etc/letsencrypt/live/example.com`
-
-### Configurar los certificados para su site(s)
-
-Vaya al archivo site_config.json del site donde tiene erpnext
-
- $ cd frappe-bench/sites/{{nombre_sitio}}
-
-Agrega las siguientes lineas al archivo site_config.json
-
- "ssl_certificate": "/etc/letsencrypt/live/example.com/fullchain.pem",
- "ssl_certificate_key": "/etc/letsencrypt/live/example.com/privkey.pem"
-
-
-Regenerar las configuraciones de nginx
-
- $ bench setup nginx
-
-Reiniciar el servidor nginx
-
- $ sudo service nginx restart
-
----
-
-### Renovació Automática (experimental)
-
-Accede como root o como un usuario con privileges de administrador, ejecuta `crontab -e` y presiona enter:
-
-
- # renovar el certificado de letsencrypt todos los días primero de cada mes y recibe un email si el comando ha sido ejecutado
- MAILTO="mail@example.com"
- 0 0 1-7 * * [ "$(date '+\%a')" = "Mon" ] && sudo service nginx stop && /opt/certbot-auto renew && sudo service nginx start
diff --git a/frappe/docs/user/es/bench/guides/manual-setup.md b/frappe/docs/user/es/bench/guides/manual-setup.md
deleted file mode 100644
index aa60dc61a6..0000000000
--- a/frappe/docs/user/es/bench/guides/manual-setup.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Manual Setup
-
-Instalación Manual
---------------
-
-Prerrequisitos,
-
-* [Python 2.7](https://www.python.org/download/releases/2.7/)
-* [MariaDB](https://mariadb.org/)
-* [Redis](http://redis.io/topics/quickstart)
-* [WKHTMLtoPDF con QT parcheado](http://wkhtmltopdf.org/downloads.html) (Requerido para la generación de pdf)
-
-[Instalando los Prerrequisitos en OSX](https://github.com/frappe/bench/wiki/Installing-Bench-Pre-requisites-on-MacOSX)
-
-Instalar el bench como usuario normal, **no root**
-
- git clone https://github.com/frappe/bench bench-repo
- sudo pip install -e bench-repo
-
-Nota: Favor de no remover el directorio bench que el comando va a crear
-
-Migrando desde una instalación existente
-------------------------------------
-
-Si deseas migrar desde ERPNext v3, sigue las siguientes instrucciones [aquí](https://github.com/frappe/bench/wiki/Migrating-from-ERPNext-version-3)
-
-Si deseas migrar de una versión vieja del bench, sigue las instrucciones [aquí](https://github.com/frappe/bench/wiki/Migrating-from-old-bench)
-
-
-Uso básico
-===========
-
-* Crea un nuevo bench
-
- El comando init va a crear un directorio conteniendo el framework Frappe instalado.
- Va a ser configurado para copias de seguridad periódicas y actualizaciones automáticas una vez por día.
-
- bench init frappe-bench && cd frappe-bench
-
-* Agregar aplicaciones
-
- El comando get-app descarga e instala aplicaciones hechas en frappe. Ejemplos:
-
- - [erpnext](https://github.com/frappe/erpnext)
- - [erpnext_shopify](https://github.com/frappe/erpnext_shopify)
- - [paypal_integration](https://github.com/frappe/paypal_integration)
-
- bench get-app erpnext https://github.com/frappe/erpnext
-
-* Agregar Site
-
- Las aplicaciones Frappe son montadas en los Sites y por tanto tendras que crear por lo menos un site.
- El comando new-site te permite crearlos.
-
- bench new-site site1.local
-
-* Iniciar bench
-
- Para comenzar a utilizar el bench, usa el comando `bench start`
-
- bench start
-
- Para acceder a Frappe / ERPNext, abra su navegador favorito y escriba la ruta `localhost:8000`
-
- El usuario por defecto es "Administrator" y la contraseña es la que específicaste al momento de crear el nuevo site.
-
-
-Configurando ERPNext
-==================
-
-Para instalar ERPNext, ejecuta:
-```
-bench install-app erpnext
-```
-
-Ahora puedes usar `bench start` o [configurar el bench para uso en producción](setup-production.html)
diff --git a/frappe/docs/user/es/bench/guides/settings-limits.md b/frappe/docs/user/es/bench/guides/settings-limits.md
deleted file mode 100644
index a72ddc2d79..0000000000
--- a/frappe/docs/user/es/bench/guides/settings-limits.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Estableciendo límites para su sitio
-
-La versión 7 de Frappe ha agregado soporte para la configuración de límites y restricciones para su site.
-Estas restricciones están en el archivo `site_config.json` dentro de la carpeta del site.
-
- {
- "db_name": "xxxxxxxxxx",
- "db_password": "xxxxxxxxxxxx",
- "limits": {
- "emails": 1500,
- "space": 0.157,
- "expiry": "2016-07-25",
- "users": 1
- }
- }
-
-Puedes establecer un límite ejecutando:
-
- bench --site [nombre_sitio] set-limit [limite] [valor]
-
-Puedes establecer varios límites al mismo tiempo ejecutando:
-
- bench --site [nombre_sitio] set-limits --limit [limite] [valor] --limit [limite-2] [valor-2]
-
-Los límites que puedes configurar son:
-
-- **users** - Limita el número de usuarios por site.
-- **emails** - Limita el número de correos enviados por mes desde un site.
-- **space** - Limita el máximo número de espacio en GB que el site puede usar.
-- **email_group** - Limia el número máximo de miembros en un grupo de correos.
-- **expiry** - Fecha de expiración para el site. (YYYY-MM-DD en de comillas)
-
-Ejemplo:
-
- bench --site site1.local set-limit users 5
-
-Puedes verificar el uso abriendo la página de "Usage Info" ubicada en el toolbar / AwesomeBar. Un límite solo va a mostrarse en la página si ha sido configurado.
-
-
diff --git a/frappe/docs/user/es/bench/guides/setup-multitenancy.md b/frappe/docs/user/es/bench/guides/setup-multitenancy.md
deleted file mode 100644
index ca7469f1fd..0000000000
--- a/frappe/docs/user/es/bench/guides/setup-multitenancy.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Setup Multitenancy
-
-Asumiento que tiene su primer site corriendo y ha realizado los
- [pasos para producción](setup-production.html), esta sección explica como montar su segundo site (y más).
- Su primer site se configuró como el site por defecto de forma automática. Puedes cambiarlo ejecutando el comando,
-
- bench use nombre_site
-
-
-
-
-Multitenancy basada en puertos
------------------------
-
-Puedes crear un nuevo site y ponerlo a escuchar por otro puerto (mientras que el primero corre en el puerto 80)
-
-* Desactivar el multitenancy basada en DNS (una vez)
-
- `bench config dns_multitenant off`
-
-* Crea un nuevo site
-
- `bench new-site site2name`
-
-* Configura el puerto
-
- `bench set-nginx-port site2name 82`
-
-* Regenera las configuraciones de nginx
-
- `bench setup nginx`
-
-* Recarga el servicio de nginx
-
- `sudo service nginx reload`
-
-
-Multitenancy basada en DNS
-----------------------
-
-Puedes nombrar sus sites como los los nombre de dominio que van a rederigirse a ellos. Así, todos los sites agregados al bench van a correr en el mismo puerto y van a ser automáticamente seleccionados basados en el nombre del host.
-
-Para convertir un site nuevo dentro de la multitenancy basada en DNS, realiza los siguientes pasos.
-
-* Desactivar el multitenancy basada en DNS (una vez)
-
- `bench config dns_multitenant on`
-
-* Crea un nuevo site
-
- `bench new-site site2name`
-
-* Regenera las configuraciones de nginx
-
- `bench setup nginx`
-
-* Recarga el servicio de nginx
-
- `sudo service nginx reload`
diff --git a/frappe/docs/user/es/bench/guides/setup-production.md b/frappe/docs/user/es/bench/guides/setup-production.md
deleted file mode 100644
index f97c582bd0..0000000000
--- a/frappe/docs/user/es/bench/guides/setup-production.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Setup Production
-
-Puedes configurar el bench para producción configurando dos parametros, Supervisor y nginx. Si quieres volver a ponerlo en desarrollo debes ver [estos comandos](https://github.com/frappe/bench/wiki/Stopping-Production-and-starting-Development)
-
-####Configuración para producción facíl
-Estos pasos son automátizados si ejecutas `sudo bench setup production`
-
-
-####Configuración manual para producción
-Supervisor
-----------
-Supervisor se asegura de mantener el proceso que inició Frappe corriendo y lo reinicia en caso de cualquier inconveniente.
- Puedes generar la configuración necesaria para supervisor ejecutando el comando `bench setup supervisor`.
- La configuración va a estar disponible en la carpeta `config/supervisor.conf`. Luego puedes copiar/enlazar este archivo al directorio de configuración
- de supervisor y reiniciar el servicio para que tome efecto de los cambios realizados.
-
-Ejemplo,
-
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf
-```
-
-Nota: Para CentOS 7, la extensión debería ser `ini`, por lo que el comando sería
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.ini #para CentOS 7 solamente
-```
-
-El bench también necesita reiniciar el proceso manejado por supervisor cuando actualizar cualquier aplicación.
-Para automatizarlo, vas a tener que agregar el usuario a sudoers ejecutando `sudo bench setup sudoers $(whoami)`.
-
-Nginx
------
-
-
-Nginx es un servidor web y lo usamos para servir archivos estáticos y aponderar el resto de la
-peticiones a frappe. Puedes generar las configuraciones necesarias para nginx usando el comando `bench setup nginx`.
-La configuración va a estar almacenada en el archivo `config/nginx.conf`. Entonces puedes copiar/enlazar este archivo al directorio de
-configuración de nginx y reiniar el servicio para poder ver si se han aplicado los cambios.
-
-Ejemplo,
-
-```
-bench setup nginx
-sudo ln -s `pwd`/config/nginx.conf /etc/nginx/conf.d/frappe-bench.conf
-```
-
-Nota: Cuando reinicias nginx despues de cualquier cambio en la configuración, podría fallar si tienes otra configuración con el bloque server para el puerto 80 (En la mayoría de veces la página princial de nginx). Vas a tener que deshabilitar esta configuración. Las rutas más probables donde podemos encontrarlo son `/etc/nginx/conf.d/default.conf` y
-`/etc/nginx/conf.d/default`.
diff --git a/frappe/docs/user/es/bench/index.md b/frappe/docs/user/es/bench/index.md
deleted file mode 100644
index 24baef4875..0000000000
--- a/frappe/docs/user/es/bench/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Bench
-
-
-
-{index}
diff --git a/frappe/docs/user/es/bench/index.txt b/frappe/docs/user/es/bench/index.txt
deleted file mode 100644
index 81f550d26c..0000000000
--- a/frappe/docs/user/es/bench/index.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-guides
-resources
diff --git a/frappe/docs/user/es/bench/resources/__init__.py b/frappe/docs/user/es/bench/resources/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/bench/resources/background-services.md b/frappe/docs/user/es/bench/resources/background-services.md
deleted file mode 100644
index 5145897996..0000000000
--- a/frappe/docs/user/es/bench/resources/background-services.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Background Services
-
-Servicios Externos
------------------
-
- * MariaDB (Base de datos)
- * Redis (Caché y background workers)
- * nginx (para producción)
- * supervisor (para producción)
-
-Procesos de Frappe
-----------------
-
-
-* Servidor WSGI
-
- * El servidor WSGI es responsable de responder a las peticiones HTTP.
- En entornos de desarrollo (`bench serve` o `bench start`), El servidor WSGI Werkzeug es usado y en producción,
- se usa gunicorn (automáticamente configurado en supervisor)
-
-* Procesos de Redis Worker
-
- * Los procesos de Celery se encargan de ejecutar tareas en background en Frappe.
- Estos procesos son iniciados automáticamente cuando se ejecuta el comando `bench start` y
- para producción se configuran en las configuraciones de supervisor.
-
-* Procesos Scheduler
-
- * Los procesos del Scheduler programan la lista de tareas programadas en Frappe.
- Este proceso es iniciado automáticamente cuando se ejecuta el comando `bench start` y
- para producción se configuran en las configuraciones de supervisor.
diff --git a/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md b/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md
deleted file mode 100644
index c5277c45bc..0000000000
--- a/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Bench Commands Cheatsheet
-
-### Uso General
-* `bench --version` - Muestra la versión del bench
-* `bench src` - Muestra el directorio repo del bench
-* `bench --help` - Muestra todos los comandos y ayudas
-* `bench [command] --help` - Muestra la ayuda para un comando
-* `bench init [bench-name]` - Crea un nuevo bench (Ejecutar desde Home)
-* `bench --site [site-name] COMMAND` - Especificar un site para el comando
-* `bench update` - Buscar los últimos cambios de bench-repo y todas las aplicaciones, aplica parches, crea los JS y CSS, y realiza la migración.
- * `--pull` Hace un Pull a todas las aplicaciones en el bench
- * `--patch` Ejecuta las migraciones para todos los sites en el bench
- * `--build` Crea los JS y CSS para el bench
- * `--bench` Actualiza el bench
- * `--requirements` Actualiza los requerimientos
- * `--restart-supervisor` Reinicia los procesos de supervisor despues de actualizar
- * `--upgrade` Realiza migraciones mayores (Eg. ERPNext 6 -> 7)
- * `--no-backup` No crea una copia de respaldo antes de actualizar
-* `bench restart` Reinicia todos los servicios del bench
-* `bench backup` Copia de respaldo
-* `bench backup-all-sites` Copia de respaldo a todos los sites
- * `--with-files` Copia de respaldo a los sites con los archivos
-* `bench restore` Restaurar
- * `--with-private-files` Restaura un site con todos los archivos privados (Ruta al archivo .tar)
- * `--with-public-files` Restaura un site con todos los archivos públicos (Ruta al archivo .tar)
-* `bench migrate` Leerá los archivos JSON y realizará los cambios en la base de datos.
-
-###Configuración
-* `bench config` - Cambiar las configuraciones del bench
- * `auto_update [on/off]` Activa/Desactiva las actualizaciones automáticas para el bench
- * `dns_multitenant [on/off]` Activa/Desactiva DNS Multitenancy
- * `http_timeout` Establece un timeout para http
- * `restart_supervisor_on_update` Activa/Desactiva el reinicio automático de supervisor
- * `serve_default_site` Configurar nginx para que sirva el sitio predeterminado en...
- * `update_bench_on_update` Activa/Desactiva las actualizaciones en un bench corriendo
-* `bench setup` - Configurar componentes
- * `auto-update` Añade un cronjob para actualizaciones automática del bench
- * `backups ` Añade un cronjob para las copias de respaldo del bench
- * `config ` sobreescribe o crea config.json
- * `env ` Configurar un virtualenv para el bench
- * `nginx ` generar configuraciones para nginx
- * `procfile ` Configura el archivo Procfile para bench start
- * `production ` Configura el bench para producción
- * `redis ` genera las configuraciones para redis cache
- * `socketio ` Configura las dependencias de node para el servidor socketio
- * `sudoers ` Agrega comandos a la sudoers para su ejecución
- * `supervisor ` Genera las configuraciones para supervisor
- * `add-domain ` agrega un dominio personalizado para un site
- * `firewall ` configura un firewall y bloquea todos los puertos en excepción el 22, 80 y 443
- * `ssh-port ` cambia el puerto por defecto para conexiones ssh
-
-
-###Desarrollo
-* `bench new-app [app-name]` Crea una nueva app
-* `bench get-app [repo-link]` - Descarga una app desde un repositorio git y la instala
-* `bench install-app [app-name]` Instala aplicaciones existentes
-* `bench remove-from-installed-apps [app-name]` Remueve aplicaciones de la liste de aplicaciones
-* `bench uninstall-app [app-name]` Elimina la aplicación y todo lo relaciones a esa aplicación (Bench necesita estar corriendo)
-* `bench remove-app [app-name]` Eliminar una aplicación completamente del bench
-* `bench --site [sitename] --force reinstall ` Reiniciar con una base de datos nueva (Atención: Va a borrar la base de datos anterior)
-* `bench new-site [sitename]` - Crea un nuevo site
- * `--db-name` Nombre de la base de datos
- * `--mariadb-root-username` Nombre de usuario de Root
- * `--mariadb-root-password` Contraseña del usuario Root
- * `--admin-password` Contraseña del usuario Administrator para un nuevo site
- * `--verbose` Verbose
- * `--force` Forzar la restauración si el site/base de datos existen.
- * `--source_sql` Inicializar una base de datos con un archivo SQL
- * `--install-app` Instalar una aplicación despues de haber instalado el bench
-* `bench use [site]` Configura el site por defecto
-* `bench drop-site` Elimina sites del disco y la base de datos completamente
- * `--root-login`
- * `--root-password`
-* `bench set-config [key] [value]` Agrega valores clave-valor al archivo de configuración del site
-* `bench console` Abre una consola de IPython en el virtualenv del bench
-* `bench execute` Ejecuta un método dentro de una aplicación
- * Eg : `bench execute frappe.utils.scheduler.enqueue_scheduler_events`
-* `bench mysql` Abre una consola SQL
-* `bench run-tests` Ejecuta las pruebas
- * `--app` Nombre de la aplicación
- * `--doctype` Especificar el DocType para cual correr las pruebas
- * `--test` Pruebas específicas
- * `--module` Ejecutar un módulo con pruebas en específico
- * `--profile` Ejecutar un Python profiler en las pruebas
-* `bench disable-production` Desactiva el entorno de producción
-
-
-###Programador
-* `bench enable-scheduler` - Habilita el Programador que ejecutará las tareas programadas
-* `bench doctor` - Obtener informaciones de diagnóstico sobre los background workers
-* `bench show-pending-jobs`- Obtener las tareas pendientes
-* `bench purge-jobs` - Eliminar todas las tareas pendientes
diff --git a/frappe/docs/user/es/bench/resources/bench-procfile.md b/frappe/docs/user/es/bench/resources/bench-procfile.md
deleted file mode 100644
index dc357bdd4e..0000000000
--- a/frappe/docs/user/es/bench/resources/bench-procfile.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Bench Procfile
-
-`bench start` usa [honcho](http://honcho.readthedocs.org) para manejar múltiples procesos en **developer mode**.
-
-### Procesos
-
-Los diversos procesos que se necesitan para correr frappe son:
-
-1. `bench start` - El servidor web.
-4. `redis_cache` para cache (general)
-5. `redis_queue` para manejar las cosas de los background workers
-6. `redis_socketio` como un notificador de notificaciones para actualizaciones en tiempo real desde los background workers
-7. `web` para el servidor web de frappe.
-7. `socketio` para mensajes en tiempo real.
-3. `schedule` para disparar tareas periódicas
-3. `worker_*` redis workers para manejar trabajos aíncronos
-
-Opcionalmente, si estas desarrollando en frappe puedes agregar:
-
-`bench watch` para automáticamente construir la aplicación javascript desk.
-
-### Ejemplo
-
- redis_cache: redis-server config/redis_cache.conf
- redis_socketio: redis-server config/redis_socketio.conf
- redis_queue: redis-server config/redis_queue.conf
- web: bench serve --port 8000
- socketio: /usr/bin/node apps/frappe/socketio.js
- watch: bench watch
- schedule: bench schedule
- worker_short: bench worker --queue short
- worker_long: bench worker --queue long
- worker_default: bench worker --queue default
diff --git a/frappe/docs/user/es/bench/resources/index.md b/frappe/docs/user/es/bench/resources/index.md
deleted file mode 100644
index 48852466ed..0000000000
--- a/frappe/docs/user/es/bench/resources/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Resources
-
-
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/es/bench/resources/index.txt b/frappe/docs/user/es/bench/resources/index.txt
deleted file mode 100644
index 4674526df6..0000000000
--- a/frappe/docs/user/es/bench/resources/index.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-background-services
-bench-commands-cheatsheet
-bench-procfile
\ No newline at end of file
diff --git a/frappe/docs/user/es/guides/__init_.py b/frappe/docs/user/es/guides/__init_.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/guides/__init__.py b/frappe/docs/user/es/guides/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/index.md b/frappe/docs/user/es/index.md
deleted file mode 100644
index d483120e16..0000000000
--- a/frappe/docs/user/es/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Desarrollo de aplicaciones con Frappe
-
-{index}
diff --git a/frappe/docs/user/es/index.txt b/frappe/docs/user/es/index.txt
deleted file mode 100644
index 85c302b8cf..0000000000
--- a/frappe/docs/user/es/index.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial
-bench
-guides
-videos
diff --git a/frappe/docs/user/es/tutorial/__init_.py b/frappe/docs/user/es/tutorial/__init_.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/tutorial/__init__.py b/frappe/docs/user/es/tutorial/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/tutorial/app.md b/frappe/docs/user/es/tutorial/app.md
deleted file mode 100644
index c7df575fbe..0000000000
--- a/frappe/docs/user/es/tutorial/app.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Qué es una aplicación
-
-Una aplicación en Frappe es una aplicación estandar en Python. Puedes estructurar una aplicación hecha en Frappe de la misma forma que estructuras una aplicación en Python.
-Para implementación, Frappe usa los Python Setuptools, lo que nos permite facilmente instalar la aplicación en cualquier computadora.
-
-El Framework Frappe provee una interfaz WSGI y para el desarrollo puedes usar el servidor interno de frappe llamado Werkzeug. Para implementación en producción, recomendamos usar nginx y gunicorn.
-
-Frappe tambien soporta la architectura multi-tenant. Esto significa que puedes correr varios "sitios" en su instalación, cada uno de ellos estará poniendo a disposición un conjunto de aplicaciones y usuarios. La base de datos para cada sitio es separada.
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/before.md b/frappe/docs/user/es/tutorial/before.md
deleted file mode 100644
index 77b7907f09..0000000000
--- a/frappe/docs/user/es/tutorial/before.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Antes de empezar
-
-Una lista de recursos que te ayudaran a inicar con el desarrollo de aplicaciones usando Frappe.
-
----
-
-#### 1. Python
-
-Frappe usa Python (v2.7) como lenguaje de parte del servidor. Es altamente recomendable aprender Python antes de iniciar a crear aplicaciones con Frappe.
-
-Para escribir código de calidad del lado del servidor, también debes incluir pruebas automatizadas.
-
-Recursos:
- 1. [Tutorial sobre Python de Codecademy](https://www.codecademy.com/learn/python)
- 1. [Tutorial Oficial de Python](https://docs.python.org/2.7/tutorial/index.html)
- 1. [Tutorial básico de Test-driven development](http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137)
-
----
-
-#### 2. MariaDB / MySQL
-
-Para crear aplicaciones con frappe, debes entender los conceptops básicos del manejo de base de datos, como instalarlas, acceder, crear nueva base de datos, y hacer consultas básicas con SQL.
-
-Recursos:
- 1. [Tutorial sobre SQL de Codecademy](https://www.codecademy.com/learn/learn-sql)
- 1. [Tutorial Básico de MySQL de DigitalOcean](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial)
- 1. [Introducción a MariaDB](https://mariadb.com/kb/en/mariadb/documentation/getting-started/)
-
----
-
-#### 3. HTML / CSS
-
-Si quieres construir interfaces de usuario usando Frappe, necesitas aprender los conceptops básicos de HTML / CSS y el framework de CSS Bootstrap.
-
-Recursos:
- 1. [Tutorial sobre HTML/CSS de Codecademy](https://www.codecademy.com/learn/learn-html-css)
- 1. [Introducción a Bootstrap](https://getbootstrap.com/getting-started/)
-
----
-
-#### 4. JavaScript and jQuery
-
-Para modificar formularios y crear interfaces de usuarios interactivas, deberías aprender JavaScript y la librería JQuery.
-
-
-Recursos:
- 1. [Tutorial sobre JavaScript de Codecademy](https://www.codecademy.com/learn/learn-javascript)
- 1. [Tutorial sobre jQuery de Codecademy](https://www.codecademy.com/learn/jquery)
----
-
-#### 5. Manejar de plantillas Jinja
-
-Si estas modificando plantillas de Impresión o Páginas Web, tienes que aprender a utilizar el manejar de plantillas Jinja. Es una forma facíl de crear páginas web dinámicas.
-
-Recursos:
- 1. [Primer on Jinja Templating](https://realpython.com/blog/python/primer-on-jinja-templating/)
- 1. [Documentación oficial](http://jinja.pocoo.org/)
-
----
-
-#### 6. Git and GitHub
-
-Aprende como contribuir en un proyecto de código abierto usando Git y GitHub, dos increíbles herramientes que te ayudan a gestionar tu código y compartirlo con otros.
-
-Recursos:
- 1. [Tutorial Básico de Git](https://try.github.io)
- 2. [Cómo contribuir al Código Abierto](https://opensource.guide/how-to-contribute/)
-
----
-
-Cuando estes listo, puedes intentar [crear una aplicación simple](/docs/user/es/tutorial/app) usando Frappe.
diff --git a/frappe/docs/user/es/tutorial/bench.md b/frappe/docs/user/es/tutorial/bench.md
deleted file mode 100644
index bc9e3ce215..0000000000
--- a/frappe/docs/user/es/tutorial/bench.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Instalando el Frappe Bench
-
-La forma más facíl de configurar frappe en un computador usando sitemas basados en Unix es usando frappe-bench. Lee las instrucciones detalladas acerca de como instalarlo usando Frappe Bench.
-
-> [https://github.com/frappe/bench](https://github.com/frappe/bench)
-
-Con Frappe Bench vas a poder configurar y hostear multiples aplicaciones y sitios, también va a configurar un entorno virtual de Python por lo que vas a tener un entorno apartado para correr sus aplicaciones (y no va a tener conflictos de versiones con otros entornos de desarrollo).
-
-El comando `bench` va a ser instalado en su sistema para ayudarlo en la fase de desarrollo y el manejo de la aplicación.
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/conclusion.md b/frappe/docs/user/es/tutorial/conclusion.md
deleted file mode 100644
index 05118d1b48..0000000000
--- a/frappe/docs/user/es/tutorial/conclusion.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Conclusión
-
-Esperamos que esto te haya dado una idea de como son desarrolladas las aplicaicones en Frappe. El objetivo era de que de manera breve se tocaran varios de los aspectos del desarrollo de aplicaciones. Para obtener ayuda en inconvenientes o temas específicos, favor revisar el API.
-
-Para ayuda, únete a la comunidad en el [canal de chat en Gitter](https://gitter.im/frappe/erpnext) o el [foro de desarrollo](https://discuss.erpnext.com)
diff --git a/frappe/docs/user/es/tutorial/controllers.md b/frappe/docs/user/es/tutorial/controllers.md
deleted file mode 100644
index e9ea7527e8..0000000000
--- a/frappe/docs/user/es/tutorial/controllers.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Controladores (Controllers)
-
-El siguiente paso va a ser agregar métodos y eventos a los modelos. En la aplicación, debemos asegurar que si una Library Transaction es creada, el Article que se solicita debe estar en disponibilidad y el miembro que lo solicita debe tener una membresía (membership) válida.
-
-Para esto, podemos escribir una validación que se verifique justo en el momento que una Library Transaction es guardada. Para lograrlo, abre el archivo `library_management/doctype/library_transaction/library_transaction.py`.
-
-Este archivo es el controlador para el objeto Library Transaction. En este archivo puedes escribir métodos para:
-
-1. `before_insert`
-1. `validate` (Antes de insertar o actualizar)
-1. `on_update` (Despues de guardar)
-1. `on_submit` (Cuando el documento es presentado como sometido o presentado)
-1. `on_cancel`
-1. `on_trash` (antes de ser eliminado)
-
-Puedes escribir métodos para estos eventos y estos van a ser llamados por el framework automóticamente cuando el documento pase por uno de esos estados.
-
-Aquí les dejo el controlador completo:
-
- from __future__ import unicode_literals
- import frappe
- from frappe import _
- from frappe.model.document import Document
-
- class LibraryTransaction(Document):
- def validate(self):
- last_transaction = frappe.get_list("Library Transaction",
- fields=["transaction_type", "transaction_date"],
- filters = {
- "article": self.article,
- "transaction_date": ("<=", self.transaction_date),
- "name": ("!=", self.name)
- })
- if self.transaction_type=="Issue":
- msg = _("Article {0} {1} no ha sido marcado como retornado desde {2}")
- if last_transaction and last_transaction[0].transaction_type=="Issue":
- frappe.throw(msg.format(self.article, self.article_name,
- last_transaction[0].transaction_date))
- else:
- if not last_transaction or last_transaction[0].transaction_type!="Issue":
- frappe.throw(_("No puedes retornar un Article que no ha sido prestado."))
-
-En este script:
-
-1. Obtenemos la última transacción antes de la fecha de la transacción actual usando la funcion `frappe.get_list`
-1. Si la última transacción es algo que no nos gusta, lanzamos una excepción usando `frappe.throw`
-1. Usamos el método `_("texto")` para identificar las cadenas que pueden ser traducidas.
-
-Verifica si sus validaciones funcionan creando nuevos registros.
-
-
-
-#### Depurando
-
-Para depurar, siempre mantener abierta su consola JS. Verifíca rastros de Javascript y del Servidor.
-
-Siempre verifica su terminal para las excepciones. Cualquier **500 Internal Server Errors** va a ser mostrado en la terminal en la que está corriendo el servidor.
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/doctype-directory-structure.md b/frappe/docs/user/es/tutorial/doctype-directory-structure.md
deleted file mode 100644
index 2ca69968b0..0000000000
--- a/frappe/docs/user/es/tutorial/doctype-directory-structure.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Estructura de directorios de un DocType
-
-Despues de guardar los DocTypes, revisa que los archivos `.json` y `.py` fuueron creados en módulo `apps/library_management/library_management`. La estructura de directorios despues de crear los modelos debería ser similar a la siguiente:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- ..
- │ ├── library_management
- │ │ ├── __init__.py
- │ │ └── doctype
- │ │ ├── __init__.py
- │ │ ├── article
- │ │ │ ├── __init__.py
- │ │ │ ├── article.json
- │ │ │ └── article.py
- │ │ ├── library_member
- │ │ │ ├── __init__.py
- │ │ │ ├── library_member.json
- │ │ │ └── library_member.py
- │ │ ├── library_membership
- │ │ │ ├── __init__.py
- │ │ │ ├── library_membership.json
- │ │ │ └── library_membership.py
- │ │ └── library_transaction
- │ │ ├── __init__.py
- │ │ ├── library_transaction.json
- │ │ └── library_transaction.py
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/doctypes.md b/frappe/docs/user/es/tutorial/doctypes.md
deleted file mode 100644
index 6d574ac721..0000000000
--- a/frappe/docs/user/es/tutorial/doctypes.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# DocType
-
-Despues de crear los Roles, vamos a crear los **DocTypes**
-
-Para crear un nuevo **DocType**, ir a:
-
-> Developer > Documents > Doctype > New
-
-
-
-En el DocType, primero el módulo, lo que en nuestro caso es **Library Management**
-
-#### Agregando Campos
-
-En la tabla de campos, puedes agregar los campos (propiedades) de el DocType (Article).
-
-Los campos son mucho más que solo columnas en la base de datos, pueden ser:
-Fields are much more than database columns, they can be:
-
-1. Columnas en la base de datos
-1. Ayudantes de diseño (definidores de secciones / columnas)
-1. Tablas hijas (Tipo de dato Table)
-1. HTML
-1. Acciones (botones)
-1. Adjuntos o Imagenes
-
-Vamos a agregar los campos de el Article.
-
-
-
-Cuando agredas los campos, necesitas llenar el campo **Type**. **Label** es opcional para los Section Break y Column Break. **Name** (`fieldname`) es el nombre de la columna en la tabla de la base de datos y tambien el nombre de la propiedad para el controlador. Esto tiene que ser *code friendly*, i.e. Necesitas poner _ en lugar de " ". Si dejas en blanco este campo, se va a llenar automáticamente al momento de guardar.
-
-Puedes establecer otras propiedades al campo como si es obligatorio o no, si es de solo lectura, etc.
-
-Podemos agregar los siguientes campos:
-
-1. Article Name (Data)
-2. Author (Data)
-3. Description
-4. ISBN
-5. Status (Select): Para los campos de tipo Select, vas a escribir las opciones. Escribe **Issued** y **Available** cada una en una linea diferente en la caja de texto de Options. Ver el diagrama más abajo.
-6. Publisher (Data)
-7. Language (Data)
-8. Image (Adjuntar Imagen)
-
-
-#### Agregar permisos
-
-Despues de agregar los campos, dar click en hecho y agrega una nueva fila en la sección de Permission Roles. Por ahora, vamos a darle accesos Lectura, Escritura, Creación y Reportes al Role **Librarian**. Frappe cuenta con un sistema basados en el modelo de Roles finamente granulado. Puedes cambiar los permisos más adealante usando el **Role Permissions Manager** desde **Setup**.
-
-
-
-#### Guardando
-
-Dar click en el botón de **Guardar**. Cuando el botón es clickeado, una ventana emergente le va a preguntar por el nombre. Vamos a darle el nombre de **Article** y guarda el DocType.
-
-Ahora accede a mysql y verifica que en la base de datos que se ha creado una nueva tabla llamada tabArticle.
-
- $ bench mysql
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MariaDB connection id is 3931
- Server version: 5.5.36-MariaDB-log Homebrew
-
- Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- MariaDB [library]> DESC tabArticle;
- +--------------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+--------------+------+-----+---------+-------+
- | name | varchar(255) | NO | PRI | NULL | |
- | creation | datetime(6) | YES | | NULL | |
- | modified | datetime(6) | YES | | NULL | |
- | modified_by | varchar(40) | YES | | NULL | |
- | owner | varchar(60) | YES | | NULL | |
- | docstatus | int(1) | YES | | 0 | |
- | parent | varchar(255) | YES | MUL | NULL | |
- | parentfield | varchar(255) | YES | | NULL | |
- | parenttype | varchar(255) | YES | | NULL | |
- | idx | int(8) | YES | | NULL | |
- | article_name | varchar(255) | YES | | NULL | |
- | status | varchar(255) | YES | | NULL | |
- | description | text | YES | | NULL | |
- | image | varchar(255) | YES | | NULL | |
- | publisher | varchar(255) | YES | | NULL | |
- | isbn | varchar(255) | YES | | NULL | |
- | language | varchar(255) | YES | | NULL | |
- | author | varchar(255) | YES | | NULL | |
- +--------------+--------------+------+-----+---------+-------+
- 18 rows in set (0.00 sec)
-
-Como puedes ver, junto con los DocFields, algunas columnas fueron agregadas a la tabla. Las importantes a notar son, la clave primaria, `name`, `owner`(El usuario que creo el registro),
-`creation` y `modified` (timestamps para la creación y última modificación).
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/form-client-scripting.md b/frappe/docs/user/es/tutorial/form-client-scripting.md
deleted file mode 100644
index 26f5410b83..0000000000
--- a/frappe/docs/user/es/tutorial/form-client-scripting.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Form Client Scripting
-
-## Añadir Scripts a nuestros formularios
-
-Ya que tenemos creado el sistema básico que funciona sin problemas sin escribir una linea de código. Vamos a escribir algunos scripts
-para hablar la aplicación más interactiva y agregar validaciones para que el usuario no pueda introducir información erronea.
-
-### Scripts del lado del Cliente
-
-En el DocType **Library Transaction**, solo tenemos campo para el Nombre del miembro. No hemos creado dos campos. Esto podría ser dos campos (y probablemente debería), pero para los motivos del ejemplo, vamos a considerar que tenemos que implementarlo así. Para hacerlo vamos a tener que escribir un manejador de eventos para el evento que ocurre cuando el usuario selecciona el campo `library_member` y luego accede a la información del miembro desde el servidor usando el REST API y cambia los valores en el formulario.
-
-Para empezar el script, en el directorio `library_management/doctype/library_transaction`, crea un nuevo archivo `library_transaction.js`.
-Este archivo va a ser ejecutado automáticamente cuando la primer Library Transaction es abierta por el usuario. En este archivo, podemos establecer eventos y escribir otras funciones.
-
-#### library_transaction.js
-
- frappe.ui.form.on("Library Transaction", "library_member",
- function(frm) {
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Library Member",
- name: frm.doc.library_member
- },
- callback: function (data) {
- frappe.model.set_value(frm.doctype,
- frm.docname, "member_name",
- data.message.first_name
- + (data.message.last_name ?
- (" " + data.message.last_name) : ""))
- }
- })
- });
-
-1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** es usada para establecer un manejador de eventos cuando la propiedad library_member es seleccionada.
-1. En el manejador, vamos a disparar una llamada AJAX a `frappe.client.get`. En respuesta obtenemos el objeto consultado en formato JSON. [Aprende más acerca del API](/frappe/user/en/guides/integration/rest_api).
-1. Usando **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** cambiamos el valor en el formulario.
-
-**Nota:** Para verificar si su script funciona, recuerda Recargar/Reload la página antes de probar el script. Los cambios realizados a los script del lado del Cliente no son automáticamente cargados nuevamente cuando estas en modo desarrollador.
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/index.md b/frappe/docs/user/es/tutorial/index.md
deleted file mode 100644
index 62d30a873c..0000000000
--- a/frappe/docs/user/es/tutorial/index.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Tutorial sobre Frappe
-
-En esta guía, vamos a mostrarte como crear una aplicación desde cero usando **Frappe**. Usando el ejemplo de un Sistema de Gestión de Librería. Vamos a cubrir:
-
-1. Instalación
-1. Creando una nueva App
-1. Creando Modelos
-1. Creando Usuarios y Registros
-1. Creando Controladores
-1. Creando Vistas Web
-1. Configurando Hooks y Tareas
-
-## Para Quién es este tutorial?
-
-Esta guía esta orientada para desarrolladores de software que estan familiarizados con el proceso de como son creadas y servidas las aplicaciones web. El Framework Frappe está escrito en Python y usa MariaDB como base de datos y para la creación de las vistas web usa HTML/CSS/Javascript. Por lo que sería excelente si estas familiarizado con estas tecnologías.
-Por lo menos, si nunca haz usado Python antes, deberías tomar un tutorial rápido antes de iniciar con este tutorial.
-
-Frappe usa el sistema de gestión de versiones en GitHub. También, es importante estar familiarizado con los conceptos básicos de git y tener una cuenta en GitHub para manejar sus aplicaciones.
-
-## Ejemplo
-
-Para esta guía, vamos a crear una aplicación simple llamada **Library Management**. En esta aplicación vamos a tener los siguientes modelos (Permanecerán en inglés para que coincidan con las imagenes):
-
-1. Article (Libro o cualquier otro artículo que pueda ser prestado)
-1. Library Member
-1. Library Transaction (Entrega o Retorno de un artículo)
-1. Library Membership (Un período en el que un miembro esta permitido hacer una trasacción)
-1. Library Management Setting (Configuraciones generales, como el tiempo que dura el prestamo de un artículo)
-
-La interfaz de usuario (UI) para la aplicación va a ser el **Frappe Desk**, un entorno para UI basado en el navegador y viene integrado en Frappe donde los formularios son generados automáticamente desde los modelos y los roles y permisos son aplicados.
-
-También, vamos a crear vistas webs para la librería donde los usuarios pueden buscar los artículos desde una página web.
-
-{index}
diff --git a/frappe/docs/user/es/tutorial/index.txt b/frappe/docs/user/es/tutorial/index.txt
deleted file mode 100644
index 1fed6aed93..0000000000
--- a/frappe/docs/user/es/tutorial/index.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-before
-app
-bench
-new-app
-setting-up-the-site
-start
-models
-roles
-doctypes
-naming-and-linking
-doctype-directory-structure
-users-and-records
-form-client-scripting
-controllers
-reports
-web-views
-single-doctypes
-task-runner
-conclusion
diff --git a/frappe/docs/user/es/tutorial/models.md b/frappe/docs/user/es/tutorial/models.md
deleted file mode 100644
index 4951c55ec0..0000000000
--- a/frappe/docs/user/es/tutorial/models.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Creando Modelos
-
-El siguiente paso es crear los modelos que discutimos en la introducción. En Frappe, los modelos son llamados **DocTypes**. Puedes crear nuevos DocTypes desde el UI Escritorio de Frappe. **DocTypes** son creados de campos llamados **DocField** y los permisos basados en roles son integrados dentro de los modelos, estos son llamados **DocPerms**.
-
-Cuando un DocType es guardado, se crea una nueva tabla en la base de datos. Esta tabla se nombra `tab[doctype]`.
-
-Cuando creas un **DocType** una nueva carpeta es creada en el **Module** y un archivo JSON y una platilla de un controlador en Python son creados automáticamente. Cuando modificas un DocType, el archivo JSON es modificado y cada vez que se ejecuta `bench migrate`, sincroniza el archivo JSON con la tabla en la base de datos. Esto hace que sea más facíl reflejar los cambios hechos al esquema y migrarlo.
-
-### Modo desarrollador
-
-Para crear modelos, debes setear `developer_mode` a 1 en el archivo `site_config.json` ubicados en /sites/library y ejecuta el comando `bench clear-cache` o usa el menú de usuario en el Escritorio y da click en "Recargar/Reload" para que los cambios tomen efecto. Deberías poder ver la aplicación llamada "Developer" en su escritorio.
-
- {
- "db_name": "bcad64afbf",
- "db_password": "v3qHDeVKvWVi7s97",
- "developer_mode": 1
- }
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/naming-and-linking.md b/frappe/docs/user/es/tutorial/naming-and-linking.md
deleted file mode 100644
index da929b0272..0000000000
--- a/frappe/docs/user/es/tutorial/naming-and-linking.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Nombrando y Asociando DocType
-
-Vamos a crear otro DocType y guardarlo:
-
-1. Library Member (First Name, Last Name, Email Address, Phone, Address)
-
-
-
-
-#### Nombrando DocTypes
-
-Los DocTypes pueden ser nombrados en diferentes maneras:
-
-1. Basados en un campo
-1. Basados en una serie
-1. A traves del controlador (vía código)
-1. Con un promt
-
-Esto puede ser seteado a traves del campo **Autoname**. Para el controlador, dejar en blanco.
-
-> **Search Fields**: Un DocType puede ser nombrado por serie pero seguir teniendo la necesidad de ser buscado por nombre. En nuestro caso, el Article va ser buscado por el título o el nombre del autor. Por lo que vamos a poner esos campos en el campo de search.
-
-
-
-#### Campo de Enlace y Campo Select
-
-Las claves foraneas son específicadas en Frappe como campos **Link** (Enlace). El DocType debe ser mencionado en el area de texto de Options.
-
-En nuestro ejemplo, en el DocType de Library Transaction,tenemos que enlazar los dos DocTypes de Library Member and the Article.
-
-**Nota:** Recuerda que los campos de Enlace no son automáticamente establecidos como claves foraneas en la base de datos MariaDB, porque esto crearía un indice en la columna. Las validaciones de claves foraneas son realizadas por el Framework.
-
-
-
-Por campos de tipo Select, como mencionamos antes, agrega varias opciones en la caja de texto **Options**, cada una en una nueva linea.
-
-
-
-De manera similar continua haciendo los otros modelos.
-
-#### Valores enlazados
-
-Un patrón estandar es que cuando seleccionas un ID, dice **Library Member** en **Library Membership**, entonces el nombre y apellido del miembro deberian ser copiados en campos relevantes de el Doctype Library Membership Transaction.
-
-Para hacer esto, podemos usar campos de solo lectura y en opciones, podemos especificar el nombre del link (enlace) y el campo o propiedad que deseas obtener. Para este ejempo en **Member First Name** podemos especificar `library_member.first_name`.
-
-
-
-### Completar los modelos
-
-En la misma forma, puedes completar todos los modelos, todos los campos deben verse de esta manera
-
-#### Article
-
-
-
-#### Library Member
-
-
-
-#### Library Membership
-
-
-
-#### Library Transaction
-
-
-
-> Asegurate de dar permiso a **Librarian** en cada DocType
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/new-app.md b/frappe/docs/user/es/tutorial/new-app.md
deleted file mode 100644
index 2978145db7..0000000000
--- a/frappe/docs/user/es/tutorial/new-app.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Creando una nueva aplicación
-
-Una vez el bench esté instalado, vas a ver dos directorios principales, `apps` and `sites`. Todas las aplicaciones van a ser instaladas en apps.
-
-Para crear una nueva aplicación, debes posicionarte en el directorio del bench y ejecutar `bench new-app {app_name}` y llenar los detalles de la aplicación. Esto a va crear los directorios y archivos necesarios para una aplicación.
-
- $ bench new-app library_management
- App Title (defaut: Lib Mgt): Library Management
- App Description: App for managing Articles, Members, Memberships and Transactions for Libraries
- App Publisher: Frappe
- App Email: info@frappe.io
- App Icon (default 'octicon octicon-file-directory'): octicon octicon-book
- App Color (default 'grey'): #589494
- App License (default 'MIT'): GNU General Public License
-
-### Estructura de una aplicación
-
-La aplicación va a ser creada en el directorio llamado `library_management` y va a tener la siguiente estructura:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- │ ├── __init__.py
- │ ├── config
- │ │ ├── __init__.py
- │ │ └── desktop.py
- │ ├── hooks.py
- │ ├── library_management
- │ │ └── __init__.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── __init__.py
- │ ├── generators
- │ │ └── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- ├── license.txt
- ├── requirements.txt
- └── setup.py
-
-1. `config` contiene la información de configuración de la aplicación.
-1. `desktop.py` es donde los íconos del escritorio pueden ser agregados al mismo.
-1. `hooks.py` es donde se configuran las integraciones con el entorno y otras aplicaciones.
-1. `library_management` (dentro) es un **módulo** que está contenido. En Frappe, un **módulo** es donde los modelos y controladores se almacenan.
-1. `modules.txt` contiene la lista de **módulos** en la aplicación. Cuando creas un nuevo módulo, es obligatorio que lo agregues a este archivo.
-1. `patches.txt` es donde los patches para migraciones son establecidos. Son módulos de Python referenciados usando la nomenclatura de punto.
-1. `templates` es el directorio donde son mantenidos las plantillas de vistas web. Plantillas para **Login** y otras páginas estandar estan contenidas en Frappe.
-1. `generators` son donde las plantillas para los modelos son almacenadas, donde cada instancia de modelo tiene una ruta web separada, por ejemplo un **Blog Post** donde cada post tiene una url única. En Frappe, el manejador de plantillas utilizado es Jinja2.
-1. `pages` es donde las rutas simples son almacenadas. Por ejemplo para un tipo de página "/blog".
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/reports.md b/frappe/docs/user/es/tutorial/reports.md
deleted file mode 100644
index 3fb5a9d76e..0000000000
--- a/frappe/docs/user/es/tutorial/reports.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Reportes
-
-Puedes dar click en el texto que dice Reportes en el panel lateral izquierdo para ver los registros de manera tabulada.
-
-
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/roles.md b/frappe/docs/user/es/tutorial/roles.md
deleted file mode 100644
index d65aed184c..0000000000
--- a/frappe/docs/user/es/tutorial/roles.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Creando Roles
-
-Antes de crear los Modelos, debemos crear los Roles que van a establecer los permisos en el Modelo. En nuestro ejemplo vamos a tener dos Roles:
-
-1. Librarian
-1. Library Member
-
-Para crear un nuevo Role, ir a:
-
-> Setup > Users > Role > New
-
-
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/setting-up-the-site.md b/frappe/docs/user/es/tutorial/setting-up-the-site.md
deleted file mode 100644
index 83c925d909..0000000000
--- a/frappe/docs/user/es/tutorial/setting-up-the-site.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Configurando el Site
-
-Vamos a crear un nuevo Site llamado `library`.
-
-*Nota: Antes de crear cualquier Site, necesitas hacer unos cambios en su instalación de MariaDB.*
-*Copia la siguiente configuración por defecto de ERPNext en su archivo `my.cnf`.*
-
- [mysqld]
- innodb-file-format=barracuda
- innodb-file-per-table=1
- innodb-large-prefix=1
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
-
- [mysql]
- default-character-set = utf8mb4
-
-Ahora puedes instalar un nuevo site, ejecutando el comando `bench new-site library`.
-
-La ejecución del comando anterior va a generar una nueva base de datos, un directorio en la carpeta sites y va a instalar `frappe` (el cual también es una aplicación!) en el nuevo site.
- La aplicación `frappe` tiene dos módulos integrados que son **Core** y **Website**. El módulo Core contiene los modelos básicos para la aplicación. Frappe es un Framework con muchas funcionalidades incluidas y viene con muchos modelos integrados. Estos modelos son llamados **DocTypes**. Vamos a ver más de esto en lo adelante.
-
- $ bench new-site library
- MySQL root password:
- Installing frappe...
- Updating frappe : [========================================]
- Updating country info : [========================================]
- Set Administrator password:
- Re-enter Administrator password:
- Installing fixtures...
- *** Scheduler is disabled ***
-
-### Estructura de un Site
-
-Un nuevo directorio ha sido creado dentro de la carpeta `sites` llamado `library`. La estructura siguiente es la que trae por defecto un site.
-
- .
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- └── site_config.json
-
-1. `public/files` es donde se almacenan los archivos subidos por los usuarios.
-1. `private/backups` es donde se almacenan los backups o copias de respaldo.
-1. `site_config.json` es donde todas las configuraciones a nivel de sites son almacenadas.
-
-### Configurando un Site por defecto
-
-En caso que tengas varios sites en tu Bench, debes usar `bench use [nombre_site]` para especificar el site por defecto.
-
-Ejemplo:
-
- $ bench use library
-
-### Instalar Aplicaciones
-
-Ahora vamos a instalar nuestra aplicación `library_management` en nuestro site `library`.
-
-1. Instalar la aplicación library_management en el site library se logra ejecutando el siguiente comando: `bench --site [nombre_site] install-app [nombre_app]`
-
-Ejemplo:
-
- $ bench --site library install-app library_management
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/single-doctypes.md b/frappe/docs/user/es/tutorial/single-doctypes.md
deleted file mode 100644
index 0b8d7745c2..0000000000
--- a/frappe/docs/user/es/tutorial/single-doctypes.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# DocTypes Simples
-
-Una aplicación normalmente va a tener una página de configuración. En nuestra aplicación, podemos definir una página donde específiquemos el período de prestamos. Necesitaremos almacenar esta propiedad. En Frappe, esto puede lograrse usando los DocType de tipo **Simple**. Un DocType Simple es como el patrón Singleton en Java. Es un objeto con tan solo una instancia. Vamos a llamarlo **Library Managment Settings**.
-
-Para crear un Single DocType, marca el checkbox **Is Single**.
-
-
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/start.md b/frappe/docs/user/es/tutorial/start.md
deleted file mode 100644
index f8abb4d675..0000000000
--- a/frappe/docs/user/es/tutorial/start.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Iniciando el Bench
-
-Ahora podemos acceder y verificar que todo esta funcionando de forma correcta.
-
-Para iniciar el servidor de desarrollo, ejecuta `bench start`.
-
- $ bench start
- 13:58:51 web.1 | started with pid 22135
- 13:58:51 worker.1 | started with pid 22136
- 13:58:51 workerbeat.1 | started with pid 22137
- 13:58:52 web.1 | * Running on http://0.0.0.0:8000/
- 13:58:52 web.1 | * Restarting with reloader
- 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting...
-
-Ahora abre tu navegador y ve a la dirección `http://localhost:8000`. Deberías ver la páagina de inicio de sesión si todo salió bien.:
-
-
-
-Ahora accede con :
-
-Login ID: **Administrator**
-
-Password : **Usa la contraseña que creaste durante la instalación**
-
-Cuando accedas, deberías poder ver la página de inicio (Desk).
-
-
-
-Como puedes ver, el sistema básico de Frappe viene con algunas aplicaciones preinstaladas como To Do, File Manager etc. Estas aplicaciones pueden integrarse en el flujo de trabajo de su aplicació a medida que avancemos.
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/task-runner.md b/frappe/docs/user/es/tutorial/task-runner.md
deleted file mode 100644
index 215bd6b46d..0000000000
--- a/frappe/docs/user/es/tutorial/task-runner.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Tareas Programadas
-
-Finalmente, una aplicación también tiene que mandar notificaciones de email y hacer otros tipos de tareas programadas. En Frappe, si tienes el bench configurado, el programador de tareas es configurado vía Celery usando Redis Queue.
-
-Para agregar un nuevo manejador(Handler) de tareas, ir a `hooks.py` y agrega un nuevo manejador. Los manejadores (Handlers) por defecto son `all`, `daily`, `weekly`, `monthly`. El manejador `all` es llamado cada 3 minutos por defecto.
-
- # Tareas Programadas
- # ---------------
-
- scheduler_events = {
- "daily": [
- "library_management.tasks.daily"
- ],
- }
-
-Aquí hacemos referencia a una función Python que va a ser ejecutada diariamente. Vamos a ver como se ve esta función:
-
- # Copyright (c) 2013, Frappe
- # For license information, please see license.txt
-
- from __future__ import unicode_literals
- import frappe
- from frappe.utils import datediff, nowdate, format_date, add_days
-
- def daily():
- loan_period = frappe.db.get_value("Library Management Settings",
- None, "loan_period")
-
- overdue = get_overdue(loan_period)
-
- for member, items in overdue.iteritems():
- content = """Following Items are Overdue
- Please return them as soon as possible
"""
-
- for i in items:
- content += "- {0} ({1}) due on {2}
".format(i.article_name,
- i.article,
- format_date(add_days(i.transaction_date, loan_period)))
-
- content += "
"
-
- recipient = frappe.db.get_value("Library Member", member, "email_id")
- frappe.sendmail(recipients=[recipient],
- sender="test@example.com",
- subject="Library Articles Overdue", content=content, bulk=True)
-
- def get_overdue(loan_period):
- # check for overdue articles
- today = nowdate()
-
- overdue_by_member = {}
- articles_transacted = []
-
- for d in frappe.db.sql("""select name, article, article_name,
- library_member, member_name
- from `tabLibrary Transaction`
- order by transaction_date desc, modified desc""", as_dict=1):
-
- if d.article in articles_transacted:
- continue
-
- if d.transaction_type=="Issue" and \
- datediff(today, d.transaction_date) > loan_period:
- overdue_by_member.setdefault(d.library_member, [])
- overdue_by_member[d.library_member].append(d)
-
- articles_transacted.append(d.article)
-
-Podemos pegar el código anterior en cualquier módulo de Python que sea accesible. La ruta es definida en `hooks.py`, por lo que para nuestro propósito vamos a poner el código en el archivo `library_management/tasks.py`.
-
-Nota:
-
-1. Obtenemos el período de prestamo desde **Library Management Settings** usando la función `frappe.db.get_value`.
-1. Ejecutamos una consulta en la base de datos usando la función `frappe.db.sql`
-1. Los Email son enviados usando `frappe.sendmail`
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/users-and-records.md b/frappe/docs/user/es/tutorial/users-and-records.md
deleted file mode 100644
index e599c4301b..0000000000
--- a/frappe/docs/user/es/tutorial/users-and-records.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Creando Usuarios y Registros
-
-Teniendo los modelos creados, podemos empezar a crear registros usando la interfaz gráfica de usuario de Frappe. No necesitas crear vistas! Las vistas en Frappe son automáticamente creadas basadas en las propiedades del DocType.
-
-### 4.1 Creando Usuarios
-
-Para crear registros, primero vamos a crear un Usuario. Para crear un usuario, ir a:
-
-> Setup > Users > User > New
-
-Crea un nuevo Usuario y llena los campos de nombre, primer nombre y nueva contraseña.
-
-Luego dale los Roles de Librarian y de Library Member a este usuario.
-
-
-
-Ahora cierra sesión y accede usando las credenciales del nuevo usuario.
-
-### 4.2 Creando Registros
-
-Debes ver un ícono del módulo de Library Management. Dar click en el ícono para entrar a la página del módulo:
-
-
-
-Aquí puedes ver los DocTypes que fueron creados para la aplicación. Vamos a comenzar a crear nuevos registros.
-
-Primero vamos a crear un nuevo Article:
-
-
-
-Aquí vas a ver que los DocTypes que haz creado han sido renderizados como un formulario. Las validaciones y las otras restricciones también están aplicadas según se diseñaron. Vamos a llenar los datos de un Article.
-
-
-
-Puedes agregar una imagen si deseas.
-
-
-
-Ahora vamos a crear un nuevo miembro:
-
-
-
-Despues de esto, crearemos una nueva membresía (membership) para el miembro.
-
-Si recuerdas, aquí hemos específicado los valores del nombre y apellido del miembro directamente desde el registro del miembro tan pronto selecciones el miembro id, los nombres serán actualizados.
-
-
-
-Como puedes ver la fecha tiene un formato de año-mes-día lo cual es una fecha del sistema. Para seleccionar o cambiar la fecha, tiempo y formatos de números, ir a:
-
-> Setup > Settings > System Settings
-
-
-
-{next}
diff --git a/frappe/docs/user/es/tutorial/web-views.md b/frappe/docs/user/es/tutorial/web-views.md
deleted file mode 100644
index 2fe98f1523..0000000000
--- a/frappe/docs/user/es/tutorial/web-views.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Vistas Web (Web Views)
-
-Frappe tiene dos entornos principales, El escritorio y la Web. El escritorio es una interfaz de usuario controlada con una excelente aplicación AJAX y la web es mas plantillas de HTML tradicionales dispuestas para consumo público. Vistas Web pueden también ser generadas para crear vistas controladas para los usuarios que puedes acceder al sistema pero aún así no tener acceso al escritorio.
-
-En Frappe, Las vistas web son manejadas por plantillas que estan usualmente en el directorio `templates`. Hay dos tipos principales de plantillas.
-
-1. Pages: Estos son plantillas Jinja donde una vista existe solo para una ruta. ejemplo. `/blog`.
-2. Generators: Estas son plantiallas donde cada instancia de un DocType tiene una ruta diferente `/blog/a-blog`, `blog/b-blog` etc.
-3. Lists and Views: Estos son listas y vistan estandares con la ruta `[doctype]/[name]` y son renderizadas basándose en los permisos.
-
-### Vista Web Estandar
-
-> Esta funcionalidad sigue bajo desarrollo.
-
-Vamos a ver las Vistas web estandar:
-
-Si estas logueado como el usuario de prueba, ve a `/article` y deberías ver la lista de artículos.
-
-
-
-Da click en uno de los artículos y vas a ver una vista web por defecto
-
-
-
-Si deseas hacer una mejor vista para la lista de artículos, crea un archivo llamado `row_template.html` en el directorio `library_management/templates/includes/list/`.
- Aquí hay un archivo de ejemplo:
-
- {% raw %}
-
-
-
-
-
-
- {{ doc.article_name }}
- {{ doc.author }}
- {{ (doc.description[:200] + "...")
- if doc.description|len > 200 else doc.description }}
- Publisher: {{ doc.publisher }}
-
- {% endraw %}
-
-Aquí, vas a tener todas las propiedades de un artículo en el objeto `doc`.
-
-La lista actualizada debe lucir de esta manera!
-
-
-
-#### Página de Inicio
-
-Frappe también tiene vistas para el registro de usuarios que incluye opciones de registro usando Google, Facebook y GitHub. Cuando un usuario se registra vía la web, no tiene acceso a la interfaz del Escritorio por defecto.
-
-> Para permitirles a los usuarios acceso al Escritorio, debes especificar que el usuario es de tipo "System User" en Setup > User
-
-Para usuario que no son de tipo System User, podemos especificar una página de inicio por defecto a traves de `hooks.py` basándonos en Role.
-
-Cuando miembros acceden al sistema, deben ser redireccionados a la página `article`, para configurar esto modifica el archivo `library_management/hooks.py` y agrega lo siguiente:
-
- role_home_page = {
- "Library Member": "article"
- }
-
-{next}
diff --git a/frappe/docs/user/es/videos/__init_.py b/frappe/docs/user/es/videos/__init_.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/videos/__init__.py b/frappe/docs/user/es/videos/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/es/videos/index.md b/frappe/docs/user/es/videos/index.md
deleted file mode 100644
index 4beb76e7a9..0000000000
--- a/frappe/docs/user/es/videos/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Videos Tutoriales acerca del Framework Frappe
-
-Este video tutorial de 10 videos va a enseñarte como crear aplicaciones complejas en Frappe.
-
-Prerrequisitos: Debes tener conocimientos básicos de Python, Javascript y MySQl antes de empezar este tutorial.
-
----
-
-
diff --git a/frappe/docs/user/fr/__init__.py b/frappe/docs/user/fr/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/fr/index.md b/frappe/docs/user/fr/index.md
deleted file mode 100644
index a25785e59e..0000000000
--- a/frappe/docs/user/fr/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Develop Apps with Frappe
-
-{index}
diff --git a/frappe/docs/user/fr/index.txt b/frappe/docs/user/fr/index.txt
deleted file mode 100644
index 4d8a2e24ae..0000000000
--- a/frappe/docs/user/fr/index.txt
+++ /dev/null
@@ -1 +0,0 @@
-tutorial
diff --git a/frappe/docs/user/fr/tutorial/__init__.py b/frappe/docs/user/fr/tutorial/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/fr/tutorial/app.md b/frappe/docs/user/fr/tutorial/app.md
deleted file mode 100644
index 54c4fffd1e..0000000000
--- a/frappe/docs/user/fr/tutorial/app.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Qu'est ce qu'une application ?
-
-Dans Frappe, une application est juste une application Python standard. Vous pouvez structurer une application Frappe de
-la même facon que vous structurez une application Python standard. Pour le déploiement, Frappe utilise Setuptools donc
-vous pouvez facilement déployer votre application sur n'importe quelle machine.
-
-Frappe fournit une interface WSGI et pendant vos développements vous pouvez utiliser le serveur Werkzeug embarqué. Pour le
-déploiement en production, nous recommandons d'utiliser nginx et gunicorn.
-
-Frappe, c'est aussi une une architecture multi-tenant ce qui signifie que vous pouvez lancer plusieurs sites sur une même
-configuration, chaque site utilisant ses propres applications et utilisateurs. La base de données de chaque site est indépendante.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/before.md b/frappe/docs/user/fr/tutorial/before.md
deleted file mode 100644
index 12da08b512..0000000000
--- a/frappe/docs/user/fr/tutorial/before.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Avant de commencer
-
-Liste des outils et technologies utiles dans le développement d'applications avec Frappe.
-
-Il y a un grand nombres de tutoriels en ligne et nous recommandons [CodeAcademy](http://www.codecademy.com/) ou vous trouverez beaucoup de ressources de qualité.
-
----
-
-#### 1. Python
-
-La partie serveur de Frappe est codée en Python et c'est une bonne idée d'[apprendre rapidement Python](http://www.codecademy.com/tracks/python) avant de commencer à comprendre Frappe. [Le tutoriel sur docs.python.org](https://docs.python.org/2.7/tutorial/index.html) est aussi une excellente ressource pour apprendre Python. Notez que Frappe utilise Python 2.7.
-
-Pour produire une application de qualité, vous devez inclure des tests automatiques. Vous pouvez comprendre les bases du développement par les tests [ici](http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137).
-
----
-
-#### 2. MariaDB / MySQL
-
-Vous devez comprendre les notions essentielles des bases de données, comment installer, se connecter, créer de nouvelles bases,
-et comment faire des requêtes. Voici [une rapide introduction à MySQL](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial) ou dirigez vous vers [le site MariaDB pour des informations plus détaillées](https://mariadb.com/kb/en/mariadb/documentation/getting-started/)
-
----
-
-#### 3. HTML / CSS
-
-Pour construire des interfaces utilisateur, vous devez [apprendre les bases HTML / CSS](http://www.codecademy.com/tracks/web) et [connaître le framework CSS Boostrap](http://getbootstrap.com).
-
----
-
-#### 4. Construire des interfaces avec Javascript et JQuery
-
-Pour customiser les formulaires et créer des interfaces riches, le mieux est [d'apprendre Javascript](http://www.codecademy.com/tracks/javascript) et la [fameuse librairie JQuery](http://www.codecademy.com/tracks/jquery).
-
----
-
-#### 5. Modifier les affichages et les pages web avec le sysème de template Jinja
-
-Si vous voulez modifier les affichages, vous devez apprendre le [language de template Jinja](http://jinja.pocoo.org/). C'est un moyen rapide de construire des pages web dynamiques.
-
----
-
-#### 6. Git et GitHub
-
-[Apprenez à contribuer à un projet open source en utilisant Git et GitHub](https://guides.github.com/activities/contributing-to-open-source/), deux outils fantastiques pour vous aider à gérer et partager votre code.
-
----
-
-Quand vous êtes prêts, [essayez de développer une application simple avec Frappe](/docs/user/fr/tutorial/app)
-
diff --git a/frappe/docs/user/fr/tutorial/bench.md b/frappe/docs/user/fr/tutorial/bench.md
deleted file mode 100644
index c2902b3a87..0000000000
--- a/frappe/docs/user/fr/tutorial/bench.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Installer le bench de Frappe
-
-La façon la plus rapide d'installer Frappe sur un système Unix est d'utiliser frappe-bench. Lisez les instructions détaillées sur l'installation et l'utilisation de Frappe Bench : [https://github.com/frappe/bench](https://github.com/frappe/bench)
-
-Avec Frappe Bench vous pourrez configurer et héberger plusieurs sites et applications. Frappe Bench configure aussi un environnement virtuel Python (Virtualenv), vos applications seront donc isolées les unes des autres et vous n'aurez pas de conflits avec d'autres environnements de développement.
-
-La commande `bench` sera ajoutée pour vous aider dans le développement et la gestion de vos applications.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/conclusion.md b/frappe/docs/user/fr/tutorial/conclusion.md
deleted file mode 100644
index 8428b362b2..0000000000
--- a/frappe/docs/user/fr/tutorial/conclusion.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Conclusion
-
-Nous espérons vous avoir donné un apercu de comment les applications sont développées avec Frappe. L'ojectif était de vous
-montrer brievement, les différents aspects du développement d'une application en vous donnant un apércu général. Pour aller plus
-loin dans les explications, consultez l'API.
-
-Pour obtenir de l'aider, rejoingnez la communauté sur le [chat sur Gitter](https://gitter.im/frappe/erpnext) ou sur le
-[forum des développeurs](https://discuss.erpnext.com)
-
diff --git a/frappe/docs/user/fr/tutorial/controllers.md b/frappe/docs/user/fr/tutorial/controllers.md
deleted file mode 100644
index dd9f2ab69d..0000000000
--- a/frappe/docs/user/fr/tutorial/controllers.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Les controleurs
-
-La prochaine étape est d'ajouter quelques méthodes et événements à nos modèles. Dans l'application, nous devons nous
-assurer que si une opération est faite, l'article concerné doit être disponible en stock et que le membre qui souhaite
-faire le prêt à un abonnement valide.
-
-Pour cela, nous pouvons écrire une règle de validation au moment de la sauvegarde du prêt. Ouvrez le template `library_management/doctype/library_transaction/library_transaction.py`.
-
-Ce fichier est le controleur qui gère les opérations de la librairie, vous pouvez y écrire des méthodes pour:
-
-1. `before_insert`
-1. `validate` (avant l'insertion ou la mise à jour)
-1. `on_update` (après la sauvegarde)
-1. `on_submit` (quand le document est soumis)
-1. `on_cancel`
-1. `on_trash` (avant qu'il ne soit sur le point d'être supprimé)
-
-Vous pouvez écrire des méthodes pour ces événements et elles seront appelées par le framework au bon moment.
-
-Voici pour finir le controleur:
-
- from __future__ import unicode_literals
- import frappe
- from frappe import _
- from frappe.model.document import Document
-
- class LibraryTransaction(Document):
- def validate(self):
- last_transaction = frappe.get_list("Library Transaction",
- fields=["transaction_type", "transaction_date"],
- filters = {
- "article": self.article,
- "transaction_date": ("<=", self.transaction_date),
- "name": ("!=", self.name)
- })
- if self.transaction_type=="Issue":
- msg = _("Article {0} {1} has not been recorded as returned since {2}")
- if last_transaction and last_transaction[0].transaction_type=="Issue":
- frappe.throw(msg.format(self.article, self.article_name,
- last_transaction[0].transaction_date))
- else:
- if not last_transaction or last_transaction[0].transaction_type!="Issue":
- frappe.throw(_("Cannot return article not issued"))
-
-Dans ce script:
-
-1. Nous récuperons la dernière opération, avant la date de l'opération en cours en utilisant la méthode `frappe.get_list`
-1. Si la dernière opération est quelque chose qui n'est pas attendu, alors nous levons une exception en utilisant `frappe.throw`
-1. Nous utilisons la méthode `_("text")` pour identifier une chaine traduisible.
-
-Vérifiez vos validations en créant de nouveaux enregistrements.
-
-
-
-#### Debogage
-
-Pour debugger, gardez toujours votre console JS ouverte, vérifier les erreurs à la fois de Javascript mais aussi du serveur.
-
-Regardez aussi votre fenêtre de terminal pour les exceptions. Chaque **erreur 500 pour des problèmes internes** seront affichées dans le terminal du serveur en cours d'utilisation.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/doctype-directory-structure.md b/frappe/docs/user/fr/tutorial/doctype-directory-structure.md
deleted file mode 100644
index 1bb7970182..0000000000
--- a/frappe/docs/user/fr/tutorial/doctype-directory-structure.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Structure du repertoire d'un DocType
-
-Après avoir sauvegardé vos DocTypes, vérifiez que les modèles dans les fichiers `.json` et `.py` soient créés dans le module
-`apps/library_management/library_management`. La structure du repertoire devrait ressembler à:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- ..
- │ ├── library_management
- │ │ ├── __init__.py
- │ │ └── doctype
- │ │ ├── __init__.py
- │ │ ├── article
- │ │ │ ├── __init__.py
- │ │ │ ├── article.json
- │ │ │ └── article.py
- │ │ ├── library_member
- │ │ │ ├── __init__.py
- │ │ │ ├── library_member.json
- │ │ │ └── library_member.py
- │ │ ├── library_membership
- │ │ │ ├── __init__.py
- │ │ │ ├── library_membership.json
- │ │ │ └── library_membership.py
- │ │ └── library_transaction
- │ │ ├── __init__.py
- │ │ ├── library_transaction.json
- │ │ └── library_transaction.py
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/doctypes.md b/frappe/docs/user/fr/tutorial/doctypes.md
deleted file mode 100644
index 698e1e6c69..0000000000
--- a/frappe/docs/user/fr/tutorial/doctypes.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# DocType
-
-Après avoir créé les roles, créons des **DocTypes**
-
-Pour créer un nouveau **DocType**, rendez-vous sur:
-
-> Developer > Documents > Doctype > New
-
-
-
-Dans un premier temps, saisissez le module, dans notre cas, **Library Managment**
-
-#### Ajouter des champs
-
-Dans le tableau des champs, vous pouvez ajouter des champs (propriétés) du **DocType** (Article).
-
-Les champs sont bien plus que des colonnes d'une base de données, ils peuvent être:
-
-1. Des colonnes d'une base de données
-1. Des aides pour la mise en page (section / saut de lignes)
-1. Des tableaux enfants (Champs de type tableau)
-1. HTML
-1. Des actions (button)
-1. Des pièces jointes ou des images
-
-Ajoutons des champs pour l'article.
-
-
-
-Quand vous ajoutez des champs, vous devez entrer le **Type**. Le **Label** est optionnel pour les retours de sections et de colonnes.
-Le **Name** (`fieldname`) ets le nom de la colonne dans la base de données et aussi la propriété du controleur. Les définitions
-doivent être *code friendly*, (par exemple insérer des underscores (_) à la place de espaces. Si vous laissez le champs `fieldname`
-vide, il sera automatiquement complété à la sauvegarde.
-
-Vous pouvez aussi définir d'autres propriétés comme par exemple prciser que le champs est requis ou en lecture seule etc.
-
-Nous pouvons ajouter les champs suivants:
-
-1. Article Name (Data)
-2. Author (Data)
-3. Description
-4. ISBN
-5. Status (Select): Pour les champs de type select, vous devez compléter les options. entrer **Issued** et **Available**
-sur chacune des lignes comme ci-dessous
-6. Publisher (Data)
-7. Language (Data)
-8. Image (Attach Image)
-
-
-#### Ajouter des permissins
-
-Après avoir ajouté les champs, validez et ajoutez un nouveau rôle dans la section des règles de permissions. Pour le moment
-ajoutons les droits le lecture, écriture, création et suppression au modèle **Librarian**. Frappe à une gestion fine des
-permissions sur les modèles. Vous pouvez aussi changer les permissions plus tard en utilisant le gestionnaire de permissions
-dans la configuration.
-
-
-
-#### Sauvegarde
-
-Cliquez sur le bouton **Save**. Quand le bouton est cliqué, une popup vous demandera le nom. Donnez le nom **Article** et
-sauvegardez le **DocType**.
-
-Maintenant, connectez vous à MySQL et vérifiez la base de données créée:
-
- $ bench mysql
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MariaDB connection id is 3931
- Server version: 5.5.36-MariaDB-log Homebrew
-
- Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- MariaDB [library]> DESC tabArticle;
- +--------------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+--------------+------+-----+---------+-------+
- | name | varchar(255) | NO | PRI | NULL | |
- | creation | datetime(6) | YES | | NULL | |
- | modified | datetime(6) | YES | | NULL | |
- | modified_by | varchar(40) | YES | | NULL | |
- | owner | varchar(60) | YES | | NULL | |
- | docstatus | int(1) | YES | | 0 | |
- | parent | varchar(255) | YES | MUL | NULL | |
- | parentfield | varchar(255) | YES | | NULL | |
- | parenttype | varchar(255) | YES | | NULL | |
- | idx | int(8) | YES | | NULL | |
- | article_name | varchar(255) | YES | | NULL | |
- | status | varchar(255) | YES | | NULL | |
- | description | text | YES | | NULL | |
- | image | varchar(255) | YES | | NULL | |
- | publisher | varchar(255) | YES | | NULL | |
- | isbn | varchar(255) | YES | | NULL | |
- | language | varchar(255) | YES | | NULL | |
- | author | varchar(255) | YES | | NULL | |
- +--------------+--------------+------+-----+---------+-------+
- 18 rows in set (0.00 sec)
-
-
-Comme vous pouvez le voir, en plus de nos **DocFields**, d'autres colonnes ont été ajoutées dans notre table. Notez les
-changement, la clé primaire sur, `name`, `owner`(l'utilisateur quia créer l'enregistrement), `creation` et `modified` (des timestamps pour enregistrer les dates de creation et de modification).
-
-{next}
-
diff --git a/frappe/docs/user/fr/tutorial/form-client-scripting.md b/frappe/docs/user/fr/tutorial/form-client-scripting.md
deleted file mode 100644
index a6ab64a60c..0000000000
--- a/frappe/docs/user/fr/tutorial/form-client-scripting.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Form Client Scripting
-
-## Codes des formulaires
-
-Jusqu'a maintenant, nous avons développé un système basique qui fonctionne parfaitement sans avoir eu besoin d'écrire une
- seule ligne de code. Ajoutons donc quelques scripts pour rendre l'applications plus professionnelle et ajoutons des validations
- pour éviter que les utilisateurs n'enregistrent des données invalides.
-
-
-### Les scripts coté client
-
-Dans le **DocType** **Library Transaction**, nous n'avons qu'un seul champ `Member Name`. Nous n'avons pas fait 2 champs.
-Ca pourrait être bien d'avoir deux champs, mais juste pour l'exemple, considérons que nous avons à implémenter cela. Pour ce
-faire, nous allons devoir écrire un gestionnaire d'évenements pour lorsque l'utilisateur sélectionne le champs `library_member` et accède aux données de l'utilisateur depuis le serveur en utilisant une API REST, remplisse les données dans le formaulaire.
-
-Pour commencer ce script, dans le repertoire `library_management/doctype/library_transaction`, créez un nouveau fichier
-`library_transaction.js`. Ce fichier sera automatiquement executé lorsque le modèle `Library Transaction` est appelé par l'utilisateur.
-Donc, dans ce fichier nous pouvons lier des actions à des événemenents mais aussi écrire d'autres fonctions.
-
-#### library_transaction.js
-
- frappe.ui.form.on("Library Transaction", "library_member",
- function(frm) {
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Library Member",
- name: frm.doc.library_member
- },
- callback: function (data) {
- frappe.model.set_value(frm.doctype,
- frm.docname, "member_name",
- data.message.first_name
- + (data.message.last_name ?
- (" " + data.message.last_name) : ""))
- }
- })
- });
-
-1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** est utilisé pour lier un évenement au gestionnaire d'évenements
- quand la propriété `library_member` est complétée.
-1. Dans le gestionnaire, nous déclenchons un appel AJAX vers `frappe.client.get`. En réponse, nous avons l'ojet demandé sous forme d'une JSON. [En savoir plus sur l'API](/frappe/user/fr/guides/integration/rest_api).
-1. En utilisant **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** nous définissons la valeur dans le formulaire.
-
-**Note:** Pour vérifier que votre script fonctionne, n'oubliez pas de recharger votre page avant de tester.
-Les changements dans les scripts côté client ne sont pas automatiquement pris en compte quand vous êtes en mode développeur.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/index.md b/frappe/docs/user/fr/tutorial/index.md
deleted file mode 100644
index b518478c72..0000000000
--- a/frappe/docs/user/fr/tutorial/index.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Tutoriel Frappe
-
-Dans ce guide nous allons vous montrer comment créer une application de A à Z en utilisant **Frappe**. Avec un
-exemple de gestion de bibliothèque, nous allons aborder les sujets suivants:
-
-1. Installation
-1. Créer une nouvelle application
-1. Créer des modèles
-1. Créer des utilisateurs et des enregristrements
-1. Créer des contrôleurs
-1. Créer des vues web
-1. Configurer des Hooks et des tâches
-
-## A qui s'adresse ce tutoriel ?
-
-Ce guide est à destination des développeurs familiers avec la création d'applications web. Le framework Frappe est développé
-avec Python, utilise le système de base de données MariaDB et HTML/CSS/Javascript pour le rendu des pages.
-Il est donc nécessaire d'être familier avec ces technologies. Si vous n'avez jamais utilisé Python auparavant, vous devriez
-suivre un tutoriel rapide avant de suivre ce guide.
-
-Frappe utilise le système de gestion de version git sur Github. Il est donc important que vous connaissiez les bases de
-l'utilisation de git et que vous ayez un compte sur Github pour gérer vos applications.
-
-## Exemple
-
-Dans ce guide, nous allons développer une application simple de **gestion de bibliothèque**. Dans cette applications nous aurons
-les modèles suivants:
-
-1. Article (un livre ou tout autre objet qui peut être emprunté)
-1. Library Member (membre de la bibliothèque)
-1. Library Transaction (prêt ou retour d'un article)
-1. Library Membership (période pendant laquelle un membre peut emprunter)
-1. Library Management Setting (configuration générale)
-
-L'interface utilisateur (UI) pour le bibliothécaire sera **Frappe Desk**, un système de rendu d'interface où les formulaires sont
-automatiquement générés depuis les modèles en appliquant rôles et permissions.
-
-Nous allons aussi créer des vues pour la bibliothèque afin que les utilisateurs puissent parcourir la liste des livres depuis un site internet.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/index.txt b/frappe/docs/user/fr/tutorial/index.txt
deleted file mode 100644
index 1fed6aed93..0000000000
--- a/frappe/docs/user/fr/tutorial/index.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-before
-app
-bench
-new-app
-setting-up-the-site
-start
-models
-roles
-doctypes
-naming-and-linking
-doctype-directory-structure
-users-and-records
-form-client-scripting
-controllers
-reports
-web-views
-single-doctypes
-task-runner
-conclusion
diff --git a/frappe/docs/user/fr/tutorial/models.md b/frappe/docs/user/fr/tutorial/models.md
deleted file mode 100644
index f67d356bf6..0000000000
--- a/frappe/docs/user/fr/tutorial/models.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Définir des modèles
-
-La prochaine étape est de définir les modèles que nous avons présenté en introduction. Dans **Frappe**, les modèles sont appelés
-des **DocTypes**. Vous pouvez définir de nouveaux **DocTypes** depuis l'interface. Les **DocTypes** sont faits de **DocField**
-et de permissions appelées **DocPerms**.
-
-Quand un DocType est sauvegardé, une nouvelle table est créée dans la base de données. Cette table est nommée `tab[doctype]`.
-
-Quand vous créez un **DocType**, un nouveau repertoire est créé dans le **Module**, un fichier JSON définissant le modèles
-ainsin qu'un template de controleur sont automatiquement créés.
-Qaund vous mettez à jour un **DocType**, le modèle JSON est mis à jour et lorsque la commande `bench migrate` est exécutée,
-c'est synchronisé avec la base de données. Cela facilite a mise à jour et la migrations des schemas.
-
-### Le mode développeur
-
-Pour créer des modèles, vous devez définir la valeur de `developer_mode` à 1 dans le fichier `site_config.json` situé dans
-le repertoire /sites/library et executer la commande `bench clear-cache` ou utiliser l'interface et cliquer sur "Recharger"
-pour appliquer les changements. Vous devriez maintenant voir l'application "Developer" sur le bureau.
-
- {
- "db_name": "bcad64afbf",
- "db_password": "v3qHDeVKvWVi7s97",
- "developer_mode": 1
- }
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/naming-and-linking.md b/frappe/docs/user/fr/tutorial/naming-and-linking.md
deleted file mode 100644
index 28ef965efa..0000000000
--- a/frappe/docs/user/fr/tutorial/naming-and-linking.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Nommage et relation entre DocType
-
-Définissons un nouveau **DocType**:
-
-1. Library Member (First Name, Last Name, Email Address, Phone, Address)
-
-
-
-
-#### Le nommage des DocTypes
-
-Les **DocTypes** peuvent être nommés de différentes facons:
-
-1. Sur la base d'un champ
-1. Sur la base d'une série
-1. Par le controlleur (code)
-1. Par la console
-
-Cela peut être configuré par le champs **Autoname**. Pour le controleur, laissez vide.
-
-> **Search Fields**: Un **DocType** peut être nommé sur la base d'une serie mais nous devons toujours pouvoir le chercher par un nom.
-Dans notre cas, l'arcicle peut etre cherché par un titre ou par l'auteur. Remplissons donc le champs **Search Fields**.
-
-
-
-#### Relation et champs select
-
-Les clés étrangères sont, dans Frappe, traduits par un champs de type **Link**. Le **DocType** ciblé doit être mentionné
- dans le champs **Options**.
-
-Dans notre exemple, pour le **doctype** `Library Transaction`, nous avons un lien vers `Library Member` et vers `Article`.
-
-**Note:** Souvenez vous que les champs **Link** ne sont pas automatiquement enregistré comme clé étrangère afin d'éviter
-d'indexer la colonne. Cela pourrait ne pas être optimum, c'est pour cela que la validation de la clé étrangère est faite
-par le framework.
-
-
-
-Pour les champs **select**, comme mentionné plus tôt, ajoutez chacune des options dans le champs **Options**, chaque
-option sur une nouvelle ligne.
-
-
-
-faites de même pour les autres modèles.
-
-#### Valeurs liées
-
-Un modèle standard c'est lorsque vous selectionnez un ID, admettons **Library Member** dans **Library Membership**, alors,
-les noms et prénoms du membre doivent être copiés dans le champs adequat lors d'enregistrements dans `Library Membership Transaction`.
-
-Pour cela, nous pouvons utiliser des champs en lecture seules et, dans les options, nous pouvons définir le nom du lien
-et le nom du champs de la propriété que nous voulons parcourir. Dans cet exemple, dans **Member First Name** nous pouvons
-définir `library_member.first_name`
-
-
-
-### Completer les Modeles
-
-De la même facon, vous pouvez compléter les autres modèles pour qu'au final le résultat soit:
-
-#### Article
-
-
-
-#### Library Member
-
-
-
-#### Library Membership
-
-
-
-#### Library Transaction
-
-
-
-> Vérifiez que le modèles **Librarian** aient les permissions sur chaque **DocType**.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/new-app.md b/frappe/docs/user/fr/tutorial/new-app.md
deleted file mode 100644
index 418a1643be..0000000000
--- a/frappe/docs/user/fr/tutorial/new-app.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Créer une nouvelle application
-
-Une fois que Bench est installé, vous apercevrez deux répertoires, `apps` and `sites`. Toutes les applications seront
-installées dans `apps`.
-
-Pour créer une nouvelle application, allez dans votre répertoire et lancer la commande, `bench new-app {app_name}` et
-remplissez les informations à propos de votre application. Cela va créer un template d'application pour vous.
-
- $ bench new-app library_management
- App Title (defaut: Lib Mgt): Library Management
- App Description: App for managing Articles, Members, Memberships and Transactions for Libraries
- App Publisher: Frappe
- App Email: info@frappe.io
- App Icon (default 'octicon octicon-file-directory'): octicon octicon-book
- App Color (default 'grey'): #589494
- App License (default 'MIT'): GNU General Public License
-
-### Structure d'une application
-
-L'application sera créée dans un répertoire appelé `library_management` et aura la structure suivante:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- │ ├── __init__.py
- │ ├── config
- │ │ ├── __init__.py
- │ │ └── desktop.py
- │ ├── hooks.py
- │ ├── library_management
- │ │ └── __init__.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── __init__.py
- │ ├── generators
- │ │ └── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- ├── license.txt
- ├── requirements.txt
- └── setup.py
-
-1. `config` contient les configurations de l'application
-1. `desktop.py` est l'endroit ou les icones peuvent être ajoutées au bureau
-1. `hooks.py` contient les définitions de la facon dont l'intégration avec l'environnement et les autres applications est faite.
-1. `library_management` (interne) est un **module** bootstrappé. Dans Frappe, un **module** est l'endroit où sont les controlleurs et les modeles.
-1. `modules.txt` contient la liste des **modules** dans l'application. Quand vous créez un nouveau module, c'est obligatoire de l'ajouter dans ce fichier.
-1. `patches.txt` contient les patchs de migration. Ce sont des références Python utilisant la notation par point.
-1. `templates` est le repertoire qui contient les templates des vues. Les templates pour **Login** et autres pages par défaut sont déjà contenus dans Frappe.
-1. `generators` est l'endroit où sont stockés les templates des modèles. Chaque instance du modèle a une route web comme par exemple les **articles de blog** ou chaque article a une adresse unique. Dans Frappe, Jinj2 est utilisé pour les templates.
-1. `pages` contient les routes uniques pour les templates. Par exemple "/blog" ou "/article"
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/reports.md b/frappe/docs/user/fr/tutorial/reports.md
deleted file mode 100644
index 92b0ef4d45..0000000000
--- a/frappe/docs/user/fr/tutorial/reports.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Rapports
-
-Vous pouvez aussi cliquer sur le texte "Rapports" dans la barre latérale de gauche pour voir vos données dans un tableau.
-
-
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/roles.md b/frappe/docs/user/fr/tutorial/roles.md
deleted file mode 100644
index ce5add6000..0000000000
--- a/frappe/docs/user/fr/tutorial/roles.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Créer des rôles
-
-Avant de créer des modèles, nous devons auparavant créer des rôles qui auront des permissions sur le modèles. Nous allons
-créer deux rôles:
-
-1. Librarian pour définir le libraire
-1. Library Member pour définir un membre
-
-Pour créer un nouveau rôle, se rendre sur:
-
-> Setup > Users > Role > New
-
-
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/setting-up-the-site.md b/frappe/docs/user/fr/tutorial/setting-up-the-site.md
deleted file mode 100644
index 11b7aad611..0000000000
--- a/frappe/docs/user/fr/tutorial/setting-up-the-site.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Configurer le site
-
-Créons un site et appelons le `library`.
-
-*Remarque: Avant de créer un nouveau site, vous devez activer le moteur de stockage Barracuda sur votre installation MariaDB.*
-*Copiez les paramètres de base de données ERPNext par défaut suivants dans votre fichier `my.cnf`.*
-
- [mysqld]
- innodb-file-format=barracuda
- innodb-file-per-table=1
- innodb-large-prefix=1
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
-
- [mysql]
- default-character-set = utf8mb4
-
-
-Vous pouvez installer un nouveau site avec la commande `bench new-site library`
-
-Cette commande va créer une nouvelle base de données, un repertoire et installer `frappe` (qui est aussi une application!)
-dans le nouveau site. L'application `frappe` a deux modules par défaut, **Core** et **Website**. Le module **Core**
-contient les modèles basiques pour l'application. En effet, Frappe contient des modèles par défaut qui sont appelés **DocTypes**
-mais nous en reparlerons plus tard.
-
- $ bench new-site library
- MySQL root password:
- Installing frappe...
- Updating frappe : [========================================]
- Updating country info : [========================================]
- Set Administrator password:
- Re-enter Administrator password:
- Installing fixtures...
- *** Scheduler is disabled ***
-
-### Structure du site
-
-Un nouveau repertoires appelé `library` sera créé dans le repertoire `sites`. Voici la structure standard pour un site.
-
- .
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- └── site_config.json
-
-1. `public/files` contient les fichiers uploadés.
-1. `private/backups` contient les backups.
-1. `site_config.json` contient la configuration du site.
-
-### COnfiguration par défaut
-
-Dans le cas où vous avez plusieurs sites, utilisez la commande `bench use [site_name]` pour définir le site par défaut.
-
-Exemple:
-
- $ bench use library
-
-### Installer une application
-
-Maintenant installons notre application `library_management` dans notre site `library`
-
-1. Installer library_management avec la commande: `bench --site [site_name] install-app [app_name]`
-
-Exemple:
-
- $ bench --site library install-app library_management
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/single-doctypes.md b/frappe/docs/user/fr/tutorial/single-doctypes.md
deleted file mode 100644
index e3b10a0523..0000000000
--- a/frappe/docs/user/fr/tutorial/single-doctypes.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Les DocTypes de type Single
-
-Une application aura en générale une seule page de configuration. Dans notre application nous pouvons donc définir une page
-ou nous définierons la période prêt. Nous avons aussi besoin de sauvegarder cette propriété. Dans Frappe, ceci est possible
-en utilisant un un Doctype de type **Single**. Un DocType **Single** est comme le pattern Singleton, une instance unique
-d'une classe. Appelons le **Library Managment Settings**.
-
-Pour créer un DocType de type **Single** cochez la case **Is Single**.
-
-
-
-{suite}
diff --git a/frappe/docs/user/fr/tutorial/start.md b/frappe/docs/user/fr/tutorial/start.md
deleted file mode 100644
index 608127c0d5..0000000000
--- a/frappe/docs/user/fr/tutorial/start.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Demarrer avec Bench
-
-Maintenant, nous pouvons nous connecter et vérifier que tout fonctionne normalement.
-
-Pour démarrer le serveur de développement, lancez la commande `bench start`
-
- $ bench start
- 13:58:51 web.1 | started with pid 22135
- 13:58:51 worker.1 | started with pid 22136
- 13:58:51 workerbeat.1 | started with pid 22137
- 13:58:52 web.1 | * Running on http://0.0.0.0:8000/
- 13:58:52 web.1 | * Restarting with reloader
- 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting...
-
-Vous pouvez maintenant ouvrir votre navigateur et vous rendre sur `http://localhost:8000`. Si tout se passe bien vous devriez voir:
-
-
-
-Maintenant, connectez vous avec les identifiants suivants:
-
-Login ID: **Administrator**
-
-Mot de passe: **Le mot de passe que vous avez définis pendant l'installation**
-
-Une fois connecté, vous devriez voir le `Desk`, c'est à dire la page d'accueil
-
-
-
-Comme vous pouvez le voir, Frappe fournit quelques applications comme un To Do, un gestionnaire de fichiers etc. Ces applications
-peuvent être intégrées par la suite.
-
-{next}
diff --git a/frappe/docs/user/fr/tutorial/task-runner.md b/frappe/docs/user/fr/tutorial/task-runner.md
deleted file mode 100644
index b455fb6af9..0000000000
--- a/frappe/docs/user/fr/tutorial/task-runner.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Les tâches planifiées
-
-Finalement, une application a aussi à envoyer des emails de notifications ou d'autres taches planifiées. Dans Frappe, si
- vous avez configuré le **bench**, la tâche / planificateur est configuré via Celery en utilisant les queues Redis.
-
-Pour ajouter un nouveau gestionnaire de tâches, ouvrez le fichier `hooks.py` et ajoutez un nouveau gestionnaire. Les gestionnaires
- par defaut sont `all`, `daily`, `weekly`, `monthly`. Le gestionanire `all` est appelé toutes les 3 minutes par defaut.
-
- # Scheduled Tasks
- # ---------------
-
- scheduler_events = {
- "daily": [
- "library_management.tasks.daily"
- ],
- }
-
-Ici, nous pointons sur une fonction en Python et cette fonction sera appelée tous les jours. Voyons à quoi cette fonction
-ressemble:
-
- # Copyright (c) 2013, Frappe
- # For license information, please see license.txt
-
- from __future__ import unicode_literals
- import frappe
- from frappe.utils import datediff, nowdate, format_date, add_days
-
- def daily():
- loan_period = frappe.db.get_value("Library Management Settings",
- None, "loan_period")
-
- overdue = get_overdue(loan_period)
-
- for member, items in overdue.iteritems():
- content = """Following Items are Overdue
- Please return them as soon as possible
"""
-
- for i in items:
- content += "- {0} ({1}) due on {2}
".format(i.article_name,
- i.article,
- format_date(add_days(i.transaction_date, loan_period)))
-
- content += "
"
-
- recipient = frappe.db.get_value("Library Member", member, "email_id")
- frappe.sendmail(recipients=[recipient],
- sender="test@example.com",
- subject="Library Articles Overdue", content=content, bulk=True)
-
- def get_overdue(loan_period):
- # check for overdue articles
- today = nowdate()
-
- overdue_by_member = {}
- articles_transacted = []
-
- for d in frappe.db.sql("""select name, article, article_name,
- library_member, member_name
- from `tabLibrary Transaction`
- order by transaction_date desc, modified desc""", as_dict=1):
-
- if d.article in articles_transacted:
- continue
-
- if d.transaction_type=="Issue" and \
- datediff(today, d.transaction_date) > loan_period:
- overdue_by_member.setdefault(d.library_member, [])
- overdue_by_member[d.library_member].append(d)
-
- articles_transacted.append(d.article)
-
-Nous pouvons placer ce code dans un n'importe quel module Python accessible. La route est définie dans `hooks.py`, dans cet exemple nos placerons ce code dans `library_management/tasks.py`.
-
-Note:
-
-1. Nous obtenons la durée de prêt depuis **Library Management Settings** en utilisant `frappe.db.get_value`.
-1. Nous lancons une requête dans la base de données via `frappe.db.sql`
-1. Les emails sont envoyés via `frappe.sendmail`
-
-{suite}
diff --git a/frappe/docs/user/fr/tutorial/users-and-records.md b/frappe/docs/user/fr/tutorial/users-and-records.md
deleted file mode 100644
index e0a714c9c4..0000000000
--- a/frappe/docs/user/fr/tutorial/users-and-records.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Créer des utilisateurs et des enregistrements
-
-Maintenant que nous avons définis des modèles, nous pouvons créér des enregistrements directement depuis l'interface. Vous
-n'avez pas à créer des vues ! Les vues dans Frappe sont automatiquements créées à partir des propriétés de vos **DocTypes**.
-
-### 4.1 Créer des utilisateurs
-
-Afin de créer des enregistrements, nous avons tout d'abord besoin de créer un utilisateur. Rendez-vous sur:
-
-> Setup > Users > User > New
-
-Saisissez un nom, un prénom ainsi qu'un mot de passe à votre utilisateur pour le créer et donnez lui les rôles `Librarian`
- et `Library Member`.
-
-
-
-Maintenant déconnectez-vous puis connectez-vous avec l'utilisateur que vous venez de créer.
-
-### 4.2 Créer des enregistrements
-
-Vous allez désormais voir une icone pour notre module de gestion de librairie. Cliquez sur cette icone et vous apercevrez
-la page du module:
-
-
-
-Vous pouvez donc voir les **DocTypes** que nous avons créés pour l'application. Créons quelques enregistrements.
-
-Définissons un nouvel Article:
-
-
-
-Le **DocType** que vous avons définis est transformé en formulaire. Les règles de validation seront appliquées selon nos
-définitions. Remplissons le formulaire pour créer notre premier article.
-
-
-
-Vous pouvez aussi ajouter une image.
-
-
-
-Maintenant créons un nouveau membre.
-
-
-
-Après cela, définissons un nouvel abonnement pour ce membre.
-
-Ici, si vous vous souvenez, nous avons définis que les noms et prénoms doivent automatiquement être renseignés dès que nous
-avons selectionné l'ID du membre.
-
-
-
-Comme vous pouvez le voir, la date est formattée en années-mois-jour qui est le format du système. Pour configurer / changer
-le format de la date et de l'heure, rendez-vous sur:
-
-> Setup > Settings > System Settings
-
-
-
-{suite}
diff --git a/frappe/docs/user/fr/tutorial/web-views.md b/frappe/docs/user/fr/tutorial/web-views.md
deleted file mode 100644
index 9b0f80a0e9..0000000000
--- a/frappe/docs/user/fr/tutorial/web-views.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Les vues web
-
-Frappe a deux principaux environnements, le **bureau** et **le web**. Le **bureau** est un environnement riche AJAX alors
-que **le web** est une collection plus traditionnelle de fichiers HTML pour la consultation publique. Les vues web peuvent
-aussi être générées pour créer des vues plus controllées pour les utilisateurs qui peuvent se connecter mais qui n'ont pas
-accès au desk.
-
-Dans Frappe, les vues sont gérées par des templates et sont tout naturellement placés dans le repertoire `templates`. Il
-y a 2 principaux types de templates.
-
-1. Pages: Ce sont des templates Jinja ou une vue unique existe pour une route (exemple:`/blog`).
-2. Générateurs: Ce sont des templates ou chaque instance représente un **DocType** réprésenté par une url unique. (exemple:`/blog/a-blog`, `blog/b-blog` etc.)
-3. Les listes et les vues: Ce sont des listes standards et des vues avec l'url `[doctype]/[name]` et sont affichées en fonction des permissions.
-
-### Les vues web standards
-
-> Cette fonctionnalité est encore en développement.
-
-Jettons un oeil aux vues standards:
-
-Si vous êtes connecté avec votre utilisateur de test, rendez-vous sur`/article` et vous devriez voir la liste des articles:
-
-
-
-Cliquez sur un article et vous devriez voir une vue par défaut.
-
-
-
-Maintenant, si vous voulez une meilleur liste pour vos articles, créez un fichier appelé `row_template.html` dans le
-repertoire `library_management/templates/includes/list/`. Voici un exemple du contenu de ce fichier:
-
- {% raw %}
-
-
-
-
-
-
- {{ doc.article_name }}
- {{ doc.author }}
- {{ (doc.description[:200] + "...")
- if doc.description|length > 200 else doc.description }}
- Publisher: {{ doc.publisher }}
-
- {% endraw %}
-
-
-Ici, vous aurez toutes les propriétés d'un article dans l'object `doc`.
-
-La mise à jour de la liste ressemble à ca !
-
-
-
-#### La page d'accueil
-
-Frappe permet l'inscription et inclut les inscriptions via Google, Facebook et Github. Quand un utilisateur s'inscrit via
-le web, il n'a pas accès à l'interface du desk par defaut.
-
-> Pour autoriser les utilisateurs à accéder au `Desk`, ouvrez la configuration de l'utilisateur (Setup > User) et définissez
- le type d'utilisatuer à "System User".
-
-Pour les utilisateurs qui n'ont pas accès au `Desk`, nous pouvons définir une page d'accueil ou ils peuvent se connecter via
-`hooks.py` le tout en respectant les rôles.
-
-Quand un membre de la librairie se connecte, il doit être redirigé vers la page `article` donc ouvrez le fichier `library_management/hooks.py` et ajoutez:
-
- role_home_page = {
- "Library Member": "article"
- }
-
-{next}
diff --git a/frappe/docs/user/index.md b/frappe/docs/user/index.md
deleted file mode 100644
index d4fe590460..0000000000
--- a/frappe/docs/user/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Frappe Developer Tutorial
-
-Select your language
-
-1. [English](/docs/user/en)
-1. [Français](/docs/user/fr)
-1. [Português](/docs/user/pt)
-1. [Español](/docs/user/es)
-1. [简体中文](/docs/user/zh)
-
-
diff --git a/frappe/docs/user/index.txt b/frappe/docs/user/index.txt
deleted file mode 100644
index ae8ed6f5cd..0000000000
--- a/frappe/docs/user/index.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-en
-fr
-pt
-es
-zh
\ No newline at end of file
diff --git a/frappe/docs/user/pt/__init__.py b/frappe/docs/user/pt/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/pt/index.md b/frappe/docs/user/pt/index.md
deleted file mode 100755
index a25785e59e..0000000000
--- a/frappe/docs/user/pt/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Develop Apps with Frappe
-
-{index}
diff --git a/frappe/docs/user/pt/index.txt b/frappe/docs/user/pt/index.txt
deleted file mode 100755
index 4d8a2e24ae..0000000000
--- a/frappe/docs/user/pt/index.txt
+++ /dev/null
@@ -1 +0,0 @@
-tutorial
diff --git a/frappe/docs/user/pt/tutorial/__init__.py b/frappe/docs/user/pt/tutorial/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/pt/tutorial/app.md b/frappe/docs/user/pt/tutorial/app.md
deleted file mode 100755
index dd1a2597e3..0000000000
--- a/frappe/docs/user/pt/tutorial/app.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# O que é uma aplicação
-
-Uma Aplicação em Frappe é apenas uma aplicação padrão em Python. Você pode estruturar uma aplicação Frappe da mesma forma que estrutura uma aplicação padrão do Python. Para fazer o deploy, Frappe usa o padrão Setuptools do Python, assim você pode facilmente portar e instalar o aplicativo em qualquer máquina.
-
-Frappe Framework fornece uma interface WSGI e para o desenvolvimento você pode usar o servidor embutido Werkzeug. Para a implementação em produção, recomendamos o uso do nginx e gunicorn.
-
-Frappe também tem uma arquitetura multi-tenant, a partir da base. Isso significa que você pode executar vários "sites" em sua configuração, cada um poderia estar servindo um conjunto diferente de aplicativos e usuários. O banco de dados de cada site é separado.
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/before.md b/frappe/docs/user/pt/tutorial/before.md
deleted file mode 100755
index 166b7b69f0..0000000000
--- a/frappe/docs/user/pt/tutorial/before.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Antes de começar
-
-Uma lista de ferramentas, tecnologias que serão muito úteis para a construção de aplicativos com Frappe.
-
-Há uma série de bons tutoriais on-line e encontramos [Codecademy] (http://www.codecademy.com/) como um dos mais bonitos tutoriais, aqui há um monte de lições que você pode aprender com Codecademy
-
----
-
-#### 1. Python
-
-O lado do servidor do Frappe é escrito em Python e é uma boa idéia para [aprender rapidamente Python] (http://www.codecademy.com/tracks/python) antes de começar a se aprofundar em Frappe. Outro bom lugar para aprender Pytohn é o [tutorial no docs.python.org](https://docs.python.org/2.7/tutorial/index.html). Note-se que o Frappe usa Python 2.7
-
-Para escrever código do lado do servidor de qualidade, você deve incluir testes automáticos. Você pode aprender as noções básicas de [test driven development (TDD) - aqui] (http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137).
-
----
-
-#### 2. Databases MariaDB / MySQL
-
-Você precisa entender os conceitos básicos de bancos de dados, como instalar, login, criar novos bancos de dados e consultas SQL básicas. Aqui é um [introdução muito rápido para MySQL](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial) ou o [site do MariaDB para uma compreensão mais detalhada](https://mariadb.com/kb/en/mariadb/documentation/getting-started/)
-
----
-
-#### 3. HTML / CSS
-
-Se você está construindo interfaces de usuário, você precisará [conhecer o básico de HTML / CSS](http://www.codecademy.com/tracks/web) e o [Framework CSS - Boostrap](http://getbootstrap.com)
-
----
-
-#### 4. Building UI with Javascript and JQuery
-
-Para personalizar formulários e criar novas interfaces de usuário ricas, é melhor [saber JavaScript](http://www.codecademy.com/tracks/javascript) e a [biblioteca popular, JQuery](http://www.codecademy.com/faixas/jQuery).
-
----
-
-#### 5. Customizing Prints and Web pages with Jinja Templating
-
-Se estiver personalizando modelos de impressão, você precisa aprender a [línguagem Jinja Templating](http://jinja.pocoo.org/). É uma maneira fácil de criar páginas web dinâmicas (HTML).
-
----
-
-#### 6. Git and GitHub
-
-[Saiba como contribuir para um projeto open source usando Git e GitHub](https://guides.github.com/activities/contributing-to-open-source/), duas grandes ferramentas para ajudá-lo a gerir o seu código e compartilha-lo com os outros.
-
----
-
-Quando estiver pronto, [tente construir uma aplicação de exemplo em Frappe](/docs/user/pt/tutorial/app)
diff --git a/frappe/docs/user/pt/tutorial/bench.md b/frappe/docs/user/pt/tutorial/bench.md
deleted file mode 100755
index 5b764d7a8e..0000000000
--- a/frappe/docs/user/pt/tutorial/bench.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Instalando o Frappe Bench
-
-A maneira mais fácil de instalar o frappe em um sistema baseado em Unix, é utilizando o frappe-bench. Leia as instruções detalhadas sobre como instalar usando o Frappe Bench.
-
-> [https://github.com/frappe/bench](https://github.com/frappe/bench)
-
-Com Frappe Bench você será capaz de configurar e hospedar vários aplicativos e sites e vai também configurar um Virtualenv do Python de modo que você pode ter um ambiente isolado para executar seus aplicativos (e não terá conflito de versões com outros ambientes de desenvolvimento).
-
-O `bench` ferramenta de linha de comando também será instalado, o que irá ajudá-lo no desenvolvimento e na gestão da instalação.
-{next}
diff --git a/frappe/docs/user/pt/tutorial/conclusion.md b/frappe/docs/user/pt/tutorial/conclusion.md
deleted file mode 100755
index 8163004eeb..0000000000
--- a/frappe/docs/user/pt/tutorial/conclusion.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Conclusão
-
-
-Esperamos que este tutorial lhe de uma visão geral de como as aplicações são desenvolvidas em Frappe. O objetivo era abordar brevemente os vários aspectos do desenvolvimento de aplicações e dar uma visão ampla. Para obter ajuda em questões específicas, olhe nossa API.
-
-Para obter ajuda, faça parte da comunidade no [canal de bate-papo no Gitter](https://gitter.im/frappe/erpnext) ou no [fórum de desenvolvedores](https://discuss.erpnext.com)
diff --git a/frappe/docs/user/pt/tutorial/controllers.md b/frappe/docs/user/pt/tutorial/controllers.md
deleted file mode 100755
index cf657e9d0d..0000000000
--- a/frappe/docs/user/pt/tutorial/controllers.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Controladores
-
-O passo seguinte seria a adição de métodos e handlers de eventos para os modelos. No aplicativo, devemos assegurar que se uma Library Transaction é feita, o artigo em questão deve estar em estoque e o membro que irá emprestar o artigo deve ter um filiação válida.
-
-Para isso, podemos escrever uma validação pouco antes do objeto de Library Transaction ser salvo. Para fazer isso, abra o template `library_management/doctype/library_transaction/library_transaction.py`.
-
-Este arquivo é o controlador para o objeto Library Transaction. Nele você pode escrever métodos para:
-
-1. `before_insert`
-1. `validate` (antes de inserir ou atualizar)
-1. `on_update` (depois de salvar)
-1. `on_submit` (quando o documento é submetido)
-1. `on_cancel`
-1. `on_trash` (antes que ele esteja prestes a ser excluido)
-
-Você pode escrever métodos para esses eventos e eles serão chamados pelo framework quando o documento for salvo etc.
-
-Aqui é o controlador acabado:
-
- from __future__ import unicode_literals
- import frappe
- from frappe import _
- from frappe.model.document import Document
-
- class LibraryTransaction(Document):
- def validate(self):
- last_transaction = frappe.get_list("Library Transaction",
- fields=["transaction_type", "transaction_date"],
- filters = {
- "article": self.article,
- "transaction_date": ("<=", self.transaction_date),
- "name": ("!=", self.name)
- })
- if self.transaction_type=="Issue":
- msg = _("Article {0} {1} has not been recorded as returned since {2}")
- if last_transaction and last_transaction[0].transaction_type=="Issue":
- frappe.throw(msg.format(self.article, self.article_name,
- last_transaction[0].transaction_date))
- else:
- if not last_transaction or last_transaction[0].transaction_type!="Issue":
- frappe.throw(_("Cannot return article not issued"))
-
-Nesse script:
-
-1. Pegamos a última transação antes da data da transação atual usando a função de consulta `frappe.get_list`
-1. Se a última transação for algo que não queremos, lançamos uma exceção usando `frappe.throw`
-1. Usamos o método `_("text")` para identificar strings traduzíveis.
-
-Verifique se suas validações funcionaram, criando de novos registros.
-
-
-
-#### Debugging
-
-Para Debugar, mantenha sempre o seu Console JS aberto. procurando por erros de servidor e JavaScript.
-
-Além disso, verifique a sua janela do terminal para exceções. Quaisquer **500 Internal Server Errors** será impresso em seu terminal, onde o servidor está rodando.
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/doctype-directory-structure.md b/frappe/docs/user/pt/tutorial/doctype-directory-structure.md
deleted file mode 100755
index 12b7a2f837..0000000000
--- a/frappe/docs/user/pt/tutorial/doctype-directory-structure.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Estrutura de diretórios do DocType
-
-Depois de salvar os doctypes, verifique-se de que oo arquivos do modelo `.json` e `.py` foram criados no modulo `apps/library_management/library_management`. A estrutura de diretório após a criação dos modelos deve ficar assim:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- ..
- │ ├── library_management
- │ │ ├── __init__.py
- │ │ └── doctype
- │ │ ├── __init__.py
- │ │ ├── article
- │ │ │ ├── __init__.py
- │ │ │ ├── article.json
- │ │ │ └── article.py
- │ │ ├── library_member
- │ │ │ ├── __init__.py
- │ │ │ ├── library_member.json
- │ │ │ └── library_member.py
- │ │ ├── library_membership
- │ │ │ ├── __init__.py
- │ │ │ ├── library_membership.json
- │ │ │ └── library_membership.py
- │ │ └── library_transaction
- │ │ ├── __init__.py
- │ │ ├── library_transaction.json
- │ │ └── library_transaction.py
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/doctypes.md b/frappe/docs/user/pt/tutorial/doctypes.md
deleted file mode 100755
index fa6c7a26ee..0000000000
--- a/frappe/docs/user/pt/tutorial/doctypes.md
+++ /dev/null
@@ -1,95 +0,0 @@
-# DocType
-
-Depois de criar as Roles, vamos criar os **DocTypes**
-
-Para criar um novo **DocType**, vá para:
-
-> Developer > Documents > Doctype > New
-
-
-
-No DocType, criamos o módulo, que no nosso caso é **Library Managment**
-
-#### Adicionando Campos
-
-Na Tabela, você pode adicionar os campos (fields) do DocType (Article).
-
-Os campos são muito mais do que colunas de banco de dados, eles podem ser:
-
-1. Colunas no banco de dados
-1. Layout helpers (Seção / quebras de coluna)
-1. Tabelas filho (Tabela como tipo de uma propriedade)
-1. HTML
-1. Ações (botões)
-1. Anexos ou imagens
-
-Vamos adicionar os campos do artigo.
-
-
-
-Quando você adiciona campos, você precisa digitar o **Type**. **Label** é opcional para quebra de seção e quebra de coluna. **Name** (`fieldname`) é o nome da coluna da tabela de banco de dados e também a propriedade do controlador. Isso tem que ser um *código amigável*, ou seja, ele tem que ter caracteres minusculos e _ em vez de "". Se você deixar o nome do campo em branco, ele será ajustado automaticamente quando você salvá-lo.
-
-Você também pode definir outras propriedades do campo como se é obrigatório, apenas para leitura etc.
-
-Nós podemos adicionar os seguintes campos:
-
-1. Article Name (Data)
-2. Author (Data)
-3. Description
-4. ISBN
-5. Status (Select): Para Selecionar campos, você vai entrar nas opções. Digite **Issued** e **Available** cada um em uma nova linha na caixa de Opções. Consulte o diagrama abaixo
-6. Publisher (Data)
-7. Language (Data)
-8. Image (Attach Image)
-
-
-#### Adicionando permissões
-
-Depois de adicionar os campos, finalize e adicione uma nova linha na seção Regras de permissão. Por enquanto, vamos dar permissão de Read, Write, Create, Delete and Report, a **Librarian**. Frappe tem uma Role baseado nas permissões do modelo. Você também pode alterar as permissões posteriormente usando o **Role Permissions Manager** do **Setup**.
-
-
-
-#### Salvando
-
-Click no botão **Save**. Quando o botão for clicado, um popup irá te pedir um nome. De o nome de **Article** e salve o DocType.
-
-Agora logue no mysql e verifique se a tabela do banco de dados foi criada:
-
- $ bench mysql
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MariaDB connection id is 3931
- Server version: 5.5.36-MariaDB-log Homebrew
-
- Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- MariaDB [library]> DESC tabArticle;
- +--------------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+--------------+------+-----+---------+-------+
- | name | varchar(255) | NO | PRI | NULL | |
- | creation | datetime(6) | YES | | NULL | |
- | modified | datetime(6) | YES | | NULL | |
- | modified_by | varchar(40) | YES | | NULL | |
- | owner | varchar(60) | YES | | NULL | |
- | docstatus | int(1) | YES | | 0 | |
- | parent | varchar(255) | YES | MUL | NULL | |
- | parentfield | varchar(255) | YES | | NULL | |
- | parenttype | varchar(255) | YES | | NULL | |
- | idx | int(8) | YES | | NULL | |
- | article_name | varchar(255) | YES | | NULL | |
- | status | varchar(255) | YES | | NULL | |
- | description | text | YES | | NULL | |
- | image | varchar(255) | YES | | NULL | |
- | publisher | varchar(255) | YES | | NULL | |
- | isbn | varchar(255) | YES | | NULL | |
- | language | varchar(255) | YES | | NULL | |
- | author | varchar(255) | YES | | NULL | |
- +--------------+--------------+------+-----+---------+-------+
- 18 rows in set (0.00 sec)
-
-
-Como você pode ver, junto com os DocFields, várias colunas padrão também foram adicionados à tabela. Importante notar aqui que, a chave primária, `name`,` owner` (o usuário que criou o registro), `creation` e` modified` (timestamps para a criação e última modificação).
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/form-client-scripting.md b/frappe/docs/user/pt/tutorial/form-client-scripting.md
deleted file mode 100755
index faf453c57a..0000000000
--- a/frappe/docs/user/pt/tutorial/form-client-scripting.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Form Client Scripting
-
-## Escrevendo script de formulários
-
-Até agora nós criamos um sistema básico que funciona fora da caixa, sem ter que escrever nenhum código. Vamos agora escrever alguns scripts para tornar a aplicação mais rica e adicionar validações de formulários para o usuário não inserir dados incorretos.
-
-### Script no Lado do Cliente
-
-No DocType **Library Transaction**, temos um único campo de nome do membro. Não fizemos dois campos. Agora, isso poderia muito bem ser dois campos (e provavelmente deve), mas por uma questão de exemplo, vamos considerar que temos que implementar isto. Para fazer isso, teria que escrever um Handler de eventos para um evento para quando o usuário selecionar o campo `library_member`, acessar o recurso membro do servidor usando REST API e inserir os valores no formulário.
-
-Para iniciar o script, na pasta `library_management/doctype/library_transaction`, crie um novo arquivo `library_transaction.js`. Este arquivo será executado automaticamente quando a primeiro Library Transaction for aberta pelo usuário. Portanto, neste arquivo, podemos ligar os eventos e escrever outras funções.
-
-#### library_transaction.js
-
- frappe.ui.form.on("Library Transaction", "library_member",
- function(frm) {
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Library Member",
- name: frm.doc.library_member
- },
- callback: function (data) {
- frappe.model.set_value(frm.doctype,
- frm.docname, "member_name",
- data.message.first_name
- + (data.message.last_name ?
- (" " + data.message.last_name) : ""))
- }
- })
- });
-
-1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** é utilizado para ligar um handler ao evento quando a propriedade library_member for definida.
-1. No handler, nós desencadear uma chamada AJAX para `frappe.client.get`. Em resposta obtemos o objeto solicitado como JSON. [Saiba mais sobre a API](/frappe/user/en/guides/integration/rest_api).
-1. Utilizando **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** Nós inserimos o valor no formulário.
-
-**Observação:** Para verificar se o script funciona, lembre-se de 'recarregar' a página antes de testar seu script. mudanças no script do cliente não são captadas automaticamente quando você está no modo de desenvolvedor..
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/index.md b/frappe/docs/user/pt/tutorial/index.md
deleted file mode 100755
index 56f5817fc5..0000000000
--- a/frappe/docs/user/pt/tutorial/index.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Frappe Tutorial
-
-In this guide we will show you how to create an application from scratch using **Frappe**. Using the example of a Library Management System, we will cover:
-
-1. Installation
-1. Making a New App
-1. Making Models
-1. Creating Users and Records
-1. Creating Controllers
-1. Creating Web Views
-1. Setting Hooks and Tasks
-
-## Who is This For?
-
-This guide is intended for software developers who are familiar with how the web applications are built and served. Frappe Framework is built on Python and uses MariaDB database and for creating web views, HTML/CSS/Javascript is used. So it would be great if you are familiar with all these technologies. At minimum if you have never used Python before, you should take a quick tutorial before your use this Guide.
-
-Frappe uses the git version control system on GitHub. It is also important that you are familiar with basic git and have an account on GitHub to manage your applications.
-
-## Example
-
-For this guide book, we will build a simple **Library Management** application. In this application we will have models:
-
-1. Article (Book or any other item that can be loaned)
-1. Library Member
-1. Library Transaction (Issue or Return of an article)
-1. Library Membership (A period in which a member is allowed to transact)
-1. Library Management Setting (Global settings like period of loan)
-
-The user interface (UI) for the librarian will be the **Frappe Desk**, a built-in browser based UI environment where forms are automatically generated from the models and roles and permissions are also applied.
-
-We will also create web views for library where users can browse articles from a website.
-
-{index}
diff --git a/frappe/docs/user/pt/tutorial/index.txt b/frappe/docs/user/pt/tutorial/index.txt
deleted file mode 100755
index 1fed6aed93..0000000000
--- a/frappe/docs/user/pt/tutorial/index.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-before
-app
-bench
-new-app
-setting-up-the-site
-start
-models
-roles
-doctypes
-naming-and-linking
-doctype-directory-structure
-users-and-records
-form-client-scripting
-controllers
-reports
-web-views
-single-doctypes
-task-runner
-conclusion
diff --git a/frappe/docs/user/pt/tutorial/models.md b/frappe/docs/user/pt/tutorial/models.md
deleted file mode 100755
index f31c5c9864..0000000000
--- a/frappe/docs/user/pt/tutorial/models.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Criando modelos
-
-O próximo passo é criar os modelos como discutimos na introdução. Em Frappe, os modelos são chamados **DocTypes**. Você pode criar novos doctypes atravez da interface do Desk. **DocTypes** são feitos de campos chamados **DocField** e de permissões com base nas permissões que são integrados nos modelos, estes são chamados **DocPerms**.
-
-Quando um DocType é salvo, uma nova tabela é criada no banco de dados. Esta tabela é nomeado como `tab[doctype]`.
-
-Quando você cria um **DocType** uma nova pasta é criada no **Módulo** e um arquivo JSON do modelo e um controlador template em Python são criados automaticamente. Quando você atualizar o DocType, o arquivo modelo JSON é atualizado e quando o `bench migrate` é executado, ele é sincronizado com o banco de dados. Isto torna mais fácil para propagar alterações de schema e migrar.
-
-### Modo Desenvolvedor
-
-Para criar modelos, você deve definir `developer_mode` como 1 no arquivo `site_config.json` localizado em /sites/library e executar o comando `bench clear-cache` ou use o menu de usuário na interface do usuário e clique em "Atualizar" para que as alterações entrem em vigor. Agora você deve ver o aplicativo "Developer" em sua Desk
-
- {
- "db_name": "bcad64afbf",
- "db_password": "v3qHDeVKvWVi7s97",
- "developer_mode": 1
- }
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/naming-and-linking.md b/frappe/docs/user/pt/tutorial/naming-and-linking.md
deleted file mode 100755
index 1d72cd55c3..0000000000
--- a/frappe/docs/user/pt/tutorial/naming-and-linking.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Nomeando e vinculando DocType
-
-Em seguida, vamos criar outro DocType e salva-lo também:
-
-1. Library Member (First Name, Last Name, Email Address, Phone, Address)
-
-
-
-
-#### Nomeação de DocTypes
-
-DocTypes podem ser nomeados de diferentes formas:
-
-1. Com base em um campo
-1. Com base numa série
-1. Pelo controlador (Código)
-1. Prompt
-
-Isso pode ser definido através do preenchimento do campo **Autoname**. Para o controlador, deixe em branco.
-
-> **Search Fields**: A DocType pode ser nomeado em uma série, mas ele ainda precisa ser pesquisado por nome. No nosso caso, o artigo será procurado pelo título ou o nome do autor. Portanto, este pode ser inserido no campo de pesquisa.
-
-
-
-#### Vinculando e selecionando campos
-
-As chaves estrangeiras são especificados no Frappe como um tipo de campo **Link**. O DocType alvo deve ser mencionado na área de Opções de texto.
-
-No nosso exemplo, na Library Transaction DocType, temos que ligar o Membro da Biblioteca e o artigo.
-
-**Observação:** Lembre-se que os campos link não são automaticamente configurados como chaves estrangeiras no banco de dados MariaDB, porque isso vai implicitamente indexar a coluna. Isto pode não ser ideal, mas, a validação de chave estrangeira é feito pelo Framework.
-
-
-
-Para campos de multipla escolha, como mencionamos anteriormente, adicione as várias opções na caixa de entrada **Options**, cada opção em uma nova linha.
-
-
-
-Fazer o mesmo para outros modelos.
-
-#### Vinculando valores
-
-Um modelo padrão é quando você seleciona um ID, **Library Member** na **Library Membership**, então, o primeiro e o ultimo nome dos membros devem ser copiados para os campos adequados ao gravar na Library Membership Transaction.
-
-Para fazer isso, podemos usar campos de somente leitura e de opções, podemos definir o nome do link e o nome do campo da propriedade que deseja buscar. Para este exemplo no **Member First Name** podemos definir `library_member.first_name`
-
-
-
-### Complete os modelos
-
-Da mesma forma, você pode completar todos os modelos de modo que os campos finais fiquem parecido com este:
-
-#### Article
-
-
-
-#### Library Member
-
-
-
-#### Library Membership
-
-
-
-#### Library Transaction
-
-
-
-> Lembre-se de dar permissões para **Librarian** em cada DocType
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/new-app.md b/frappe/docs/user/pt/tutorial/new-app.md
deleted file mode 100755
index 1390f60766..0000000000
--- a/frappe/docs/user/pt/tutorial/new-app.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Crie um novo aplicativo
-
-Uma vez que o banco ja estiver instalado, você verá duas pastas principais, `apps` e` sites`. Todos os aplicativos serão instalados em apps.
-
-Para criar uma nova aplicação, vá para a pasta do bench e execute, `bench new-app {app_name}` e preencha os detalhes sobre o aplicativo. Isto irá criar uma aplicação base para você.
-
- $ bench new-app library_management
- App Title (defaut: Lib Mgt): Library Management
- App Description: App for managing Articles, Members, Memberships and Transactions for Libraries
- App Publisher: Frappe
- App Email: info@frappe.io
- App Icon (default 'octicon octicon-file-directory'): octicon octicon-book
- App Color (default 'grey'): #589494
- App License (default 'MIT'): GNU General Public License
-
-### Estrutura do aplicativo
-
-O aplicativo será criado em uma pasta chamada `library_management` e terá a seguinte estrutura::
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- │ ├── __init__.py
- │ ├── config
- │ │ ├── __init__.py
- │ │ └── desktop.py
- │ ├── hooks.py
- │ ├── library_management
- │ │ └── __init__.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── __init__.py
- │ ├── generators
- │ │ └── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- ├── license.txt
- ├── requirements.txt
- └── setup.py
-
-1. `config` pasta que contém as informações de configuração do aplicativo
-1. `desktop.py` é onde os ícones da área de trabalho pode ser adicionado ao Desk
-1. `hooks.py` é onde integrações com o ambiente da aplicação e outras aplicações é mencionada.
-1. `library_management` (Interior) é um **módulo** que foi criado. Em Frappe, um **módulo** é onde os arquivos do modelo e do controlador residem.
-1. `modules.txt` contém a lista dos **módulos** do aplicativo. Quando você cria um novo módulo, é necessário que você atualize este arquivo.
-1. `patches.txt` é o lugar onde os patches de migração são escritos. Eles são referências de módulos Python utilizando a notação de ponto.
-1. `templates` é a pasta onde os modelos de web view são mantidos. Modelos para **Login** e outras páginas padrão são criadas pelo frappe.
-1. `generators` é onde os templates para os modelos são mantidas, onde cada instância de modelo tem uma rota web separada, por exemplo, um **Post de um Blog**, onde cada post tem a sua única url web. Em Frappe, o mecanismo de modelagem utilizada é o Jinja2
-1. `pages` É onde uma única rota para os modelos são mantidas. Por exemplo, para um "/blog" tipo da página.
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/reports.md b/frappe/docs/user/pt/tutorial/reports.md
deleted file mode 100755
index 1889705874..0000000000
--- a/frappe/docs/user/pt/tutorial/reports.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Relatórios
-
-Você também pode clicar sobre o texto Relatórios na barra lateral (esquerda) para ver os registros tabulados
-
-
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/roles.md b/frappe/docs/user/pt/tutorial/roles.md
deleted file mode 100755
index 286d39afa7..0000000000
--- a/frappe/docs/user/pt/tutorial/roles.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Criando Roles
-
-Antes de criar modelos, devemos criar roles para que possamos definir as permissões do modelo. Há dois roles que nós iremos criar:
-
-1. Librarian
-1. Library Member
-
-Para criar um novo roles, vá para:
-
-> Setup > Users > Role > New
-
-
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/setting-up-the-site.md b/frappe/docs/user/pt/tutorial/setting-up-the-site.md
deleted file mode 100755
index 90f499c9c7..0000000000
--- a/frappe/docs/user/pt/tutorial/setting-up-the-site.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Configurando o site
-
-Vamos criar um novo site e chamá-lo de `library`.
-
-*Nota: Antes de criar um novo site, é necessário ativar o mecanismo de armazenamento Barracuda na instalação do MariaDB.*
-*Copie as seguintes configurações de banco de dados ERPNext padrão para o arquivo `my.cnf`.*
-
- [mysqld]
- innodb-file-format=barracuda
- innodb-file-per-table=1
- innodb-large-prefix=1
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
-
- [mysql]
- default-character-set = utf8mb4
-
-
-Você pode instalar um novo site, pelo comando `bench new-site library`
-
-Isto irá criar uma nova pasta para o site e um banco de dados e instalar o `frappe` (que também é uma aplicação!) No novo site. A aplicação `frappe` tem dois módulos embutidos **Core** e **WebSite**. O módulo de Core contém os modelos básicos para a aplicação. Frappe é uma estrutura como as pilhas e vem com um monte de modelos internos. Estes modelos são chamados doctypes **Mais sobre isso mais tarde**.
-
- $ bench new-site library
- MySQL root password:
- Installing frappe...
- Updating frappe : [========================================]
- Updating country info : [========================================]
- Set Administrator password:
- Re-enter Administrator password:
- Installing fixtures...
- *** Scheduler is disabled ***
-
-### Estrututa do Site
-
-Uma nova pasta chamada `library` será criado na pasta` sites`. Aqui está a estrutura de pastas padrão para um site.
-
- .
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- └── site_config.json
-
-1. `public/files` é onde os arquivos enviados pelo usuário são armazenados.
-1. `private/backups` é onde os backups são despejados
-1. `site_config.json` é onde as configurações a nível do site são mantidas.
-
-### Configurações padrão do site
-
-No caso de você ter vários sites em seu bench use `bench use [site_name]` para definir o site padrão.
-
-Exemplo:
-
- $ bench use library
-
-### Instalar App
-
-Agora vamos instalar nosso app `library_management` no nosso site `library`
-
-1. Instale library_management no library com: `bench --site [site_name] install-app [app_name]`
-
-Exemplo:
-
- $ bench --site library install-app library_management
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/single-doctypes.md b/frappe/docs/user/pt/tutorial/single-doctypes.md
deleted file mode 100755
index c21115244e..0000000000
--- a/frappe/docs/user/pt/tutorial/single-doctypes.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Single DocTypes
-
-A aplicação irá normalmente têm uma página de configurações. Em nossa aplicação, podemos definir uma página onde podemos definir o período de empréstimo. Também precisamos salvar esta propriedade. Em Frappe, isso pode ser feito usando um tipo DocType **Single** . Um DocType Single é como o padrão Singleton em Java. É um objecto com uma única instância. Vamos chamar isso de **Library Managment Settings**.
-
-Para criar um DocType Single, marque a propriedade **Is Single** como verdadeira.
-
-
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/start.md b/frappe/docs/user/pt/tutorial/start.md
deleted file mode 100755
index c4ed5e5f3c..0000000000
--- a/frappe/docs/user/pt/tutorial/start.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Iniciando o Bench
-
-Agora podemos logar e verificar se tudo funcionou.
-
-Para iniciar o servidor de desenvolvimento, digite `bench start`
-
- $ bench start
- 13:58:51 web.1 | started with pid 22135
- 13:58:51 worker.1 | started with pid 22136
- 13:58:51 workerbeat.1 | started with pid 22137
- 13:58:52 web.1 | * Running on http://0.0.0.0:8000/
- 13:58:52 web.1 | * Restarting with reloader
- 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting...
-
-Agora você pode abrir o seu navegador e ir para `http://localhost:8000`. Você deve ver esta página de login, se tudo correu bem:
-
-
-
-Agora logue com :
-
-Login ID: **Administrator**
-
-Senha : **Use a senha que foi criada durante a instalação**
-
-Quando voce logar, voce deverá ver o "Desk" da pagine home
-
-
-
-Como você pode ver, o básico do sistema Frappe vem com vários aplicativos pré-carregados como coisas a fazer, o Gerenciador de arquivos etc. Esses aplicativos podem ser integrados no fluxo de trabalho do app à medida que progredimos.
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/task-runner.md b/frappe/docs/user/pt/tutorial/task-runner.md
deleted file mode 100755
index c0f696410f..0000000000
--- a/frappe/docs/user/pt/tutorial/task-runner.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Tarefas agendadas
-
-Finalmente, uma aplicação também tem que enviar notificações de e-mail e fazer outros tipos de tarefas agendadas. Em Frappe, se você instalou o bench, o task / scheduler foi instalado via Celery usando Redis Queue.
-
-Para adicionar um novo task handler, vá para `hooks.py` e adicione um novo handler. Handlers padrão são os `all`,` daily`, `weekly`,` monthly`. O handler `all` é chamado a cada 3 minutos por padrão.
-
- # Scheduled Tasks
- # ---------------
-
- scheduler_events = {
- "daily": [
- "library_management.tasks.daily"
- ],
- }
-
-Aqui podemos apontar para uma função Python e esta função será executada todos os dias. Vejamos como é essa função:
-
- # Copyright (c) 2013, Frappe
- # For license information, please see license.txt
-
- from __future__ import unicode_literals
- import frappe
- from frappe.utils import datediff, nowdate, format_date, add_days
-
- def daily():
- loan_period = frappe.db.get_value("Library Management Settings",
- None, "loan_period")
-
- overdue = get_overdue(loan_period)
-
- for member, items in overdue.iteritems():
- content = """Following Items are Overdue
- Please return them as soon as possible
"""
-
- for i in items:
- content += "- {0} ({1}) due on {2}
".format(i.article_name,
- i.article,
- format_date(add_days(i.transaction_date, loan_period)))
-
- content += "
"
-
- recipient = frappe.db.get_value("Library Member", member, "email_id")
- frappe.sendmail(recipients=[recipient],
- sender="test@example.com",
- subject="Library Articles Overdue", content=content, bulk=True)
-
- def get_overdue(loan_period):
- # check for overdue articles
- today = nowdate()
-
- overdue_by_member = {}
- articles_transacted = []
-
- for d in frappe.db.sql("""select name, article, article_name,
- library_member, member_name
- from `tabLibrary Transaction`
- order by transaction_date desc, modified desc""", as_dict=1):
-
- if d.article in articles_transacted:
- continue
-
- if d.transaction_type=="Issue" and \
- datediff(today, d.transaction_date) > loan_period:
- overdue_by_member.setdefault(d.library_member, [])
- overdue_by_member[d.library_member].append(d)
-
- articles_transacted.append(d.article)
-
-Nós podemos colocar o código acima em qualquer módulo Python acessível. A rota é definida em `hooks.py`, portanto, para os nossos propósitos, iremos colocar esse código em `library_management/tasks.py`.
-
-Observação:
-
-1. Nós pegamos o loan period de **Library Management Settings** usando `frappe.db.get_value`.
-1. Nós rodamos uma query no banco de dados com `frappe.db.sql`
-1. O email foi enviado via `frappe.sendmail`
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/users-and-records.md b/frappe/docs/user/pt/tutorial/users-and-records.md
deleted file mode 100755
index 878253bf0b..0000000000
--- a/frappe/docs/user/pt/tutorial/users-and-records.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Fazendo Usuários e Registros
-
-Agora que já criamos os modelos, podemos começar diretamente criando registros usando a interface Desk do Frappe. Você não precisa criar Views! Views no Frappe são geradas automaticamente com base nas propriedades do DocType.
-
-### 4.1 Criando Usuarios
-
-Para criar registros, vamos primeiro criar um usuário. Para criar um usuário, vá para:
-
-> Setup > Users > User > New
-
-Crie um novo usuário e definá o nome, o primeiro nome e uma nova senha.
-
-Também de as roles de Librarian e Library Member para este usuario
-
-
-
-Agora saia e se autentique usando o novo ID de usuário e senha.
-
-### 4.2 Criando registros
-
-Você vai ver agora um ícone para o módulo de Library Management. Clique nesse ícone e você verá a página do modelo:
-
-
-
-Aqui você pode ver os doctypes que criamos para a aplicação. Vamos começar a criar alguns registros.
-
-Primeiro, vamos criar um novo artigo:
-
-
-
-Aqui você vai ver que o DocType que você tinha criado foi processado como um formulário. As validações e outras regras também serão aplicadas conforme projetado. Vamos preencher um artigo.
-
-
-
-Você também pode adicionar uma imagem.
-
-
-
-Agora vamos criar um novo membro:
-
-
-
-Depois disso, vamos criar um novo registro de membership para o membro.
-
-Aqui se você se lembra, nós tinhamos definido os valores do primeiro e do ultimo nome do membro para ser diretamente obtido a partir dos registros de membros e, logo que você selecionar o ID de membro, os nomes serão atualizados.
-
-
-
-Como você pode ver que a data é formatada como ano-mês-dia, que é um formato de sistema. Para definir/mudar a data, hora e número de formatos, acesse
-
-> Setup > Settings > System Settings
-
-
-
-{next}
diff --git a/frappe/docs/user/pt/tutorial/web-views.md b/frappe/docs/user/pt/tutorial/web-views.md
deleted file mode 100755
index de7d5b93c9..0000000000
--- a/frappe/docs/user/pt/tutorial/web-views.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Web Views
-
-Frappe tem dois ambientes de usuário principais, o Desk e o Web. Desk é um ambiente UI controlado com uma rica aplicação AJAX e a web usa template HTML tradicional que serve para consumo público. Web Views também podem ser gerados para criar views mais controladas para os usuários que pode fazer o login mas ainda não têm acesso à Desk.
-
-Em Frappe, Web Views são geridas por modelos e eles geralmente estão na pasta `templates`. Existem 2 tipos principais de templates.
-
-1. Pages: Estes são Jinja Templates, onde existe uma única view para uma única rota web, por exemplo, `/blog`.
-2. Generators: Estes são templates em que cada instância de um DocType tem uma rota web separada `/blog/a-blog`, `blog/b-blog` etc.
-3. Lists and Views: Estas são listas e views padrões com a rota `[doctype]/[name]` e são processadas com base na permissão.
-
-### Standard Web Views
-
-> Esta funcionalidade ainda esta em desenvolvimento.
-
-Vamos dar uma olhada na standard Web Views:
-
-Se você estiver logado como usuário de teste, vá para `/article` e você deverá ver a lista de artigos:
-
-
-
-Clique em um artigo e você vai ver uma Web View padrão
-
-
-
-Agora, se você quiser fazer uma List View melhor para o artigo, crie um arquivo chamado `row_template.html` na pasta
-`library_management/templates/includes/list/`. Aqui está um exemplo de arquivo:
-
- {% raw %}
-
-
-
-
-
-
- {{ doc.article_name }}
- {{ doc.author }}
- {{ (doc.description[:200] + "...")
- if doc.description|len > 200 else doc.description }}
- Publisher: {{ doc.publisher }}
-
- {% endraw %}
-
-
-Aqui, você vai ter todas as propriedades do artigo no objeto `doc`.
-
-A List View atualizada se parece com isso!
-
-
-
-#### Home Page
-
-Frappe também tem um fluxo de trabalho de inscrição built-in que também inclui inscrições de terceiros via Google, Facebook e GitHub. Quando um usuário se inscreve na web, ele não tem acesso à interface Desk por padrão.
-
-> Para permitir o acesso do usuário ao Desk, abra as configurações pelo Setup > User e defina o usuário como "System User"
-
-Agora, para os não usuários do sistema, podemos definir uma home page para quando eles fizerem login via `hooks.py` com baseado na Role.
-
-Para quando os membros da biblioteca entrarem, eles devem ser redirecionado para a página `article`, para abrir o arquivo `library_management/hooks.py` adicione:
-
- role_home_page = {
- "Library Member": "article"
- }
-
-{next}
diff --git a/frappe/docs/user/zh/__init__.py b/frappe/docs/user/zh/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/bench/__init__.py b/frappe/docs/user/zh/bench/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/bench/guides/__init__.py b/frappe/docs/user/zh/bench/guides/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/bench/guides/adding-custom-domains.md b/frappe/docs/user/zh/bench/guides/adding-custom-domains.md
deleted file mode 100755
index ac232e6265..0000000000
--- a/frappe/docs/user/zh/bench/guides/adding-custom-domains.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# 为站点添加自定义域名
-
-你可以为站点添加 **多个自定义域名**,只需运行:
-
- bench setup add-domain [desired-domain]
-
-在运行该命令时,将询问你要为哪个站点设置自定义域名。
-
-你可以使用以下选项为自定义域名设置 SSL:
-
- --ssl-certificate [path-to-certificate]
- --ssl-certificate-key [path-to-certificate-key]
-
-例如:
-
- bench setup add-domain custom.erpnext.com --ssl-certificate /etc/letsencrypt/live/erpnext.cert --ssl-certificate-key /etc/letsencrypt/live/erpnext.key
-
-域名配置保存在各站点自己的 site_config.json 配置文件里:
-
- "domains": [
- {
- "ssl_certificate": "/etc/letsencrypt/live/erpnext.cert",
- "domain": "erpnext.com",
- "ssl_certificate_key": "/etc/letsencrypt/live/erpnext.key"
- }
- ],
-
-**你需要通过运行 `bench setup nginx` 重新生成 Nginx 配置,并重新加载 Nginx 服务使你的自定义域名生效**
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/guides/configuring-https.md b/frappe/docs/user/zh/bench/guides/configuring-https.md
deleted file mode 100755
index 82bb31d388..0000000000
--- a/frappe/docs/user/zh/bench/guides/configuring-https.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# 配置 HTTPS
-
-### 获取必要的文件
-
-你可以从受信任的证书颁发机构获得 SSL 证书或生成自己的证书。对于自签名证书,浏览器将显示一个 “该证书不受信任” 的警告。[这里是通过 Let's Encrypt 获取免费 SSL 证书的教程](lets-encrypt-ssl-setup.html)
-
-这些必要的文件包括:
-
-* 证书 (通常后缀名为 .crt)
-* 解密的私钥
-
-如果你有多个证书(初级和中级),你将需要将它们连接起来。例如,
-
- cat your_certificate.crt CA.crt >> certificate_bundle.crt
-
-还要确保你的私钥不可读。一般来说,它只有 root 才能是所有者和可读
-
- chown root private.key
- chmod 600 private.key
-
-### 将两个文件移动到适当的位置
-
- mkdir /etc/nginx/conf.d/ssl
- mv private.key /etc/nginx/conf.d/ssl/private.key
- mv certificate_bundle.crt /etc/nginx/conf.d/ssl/certificate_bundle.crt
-
-### 设置 Nginx 配置
-
-为你的站点设置证书和私钥的路径
-
- bench set-ssl-certificate site1.local /etc/nginx/conf.d/ssl/certificate_bundle.crt
- bench set-ssl-key site1.local /etc/nginx/conf.d/ssl/private.key
-
-### 生成 Nginx 配置
-
- bench setup nginx
-
-### 重启 Nginx
-
- sudo service nginx reload
-
-或
-
- systemctl reload nginx # for CentOS 7
-
-现在你已完成了 SSL 的配置,所有 HTTP 通信都将重定向到 HTTPS
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/guides/diagnosing-the-scheduler.md b/frappe/docs/user/zh/bench/guides/diagnosing-the-scheduler.md
deleted file mode 100755
index 68150dc702..0000000000
--- a/frappe/docs/user/zh/bench/guides/diagnosing-the-scheduler.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# 诊断计划任务
-
-
-
-如果你在计划任务中遇到延迟,或者似乎无法运行,可以运行几个命令来诊断问题。
-
-### `bench doctor`
-
-这将按顺序给出如下输出:
-- 各站点计划任务状态
-- 执行单元 (Workers) 数量
-- 待处理任务
-
-
-预期输出:
-
- Workers online: 0
- -----None Jobs-----
-
-### `bench --site [site-name] show-pending-jobs`
-
-这将按顺序给出如下输出:
-- 队列
-- 队列任务
-
-预期输出:
-
- -----Pending Jobs-----
-
-
-### `bench purge-jobs`
-
-这将从所有队列中删除全部待处理的任务
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/guides/index.md b/frappe/docs/user/zh/bench/guides/index.md
deleted file mode 100644
index 94035fe8b1..0000000000
--- a/frappe/docs/user/zh/bench/guides/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# 指南
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/guides/index.txt b/frappe/docs/user/zh/bench/guides/index.txt
deleted file mode 100755
index 4f99377c88..0000000000
--- a/frappe/docs/user/zh/bench/guides/index.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-configuring-https
-lets-encrypt-ssl-setup
-diagnosing-the-scheduler
-how-to-change-host-name-from-localhost
-manual-setup
-setup-multitenancy
-setup-production
-setup-ssl
-stop-production-and-start-development
-updating
-setting-limits
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/guides/lets-encrypt-ssl-setup.md b/frappe/docs/user/zh/bench/guides/lets-encrypt-ssl-setup.md
deleted file mode 100755
index 998a38e5a1..0000000000
--- a/frappe/docs/user/zh/bench/guides/lets-encrypt-ssl-setup.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# 通过 Let's Encrypt 配置 HTTPS
-
-## 必备条件
-
-1. 你需要有 DNS 多租户 (Multitenant) 设置
-2. 你的网站应可通过有效的域名访问
-3. 你需要服务器的 root 权限
-
-**注意 : Let's Encrypt 证书将每三个月到期**
-
-## 使用 Bench 命令
-
-运行:
-
- sudo -H bench setup lets-encrypt [site-name]
-
-您将碰到几个提示,请做出相应地回应。该命令还会向用户的 crontab 添加一个任务,每月尝试更新证书。
-
-### 自定义域名
-
-你还可以为[自定义域名](adding-custom-domains.html)设置 Let's Encrypt。使用 `--custom-domain` 选项即可
-
- sudo -H bench setup lets-encrypt [site-name] --custom-domain [custom-domain]
-
-### 刷新证书
-
-你可以使用以下命令手工刷新证书:
-
- sudo bench renew-lets-encrypt
-
-
-
-## 手工方式
-
-### 下载适当的 Certbot-auto 脚本到 /opt 目录中
-
- https://certbot.eff.org/
-
-### 停止 nginx 服务
-
- $ sudo service nginx stop
-
-### 运行 Certbot
-
- $ ./opt/certbot-auto certonly --standalone
-
-在 letsencrypt 初始化后,将提示你输入一些信息。取决于你之前是否使用了 Let's Encrypt,这个提示可能会有所不同,但我们会第一时间指导你完成。
-
-在提示中,输入用于通知、以及恢复丢失密钥的电子邮件地址:
-
-
-
-你必须同意 Let's Encrypt 的订阅协议,选择同意:
-
-
-然后输入你的域名。注意,如果你希望把一个证书用到多个域名上 (例如 example.com、www.example.com) ,确保像如下那样全部包含它们:
-
-
-
-### 证书文件
-
-获得证书后,你将拥有以下 PEM 编码的文件:
-
-* **cert.pem**: 你的域名证书
-* **chain.pem**: Let's Encrypt 链证书
-* **fullchain.pem**: 合并的 cert.pem 和 chain.pem
-* **privkey.pem**: 你的证书私钥
-
-
-这些证书文件保存在 `/etc/letsencrypt/live/example.com` 文件夹
-
-### 为你的站点配置证书
-
-转到你的 erpnext 站点 site_config.json
-
- $ cd frappe-bench/sites/{{site_name}}
-
-添加以下两行到你的 site_config.json 文件中
-
- "ssl_certificate": "/etc/letsencrypt/live/example.com/fullchain.pem",
- "ssl_certificate_key": "/etc/letsencrypt/live/example.com/privkey.pem"
-
-
-重新生成 Nginx 配置
-
- $ bench setup nginx
-
-重启 Nginx 服务
-
- $ sudo service nginx restart
-
----
-
-### 自动更新 (实验功能)
-
-以 root 或拥有 superuser 权限的用户身份登录,运行 `crontab -e` 并输入:
-
- # 每月第一个周一刷新 letsencrypt 证书,如果执行完成后将收到邮件提示
- MAILTO="mail@example.com"
- 0 0 1-7 * * [ "$(date '+\%a')" = "Mon" ] && sudo service nginx stop && /opt/certbot-auto renew && sudo service nginx start
diff --git a/frappe/docs/user/zh/bench/guides/manual-setup.md b/frappe/docs/user/zh/bench/guides/manual-setup.md
deleted file mode 100755
index de9a4685c3..0000000000
--- a/frappe/docs/user/zh/bench/guides/manual-setup.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# 手工设置
-
-手工设置
---------------
-
-安装必备组件,
-
-* [Python 2.7](https://www.python.org/download/releases/2.7/)
-* [MariaDB](https://mariadb.org/)
-* [Redis](http://redis.io/topics/quickstart)
-* [WKHTMLtoPDF with patched QT](http://wkhtmltopdf.org/downloads.html) (生成 pdf 需要)
-
-[在 OSX 下安装必备组件](https://github.com/frappe/bench/wiki/Installing-Bench-Pre-requisites-on-MacOSX)
-
-以*非 root 用户*安装 bench,
-
- git clone https://github.com/frappe/bench bench-repo
- sudo pip install -e bench-repo
-
-提示:请不要删除上述命令将创建的 bench 目录
-
-
-从现有安装迁移
-------------------------------------
-
-如果想从 ERPNext 版本 3 迁移,请参照[这里](https://github.com/frappe/bench/wiki/Migrating-from-ERPNext-version-3)的说明
-
-如果想从老版本的 Bench 迁移,请参照[这里](https://github.com/frappe/bench/wiki/Migrating-from-old-bench)的说明
-
-
-基本用法
-===========
-
-* 创建新的 Bench
-
- 命令 init 将创建一个安装了 frappe 框架的 bench 目录。它将被设置为定期备份和每天一次的自动更新。
-
- bench init frappe-bench && cd frappe-bench
-
-* 添加应用
-
- 命令 get-app 获取并安装 frappe 应用。例如:
-
- - [erpnext](https://github.com/frappe/erpnext)
- - [erpnext_shopify](https://github.com/frappe/erpnext_shopify)
- - [paypal_integration](https://github.com/frappe/paypal_integration)
-
- bench get-app erpnext https://github.com/frappe/erpnext
-
-* 添加站点
-
- Frappe 应用由 frappe 站点运行,您需要至少创建一个站点。命令 new-site 可以达到该目的:
-
- bench new-site site1.local
-
-* 启动 Bench
-
- 要启动 Bench,使用 `bench start` 命令
-
- bench start
-
- 要登录 Frappe / ERPNext,打开你的浏览器输入 `localhost:8000`
-
- 默认用户名为 "Administrator",密码则是当你设置新站点时指定的密码。
-
-
-配置 ERPNext
-==================
-
-要安装 ERPNext,只需运行:
-```
-bench install-app erpnext
-```
-
-现在你可以使用 `bench start` 启动或[设置生产用 Bench](setup-production.html)
diff --git a/frappe/docs/user/zh/bench/guides/settings-limits.md b/frappe/docs/user/zh/bench/guides/settings-limits.md
deleted file mode 100644
index 0e9253969a..0000000000
--- a/frappe/docs/user/zh/bench/guides/settings-limits.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# 为站点配置限额
-
-Frappe v7 加入了对站点进行限额设置的支持。这些限额在站点文件夹内的 `site_config.json` 文件中设置,
-
- {
- "db_name": "xxxxxxxxxx",
- "db_password": "xxxxxxxxxxxx",
- "limits": {
- "emails": 1500,
- "space": 0.157,
- "expiry": "2016-07-25",
- "users": 1
- }
- }
-
-你可以运行以下命令设置限制:
-
- bench --site [sitename] set-limit [limit] [value]
-
-你也可以同时设置多个限制,运行以下命令:
-
- bench --site [sitename] set-limits --limit [limit] [value] --limit [limit-2] [value-2]
-
- 你可以设置的有效限制有:
-
-- **users** - 限制站点的最大用户数
-- **emails** - 限制站每月邮件的发送数量上限
-- **space** - 限制站点可以使用的最大存储空间(GB)
-- **email_group** - 限制邮件群组中允许的最大成员数量
-- **expiry** - 站点的到期日期(带括号的 YYYY-MM-DD 格式)
-
-例如:
-
- bench --site site1.local set-limit users 5
-
-你可以通过从工具栏/ AwesomeBar 打开 “使用信息” 页面查看使用情况。设置的限制会显示在该页面上。
-
-
diff --git a/frappe/docs/user/zh/bench/guides/setup-multitenancy.md b/frappe/docs/user/zh/bench/guides/setup-multitenancy.md
deleted file mode 100755
index e41d8200f6..0000000000
--- a/frappe/docs/user/zh/bench/guides/setup-multitenancy.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# 多租户模式配置
-
-假设你已经运行了你的第一个站点,并完成了[生产环境部署](setup-production.html),这篇文章将展示如何托管你的第二个站点(或更多)。你的第一个站点自动设置为默认站点。你可以通过如下命令更改默认站点,
-
- bench use sitename
-
-基于端口的多租户模式
------------------------
-
-你可以创建新的站点并运行在不同的端口上(第一个站点运行在 80 端口)。
-
-
-* 关闭基于 DNS 的多租户模式 (一次即可)
-
- `bench config dns_multitenant off`
-
-* 新增站点
-
- `bench new-site site2name`
-
-* 设置端口
-
- `bench set-nginx-port site2name 82`
-
-* 重新生成 Nginx 配置
-
- `bench setup nginx`
-
-* 重新加载 Nginx 服务
-
- `sudo service nginx reload`
-
-
-基于 DNS 的多租户模式
-----------------------
-将你的站点命名为主机名(hostname)即可。你的所有站点都将运行在相同的端口上并根据其主机名(hostname)自动选择。
-
-基于DNS的多租户在做一个新的网站,请执行以下步骤。
-
-* 开启基于 DNS 的多租户模式 (一次即可)
-
- `bench config dns_multitenant on`
-
-* 新增站点
-
- `bench new-site site2name`
-
-* 重新生成 Nginx 配置
-
- `bench setup nginx`
-
-* 重新加载 Nginx 服务
-
- `sudo service nginx reload`
diff --git a/frappe/docs/user/zh/bench/guides/setup-production.md b/frappe/docs/user/zh/bench/guides/setup-production.md
deleted file mode 100644
index 1293e12e2a..0000000000
--- a/frappe/docs/user/zh/bench/guides/setup-production.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 生产环境部署
-
-你可以通过配置 Supervisor、Nginx 来部署生产环境。如果你想把生产环境恢复为开发环境,请参考[这些命令](https://github.com/frappe/bench/wiki/Stopping-Production-and-starting-Development)。
-
-#### 自动部署生产环境
-运行命令 `sudo bench setup production` 将自动完成生产环境部署。
-
-
-#### 手工部署生产环境
-
-Supervisor
-----------
-
-Supervisor 确保 Frappe 系统进程保持运行并在它发生崩溃后自动重新启动。你可以使用命令 `bench setup supervisor` 生成 Supervisor 所需的配置。该配置可参考`config/supervisor.conf` 文件。你可以将该文件复制或链接到 supervisor 配置目录并重新加载它以使其生效。
-
-例如,
-
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf
-```
-
-注意:对于 CentOS 7, 其扩展名应是 `ini`, 因此命令变成了:
-
-```
-bench setup supervisor
-sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.ini #for CentOS 7 only
-```
-
-更新 supervisor 配置后需要重启 supervisor 管理的相关进程。要自动完成它,你需要使用命令 `sudo bench setup sudoers $(whoami)` 对 sudoers 进行配置。
-
-Nginx
------
-
-Nginx 是一个 Web 服务器,我们用它来提供静态文件以及其他对 Frappe 请求的代理。你可以使用命令 `bench setup nginx` 生成 Supervisor 所需的配置。该配置可参考`config/nginx.conf` 文件。你可以将该文件复制或链接到 nginx 配置目录并重新加载它以使其生效。
-
-例如,
-
-```
-bench setup nginx
-sudo ln -s `pwd`/config/nginx.conf /etc/nginx/conf.d/frappe-bench.conf
-```
-
-注意:如果有另一个端口配置为 80 的服务存在,在你更改配置后重新启动 Nginx 可能失败(多数情况下导致 Nginx 的欢迎页出现)。你需要禁用此配置。通常它们位于 `/etc/nginx/conf.d/default.conf` 和 `/etc/nginx/conf.d/default` 中。
diff --git a/frappe/docs/user/zh/bench/index.md b/frappe/docs/user/zh/bench/index.md
deleted file mode 100644
index 39e8cc0ffe..0000000000
--- a/frappe/docs/user/zh/bench/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Bench
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/index.txt b/frappe/docs/user/zh/bench/index.txt
deleted file mode 100644
index 97c835454b..0000000000
--- a/frappe/docs/user/zh/bench/index.txt
+++ /dev/null
@@ -1 +0,0 @@
-guides
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/resources/__init__.py b/frappe/docs/user/zh/bench/resources/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/bench/resources/background-services.md b/frappe/docs/user/zh/bench/resources/background-services.md
deleted file mode 100755
index a4186b7dc2..0000000000
--- a/frappe/docs/user/zh/bench/resources/background-services.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# 后台服务
-
-外部服务
------------------
-
- * MariaDB (Frappe 数据库)
- * Redis (Frappe 后台执行单元(Workers)和缓存查询)
- * nginx (用于生产环境部署)
- * supervisor (用于生产环境部署)
-
-Frappe 进程
-----------------
-
-* WSGI 服务
-
- * 该 WSGI 服务负责相应对 frappe 的 HTTP 请求。在开发场景下 (`bench serve` 或 `bench start`) 为 Werkzeug WSGI 服务,生产场景下则使用 gunicorn (由 supervisor 自动配置)。
-
-* Redis 执行单元(Workers)进程
-
- * 该 Celery 执行单元进程在 Frappe 系统里运行后台任务。当 supervisor 配置为生产环境时,这些进程在运行 `bench start` 时会自动启动。
-
-* 计划任务进程
-
- * 计划任务进程在 Frappe 系统里运行规划的任务。当 supervisor 配置为生产环境时,该进程在运行 `bench start` 时会自动启动。
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/resources/bench-commands-cheatsheet.md b/frappe/docs/user/zh/bench/resources/bench-commands-cheatsheet.md
deleted file mode 100755
index c0708bdf29..0000000000
--- a/frappe/docs/user/zh/bench/resources/bench-commands-cheatsheet.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# Bench 命令列表
-
-### 常用
-
-* `bench --version` - 显示 bench 版本
-* `bench src` - 显示 bench 仓库目录
-* `bench --help` - 显示所有命令和帮助
-* `bench [command] --help` - 显示指定命令的帮助
-* `bench init [bench-name]` - 创建新的工作台(bench) (在 home 目录下运行)
-* `bench --site [site-name] COMMAND` - 指定命令应用的站点
-* `bench update` - 从 bench 仓库和其他所有应用获取更新,应用补丁,重建 JS、CSS,然后执行迁移操作
- * `--pull` 获取所有应用的更新
- * `--patch` 执行所有站点的迁移
- * `--build` 重建 JS、CSS
- * `--bench` 更新 bench
- * `--requirements` 更新依赖
- * `--restart-supervisor` 更新后重启 supervisor 进程
- * `--upgrade` 进行主版本升级 ( 如 ERPNext 6 -> 7)
- * `--no-backup` 更新前不进行备份
-* `bench restart` 重启所有 bench 服务
-* `bench backup` 备份
-* `bench backup-all-sites` 备份所有站点
- * `--with-files` 备份站点及其文件
-* `bench restore` 恢复
- * `--with-private-files` 恢复站点及私有文件 (tar 文件路径)
- * `--with-public-files` 恢复站点及公共文件 (tar 文件路径)
-* `bench migrate` 读取 JSON 文件并对数据库进行相应的更改
-
-### 配置
-* `bench config` - 更改 bench 配置
- * `auto_update [on/off]` 启用/禁用 bench 自动更新
- * `dns_multitenant [on/off]` 启用/禁用 DNS 多租户模式
- * `http_timeout` 设置 http 超时时间
- * `restart_supervisor_on_update` 启用/禁用 更新时自动重启 supervisor
- * `serve_default_site` 配置 Nginx 默认站点
- * `update_bench_on_update` 启用/禁用 bench 同步更新
-* `bench setup` - 设置组件
- * `auto-update` 为 bench 自动更新增加 cronjob 任务
- * `backups ` 为 bench 备份增加 cronjob 任务
- * `config ` 重写或生成 config.json
- * `env ` 生成 bench virtualenv 环境
- * `nginx ` 生成 nginx 配置文件
- * `procfile ` 设置 bench 启动过程文件(Procfile)
- * `production ` 设置 bench 为生产环境
- * `redis ` 生成 redis 缓存配置文件
- * `socketio ` 设置 socketio 服务所需的 Node 依赖环境
- * `sudoers ` 增加命令到 sudoers 列表...
- * `supervisor ` 生成 supervisor 配置文件
- * `add-domain ` 增加站点自定义域名
- * `firewall ` 设置防火墙并屏蔽除 22、80、443 之外的所有端口
- * `ssh-port ` 更改 SSH 默认连接端口
-
-### 开发
-
-* `bench new-app [app-name]` 创建一个新的应用
-* `bench get-app [repo-link]` - 从 git 仓库下载并安装一个应用
-* `bench install-app [app-name]` 安装已有的应用
-* `bench remove-from-installed-apps [app-name]` 从应用列表中移除应用
-* `bench uninstall-app [app-name]` 删除应用及与该应用相关的一切 (须确保 Bench 在运行)
-* `bench remove-app [app-name]` 从 bench 中彻底删除应用
-* `bench --site [sitename] --force reinstall ` 全新数据库重新安装 (小心:将清除老的数据库)
-* `bench new-site [sitename]` - 创建一个新的站点
- * `--db-name` 数据库名称
- * `--mariadb-root-username` MariaDB 数据库 root 用户名
- * `--mariadb-root-password` MariaDB 数据库 root 密码
- * `--admin-password` 新站点的管理员密码
- * `--verbose` 显示详细信息
- * `--force` 强制恢复 (如果站点已经存在)
- * `--source_sql` 使用 SQL 文件初始化数据库
- * `--install-app` 站点安装后安装应用
-* `bench use [site]` 设置默认站点
-* `bench drop-site` 从磁盘及数据库中完全移除站点
- * `--root-login`
- * `--root-password`
-* `bench set-config [key] [value]` 为站点配置文件增加键值对
-* `bench console` 打开 bench venv 下的 IPython 终端
-* `bench execute` 执行任何应用内的方法
- * 例如 : `bench execute frappe.utils.scheduler.enqueue_scheduler_events`
-* `bench mysql` 打开 SQL 终端
-* `bench run-tests` 运行测试
- * `--app` 应用名称
- * `--doctype` 用于测试的 DocType
- * `--test` 具体测试
- * `--module` 运行具有测试的特定模块
- * `--profile` 运行具有测试的 Python 过程文件
-* `bench disable-production` 禁用生产环境
-
-### 计划任务
-
-* `bench enable-scheduler` - 启用运行计划任务
-* `bench doctor` - 显示有关后台执行单元的诊断信息
-* `bench show-pending-jobs`- 显示未完成任务
-* `bench purge-jobs` - 销毁所有未完成任务
-
diff --git a/frappe/docs/user/zh/bench/resources/bench-procfile.md b/frappe/docs/user/zh/bench/resources/bench-procfile.md
deleted file mode 100755
index b33727201e..0000000000
--- a/frappe/docs/user/zh/bench/resources/bench-procfile.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Bench Procfile
-
-在**开发模式**下 `bench start` 使用 [honcho](http://honcho.readthedocs.org) 管理多个流程。
-
-### 过程
-
-运行 Frappe 所需的相关过程是:
-
-1. `bench start` - Web 服务
-4. `redis_cache` 用于缓存 (通常)
-5. `redis_queue` 用于管理后台执行单元队列
-6. `redis_socketio` 作为来自后台执行单元的实时消息代理
-7. `web` 用于 frappe Web 服务
-7. `socketio` 用于实时消息
-3. `schedule` 用于触发定期任务
-3. `worker_*` 用于 redis 执行单元处理异步任务
-
-或者,如果你在开发 Frappe,你可以添加 `bench watch` 自动创建桌面 JavaScript 应用。
-
-### 例子
-
- redis_cache: redis-server config/redis_cache.conf
- redis_socketio: redis-server config/redis_socketio.conf
- redis_queue: redis-server config/redis_queue.conf
- web: bench serve --port 8000
- socketio: /usr/bin/node apps/frappe/socketio.js
- watch: bench watch
- schedule: bench schedule
- worker_short: bench worker --queue short
- worker_long: bench worker --queue long
- worker_default: bench worker --queue default
diff --git a/frappe/docs/user/zh/bench/resources/index.md b/frappe/docs/user/zh/bench/resources/index.md
deleted file mode 100644
index 23b3af3625..0000000000
--- a/frappe/docs/user/zh/bench/resources/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# 资源
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/bench/resources/index.txt b/frappe/docs/user/zh/bench/resources/index.txt
deleted file mode 100644
index 4674526df6..0000000000
--- a/frappe/docs/user/zh/bench/resources/index.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-background-services
-bench-commands-cheatsheet
-bench-procfile
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/.txt b/frappe/docs/user/zh/guides/.txt
deleted file mode 100755
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/__init__.py b/frappe/docs/user/zh/guides/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/app-development/__init__.py b/frappe/docs/user/zh/guides/app-development/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/app-development/adding-custom-button-to-form.md b/frappe/docs/user/zh/guides/app-development/adding-custom-button-to-form.md
deleted file mode 100644
index fba6397b94..0000000000
--- a/frappe/docs/user/zh/guides/app-development/adding-custom-button-to-form.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Adding Custom Button To Form
-
-To create a custom button on your form, you need to edit the javascript file associated to your doctype. For example, If you want to add a custom button to User form then you must edit `user.js`.
-
-In this file, you need to write a new method `add_custom_button` which should add a button to your form.
-
-#### Function Signature for `add_custom_button(...)`
- frm.add_custom_button(__(buttonName), function(){
- //perform desired action such as routing to new form or fetching etc.
- }, __(groupName));
-
-#### Example-1: Adding a button to User form
-We should edit `frappe\core\doctype\user\user.js`
-
- frappe.ui.form.on('User', {
- refresh: function(frm) {
- ...
- frm.add_custom_button(__('Get User Email Address'), function(){
- frappe.msgprint(frm.doc.email);
- }, __("Utilities"));
- ...
- }
- });
-
-You should be seeing a button on user form as shown below,
-
-
-
-
-
diff --git a/frappe/docs/user/zh/guides/app-development/adding-module-icons-on-desktop.md b/frappe/docs/user/zh/guides/app-development/adding-module-icons-on-desktop.md
deleted file mode 100755
index 4fbf6fda1e..0000000000
--- a/frappe/docs/user/zh/guides/app-development/adding-module-icons-on-desktop.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Adding Module Icons On Desktop
-
-To create a module icon for a Page, List or Module, you will have to edit the `config/desktop.py` file in your app.
-
-In this file you will have to write the `get_data` method that will return a dict object with the module icon parameters
-
-### Example 1: Module Icon
-
- def get_data():
- return {
- "Accounts": {
- "color": "#3498db",
- "icon": "octicon octicon-repo",
- "type": "module"
- },
- }
-
-### Example 2: List Icon
-
- def get_data():
- return {
- "To Do": {
- "color": "#f1c40f",
- "icon": "fa fa-check",
- "icon": "octicon octicon-check",
- "label": _("To Do"),
- "link": "List/ToDo",
- "doctype": "ToDo",
- "type": "list"
- },
- }
-
-
-Note: Module views are visible based on permissions.
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/custom-module-icon.md b/frappe/docs/user/zh/guides/app-development/custom-module-icon.md
deleted file mode 100755
index 4a9903fbf7..0000000000
--- a/frappe/docs/user/zh/guides/app-development/custom-module-icon.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Custom Module Icon
-
-If you want to create a custom icon for your module, you will have to create an SVG file for your module and set the path to this file in the `desktop/config.py` of your app.
-
-This icon is loaded via AJAX first time, then it will be rendered.
-
-Example:
-
- from frappe import _
-
- def get_data():
- return {
- "Frappe Apps": {
- "color": "orange",
- "icon": "assets/frappe/images/frappe.svg",
- "label": _("Frappe.io Portal"),
- "type": "module"
- }
- }
-
-> PS: A great place to buy SVG icons for a low cost is the awesome [Noun Project](http://thenounproject.com/)
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/dialogs-types.md b/frappe/docs/user/zh/guides/app-development/dialogs-types.md
deleted file mode 100755
index 31f2ccbbb4..0000000000
--- a/frappe/docs/user/zh/guides/app-development/dialogs-types.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Dialogs Types
-
-Frappe provides a group of standard dialogs that are very useful while coding.
-
-## Alert Dialog
-
-
-
-Alert Dialog is used for showing non-obstructive messages.
-
-It has 2 parameters:
-
-- **txt:** The message to be shown in the `Alert Dialog`
-- **seconds:** The duration that the message will be displayed. The default is `3 seconds`.
-
-### Example
-
- show_alert('Hi, do you have a new message', 5);
-
----
-
-## Prompt Dialog
-
-
-
-Prompt Dialog is used for collecting data from users.
-
-It has 4 parameters:
-
-- **fields:** a list with the fields objects
-- **callback:** a function to process the data in the dialog
-- **title:** the title of the dialog
-- **primary_label:** the label of the primary button
-
-### Example
-
- frappe.prompt([
- {'fieldname': 'birth', 'fieldtype': 'Date', 'label': 'Birth Date', 'reqd': 1}
- ],
- function(values){
- show_alert(values, 5);
- },
- 'Age verification',
- 'Subscribe me'
- )
-
----
-## Confirm Dialog
-
-
-
-Confirm Dialog is used to get a confirmation from the user before executing an action.
-
-It has 3 arguments:
-
-- **mesage:** The message to display in the dialog
-- **onyes:** The callback on positive confirmation
-- **oncancel:** The callback on negative confirmation
-
-### Example
-
- frappe.confirm(
- 'Are you sure to leave this page?',
- function(){
- window.close();
- },
- function(){
- show_alert('Thanks for continue here!')
- }
- )
-
----
-
-## Message Print
-
-
-
-Message Print is used for showing information to users.
-
-It has 2 arguments:
-
-- **message:** The message to display. It can be a HTML string
-- **title:** The title of the dialog
-
-### Example
-
- msgprint("Server Status"
- + "
"
- + ""
- + "- 28% Memory
"
- + "- 12% Processor
"
- + "- 0.3% Disk
"
- + "
", 'Server Info')
-
----
-
-### Custom Dialog
-
-
-
-You can extend and build your own custom dialogs using `frappe.ui.Dialog`
-
-### Example
-
- var d = new frappe.ui.Dialog({
- 'fields': [
- {'fieldname': 'ht', 'fieldtype': 'HTML'},
- {'fieldname': 'today', 'fieldtype': 'Date', 'default': frappe.datetime.nowdate()}
- ],
- primary_action: function(){
- d.hide();
- show_alert(d.get_values());
- }
- });
- d.fields_dict.ht.$wrapper.html('Hello World');
- d.show();
-
-
-
-
-
diff --git a/frappe/docs/user/zh/guides/app-development/executing-code-on-doctype-events.md b/frappe/docs/user/zh/guides/app-development/executing-code-on-doctype-events.md
deleted file mode 100755
index ff03f85236..0000000000
--- a/frappe/docs/user/zh/guides/app-development/executing-code-on-doctype-events.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Executing Code On Doctype Events
-
-To execute code when a DocType is inserted, validated (before saving), updated, submitted, cancelled, deleted, you must write in the DocType's controller module.
-
-#### 1. Controller Module
-
-The controller module exists in the `doctype` folder in the Module of the `DocType`. For example, the controller for **ToDo** exists in `frappe/desk/doctype/todo/todo.py` (version 5). A controller template is created when the DocType is created. which looks like
-
- from __future__ import unicode_literals
-
- import frappe
- from frappe.model.document import Document
-
- class CustomType(Document):
- pass
-
-#### 2. Document Properties
-
-All the fields and child tables are available to the class as attributes. For example the **name** property is `self.name`
-
-#### 3. Adding Methods
-
-In this module, you can add standard methods to the class that are called when a document of that type is created. Standard Handlers are:
-
-1. `autoname`: Called while naming. You can set the `self.name` property in the method.
-1. `before_insert`: Called before a document is inserted.
-1. `validate`: Called before document is saved. You can throw an exception if you don't want the document to be saved
-1. `on_update`: Called after the document is inserted or updated in the database.
-1. `on_submit`: Called after submission.
-1. `on_cancel`: Called after cancellation.
-1. `on_trash`: Called after document is deleted.
diff --git a/frappe/docs/user/zh/guides/app-development/exporting-customizations.md b/frappe/docs/user/zh/guides/app-development/exporting-customizations.md
deleted file mode 100644
index 710db1d3e5..0000000000
--- a/frappe/docs/user/zh/guides/app-development/exporting-customizations.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Exporting Customizations to your App
-
-A common use case is to extend a DocType via Custom Fields and Property Setters for a particular app. To save these settings to an app, go to **Customize Form**
-
-You will see a button for **Export Customizations**
-
-
-
-Here you can select the module and whether you want these particular customizations to be synced after every update.
-
-The customizations will be exported to a new folder `custom` in the module folder of your app. The customizations will be saved by the name of the DocType
-
-
-
-When you do `bench update` or `bench migrate` these customizations will be synced to the app.
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md b/frappe/docs/user/zh/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md
deleted file mode 100755
index 7e47d63f5f..0000000000
--- a/frappe/docs/user/zh/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Fetch a Field Value from a Document into a Transaction
-
-Let's say, there is a custom field "VAT Number" in Supplier, which should be fetched in Purchase Order.
-
-#### Steps:
-
-1. Create a Custom Field **VAT Number** for *Supplier* document with *Field Type* as **Data**.
-
-
-1. Create another Custom Field **VAT Number** for *Purchase Order* document, but in this case with *Field Type* as **Read Only** or check **Read Only** checkbox. Set the **Options** as `supplier.vat_number`.
-
-
-1. Go to the user menu and click "Reload".
-1. Now, on selection of Supplier in a new Purchase Order, **VAT Number** will be fetched automatically from the selected Supplier.
-
diff --git a/frappe/docs/user/zh/guides/app-development/generating-docs.md b/frappe/docs/user/zh/guides/app-development/generating-docs.md
deleted file mode 100755
index 72db83324d..0000000000
--- a/frappe/docs/user/zh/guides/app-development/generating-docs.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Generating Documentation Website for your App
-
-Frappe version 6.7 onwards includes a full-blown documentation generator so that you can easily create a website for your app that has both user docs and developers docs (auto-generated).
-
-Version 8.7 onwards, these will be generated in a target app.
-
-## Writing Docs
-
-### 1. Setting up docs
-
-The first step is to setup the docs folder. For that you must create a new file in your app `config/docs.py` if it is not auto-generated. In your `docs.py` file, add the following module properties.
-
-
- source_link = "https://github.com/[orgname]/[reponame]"
- headline = "This is what my app does"
- sub_heading = "Slightly more details with key features"
- long_description = """(long description in markdown)"""
-
- def get_context(context):
- # optional settings
-
- # context.brand_html = 'Brand info on the top left'
- # context.favicon = 'path to favicon'
- #
- # context.top_bar_items = [
- # {"label": "About", "url": context.docs_base_url + "/about"},
- # ]
-
- pass
-
-### 2. Add User Documentation
-
-To add user documentation, add folders and pages in your `/docs/user` folder in the same way you would build a website pages in the `www` folder.
-
-Some quick tips:
-
-1. Add your pages as `.md` or `.html` pages
-2. Optionally add `.css` files with the same name that will be automatically served
-3. Add index by adding `{index}`
-
-### 3. Linking
-
-While linking make sure you add `/docs` to all your links.
-
-
- {% raw %}Link Description{% endraw %}
-
-
-### 4. Adding Images
-
-You can add images in the `/docs/assets` folder. You can add links to the images as follows:
-
- {% raw %}
{% endraw %}
-
----
-
-
-## Building Docs
-
-You must create a new app that will have the output of the docs, which is called the "target" app. For example, the docs for ERPNext are hosted at erpnext.org, which is based on the app "foundation". You can create a new app just to push docs of any other app.
-
-To output docs to another app,
-
- bench --site [site] build-docs [app] --target [target_app]
-
-This will create a new folder `/docs` inside the `www` folder of the target app and generate automatic docs (from code), model references and copy user docs and assets.
-
-To view the docs, just go the the `/docs` url on your target app. Example:
-
- https://erpnext.org/docs
diff --git a/frappe/docs/user/zh/guides/app-development/how-enable-developer-mode-in-frappe.md b/frappe/docs/user/zh/guides/app-development/how-enable-developer-mode-in-frappe.md
deleted file mode 100755
index 2656e8e1dd..0000000000
--- a/frappe/docs/user/zh/guides/app-development/how-enable-developer-mode-in-frappe.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# How Enable Developer Mode In Frappe
-
-When you are in application design mode and you want the changes in your DocTypes, Reports etc to affect the app repository, you must be in **Developer Mode**.
-
-To enable developer mode, update the `site_config.json` file of your site in the sites folder for example:
-
- frappe-bench/sites/site1/site_config.json
-
-Add this to the JSON object
-
- "developer_mode": 1
-
-After setting developer mode, clear the cache:
-
- $ bench clear-cache
-
-To view the full developer options, you must be logged in as the "Administrator" user.
-
-
diff --git a/frappe/docs/user/zh/guides/app-development/how-to-create-custom-fields-during-app-installation.md b/frappe/docs/user/zh/guides/app-development/how-to-create-custom-fields-during-app-installation.md
deleted file mode 100755
index 3169297850..0000000000
--- a/frappe/docs/user/zh/guides/app-development/how-to-create-custom-fields-during-app-installation.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# How To Create Custom Fields During App Installation
-
-Your custom app can automatically add **Custom Fields** to DocTypes outside of your app when it is installed to a new site.
-
-To do this, add the new custom fields that your app requires, using the Frappe web application.
-
-In your `hooks.py` file, add `"Custom Fields"`
-
- fixtures = ["Custom Field"]
-
-Export fixtures before you commit your app with:
-
- $ bench --site mysite export-fixtures
-
-This will create a new folder called `fixtures` in your app folder and a `.csv` or `.json` file will be created with the definition of the custom fields you added.
-
-This file will be automatically imported when the app is installed in a new site or updated via `bench update`.
-
-Note: You can also add single DocTypes like "Website Settings" as fixtures
-
-
-
diff --git a/frappe/docs/user/zh/guides/app-development/how-to-improve-a-standard-control.md b/frappe/docs/user/zh/guides/app-development/how-to-improve-a-standard-control.md
deleted file mode 100755
index 87edacb87a..0000000000
--- a/frappe/docs/user/zh/guides/app-development/how-to-improve-a-standard-control.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# How To Improve A Standard Control
-
-Frappe has a couple of elegant and useful widgets, but some times we need to edit them to add small improvements. This small article will describe how to add new resources to the standard widgets.
-
-Let me explain first our goal:
-
-> Add `many` alternative translations in `numerous records` and in a `lot of doctypes`
-
-Look the highlighted sections in the __goal__, we have _many translations_ to add in _many records_ and in _many doctypes_, so, we heave a **many of work**, so we have a lot to do right?
-
-The answer for this question is: _-Of course not! Because we know that if one element exists in many records and in many doctypes, this element is the `Control` or `Widget`_
-
-So, what we need do, is improve your goal based on the `Control`, to reduce our quantity of work.
-
-But, where will we find this magic element, the control? _-For now, we can look it in the JavaScript sources - let's look now at [Github](https://github.com/frappe/frappe/blob/develop/frappe/public/js/frappe/form/control.js#L13)_
-
-> Don't worry if you don't understand the code for now, our goal there is simplify our work.
-
-Let's go ahead with the thought!
-
-We know where we need to make the changes, but how will we dismember which are the controls that are affected by our feature and which aren't ?
-
-We need to keep in mind, that `Control` are instance of `DocFields` and the `DocFields` have a field that is very important for us in this case, the field that will help us to dismember which are affected by our feature and which aren't is the field `options` in the `DocField`.
-
-_-Wait!, we understood that the field `options` can help us, but, how will it help us?_
-
-Good question, we will define a word to put in the `options` of the `DocFields` that we need to include the feature, this world will be **`Translatable`.**
-
-> If you forget how to customize the options of a field look [this article](https://kb.erpnext.com/kb/customize/creating-custom-link-field), it can refresh your knowledge.
-
-Well, with the defined word in `options` of our selected `DocFields`, now is time to code:
-
-_-At last, we think we would never stop talking!_
-
- frappe.ui.form.ControlData = frappe.ui.form.ControlData.$extend({
- make_input: function(){
- var options = this.df.options;
- if (!options || options!=="Translatable"){
- this._super();
- return;
- }
- var me = this;
- $('\
- \
- \
- \
- \
- \
- ').prependTo(this.input_area);
- this.$input_area = $(this.input_area);
- this.$input = this.$input_area.find('input');
- this.$btn = this.$input_area.find('.dialog-btn');
- this.set_input_attributes();
- this.$input.on("focus", function(){
- me.$btn.toggle(true);
- });
- this.$input.on("blur", function(){
- setTimeout(function(){ me.$btn.toggle(false) }, 500);
- });
- this.input = $this.input.get(0);
- this.has_input = true;
- var me = this;
- this.setup_button();
- },
- setup_button: function(){
- var me = this;
- if (this.only_input){
- this.$btn.remove();
- return;
- }
- this.$btn.on("click", function(){
- var value = me.get_value();
- var options = me.df.options;
- if (value && options && options==="Translatable"){
- this.open_dialog();
- }
- });
- },
- open_dialog: function(){
- var doc = this.doc;
- if (!doc.__unsaved){
- new frappe.ui.form.TranslationSelector({
- doc: doc,
- df: this.doc,
- text: this.value
- });
- }
- }
- });
-
-_-Other letter soup, for my gosh!_
-
-In fact, it IS a soup of letters, for a newbie, but we are not a beginner.
-
-Let me explain what this code does;
-
- - At line 1 the code overrides the `ControlData` by one extended `Class` of itself.
- - The method `make_input` checks if the docfield is **`Translatable`** to make the new `Control` if not, it calls the *original* `make_input` using `_super()`
- - The method `setup_button` checks if the docfield is **`Translatable`** to enable it show a `dialog`
- - The method `open_dialog` invokes a new instance of the `TranslationSelector` that we will create in the code below.
-
-
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/index.md b/frappe/docs/user/zh/guides/app-development/index.md
deleted file mode 100755
index b04ae83043..0000000000
--- a/frappe/docs/user/zh/guides/app-development/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# App Development
-
-{index}
diff --git a/frappe/docs/user/zh/guides/app-development/index.txt b/frappe/docs/user/zh/guides/app-development/index.txt
deleted file mode 100755
index 5a9b4cc4a9..0000000000
--- a/frappe/docs/user/zh/guides/app-development/index.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-adding-module-icons-on-desktop
-custom-module-icon
-generating-docs
-how-enable-developer-mode-in-frappe
-fetch-custom-field-value-from-master-to-all-related-transactions
-executing-code-on-doctype-events
-exporting-customizations
-how-to-create-custom-fields-during-app-installation
-insert-a-document-via-api
-how-to-improve-a-standard-control
-overriding-link-query-by-custom-script
-single-type-doctype
-trigger-event-on-deletion-of-grid-row
-dialogs-types
-using-html-templates-in-javascript
diff --git a/frappe/docs/user/zh/guides/app-development/insert-a-document-via-api.md b/frappe/docs/user/zh/guides/app-development/insert-a-document-via-api.md
deleted file mode 100755
index c3a8358ddb..0000000000
--- a/frappe/docs/user/zh/guides/app-development/insert-a-document-via-api.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Insert A Document Via Api
-
-You can insert documents via a script using the `frappe.get_doc` method
-
-### Examples:
-
-#### 1. Insert a ToDo
-
- todo = frappe.get_doc({"doctype":"ToDo", "description": "test"})
- todo.insert()
-
----
-
-#### 2. Insert without the user's permissions being checked:
-
- todo = frappe.get_doc({"doctype":"ToDo", "description": "test"})
- todo.insert(ignore_permissions = True)
-
-
----
-
-#### 3. Submit after inserting
-
- todo = frappe.get_doc({"doctype":"ToDo", "description": "test"})
- todo.insert(ignore_permissions=True)
- todo.submit()
-
----
-
-#### 4. Insert a document on saving of another document
-
- class MyType(Document):
- def on_update(self):
- todo = frappe.get_doc({"doctype":"ToDo", "description": "test"})
- todo.insert()
-
-----
-
-#### 5. Insert a document with child tables:
-
- sales_order = frappe.get_doc({
- "doctype": "Sales Order",
- "company": "_Test Company",
- "customer": "_Test Customer",
- "delivery_date": "2013-02-23",
- "sales_order_details": [
- {
- "item_code": "_Test Item Home Desktop 100",
- "qty": 10.0,
- "rate": 100.0,
- "warehouse": "_Test Warehouse - _TC"
- }
- ]
- })
- sales_order.insert()
diff --git a/frappe/docs/user/zh/guides/app-development/overriding-link-query-by-custom-script.md b/frappe/docs/user/zh/guides/app-development/overriding-link-query-by-custom-script.md
deleted file mode 100755
index 4e78d7fd58..0000000000
--- a/frappe/docs/user/zh/guides/app-development/overriding-link-query-by-custom-script.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# Overriding Link Query By Custom Script
-
-You can override the standard link query by using `set_query`
-
-### 1. Adding Fitlers
-
-You can add filters to the query:
-
- frappe.ui.form.on("Bank Reconciliation", "onload", function(frm) {
- cur_frm.set_query("bank_account", function() {
- return {
- "filters": {
- "account_type": "Bank",
- "group_or_ledger": "Ledger"
- }
- };
- });
- });
-
-A more complex query:
-
- frappe.ui.form.on("Bank Reconciliation", "onload", function(frm){
- cur_frm.set_query("bank_account", function(){
- return {
- "filters": [
- ["Bank Account": "account_type", "=", "Bank"],
- ["Bank Account": "group_or_ledger", "!=", "Group"]
- ]
- }
- });
- });
-
----
-
-### 2. Calling a Different Method to Generate Results
-
-You can also set a server side method to be called on the query:
-
- frm.set_query("item_code", "items", function() {
- return {
- query: "erpnext.controllers.queries.item_query",
- filters: frm.doc.enquiry_type === "Maintenance" ?
- {"is_service_item": "Yes"} : {"is_sales_item": "Yes"}
- };
- });
-
-
-
-#### Custom Method
-
-The custom method should return a list of items for auto select. If you want to send additional data, you can send multiple columns in the list.
-
-Parameters to the custom method are:
-
-`def custom_query(doctype, txt, searchfield, start, page_len, filters)`
-
-**Example:**
-
- # searches for leads which are not converted
- def lead_query(doctype, txt, searchfield, start, page_len, filters):
- return frappe.db.sql("""select name, lead_name, company_name from `tabLead`
- where docstatus < 2
- and ifnull(status, '') != 'Converted'
- and ({key} like %(txt)s
- or lead_name like %(txt)s
- or company_name like %(txt)s)
- {mcond}
- order by
- if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
- if(locate(%(_txt)s, lead_name), locate(%(_txt)s, lead_name), 99999),
- if(locate(%(_txt)s, company_name), locate(%(_txt)s, company_name), 99999),
- name, lead_name
- limit %(start)s, %(page_len)s""".format(**{
- 'key': searchfield,
- 'mcond':get_match_cond(doctype)
- }), {
- 'txt': "%%%s%%" % txt,
- '_txt': txt.replace("%", ""),
- 'start': start,
- 'page_len': page_len
- })
-
-
-
-For more examples see:
-
-[https://github.com/frappe/erpnext/blob/develop/erpnext/controllers/queries.py](https://github.com/frappe/erpnext/blob/develop/erpnext/controllers/queries.py)
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/running-background-jobs.md b/frappe/docs/user/zh/guides/app-development/running-background-jobs.md
deleted file mode 100644
index d1823d1bb8..0000000000
--- a/frappe/docs/user/zh/guides/app-development/running-background-jobs.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Running Background Jobs
-
-Sometimes you may not want a user request to be executed immediately but added to a queue that will be executed by a background worker. The advantage of doing this is that your web workers remain free to execute other requests and longer jobs do not eat up all of your resources.
-
-From version 7, Frappe uses Python RQ to run background jobs.
-
-To enqueue a job,
-
- from frappe.jobs.background_jobs import enqueue
-
- def long_job(arg1, arg2):
- frappe.publish_realtime('msgprint', 'Starting long job...')
- # this job takes a long time to process
- frappe.publish_realtime('msgprint', 'Ending long job...')
-
- def enqueue_long_job(arg1, args2):
- enqueue('myapp.mymodule.long_job', arg1=arg1, arg2=arg2)
-
-This will enqueue to the queue `default`
-
-other queues are `worker_long` and `worker_short`
-
-#### Called delayed actions on Document objects
-
-You can also called delayed actions on document objects, for example in Stock Reconciliation if there are more than 100 items, it is executed as a background job.
-
-Example: you can call `doc.queue_action('submit')`
-
-Note: This only works for `save`, `submit`, `cancel`
-
-You can also push certain actions to the background if you anticipate the execution is very large.
-
-For example:
-
- def submit(self):
- if len(self.items) > 100:
- self.queue_action('submit')
- else:
- self._submit()
-
-#### Debugging
-
-If you are on `bench start`
-
-You will see logs in your terminal.
-
-Note: default worker does not auto restart, so you will have to kill bench and start again after you make changes.
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/single-type-doctype.md b/frappe/docs/user/zh/guides/app-development/single-type-doctype.md
deleted file mode 100755
index 560b2a1a6d..0000000000
--- a/frappe/docs/user/zh/guides/app-development/single-type-doctype.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Single Type Doctype
-
-DocTypes have a table associated with them. For example DocType **Customer** will have a table `tabCustomer` associated with it.
-
-**Single** type DocTypes have no table associated and there is only one Document for it. This is similar to the Singleton pattern in Java. Single DocTypes are ideal for saving Settings (that are globally applicable) and for wizard / helper type forms that have no documents, but when the DocType is used for the Form UI.
-
-The data in Single DocType is stored in `tabSingles` (`doctype`, `field`, `value`)
-
-#### Examples
-
-In Frappe, Single types are **System Settings** and **Customize Form**
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/app-development/trigger-event-on-deletion-of-grid-row.md b/frappe/docs/user/zh/guides/app-development/trigger-event-on-deletion-of-grid-row.md
deleted file mode 100755
index 776742d4ea..0000000000
--- a/frappe/docs/user/zh/guides/app-development/trigger-event-on-deletion-of-grid-row.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Trigger Event On Deletion Of Grid Row
-
-To trigger an event when a row from a Child Table has been deleted (when user clicks on `delete` button), you need to add a handler the `fieldname_remove` event to Child Table, where fieldname is the fieldname of the Child Table in Parent Table declaration.
-
- For example:
-
- Assuming that your parent DocType is named `Item` has a Table Field linked to `Item Color` DocType with decloration name `color`.
-
- In order to "catch" the delete event:
-
- frappe.ui.form.on('Item Color', {
- color_remove: function(frm) {
- // You code here
- // If you console.log(frm.doc.color) you will get the remaining color list
- }
- );
-
- The same process is used to trigger the add event (when user clicks on `add row` button):
-
- frappe.ui.form.on('Item Color', {
- color_remove: function(frm) {
- // You code here
- // If you console.log(frm.doc.color) you will get the remaining color list
- },
- color_add: function(frm) {
- }
- });
-
- Notice that the handling is be made on Child DocType Table `form.ui.on` and not on Parent Doctype so a minimal full example is:
-
-
- ```javascript
- frappe.ui.form.on('Item',{
- // Your client side handling for Item
- });
-
- frappe.ui.form.on('Item Color', {
- color_remove: function(frm) {
- // Deleting is triggered here
- }
- );
- ```
-Handlers are:
-
-1. fieldname_add
-1. fieldname_move
-1. fieldname_before_remove
-1. fieldname_remove
-
diff --git a/frappe/docs/user/zh/guides/app-development/using-html-templates-in-javascript.md b/frappe/docs/user/zh/guides/app-development/using-html-templates-in-javascript.md
deleted file mode 100755
index 13f7073e4d..0000000000
--- a/frappe/docs/user/zh/guides/app-development/using-html-templates-in-javascript.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Using Html Templates In Javascript
-
-Often while building javascript interfaces, there is a need to render DOM as an HTML template. Frappe Framework uses John Resig's Microtemplate script to render HTML templates in the Desk application.
-
-> Note 1: In Frappe we use the Jinja-like `{% raw %}{%{% endraw %}` tags to embed code rather than the standard `<%`
-
-> Note 2: Never use single quotes `'` inside the HTML template.
-
-To render a template,
-
-1. Create a template `html` file in your app. e.g. `address_list.html`
-1. Add it to `build.json` for your app (you can include it in `frappe.min.js` or your own javascript file).
-1. To render it in your app, use `frappe.render(frappe.templates.address_list, {[context]})`
-
-#### Example Template:
-
-From `erpnext/public/js/templates/address_list.js`
-
- {% raw %}
- {% for(var i=0, l=addr_list.length; i
-
- {%= __("Edit") %}
- {%= addr_list[i].address_type %}
-
-
- {% if(addr_list[i].is_primary_address) { %}
- {%= __("Primary") %}{% } %}
- {% if(addr_list[i].is_shipping_address) { %}
- {%= __("Shipping") %}{% } %}
-
- {%= addr_list[i].display %}
-
- {% } %}
- {% if(!addr_list.length) { %}
- {%= __("No address added yet.") %}
- {% } %}{% endraw %}
-
-
-
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/automated-testing/__init__.py b/frappe/docs/user/zh/guides/automated-testing/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/automated-testing/index.md b/frappe/docs/user/zh/guides/automated-testing/index.md
deleted file mode 100644
index 372d90427e..0000000000
--- a/frappe/docs/user/zh/guides/automated-testing/index.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Automated Testing
-
-Frappe Provides you a test framework to write and execute tests that can be run directly on a Continuous Integration Tool like Travis
-
-You can write server-side unit tests or UI tests
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/automated-testing/index.txt b/frappe/docs/user/zh/guides/automated-testing/index.txt
deleted file mode 100644
index 7d40d39f8a..0000000000
--- a/frappe/docs/user/zh/guides/automated-testing/index.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-unit-testing
-integration-testing
-qunit-testing
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/automated-testing/integration-testing.md b/frappe/docs/user/zh/guides/automated-testing/integration-testing.md
deleted file mode 100644
index fb99949a61..0000000000
--- a/frappe/docs/user/zh/guides/automated-testing/integration-testing.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# UI Integration Testing
-
-You can write integration tests using the Selenium Driver. `frappe.utils.selenium_driver` gives you a friendly API to write selenium based tests
-
-To write integration tests, create a standard test case by creating a python file starting with `test_`
-
-All integration tests will be run at the end of the unittests.
-
-### Example
-
-Here is an example of an integration test to check insertion of a To Do
-
- from __future__ import print_function
- from frappe.utils.selenium_testdriver import TestDriver
- import unittest
- import time
-
- class TestToDo(unittest.TestCase):
- def setUp(self):
- self.driver = TestDriver()
-
- def test_todo(self):
- self.driver.login()
-
- # list view
- self.driver.set_route('List', 'ToDo')
-
- time.sleep(2)
-
- # new
- self.driver.click_primary_action()
-
- time.sleep(2)
-
- # set input
- self.driver.set_text_editor('description', 'hello')
-
- # save
- self.driver.click_modal_primary_action()
-
- time.sleep(2)
-
- self.assertTrue(self.driver.get_visible_element('.result-list')
- .find_element_by_css_selector('.list-item')
- .find_element_by_css_selector('.list-id').text=='hello')
-
- def tearDown(self):
- self.driver.close()
-
diff --git a/frappe/docs/user/zh/guides/automated-testing/qunit-testing.md b/frappe/docs/user/zh/guides/automated-testing/qunit-testing.md
deleted file mode 100644
index 10d40999ed..0000000000
--- a/frappe/docs/user/zh/guides/automated-testing/qunit-testing.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# UI Testing with Frappe API
-
-You can either write integration tests, or directly write tests in Javascript using [QUnit](http://api.qunitjs.com/)
-
-QUnit helps you write UI tests using the UQuit framework and native frappe API. As you might have guessed, this is a much faster way of writing tests.
-
-### Test Runner
-
-To write QUnit based tests, add your tests in the `tests/ui` folder of your application. Your test files must begin with `test_` and end with `.js` extension.
-
-To run your files, you can use the **Test Runner**. The **Test Runner** gives a user interface to load all your QUnit tests and run them in the browser.
-
-In the CI, all QUnit tests are run by the **Test Runner** using `frappe/tests/test_test_runner.py`
-
-
-
-### Running Tests
-
-To run a Test Runner based test, use the `run-ui-tests` bench command by passing the name of the file you want to run.
-
- bench run-ui-tests --test frappe/tests/ui/test_list.js
-
-This will pass the filename to `test_test_runner.py` that will load the required JS in the browser and execute the tests
-
-### Debugging Tests
-
-To debug a test, you can open it in the **Test Runner** from your UI and run it manually to see where it is exactly failing.
-
-### Test Sequence
-
-In Frappe UI tests are run in a fixed sequence to ensure dependencies.
-
-The sequence in which the tests will be run will be in `tests/ui/tests.txt`
-file.
-
-### Running All UI Tests
-
-To run all UI tests together for your app run
-
- bench run-ui-tests --app [app_name]
-
-This will run all the files in your `tests/ui` folder one by one.
-
-### Example QUnit Test
-
-Here is the example of the To Do test in QUnit
-
- QUnit.test("Test quick entry", function(assert) {
- assert.expect(2);
- let done = assert.async();
- let random_text = frappe.utils.get_random(10);
-
- frappe.run_serially([
- () => frappe.set_route('List', 'ToDo'),
- () => frappe.new_doc('ToDo'),
- () => frappe.quick_entry.dialog.set_value('description', random_text),
- () => frappe.quick_entry.insert(),
- (doc) => {
- assert.ok(doc && !doc.__islocal);
- return frappe.set_route('Form', 'ToDo', doc.name);
- },
- () => assert.ok(cur_frm.doc.description.includes(random_text)),
-
- // Delete the created ToDo
- () => frappe.tests.click_page_head_item('Menu'),
- () => frappe.tests.click_dropdown_item('Delete'),
- () => frappe.tests.click_page_head_item('Yes'),
-
- () => done()
- ]);
- });
-
-### Writing Test Friendly Code with Promises
-
-Promises are a great way to write test-friendly code. If your method calls an aysnchronous call (ajax), then you should return an `Promise` object. While writing tests, if you encounter a function that does not return a `Promise` object, you should update the code to return a `Promise` object.
diff --git a/frappe/docs/user/zh/guides/automated-testing/unit-testing.md b/frappe/docs/user/zh/guides/automated-testing/unit-testing.md
deleted file mode 100755
index f1d3c5c623..0000000000
--- a/frappe/docs/user/zh/guides/automated-testing/unit-testing.md
+++ /dev/null
@@ -1,199 +0,0 @@
-# Unit Testing
-
-## 1.Introduction
-
-Frappe provides some basic tooling to quickly write automated tests. There are some basic rules:
-
-1. Test can be anywhere in your repository but must begin with `test_` and should be a `.py` file.
-1. Tests must run on a site that starts with `test_`. This is to prevent accidental loss of data.
-1. Test stubs are automatically generated for new DocTypes.
-1. Frappe test runner will automatically build test records for dependant DocTypes identified by the `Link` type field (Foreign Key)
-1. Tests can be executed using `bench run-tests`
-1. For non-DocType tests, you can write simple unittests and prefix your file names with `test_`.
-
-## 2. Running Tests
-
-This function will build all the test dependencies and run your tests.
-You should run tests from "frappe_bench" folder. Without options all tests will be run.
-
- bench run-tests
-
-If you need more information about test execution - you can use verbose log level for bench.
-
- bench --verbose run-tests
-
-### Options:
-
- --app
- --doctype
- --test
- --module (Run a particular module that has tests)
- --profile (Runs a Python profiler on the test)
- --junit-xml-output (The command provides test results in the standard XUnit XML format)
-
-#### 2.1. Example for app:
-All applications are located in folder: "~/frappe-bench/apps".
-We can run tests for each application.
-
- - frappe-bench/apps/erpnext/
- - frappe-bench/apps/erpnext_demo/
- - frappe-bench/apps/frappe/
-
- bench run-tests --app erpnext
- bench run-tests --app erpnext_demo
- bench run-tests --app frappe
-
-
-#### 2.2. Example for doctype:
-
- frappe@erpnext:~/frappe-bench$ bench run-tests --doctype "Activity Cost"
- .
- ----------------------------------------------------------------------
- Ran 1 test in 0.008s
-
- OK
-
-#### 2.3. Example for test:
-Run a specific case in User:
-
- frappe@erpnext:~/frappe-bench$ bench run-tests --doctype User --test test_get_value
- .
- ----------------------------------------------------------------------
- Ran 1 test in 0.005s
-
- OK
-
-#### 2.4. Example for module:
-If we want to run tests in the module:
-
- /home/frappe/frappe-bench/apps/erpnext/erpnext/support/doctype/issue/test_issue.py
-
-We should use module name like this (related to application folder)
-
- erpnext.support.doctype.issue.test_issue
-
-#####EXAMPLE:
-
- frappe@erpnext:~/frappe-bench$ bench run-tests --module "erpnext.stock.doctype.stock_entry.test_stock_entry"
- ...........................
- ----------------------------------------------------------------------
- Ran 27 tests in 30.549s
-
-
-#### 2.5. Example for profile:
-
- frappe@erpnext:~/frappe-bench$ bench run-tests --doctype "Activity Cost" --profile
- .
- ----------------------------------------------------------------------
- Ran 1 test in 0.010s
-
- OK
- 9133 function calls (8912 primitive calls) in 0.011 seconds
-
- Ordered by: cumulative time
-
- ncalls tottime percall cumtime percall filename:lineno(function)
- 2 0.000 0.000 0.008 0.004 /home/frappe/frappe-bench/apps/frappe/frappe/model/document.py:187(insert)
- 1 0.000 0.000 0.003 0.003 /home/frappe/frappe-bench/apps/frappe/frappe/model/document.py:386(_validate)
- 13 0.000 0.000 0.002 0.000 /home/frappe/frappe-bench/apps/frappe/frappe/database.py:77(sql)
- 255 0.000 0.000 0.002 0.000 /home/frappe/frappe-bench/apps/frappe/frappe/model/base_document.py:91(get)
- 12 0.000 0.000 0.002 0.000
-
-#### 2.6. Example for XUnit XML:
-
-##### How to run:
-
- bench run-tests --junit-xml-output=/reports/junit_test.xml
-
-##### Example of test report:
-
-
-
-
-
- details about failure
-
-
-
-It’s designed for the CI Jenkins, but will work for anything else that understands an XUnit-formatted XML representation of test results.
-
-#### Jenkins configuration support:
-1. You should install xUnit plugin - https://wiki.jenkins-ci.org/display/JENKINS/xUnit+Plugin
-2. After installation open Jenkins job configuration, click the box named “Publish JUnit test result report” under the "Post-build Actions" and enter path to XML report:
-(Example: _reports/*.xml_)
-
-## 3. Tests for a DocType
-
-### 3.1. Writing DocType Tests:
-
-1. Records that are used for testing are stored in a file `test_records.json` in the doctype folder. [For example see the Event Tests](https://github.com/frappe/frappe/blob/develop/frappe/core/doctype/event/test_records.json).
-1. Test cases are in a file named `test_[doctype].py`
-1. To provide the test records (and dependencies) call `test_records = frappe.get_test_records('Event')` in your test case file.
-
-#### Example (for `test_records.json`):
-
- [
- {
- "doctype": "Event",
- "subject":"_Test Event 1",
- "starts_on": "2014-01-01",
- "event_type": "Public"
- },
- {
- "doctype": "Event",
- "starts_on": "2014-01-01",
- "subject":"_Test Event 2",
- "event_type": "Private"
- },
- {
- "doctype": "Event",
- "starts_on": "2014-01-01",
- "subject":"_Test Event 3",
- "event_type": "Private",
- "event_individuals": [{
- "person": "test1@example.com"
- }]
- }
- ]
-
-
-#### Example (for `test_event.py`):
-
- # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
- # MIT License. See license.txt
-
- import frappe
- import frappe.defaults
- import unittest
-
- # load test records and dependencies
- test_records = frappe.get_test_records('Event')
-
- class TestEvent(unittest.TestCase):
- def tearDown(self):
- frappe.set_user("Administrator")
-
- def test_allowed_public(self):
- frappe.set_user("test1@example.com")
- doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 1"}))
- self.assertTrue(frappe.has_permission("Event", doc=doc))
-
- def test_not_allowed_private(self):
- frappe.set_user("test1@example.com")
- doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 2"}))
- self.assertFalse(frappe.has_permission("Event", doc=doc))
-
- def test_allowed_private_if_in_event_user(self):
- frappe.set_user("test1@example.com")
- doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 3"}))
- self.assertTrue(frappe.has_permission("Event", doc=doc))
-
- def test_event_list(self):
- frappe.set_user("test1@example.com")
- res = frappe.get_list("Event", filters=[["Event", "subject", "like", "_Test Event%"]], fields=["name", "subject"])
- self.assertEqual(len(res), 2)
- subjects = [r.subject for r in res]
- self.assertTrue("_Test Event 1" in subjects)
- self.assertTrue("_Test Event 3" in subjects)
- self.assertFalse("_Test Event 2" in subjects)
-
diff --git a/frappe/docs/user/zh/guides/basics/__init__.py b/frappe/docs/user/zh/guides/basics/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/basics/apps.md b/frappe/docs/user/zh/guides/basics/apps.md
deleted file mode 100755
index 5805ad38af..0000000000
--- a/frappe/docs/user/zh/guides/basics/apps.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Frappe Apps
-
-Frappe Apps are Python packages which use the Frappe platform. They can live
-anywhere on the [Python
-path](https://docs.python.org/2/tutorial/modules.html#the-module-search-path)
-and must have an entry in the `apps.txt` file.
-
-
-### Creating an app
-
-Frappe ships with a boiler plate for a new app. The command `bench make-app
-app-name` helps you start a new app by starting an interactive shell.
-
-
- % bench new-app sample_app
- App Name: sample_app
- App Title: Sample App
- App Description: This is a sample app.
- App Publisher: Acme Inc.
- App Icon: icon-linux
- App Color: #6DAFC9
- App Email: info@example.com
- App URL: http://example.com
- App License: MIT
-
-The above command would create an app with the following directory structure.
-
- sample_app
- ├── license.txt
- ├── MANIFEST.in
- ├── README.md
- ├── sample_app
- │ ├── __init__.py
- │ ├── sample_app
- │ │ └── __init__.py
- │ ├── config
- │ │ ├── desktop.py
- │ │ └── __init__.py
- │ ├── hooks.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── generators
- │ │ └── __init__.py
- │ ├── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- └── setup.py
-
-Here, "App Icon" is a font awesome class that you can select from
-[http://fortawesome.github.io/Font-Awesome/icons/](http://fortawesome.github.io/Font-Awesome/icons/).
-
-The boiler plate contains just enough files to show your app icon on the [Desk].
-
-### Files in the app
-
-#### `hooks.py`
-
-The `hooks.py` file defines the metadata of your app and integration points
-with other parts of Frappe or Frappe apps. Examples of such parts include task
-scheduling or listening to updates to different documents in the system. For
-now, it just contains the details you entered during app creation.
-
-
- app_name = "sample-app"
- app_title = "Sample App"
- app_publisher = "Acme Inc."
- app_description = "This is a sample app."
- app_icon = "fa-linux"
- app_color = "black"
- app_email = "info@example.com"
- app_url = "http://example.com"
- app_version = 0.0.1
-
-#### `modules.txt`
-
-Modules in Frappe help you organize Documents in Frappe and they are defined in
-the `modules.txt` file in your app. It is necessary for every [DocType] to be
-attached to a module. By default a module by the name of your app is added.
-Also, each module gets an icon on the [Desk]. For example, the [ERPNext] app is
-organized in the following modules.
-
- accounts
- buying
- home
- hr
- manufacturing
- projects
- selling
- setup
- stock
- support
- utilities
- contacts
-
-### Adding app to a site
-
-Once you have an app, whether it's the one you just created or any other you
-downloaded, you are required to do the following things.
-
-Download the app via git
-
- bench get-app https://github.com/org/app_name
-
-Install the app to your site
-
- bench --site site_name install-app app_name
-
diff --git a/frappe/docs/user/zh/guides/basics/frappe_ajax_call.md b/frappe/docs/user/zh/guides/basics/frappe_ajax_call.md
deleted file mode 100644
index 657cd3e7f2..0000000000
--- a/frappe/docs/user/zh/guides/basics/frappe_ajax_call.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# Frappe Ajax Call
-
-In Frappe Framework, you can manage ajax calls via frappe.call. The frappe.call works in asynchronous manner ie. send requests and handle response via callback mechanism.
-
-## frappe.call Structure
-
- frappe.call({
- type: opts.type || "POST",
- args: args,
- success: callback,
- error: opts.error,
- always: opts.always,
- btn: opts.btn,
- freeze: opts.freeze,
- freeze_message: opts.freeze_message,
- async: opts.async,
- url: opts.url || frappe.request.url,
- })
-
-#### Parameter description :
-- type: String parameter, http request type "GET", "POST", "PUT", "DELETE". Default set to "POST".
-- args: associative array, arguments that will pass with request.
-- success: Function parameter, code snippet, will after successful execution of request
-- error: Function parameter, code snippet, will execute after request failure
-- always: Function parameter, code snipper, will execute in either case
-- btn: Object parameter, triggering object
-- freeze: Boolean parameter, if set freeze the instance util it receives response
-- freeze_message: String parameter, message will populate to screen while screen is in freeze state.
-- async: Boolean parameter, default set to true. So each frappe.call is asynchronous. To make call synchronous set parameter value as false
-- url: String parameter, location from where hitting the request
-
-
-## How to use frappe.call ?
-
-### Calling standard API
- frappe.call({
- method: 'frappe.client.get_value',
- args: {
- 'doctype': 'Item',
- 'filters': {'name': item_code},
- 'fieldname': [
- 'item_name',
- 'web_long_description',
- 'description',
- 'image',
- 'thumbnail'
- ]
- },
- callback: function(r) {
- if (!r.exc) {
- // code snippet
- }
- }
- });
-
-- Param description:
- - doctype: name of doctype for which you want to pull information
- - filters: condition specifier
- - fieldname: you can specify fields in array that you want back in response
-
-### Calling whitelisted functions
-- Code client side
-
- frappe.call({
- method: "frappe.core.doctype.user.user.get_all_roles", //dotted path to server method
- callback: function(r) {
- // code snippet
- }
- })
-
-- Code at server side
-
- @frappe.whitelist()
- def get_all_roles():
- // business logic
- return value
-
-Note: While accessing any server side method via frappe.call(), you need to whitelist server side method using decorator `@frappe.whitelist`
diff --git a/frappe/docs/user/zh/guides/basics/hooks.md b/frappe/docs/user/zh/guides/basics/hooks.md
deleted file mode 100755
index c452307750..0000000000
--- a/frappe/docs/user/zh/guides/basics/hooks.md
+++ /dev/null
@@ -1,276 +0,0 @@
-# Hooks
-
-
-Hooks are the duct tape of the Frappe system. Hooks allow you to "hook" in to
-functionality and events of other parts of the Frappe system. Following are the
-official hooks from Frappe.
-
-### Application Name and Details
-
-1. `app_name` - slugified name with underscores e.g. "shopping\_cart"
-2. `app_title` - full title name e.g. "Frappe"
-3. `app_publisher`
-4. `app_description`
-5. `app_version`
-6. `app_icon` - font-awesome icon or image url
-7. `app_color` - hex colour background of the app icon
-
-### Install Events
-
-1. `before_install`
-2. `after_install`
-
-The above hooks are called before and after installation of the app they are in.
-For example, [ERPNext](/apps/erpnext)'s hooks contains a line,
-
- after_install = "erpnext.setup.install.after_install"
-
-So, the function after\_install is imported and called after ERPNext is installed.
-
-Note, the `before_install` and `after_install` hooks are called with no arguments.
-
-### Boot Session
-
-After a successful login, the Frappe JS Client requests for a resource called
-`bootinfo`. The `bootinfo` is available as a global in Javascript via
-`frappe.boot`. By default, the `bootinfo` contains
-
-* System defaults
-* Notification status
-* Permissions
-* List of icons on desktop
-* User settings
-* Language and timezone info
-
-If your app wants to modify bootinfo, it can declare a hook `boot_session`. The
-value is assumed to be a dotted path to a function and is called with one
-argument, bootinfo which it can modify and return.
-
-Eg,
-
- boot_session = "erpnext.startup.boot.boot_session"
-
-### Notification configurations
-
-The notification configuration hook is expected to return a Python dictionary.
-
- {
- "for_doctype": {
- "Issue": {"status":"Open"},
- "Customer Issue": {"status":"Open"},
- },
- "for_module_doctypes": {
- "ToDo": "To Do",
- "Event": "Calendar",
- "Comment": "Messages"
- },
- "for_module": {
- "To Do": "frappe.core.notifications.get_things_todo",
- "Calendar": "frappe.core.notifications.get_todays_events"
- }
- }
-
-
-The above configuration has three parts,
-
-1. `for_doctype` part of the above configuration marks any "Issue"
- or "Customer Issue" as unread if its status is Open
-2. `for_module_doctypes` maps doctypes to module's unread count.
-3. `for_module` maps modules to functions to obtain its unread count. The
- functions are called without any argument.
-
-### Javascript / CSS Assets
-
-The following hooks allow you to bundle built assets to your app for serving.
-There are two types of assets, app and web. The app assets are loaded in the
-Desk and web assets are loaded in the website.
-
-1. `app_include_js`
-2. `app_include_css`
-3. `web_include_js`
-4. `web_include_css`
-
-Eg,
-
- app_include_js = "assets/js/erpnext.min.js"
- web_include_js = "assets/js/erpnext-web.min.js"
-
-Note: to create an asset bundle (eg, assets/js/erpnext.min.js) the target file
-should be in build.json of your app.
-
-### Configuring Reports
-
-In the report view, you can force filters as per doctype using `dump_report_map`
-hook. The hook should be a dotted path to a Python function which will be called
-without any arguments. Example of output of this function is below.
-
-
- "Warehouse": {
- "columns": ["name"],
- "conditions": ["docstatus < 2"],
- "order_by": "name"
- }
-
-Here, for a report with Warehouse doctype, would include only those records that
-are not cancelled (docstatus < 2) and will be ordered by name.
-
-### Modifying Website Context
-
-Context used in website pages can be modified by adding
-a `update_website_context` hook. This hook should be a dotted path to a function
-which will be called with a context (dictionary) argument.
-
-### Customizing Email footer
-
-By default, for every email, a footer with content, "Sent via Frappe" is sent.
-You can customize this globally by adding a `mail_footer` hook. The hook should
-be a dotted path to a variable.
-
-### Session Creation Hook
-
-You can attach custom logic to the event of a successful login using
-`on_session_creation` hook. The hook should be a dotted path to a Python
-function that takes login\_manager as an argument.
-
-Eg,
-
- def on_session_creation(login_manager):
- """make feed"""
- if frappe.session['user'] != 'Guest':
- # log to timesheet
- pass
-
-### Website Clear Cache
-
-If you cache values in your views, the `website_clear_cache` allows you to hook
-methods that invalidate your caches when Frappe tries to clear cache for all
-website related pages.
-
-### Document hooks
-
-#### Permissions
-
-#### Query Permissions
-You can customize how permissions are resolved for a DocType by hooking custom
-permission match conditions using the `permission_query_conditions` hook. This
-match condition is expected to be fragment for a where clause in an sql query.
-Structure for this hook is as follows.
-
-
- permission_query_conditions = {
- "{doctype}": "{dotted.path.to.function}",
- }
-
-The output of the function should be a string with a match condition.
-Example of such a function,
-
-
- def get_permission_query_conditions():
- return "(tabevent.event_type='public' or tabevent.owner='{user}'".format(user=frappe.session.user)
-
-The above function returns a fragment that permits an event to listed if it's
-public or owned by the current user.
-
-#### Document permissions
-You can hook to `doc.has_permission` for any DocType and add special permission
-checking logic using the `has_permission` hook. Structure for this hook is,
-
- has_permission = {
- "{doctype}": "{dotted.path.to.function}",
- }
-
-The function will be passed the concerned document as an argument. It should
-True or a falsy value after running the required logic.
-
-For Example,
-
- def has_permission(doc):
- if doc.event_type=="Public" or doc.owner==frappe.session.user:
- return True
-
-The above function permits an event if it's public or owned by the current user.
-
-#### CRUD Events
-
-You can hook to various CRUD events of any doctype, the syntax for such a hook
-is as follows,
-
- doc_events = {
- "{doctype}": {
- "{event}": "{dotted.path.to.function}",
- }
- }
-
-To hook to events of all doctypes, you can use the follwing syntax also,
-
- doc_events = {
- "*": {
- "on_update": "{dotted.path.to.function}",
- }
- }
-
-The hook function will be passed the doc in concern as the only argument.
-
-##### List of events
-
-* `validate`
-* `before_save`
-* `autoname`
-* `after_save`
-* `before_insert`
-* `after_insert`
-* `before_submit`
-* `before_cancel`
-* `before_update_after_submit`
-* `on_update`
-* `on_submit`
-* `on_cancel`
-* `on_update_after_submit`
-* `on_change`
-* `on_trash`
-* `after_delete`
-
-
-Eg,
-
- doc_events = {
- "Cab Request": {
- "after_insert": topcab.schedule_cab",
- }
- }
-
-### Scheduler Hooks
-
-Scheduler hooks are methods that are run periodically in background. Structure for such a hook is,
-
- scheduler_events = {
- "{event_name}": [
- "{dotted.path.to.function}"
- ],
- }
-
-#### Events
-
-* `daily`
-* `daily_long`
-* `weekly`
-* `weekly_long`
-* `monthly`
-* `monthly_long`
-* `hourly`
-* `all`
-
-The scheduler events require celery, celerybeat and redis (or a supported and
-configured broker) to be running. The events with suffix '\_long' are for long
-jobs. The `all` event is triggered everytime (as per the celerybeat interval).
-
-Example,
-
- scheduler_events = {
- "{daily}": [
- "erpnext.accounts.doctype.sales_invoice.sales_invoice.manage_recurring_invoices"
- ],
- "{daily_long}": [
- "erpnext.setup.doctype.backup_manager.backup_manager.take_backups_daily"
- ],
- }
diff --git a/frappe/docs/user/zh/guides/basics/index.md b/frappe/docs/user/zh/guides/basics/index.md
deleted file mode 100755
index 645bed29a7..0000000000
--- a/frappe/docs/user/zh/guides/basics/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Basics
-
-{index}
diff --git a/frappe/docs/user/zh/guides/basics/index.txt b/frappe/docs/user/zh/guides/basics/index.txt
deleted file mode 100755
index 47c5728f4b..0000000000
--- a/frappe/docs/user/zh/guides/basics/index.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-install
-apps
-sites
-site_config
-hooks
-translations
-writing-tests
-frappe_ajax_call
diff --git a/frappe/docs/user/zh/guides/basics/install.md b/frappe/docs/user/zh/guides/basics/install.md
deleted file mode 100755
index 3afa43a37c..0000000000
--- a/frappe/docs/user/zh/guides/basics/install.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Installing Frappe
-
-## Frappe bench
-
-The following steps help you setup an isolated environment (bench) to run and
-develop Frappe apps. A virtualenv is installed in the env directory. You can
-activate it by running `source ./env/bin/activate` or use execute using
-absolute/relative path (eg, `./env/bin/frappe`).
-
-For more info, see [Frappe Bench](https://github.com/frappe/bench/)
diff --git a/frappe/docs/user/zh/guides/basics/site_config.md b/frappe/docs/user/zh/guides/basics/site_config.md
deleted file mode 100755
index cf56db9e9a..0000000000
--- a/frappe/docs/user/zh/guides/basics/site_config.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Site Config
-
-Settings for `sites/[site]/site_config.json`
-
-`site_config.json` stores global settings for a particular site and is present in the site directory. Here is a list of properties you can set in `site_config.json`.
-
-Example:
-
- {
- "db_name": "test_frappe",
- "db_password": "test_frappe",
- "admin_password": "admin",
- }
-
-### Mandatory Settings
-
-- `db_name`: Database Name.
-- `db_password`: Database password.
-- `encryption_key`: encryption_key for stored non user passwords.
-
-### Optional Settings
-
-- `admin_password`: Default Password for "Administrator".
-- `mute_emails`: Stops email sending if true.
-- `deny_multiple_logins`: Stop users from having more than one active session.
-- `root_password`: MariaDB root password.
-
-### Remote Database Host Settings
-- `db_host`: Database host if not `localhost`.
-
-To connect to a remote database server using ssl, you must first configure the database host to accept SSL connections. An example of how to do this is available at https://www.digitalocean.com/community/tutorials/how-to-configure-ssl-tls-for-mysql-on-ubuntu-16-04. After you do the configuration, set the following three options. All options must be set for Frappe to attempt to connect using SSL.
-- `db_ssl_ca`: Full path to the ca.pem file used for connecting to a database host using ssl. Example value is `"/etc/mysql/ssl/ca.pem"`.
-- `db_ssl_cert`: Full path to the cert.pem file used for connecting to a database host using ssl. Example value is `"/etc/mysql/ssl/client-cert.pem"`.
-- `db_ssl_key`: Full path to the key.pem file used for connecting to a database host using ssl. Example value is `"/etc/mysql/ssl/client-key.pem"`.
-
-### Default Outgoing Email Settings
-
-- `mail_server`: SMTP server hostname.
-- `mail_port`: STMP port.
-- `use_ssl`: Connect via SSL / TLS.
-- `mail_login`: Login id for SMTP server.
-- `mail_password`: Password for SMTP server.
-
-### Developer Settings
-
-- `developer_mode`: If developer mode is set, DocType changes are automatically updated in files.
-- `disable_website_cache`: Don't cache website pages.
-- `logging`: writes logs if **1**, writes queries also if set to **2**.
-
-### Others
-
-- `robots_txt`: Path to robots.txt file to be rendered when going to frappe-site.com/robots.txt
diff --git a/frappe/docs/user/zh/guides/basics/sites.md b/frappe/docs/user/zh/guides/basics/sites.md
deleted file mode 100755
index 00b0007007..0000000000
--- a/frappe/docs/user/zh/guides/basics/sites.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Sites
-
-## Sites Directory
-
-Frappe is a multitenant platform and each tenant is called a site. Sites exist
-in a directory called `sites_dir`, assumed as the current working directory when
-running a frappe command or other services like Celery worker or a WSGI server.
-
-You can set `sites_dir` with an environment variable `SITES_DIR` or pass
-`--sites_dir` option to the frappe command.
-
-Apart from the sites, the `sites_dir` should contain the following.
-
-#### apps.txt
-
-`apps.txt` contain a list of Python packages to treat as Frappe apps. Every
-frappe app that you intend to use in you site should have an entry in this file.
-Also, they should be in the `PYTHONPATH`. For more information, refer
-[Frappe Apps](/help/apps).
-
-#### common\_site\_config.json
-
-`common_site_config.json` is an optional file. Configuration common to all sites
-can be put in this file.
-
-#### assets
-
-Assets contain files that are required to be served for the browser client.
-These generally include *.js, *.css, *.png files. This directory is auto
-generated using the `bench build` command.
-
-#### languages.txt
-
-`languages.txt` is an autogenerated file which maps every language to it's code.
-
-## Site
-
-A site is a directory in `sites_dir` which represents a tenant in Frappe Platform.
-
-
-### Directory Structure
-
- site
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- │ └── testfile.txt
- └── site_config.json
-
-* `locks` directory is used by the scheduler to synchronize various jobs using
-the [file locking concept](http://en.wikipedia.org/wiki/File_locking).
-
-* `private` directory contains files that require authentication to access.
-Presently, it is limited only to backups.
-
-* `public` directory contains files that can directly served. In the above
- example, `testfile.txt` can be accessed by the URL,
- http://site/files/testfile.txt
-
-* `site_config.json` contains site specific configuration
-
-### Site Config
-
-[See configuration options for `site_config.json`](/frappe/user/en/guides/basics/site_config)
-
-### Site Resolution
-
-While responding to an HTTP request, a site is automatically selected based on,
-
-* `Host` header in the HTTP request matches a site
-* `X-Frappe-Site-Name` header in the HTTP request matches a site
-
-It is also possible to force the development server to serve a specific site by
-starting it with the following command.
- `bench --site SITENAME serve`
-
-
-### Adding a new site
-
-`bench new-site SITENAME`
diff --git a/frappe/docs/user/zh/guides/basics/translations.md b/frappe/docs/user/zh/guides/basics/translations.md
deleted file mode 100755
index 86d630898f..0000000000
--- a/frappe/docs/user/zh/guides/basics/translations.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Translations
-
-
-
-
-This document shows how to translations are managed in ERPNext and how to add
-a new language or update translations of an existing language.
-
-### 1. Source
-
-Translatable text exists in 3 main sources:
-
- 1. Javascript Code Files (both framework and application)
- 2. Python Code Files
- 3. DocTypes (names, labels and select options)
-
-#### Strings in Code Files
-
-Strings in code files are annotated using the `_` (underscore) method
-
- 1. In Python it is the `frappe._` method. Example:
-
-`frappe._("String {0} must be translated".format(txt))`
-
- 2. In Javascript it is the `__` method. Example:
-
-`__("String {0} must be translated", [txt])`
-
-**Note:** If you find translatable strings are not properly annotated using the `_`
-method, you can add them in the code and rebuild the translations.
-
-### 2. How Translations Are Picked up During Execution
-
-Whenever a translation is called via the _ method, the entire translation
-dictionaries from all apps are built and stored in memcache.
-
-Based on the user preferences or request preferences, the appropriate
-translations are loaded at the time of request on the server side. Or if
-metadata (DocType) is queried, then the appropriate translations are appended
-when the DocType data is requested.
-
-The underscore `_` method will replace the strings based on the available
-translations loaded at the time.
-
-### 3. Adding New Translations
-
-1. To find untranslated strings, run `bench get-untranslated [lang] [path]`
-1. Add the translated strings in another file in the same order
-1. run `bench update-translations [lang] [path of untranslated strings] [path of translated strings]`
-
-### 4. Improving Translations:
-
-For updating translations, please go to the to [the translation portal](https://frappe.io/translator).
-
-If you want to do it directly via code:
-
-To improve an existing translation, just edit the master translation files in
-the `translations` of each app
-
-> Please contribute your translations back to ERPNext by sending us a Pull
-Request.
-
-### 5. Bootstrapping a New Language
-
-If you want to add a new language it is similar to adding new translations. You need to first export all the translations strings in one file, get them translated via Google Translate Tool or Bing Translate Tool and then import the translations into individual apps.
-
-**Step 1: Export to a file**
-
- $ bench get-untranslated [lang] [path]
-
-**Step 2: Translate**
-
-Create another file with updated translations (in the same order as the source file). For this you can use the [Google Translator Toolkit](https://translate.google.com/toolkit) or [Bing Translator](http://www.bing.com/translator/).
-
-**Step 3: Import your translations**
-
- $ bench update-translations [lang] [source path] [translated path]
-
-**Step 4: Update `languages.txt`**
-
-Add your language in `apps/languages.txt` and also `frappe/data/languages.txt` (fore new bench installs)
-
-**Step 5: Commit each app and push**
-
-A new file will be added to the `translations` folder in each app. You need to add that file and push to your repo. Then send us a pull-request.
-
----
-
diff --git a/frappe/docs/user/zh/guides/data/__init__.py b/frappe/docs/user/zh/guides/data/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/data/import-large-csv-file.md b/frappe/docs/user/zh/guides/data/import-large-csv-file.md
deleted file mode 100755
index 013d02ac92..0000000000
--- a/frappe/docs/user/zh/guides/data/import-large-csv-file.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Import Large Csv File
-
-To import very large CSV files, you can use the bench utility `import-csv`.
-
-The benefit is that this is not subject to timeouts if you use the web interface.
-
-Here is an example:
-
- bench --site test.erpnext.com import-csv ~/Downloads/Activity_Type.csv
-
-### Help
-
- $ bench import-csv --help
- Usage: bench import-csv [OPTIONS] PATH
-
- Import CSV using data import tool
-
- Options:
- --only-insert Do not overwrite existing records
- --submit-after-import Submit document after importing it
- --ignore-encoding-errors Ignore encoding errors while coverting to unicode
- --help Show this message and exit.
-
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/data/index.md b/frappe/docs/user/zh/guides/data/index.md
deleted file mode 100755
index e6f341b236..0000000000
--- a/frappe/docs/user/zh/guides/data/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Data Management
-
-{index}
diff --git a/frappe/docs/user/zh/guides/data/index.txt b/frappe/docs/user/zh/guides/data/index.txt
deleted file mode 100755
index 620bafa4e3..0000000000
--- a/frappe/docs/user/zh/guides/data/index.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-import-large-csv-file
-using-data-migration-tool
diff --git a/frappe/docs/user/zh/guides/data/using-data-migration-tool.md b/frappe/docs/user/zh/guides/data/using-data-migration-tool.md
deleted file mode 100644
index ca6285031e..0000000000
--- a/frappe/docs/user/zh/guides/data/using-data-migration-tool.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# Using the Data Migration Tool
-
-> Data Migration Tool was introduced in Frappe Framework version 9.
-
-The Data Migration Tool was built to abstract all the syncing of data between a remote source and a DocType. This is a middleware layer between your Frappe based website and a remote data source.
-
-To understand this tool, let's make a connector to push ERPNext Items to an imaginary service called Atlas.
-
-### Data Migration Plan
-A Data Migration Plan encapsulates a set of mappings.
-
-Let's make a new *Data Migration Plan*. Set the plan name as 'Atlas Sync'. We also need to add mappings in the mappings child table.
-
-
-
-
-### Data Migration Mapping
-A Data Migration Mapping is a set of rules that specify field-to-field mapping.
-
-Make a new *Data Migration Mapping*. Call it 'Item to Atlas Item'.
-
-To define a mapping, we need to put in some values that define the structure of local and remote data.
-
-1. Remote Objectname: A name that identifies the remote object e.g Atlas Item
-1. Remote primary key: This is the name of the primary key for Atlas Item e.g id
-1. Local DocType: The DocType which will be used for syncing e.g Item
-1. Mapping Type: A Mapping can be of type 'Push' or 'Pull', depending on whether the data is to be mapped remotely or locally. It can also be 'Sync', which will perform both push and pull operations in a single cycle.
-1. Page Length: This defines the batch size of the sync.
-
-
-
-#### Specifying field mappings:
-
-The most basic form of a field mapping would be to specify fieldnames of the remote and local object. However, if the mapping is one-way (push or pull), the source field name can also take literal values in quotes (for e.g `"GadgetTech"`) and eval statements (for e.g `"eval:frappe.db.get_value('Company', 'Gadget Tech', 'default_currency')"`). For example, in the case of a push mapping, the local fieldname can be set to a string in quotes or an `eval` expression, instead of a field name from the local doctype. (This is not possible with a sync mapping, where both local and remote fieldnames serve as a target destination at a some point, and thus cannot be a literal value).
-
-Let's add the field mappings and save:
-
-
-
-We can now add the 'Item to Atlas Item' mapping to our Data Migration Plan and save it.
-
-
-
-#### Additional layer of control with pre and post process:
-
-Migrating data frequently involves more steps in addition to one-to-one mapping. For a Data Migration Mapping that is added to a Plan, a mapping module is generated in the module specified in that plan.
-
-In our case, an `item_to_atlas_item` module is created under the `data_migration_mapping` directory in `Integrations` (module for the 'Atlas Sync' plan).
-
-
-
-You can implement the `pre_process` (receives the source doc) and `post_process` (receives both source and target docs, as well as any additional arguments) methods, to extend the mapping process. Here's what some operations could look like:
-
-
-
-### Data Migration Connector
-Now, to connect to the remote source, we need to create a *Data Migration Connector*.
-
-
-
-We only have two connector types right now, let's add another Connector Type in the Data Migration Connector DocType.
-
-
-
-Now, let's create a new Data Migration Connector.
-
-
-
-As you can see we chose the Connector Type as Atlas. We also added the hostname, username and password for our Atlas instance so that we can authenticate.
-
-Now, we need to write the code for our connector so that we can actually push data.
-
-Create a new file called `atlas_connection.py` in `frappe/data_migration/doctype/data_migration_connector/connectors/` directory. Other connectors also live here.
-
-We just have to implement the `insert`, `update` and `delete` methods for our atlas connector. We also need to write the code to connect to our Atlas instance in the `__init__` method. Just see `frappe_connection.py` for reference.
-
-
-
-After creating the Atlas Connector, we also need to import it into `data_migration_connector.py`
-
-
-
-### Data Migration Run
-Now that we have our connector, the last thing to do is to create a new *Data Migration Run*.
-
-A Data Migration Run takes a Data Migration Plan and Data Migration Connector and execute the plan according to our configuration. It takes care of queueing, batching, delta updates and more.
-
-
-
-Just click Run. It will now push our Items to the remote Atlas instance and you can see the progress which updates in realtime.
-
-After a run is executed successfully, you cannot run it again. You will have to create another run and execute it.
-
-Data Migration Run will try to be as efficient as possible, so the next time you execute it, it will only push those items which were changed or failed in the last run.
-
-
-> Note: Data Migration Tool is still in beta. If you find any issues please report them [here](https://github.com/frappe/erpnext/issues)
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/deployment/__init__.py b/frappe/docs/user/zh/guides/deployment/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/deployment/email-notifications-for-failed-background-jobs.md b/frappe/docs/user/zh/guides/deployment/email-notifications-for-failed-background-jobs.md
deleted file mode 100755
index cd9f18e1e1..0000000000
--- a/frappe/docs/user/zh/guides/deployment/email-notifications-for-failed-background-jobs.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Email Notifications For Failed Background Jobs
-
-
-
-Frappe handles failure of jobs in the following way,
1) If a job fails, (raises exception), it's logged in Scheduler Log and logs/worker.error.log.
2) Keeps a lock file and would not run anymore if lock file is there.
3) Raises LockTimeoutError in case the lock file is more than 10 minutes old.
-
-You can configure email notification for scheduler errors. By writing a file, sites/common_site_config.json with content
-
-{
- "celery_error_emails": {
- "ADMINS": [
- [
- "Person 1",
- "person1@example.com"
- ],
- [
- "Person2 ",
- "person2@example.com"
- ]
- ],
- "SERVER_EMAIL": "exceptions@example.com"
- }
-}
-
-One limitation is that it'll use local mailserver on port 25 to send the emails.
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/deployment/how-to-enable-social-logins.md b/frappe/docs/user/zh/guides/deployment/how-to-enable-social-logins.md
deleted file mode 100755
index 26d3de446a..0000000000
--- a/frappe/docs/user/zh/guides/deployment/how-to-enable-social-logins.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# How To Enable Social Logins
-
-Use Facebook, Google or GitHub authentication to login to Frappe, and your users will be spared from remembering another password.
-
-The system uses the **Email Address** supplied by these services to **match with an existing user** in Frappe. If no such user is found, **a new user is created** of the default type **Website User**, if Signup is not disabled in Website Settings. Any System Manager can later change the user type from **Website User** to **System User**, so that the user can access the Desktop.
-
-#### Login screen with Social Logins enabled
-
-
-To enable these signups, you need to have **Client ID** and **Client Secret** from these authentication services for your Frappe site. The Client ID and Client Secret are to be set in Website > Setup > Social Login Keys. Here are the steps to obtain these credentials.
-
-> Use **https://{{ yoursite }}** if your site is HTTPS enabled.
-
----
-
-### Facebook
-
-1. Go to [https://developers.facebook.com](https://developers.facebook.com)
-1. Click on Apps (topbar) > New App, fill in the form.
-1. Go to Settings > Basic, set the **Contact Email** and save the changes.
-1. Go to Settings > Advanced, find the field **Valid OAuth redirect URIs**, and enter:
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_facebook**
-1. Save the changes in Advance tab.
-1. Go to Status & Review and switch on "Do you want to make this app and all its live features available to the general public?"
-1. Go to Dashboard, click on the show button besides App Secret, and copy the App ID and App Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
----
-
-### Google
-
-1. Go to [https://console.developers.google.com](https://console.developers.google.com)
-1. Create a new Project and fill in the form.
-1. Click on APIs & Auth > Credentials > Create new Client ID
-1. Fill the form with:
- - Web Application
- - Authorized JavaScript origins as **http://{{ yoursite }}**
- - Authorized redirect URI as
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_google**
-1. Go to the section **Client ID for web application** and copy the Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
----
-
-### GitHub
-
-1. Go to [https://github.com/settings/applications](https://github.com/settings/applications)
-1. Click on **Register new application**
-1. Fill the form with:
- - Homepage URL as **http://{{ yoursite }}**
- - Authorization callback URL as
- **http://{{ yoursite }}/api/method/frappe.www.login.login\_via\_github**
-1. Click on Register application.
-1. Copy the generated Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys**
-
-
-
-
diff --git a/frappe/docs/user/zh/guides/deployment/how-to-migrate-doctype-changes-to-production.md b/frappe/docs/user/zh/guides/deployment/how-to-migrate-doctype-changes-to-production.md
deleted file mode 100755
index 4bf2ab9351..0000000000
--- a/frappe/docs/user/zh/guides/deployment/how-to-migrate-doctype-changes-to-production.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# How To Migrate Doctype Changes To Production
-
-#### 1. DocType / Schema Changes
-
-If you are in `developer_mode`, the `.json` files for each **DocType** are automatically updated.
-
-When you update in your production using `--latest` or `bench update`, these changes are updated in the site's schema too!
-
-#### 2. Permissions
-
-Permissions do not get updated because the user may have changed them. To update permissions, you can add a new patch in the `patches.txt` of your app.
-
- execute:frappe.permissions.reset_perms("[docype]")
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/deployment/index.md b/frappe/docs/user/zh/guides/deployment/index.md
deleted file mode 100755
index 9487bbf803..0000000000
--- a/frappe/docs/user/zh/guides/deployment/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Deployment
-
-Deploying your apps on remote servers
-
-{index}
diff --git a/frappe/docs/user/zh/guides/deployment/index.txt b/frappe/docs/user/zh/guides/deployment/index.txt
deleted file mode 100755
index 7d11bf514a..0000000000
--- a/frappe/docs/user/zh/guides/deployment/index.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-migrations
-how-to-migrate-doctype-changes-to-production
-email-notifications-for-failed-background-jobs
-how-to-enable-social-logins
diff --git a/frappe/docs/user/zh/guides/deployment/migrations.md b/frappe/docs/user/zh/guides/deployment/migrations.md
deleted file mode 100755
index c40a2a7c4b..0000000000
--- a/frappe/docs/user/zh/guides/deployment/migrations.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Migrations
-
-A project often undergoes changes related to database schema during course of
-its life. It may also be required patch existing data. Frappe bundles tools to
-handle these schenarios.
-
-When you pull updates from any Frappe app (including Frappe), you should run
-`bench migrate` to apply schema changes and data migrations if any.
-
-## Schema changes
-
-You can edit a DocType to add, remove or change fields. On saving a DocType,
-a JSON file containing the DocType data is added to source tree of your app.
-When you add an app to a site, the DocTypes are installed using this JSON file.
-For making schema changes, it's required to set `developer_mode` in the
-configuration.
-
-On running a sync (`bench migrate`), doctypes in the system are synced to
-their latest version from the JSON files in the app.
-
-Note: Fields are soft deleted ie. the columns are not removed from the database
-table and however, they will not be visible in the documents. This is done to
-avoid any potential data loss situations and to allow you write related data
-migrations which might need values from deleted fields.
-
-Note: Frappe doesn't support reverse schema migrations.
-
-## Data Migrations
-
-On introducing data related changes, you might want to run one off scripts to
-change existing data to match expectations as per new code.
-
-To add a data migration to your code, you will have to write an `execute`
-function to a python module and add it to `patches.txt` of your app.
-
-It is recommended to make a file with a patch number and name in its path and
-add it to a patches package (directory) in your app. You can then add a line
-with dotted path to the patch module to `patches.txt`.
-
-The directory structure followed in Frappe is as below
-
-
- frappe
- └── patches
- └── 4_0
- └── my_awesome_patch.py
-
-The patch can be added to `patches.txt` by adding a line like
-
- frappe.patches.4_0.my_awesome_patch
-
-The metadata ie. DocType available in the execute function will be the latest as
-per JSON files in the apps. However, you will not be able to access metadata of
-any previous states of the system.
-
-#### One off Python statements
-
-You can also add one off python statements in `patches.txt` using the syntax,
- execute:{python statement}
-
-For example,
- execute:frappe.get_doc("User", "Guest").save()
-
-Note: All lines in patches.txt have to be unique. If you want to run a line
-twice, you can make it unique by adding a distinct comment.
-
-For Example,
-
- execute:frappe.installer.make_site_dirs() #2014-02-19
diff --git a/frappe/docs/user/zh/guides/desk/__init__.py b/frappe/docs/user/zh/guides/desk/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/desk/formatter_for_link_fields.md b/frappe/docs/user/zh/guides/desk/formatter_for_link_fields.md
deleted file mode 100644
index 586477f32e..0000000000
--- a/frappe/docs/user/zh/guides/desk/formatter_for_link_fields.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Formatter For Link Fields
-
-In case where a code and a name is maintained for an entity, (for example for Employee there may be an Employee Code and Employee Name) and we want to show both the ID and name in a link field, we can make a formatter.
-
-#### Example:
-
- frappe.form.link_formatters['Employee'] = function(value, doc) {
- if(doc.employee_name && doc.employee_name !== value) {
- return value + ': ' + doc.employee_name;
- } else {
- return value;
- }
- }
-
-Notes:
-
-1. Both the primary key (`name) and the descriptive name (e.g. `employee_name`) must be present in the document. The descriptive name field could be hidden
-1. This needs to be loaded before the document is loaded and can be re-used for all forms. You can also add it in `build.json`
-
diff --git a/frappe/docs/user/zh/guides/desk/index.md b/frappe/docs/user/zh/guides/desk/index.md
deleted file mode 100755
index c32fa85913..0000000000
--- a/frappe/docs/user/zh/guides/desk/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Desk Customization
-
-Articles related to customization of Frappe Desk
-
-{index}
diff --git a/frappe/docs/user/zh/guides/desk/making_charts.md b/frappe/docs/user/zh/guides/desk/making_charts.md
deleted file mode 100644
index d73ebdc903..0000000000
--- a/frappe/docs/user/zh/guides/desk/making_charts.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Making Charts
-
-[**Frappe Charts**](https://frappe.github.io/charts/) enables you to render simple line, bar or percentage graphs for single or multiple discreet sets of data points. You can also set special checkpoint values and summary stats. Check out the docs at https://frappe.github.io/charts/ to learn more.
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/index.md b/frappe/docs/user/zh/guides/index.md
deleted file mode 100755
index 9eeed8baa8..0000000000
--- a/frappe/docs/user/zh/guides/index.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Guides
-
-The Frappe Framework is a server side and client side framework and is built with the philosophy make it a "battries included" framework. It has libraries and API for everything from authentication to reports.
-
-In this section we will try and cover the most commonly used API on client and server side that will be useful for app development.
-
-{index}
diff --git a/frappe/docs/user/zh/guides/index.txt b/frappe/docs/user/zh/guides/index.txt
deleted file mode 100755
index d47785065a..0000000000
--- a/frappe/docs/user/zh/guides/index.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-basics
-app-development
-deployment
-reports-and-printing
-portal-development
-data
-integration
diff --git a/frappe/docs/user/zh/guides/integration/__init__.py b/frappe/docs/user/zh/guides/integration/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/integration/google_gsuite.md b/frappe/docs/user/zh/guides/integration/google_gsuite.md
deleted file mode 100644
index d44773c271..0000000000
--- a/frappe/docs/user/zh/guides/integration/google_gsuite.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# Google GSuite
-
-Frappe allows you to use Google's Gsuite documents as templates, generate from them a new Gsuite document that will be placed in a chosen folder. Variables can populated in both the body and the name of the Gsuite document using the standard Jinja2 format. Once generated, the Gsuite document will remain associate to the DocType as an attachment.
-
-The Gsuite document is generated by invoking the "attach file" function of any DocType.
-
-A common use cases of this features is populating contracts from customer/employee/supplier data.
-
-## 1. Enable integration with Google Gsuite
-
-### 1.1 Publish Google apps script
-
-*If you will use the default script you can go to 1.2*
-
-1. Go to [https://script.google.com](https://script.google.com)
-1. Create a new Project. Click on **File > New > Project**
-1. Copy the code of **Desk > Explore > Integrations > GSuite Settings > Google Apps Script** to clipboard and paste to an empty Code.gs in script.google.com
-1. Save the Project. Click on **File > Save > Enter new project name**
-1. Deploy the app. Click on **Publish > Deploy as web app**
-1. Copy "Current web app URL" into **Desk > Explore > Integrations > GSuite Settings > Script URL**
-1. Click on OK but don't close the script
-
-### 1.2
-
-### 1.2 Get Google access
-
-1. Go to your Google project console and select your project or create a new one. [https://console.developers.google.com](https://console.developers.google.com)
-1. In Library click on **Google Drive API** and **Enable**
-1. Click on **Credentials > Create Credentials > OAuth Client ID**
-1. Fill the form with:
- - Web Application
- - Authorized redirect URI as `http://{{ yoursite }}/?cmd=frappe.integrations.doctype.gsuite_settings.gsuite_settings.gsuite_callback`
-1. Copy the Client ID and Client Secret into **Desk > Explore > Integrations > GSuite Settings > Client ID and Client Secret**
-1. Save GSuite Settings
-
-### 1.3 Test Script
-
-1. Click on **Allow GSuite Access** and you will be redirected to select the user and give access. If you have any error please verify you are using the correct Authorized Redirect URI.
- You can find the complete URI Gsuite redirected to in the final part of the URL of the error page. Check that the protocol `http://` or `https://` matches the one your using.
-1. Click on **Run Script test**. You should be asked to give permission.
-
-## 2. GSuite Templates
-
-### 2.1 Google Document as Template
-
-1. Create a new Document or use one you already have. Set variables as you need. Variables are defined with `{{VARIABLE}}` with ***VARIABLE*** is the field of your Doctype
-
- For Example,
- If this document will be used to employee and the Doctype has the field ***name*** then you can use it in Google Docs ad `{{name}}`
-
-1. Get the ID of that Document from url of your document.
- For example: in this document url `https://docs.google.com/document/d/1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso/edit` the document ID is `1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso`
-
-1. Get the ID of the folder where you want to place the generated documents. (You can step this point if you want to place the generated documents in Google Drive root. )
-
- For example: in this folder url `https://drive.google.com/drive/u/0/folders/0BxmFzZZUHbgyQzVJNzY5eG5jbmc` the folder ID is `0BxmFzZZUHbgyQzVJNzY5eG5jbmc`
-
-### 2.2 Associate the Template to a Doctype
-
-1. Go to **Desk > Explore > Integrations > GSuite Templates > New**
-2. Fill the form with:
- - Template Name (Example: `Employee Contract`)
- - Related DocType (Example: `Employee`)
- - Template ID is the Document ID you get from your Google Docs (Example: `1Y2_btbwSqPIILLcJstHnSm1u5dgYE0QJspcZBImZQso`)
- - Document name is the name of the new files. You can use field from DocType (Example: `Employee Contract of {name}`)
- - Destination ID is the folder ID of your files created from this Template. (Example: `0BxmFzZZUHbgyQzVJNzY5eG5jbmc`)
-
-## 3. Create Documents
-
-1. Go to a Document you already have a Template for (Example: Employee > John Doe)
-2. Click on **Attach File**
-3. On **GSuite Document** section select the Template and click **Attach**
-4. You should see the generated document is already created and attached
-5. Clicking on the attached document will open it inside Gsuite
diff --git a/frappe/docs/user/zh/guides/integration/how_to_setup_oauth.md b/frappe/docs/user/zh/guides/integration/how_to_setup_oauth.md
deleted file mode 100644
index 27f9746eae..0000000000
--- a/frappe/docs/user/zh/guides/integration/how_to_setup_oauth.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# How to setup oauth?
-
-OAuth 2.0 provider based on oauthlib is built into frappe. Third party apps can now access resources of users based on Frappe Role and User permission system. To setup an app to access
-
-## OAuth defines four roles
-
-#### resource owner
-An entity capable of granting access to a protected resource. When the resource owner is a person, it is referred to as an end-user.
-
-#### resource server
-The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens.
-
-#### client
-An application making protected resource requests on behalf of the resource owner and with its authorization. The term "client" does not imply any particular implementation characteristics (e.g.,
-whether the application executes on a server, a desktop, or other devices).
-
-#### authorization server
-The server issuing access tokens to the client after successfully authenticating the resource owner and obtaining authorization.
-
-## Setup OAuth Provider
-
-System Managers can setup behavior of confirmation message as `Force` or `Auto` in OAuth Provider Settings.
-If Force is selected the system will always ask for user's confirmation. If Auto is selected system asks for the confirmation only if there are no active tokens for the user.
-
-Go to
-
-> Setup > Integrations > OAuth Provider Settings
-
-
-
-### Add Primary Server
-
-This is the main server hosting all the users. e.g. `https://frappe.io`. To setup this as the main server, go to *Setup* > *Integrations* > *Social Login Keys* and enter `https://frappe.io` in the field `Frappe Server URL`. This URL repeats in all other Frappe servers who connect to this server to authenticate. Effectively, this is the main Identity Provider (IDP).
-
-Under this server add as many `OAuth Client`(s) as required.
-
-## Add a Client App
-
-As a System Manager go to
-
-> Setup > Integrations > OAuth Client
-
-
-
-To add a client fill in the following details
-
-1. **App Name** : Enter App Name e.g. CAVS
-2. **Skip Authorization** : If this is checked, during authentication there won't be me any confirmation message
-3. **Scopes** : List of scopes shown to user along with confirmation message. scopes are separated by semicolon ';'
-4. **Redirect URIs** : List of Redirect URIs separated by semicolon ';'
-5. **Default Redirect URIs** : Default Redirect URI from list of Redirect URIs
-6. **Grant Type**: select `Authorization Code`
-7. **Response Type**: select `Code`
diff --git a/frappe/docs/user/zh/guides/integration/index.md b/frappe/docs/user/zh/guides/integration/index.md
deleted file mode 100755
index b97815866a..0000000000
--- a/frappe/docs/user/zh/guides/integration/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Integrations
-
-{index}
diff --git a/frappe/docs/user/zh/guides/integration/index.txt b/frappe/docs/user/zh/guides/integration/index.txt
deleted file mode 100755
index a2c88ed7d3..0000000000
--- a/frappe/docs/user/zh/guides/integration/index.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-rest_api
-how_to_setup_oauth
-using_oauth
-openid_connect_and_frappe_social_login
-google_gsuite
diff --git a/frappe/docs/user/zh/guides/integration/openid_connect_and_frappe_social_login.md b/frappe/docs/user/zh/guides/integration/openid_connect_and_frappe_social_login.md
deleted file mode 100644
index 75f9086ee9..0000000000
--- a/frappe/docs/user/zh/guides/integration/openid_connect_and_frappe_social_login.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# OpenID Connect and Frappe social login
-
-## OpenID Connect
-
-Frappe also uses Open ID connect essential standard for authenticating users. To get `id_token` with `access_token`, pass `openid` as the value for the scope parameter during authorization request.
-
-If the scope is `openid` the JSON response with `access_token` will also include a JSON Web Token (`id_token`) signed with `HS256` and `Client Secret`. The decoded `id_token` includes the `at_hash`.
-
-Example Bearer Token with scope `openid`
-
-```
-{
- "token_type": "Bearer",
- "id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJpc3MiOiJodHRwczovL21udGVjaG5pcXVlLmNvbSIsImF0X2hhc2giOiJOQlFXbExJUy1lQ1BXd1d4Y0EwaVpnIiwiYXVkIjoiYjg3NzJhZWQ1YyIsImV4cCI6MTQ3Nzk1NTYzMywic3ViIjoiNWFjNDE2NThkZjFiZTE1MjI4M2QxYTk0YjhmYzcwNDIifQ.1GRvhk5wNoR4GWoeQfleEDgtLS5nvj9nsO4xd8QE-Uk",
- "access_token": "ZJD04ldyyvjuAngjgBrgHwxcOig4vW",
- "scope": "openid",
- "expires_in": 3600,
- "refresh_token": "2pBTDTGhjzs2EWRkcNV1N67yw0nizS"
-}
-```
-
-## Frappe social login setup
-
-In this example there are 2 servers,
-
-### Primary Server
-This is the main server hosting all the users. e.g. `https://frappe.io`. To setup this as the main server, go to *Setup* > *Integrations* > *Social Login Keys* and enter `https://frappe.io` in the field `Frappe Server URL`. This URL repeats in all other Frappe servers who connect to this server to authenticate. Effectively, this is the main Identity Provider (IDP).
-
-Under this server add as many `OAuth Client`(s) as required. Because we are setting up one app server, add only one `OAuth Client`
-
-### Frappe App Server
-This is the client connecting to the IDP. Go to *Setup* > *Integrations* > *Social Login Keys* on this server and add appropriate values to `Frappe Client ID` and `Frappe Client Secret` (refer to client added in primary server). As mentioned before keep the `Frappe Server URL` as `https://frappe.io`
-
-Now you will see Frappe icon on the login page. Click on this icon to login with account created in primary server (IDP) `https://frappe.io`
-
-**Note**: If `Skip Authorization` is checked while registering a client, page to allow or deny the granting access to resource is not shown. This can be used if the apps are internal to one organization and seamless user experience is needed.
-
-## Steps
-
-### Part 1 : on Frappe Identity Provider (IDP)
-
-Login to IDP
-
-
-Add OAuth Client on IDP
-
-
-Set Server URL on IDP
-
-
-### Part 2 : on Frappe App Server
-
-Set `Frappe Client ID` and `Frappe Client Secret` on App server (refer the client set on IDP)
-
-
-**Note**: Frappe Server URL is the main server where identities from your organization are stored.
-
-Login Screen on App Server (login with frappe)
-
-
-### Part 3 : Redirected on IDP
-
-login with user on IDP
-
-
-Confirm Access on IDP
-
-
-### Part 4 : Back on App Server
-
-Logged in on app server with ID from IDP
-
diff --git a/frappe/docs/user/zh/guides/integration/rest_api.md b/frappe/docs/user/zh/guides/integration/rest_api.md
deleted file mode 100755
index 1f78b19990..0000000000
--- a/frappe/docs/user/zh/guides/integration/rest_api.md
+++ /dev/null
@@ -1,285 +0,0 @@
-# REST API
-
-Frappe ships with an HTTP API. There are two parts of this API.
-
-1. Remote Procedure Calls (RPC)
-2. REST
-
-## 1. RPC
-
-A request to an endpoint `/api/method/{dotted.path.to.function}` will call
-a whitelisted python function. A function can be whitelisted using the
-`frappe.whitelist` decorator.
-
-For example, Add the following to sample\_app/\_\_init\_\_.py
-
- @frappe.whitelist(allow_guest=True)
- def ping():
- return 'pong'
-
-GET http://frappe.local:8000**/api/method/sample_app.ping**
-
-_Response:_
-
- {
- "message": "pong"
- }
-
-
-## 2. REST
-
-All documents in Frappe are available via a RESTful API with prefix
-`/api/resource/`.
-
-### Login
-
-To login, you will have to send a POST request to the login method.
-
-POST http://frappe.local:8000**/api/method/login**
-
- usr=Administrator&pwd=admin
-
-_Response:_
-
- {
- "full_name": "Administrator",
- "message": "Logged In"
- }
-
-
-Try to make an authenticated request
-
-GET http://frappe.local:8000**/api/method/frappe.auth.get\_logged\_user**
-
-_Response:_
-
- {
- "message": "Administrator"
- }
-
-
-### Listing Documents
-
-To list documents, the URL endpoint is `/api/resource/{doctype}` and the
-expected HTTP verb is GET.
-
-Response is returned as JSON Object and the listing is an array in with the key `data`.
-
-GET http://frappe.local:8000**/api/resource/Person**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "000000012"
- },
- {
- "name": "000000008"
- }
- ]
- }
-
-
-#### Fields
-
-By default, only name field is included in the listing, to add more fields, you
-can pass the fields param to GET request. The param has to be a JSON array.
-
-GET http://frappe.local:8000**/api/resource/Person/?fields=["name", "first\_name"]**
-
-_Response:_
-
- {
- "data": [
- {
- "first_name": "Jane",
- "name": "000000012"
- },
- {
- "first_name": "John",
- "name": "000000008"
- }
- ]
- }
-
-
-#### Filters
-
-You can filter the listing using sql conditions by passing them as the `filters`
-GET param. Each condition is an array of the format, [{doctype}, {field},
-{operator}, {operand}].
-
-Eg, to filter persons with name Jane, pass a param `filters=[["Person", "first_name", "=", "Jane"]]`
-
-GET http://frappe.local:8000**/api/resource/Person/**
-
-_Response:_
- {
- "data": [
- {
- "name": "000000012"
- }
- ]
- }
-
-
-#### Pagination
-
-All listings are returned paginated by 20 items. To change the page size, you
-can pass `limit_page_length`. To request succesive pages, pass `limit_start` as
-per your `limit_page_length`.
-
-For Example, to request second page, pass `limit_start` as 20.
-
-GET http://frappe.local:8000**/api/resource/DocType**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "testdoc"
- },
- {
- "name": "Person"
- },
-
- ......
-
- {
- "name": "Website Template"
- }
- ]
- }
-
-
-GET http://frappe.local:8000**/api/resource/DocType?limit_start=20**
-
-_Response:_
-
- {
- "data": [
- {
- "name": "Website Route"
- },
- {
- "name": "Version"
- },
- {
- "name": "Blog Post"
- },
-
- ......
-
- {
- "name": "Custom Field"
- }
- ]
- }
-
-
-### CRUD
-
-#### Create
-
-You can create a document by sending a `POST` request to the url, `/api/resource/{doctype}`.
-
-POST http://frappe.local:8000**/api/resource/Person**
-
-_Body_:
-
- data={"first_name": "Robert"}
-
-_Response:_
-
- {
- "data": {
- "first_name": "Robert",
- "last_name": null,
- "modified_by": "Administrator",
- "name": "000000051",
- "parent": null,
- "creation": "2014-05-04 17:22:38.037685",
- "modified": "2014-05-04 17:22:38.037685",
- "doctype": "Person",
- "idx": null,
- "parenttype": null,
- "owner": "Administrator",
- "docstatus": 0,
- "parentfield": null
- }
- }
-
-Note: `POST` requests are to be sent along with `X-Frappe-CSRF-Token:` header.
-
-#### Read
-
-You can get a document by its name using the url, `/api/resource/{doctype}/{name}`
-
-For Example,
-
-GET http://frappe.local:8000**/api/resource/Person/000000012**
-
-_Response:_
-
- {
- "data": {
- "first_name": "Jane",
- "last_name": "Doe",
- "modified_by": "Administrator",
- "name": "000000012",
- "parent": null,
- "creation": "2014-04-25 17:56:51.105372",
- "modified": "2014-04-25 17:56:51.105372",
- "doctype": "Person",
- "idx": null,
- "parenttype": null,
- "owner": "Administrator",
- "docstatus": 0,
- "parentfield": null
- }
- }
-
-### Update
-
-You can create a document by sending a `PUT` request to the url,
-`/api/resource/{doctype}`. This acts like a `PATCH` HTTP request in which you do
-not have to send the whole document but only the parts you want to change.
-
-For Example,
-
-PUT http://frappe.local:8000**/api/resource/Person/000000008**
-
-_Body:_
-
- data={"last_name": "Watson"}
-
-_Response:_
-
- {
- "data": {
- "first_name": "John ",
- "last_name": "Watson",
- "modified_by": "Administrator",
- "name": "000000008",
- "creation": "2014-04-25 17:26:22.728327",
- "modified": "2014-05-04 18:21:45.385995",
- "doctype": "Person",
- "owner": "Administrator",
- "docstatus": 0
- }
- }
-
-### Delete
-
-You can delete a document by its name by sending a `DELETE` request to the url,
-`/api/resource/{doctype}/{name}`.
-
-For Example,
-
-DELETE http://frappe.local:8000**/api/resource/Person/000000008**
-
-_Response:_
-
- {"message":"ok"}
diff --git a/frappe/docs/user/zh/guides/integration/using_oauth.md b/frappe/docs/user/zh/guides/integration/using_oauth.md
deleted file mode 100644
index 208e07b452..0000000000
--- a/frappe/docs/user/zh/guides/integration/using_oauth.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Using OAuth
-
-Once the client and provider settings are entered, following steps can be used to start using OAuth 2.0
-
-### Authorization Code Endpoint
-
-#### Authorization Request
-
-URL:
-```
-[GET] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.authorize
-```
-Params:
-```
-client_id =
-scope =
-response_type = "code"
-redirect_uri =
-```
-
-#### Confirmation Dialog
-
-
-
-Click 'Allow' to receive authorization code in redirect uri.
-
-```
-http://localhost:3000/oauth_code?code=plkj2mqDLwaLJAgDBAkyR1W8Co08Ud
-```
-If user clicks 'Deny' receive error
-```
-http://localhost:3000/oauth_code?error=access_denied
-```
-
-### Token Endpoints
-
-#### Get Access Token
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.get_token
-```
-Params:
-```
-grant_type = "authorization_code"
-code =
-redirect_uri =
-client_id =
-```
-Response:
-```
-{
- "access_token": "pNO2DpTMHTcFHYUXwzs74k6idQBmnI",
- "token_type": "Bearer",
- "expires_in": 3600,
- "refresh_token": "cp74cxbbDgaxFuUZ8Usc7egYlhKbH1",
- "scope": "project"
-}
-```
-
-#### Refresh Access Token
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.get_token
-```
-Params:
-```
-grant_type = "refresh_token"
-refresh_token =
-redirect_uri =
-client_id =
-```
-Response:
-```
-{
- "access_token": "Ywz1iNk0b21iAmjWAYnFWT4CuudHD5",
- "token_type": "Bearer",
- "expires_in": 3600,
- "refresh_token": "PNux3Q8Citr3s9rl2zEsKuU1l8bSN5",
- "scope": "project"
-}
-```
-#### Revoke Token Endpoint
-
-URL:
-```
-[POST] 0.0.0.0:8000/api/method/frappe.integrations.oauth2.revoke_token
-```
-Params:
-```
-token =
-```
-Success Response
-```
-status : 200
-
-{"message": "success"}
-```
-Error Response:
-```
-status : 400
-
-{"message": "bad request"}
-```
-
-### Accessing Resource
-
-Add header `Authorizaton: Bearer ` to Frappe's REST API endpoints to access user's resource
diff --git a/frappe/docs/user/zh/guides/integration/webhooks.md b/frappe/docs/user/zh/guides/integration/webhooks.md
deleted file mode 100644
index ff7df4015f..0000000000
--- a/frappe/docs/user/zh/guides/integration/webhooks.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# Webhooks
-
-Webhooks are "user-defined HTTP callbacks". You can create webhook which triggers on Doc Event of the selected DocType. When the `doc_events` occurs, the source site makes an HTTP request to the URI configured for the webhook. Users can configure them to cause events on one site to invoke behaviour on another.
-
-#### Configure Webhook
-
-To add Webhook go to
-
-> Integrations > External Documents > Webhook
-
-Webhook
-
-
-
-1. Select the DocType for which hook needs to be triggered e.g. Note
-2. Select the DocEvent for which hook needs to be triggered e.g. on_trash
-3. Enter a valid request URL. On occurence of DocEvent, POST request with doc's json as data is made to the URL.
-4. Optionally you can add headers to the request to be made. Useful for sending api key if required.
-5. Optionally you can select fields and set its `key` to be sent as data json
-
-e.g. Webhook
-
-- **DocType** : `Quotation`
-- **Doc Event** : `on_update`
-- **Request URL** : `https://httpbin.org/post`
-- **Webhook Data** :
- 1. **Fieldname** : `name` and **Key** : `id`
- 2. **Fieldname** : `items` and **Key** : `lineItems`
-
-Note: if no headers or data is present, request will be made without any header or body
-
-Example response of request sent by frappe server on `Quotation` - `on_update` to https://httpbin.org/post:
-
-```
-{
- "args": {},
- "data": "{\"lineItems\": [{\"stock_qty\": 1.0, \"base_price_list_rate\": 1.0, \"image\": \"\", \"creation\": \"2017-09-14 13:41:58.373023\", \"base_amount\": 1.0, \"qty\": 1.0, \"margin_rate_or_amount\": 0.0, \"rate\": 1.0, \"owner\": \"Administrator\", \"stock_uom\": \"Unit\", \"base_net_amount\": 1.0, \"page_break\": 0, \"modified_by\": \"Administrator\", \"base_net_rate\": 1.0, \"discount_percentage\": 0.0, \"item_name\": \"I1\", \"amount\": 1.0, \"actual_qty\": 0.0, \"net_rate\": 1.0, \"conversion_factor\": 1.0, \"warehouse\": \"Finished Goods - R\", \"docstatus\": 0, \"prevdoc_docname\": null, \"uom\": \"Unit\", \"description\": \"I1\", \"parent\": \"QTN-00001\", \"brand\": null, \"gst_hsn_code\": null, \"base_rate\": 1.0, \"item_code\": \"I1\", \"projected_qty\": 0.0, \"margin_type\": \"\", \"doctype\": \"Quotation Item\", \"rate_with_margin\": 0.0, \"pricing_rule\": null, \"price_list_rate\": 1.0, \"name\": \"QUOD/00001\", \"idx\": 1, \"item_tax_rate\": \"{}\", \"item_group\": \"Products\", \"modified\": \"2017-09-14 17:09:51.239271\", \"parenttype\": \"Quotation\", \"customer_item_code\": null, \"net_amount\": 1.0, \"prevdoc_doctype\": null, \"parentfield\": \"items\"}], \"id\": \"QTN-00001\"}",
- "files": {},
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "close",
- "Content-Length": "1075",
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.1"
- },
- "json": {
- "id": "QTN-00001",
- "lineItems": [
- {
- "actual_qty": 0.0,
- "amount": 1.0,
- "base_amount": 1.0,
- "base_net_amount": 1.0,
- "base_net_rate": 1.0,
- "base_price_list_rate": 1.0,
- "base_rate": 1.0,
- "brand": null,
- "conversion_factor": 1.0,
- "creation": "2017-09-14 13:41:58.373023",
- "customer_item_code": null,
- "description": "I1",
- "discount_percentage": 0.0,
- "docstatus": 0,
- "doctype": "Quotation Item",
- "gst_hsn_code": null,
- "idx": 1,
- "image": "",
- "item_code": "I1",
- "item_group": "Products",
- "item_name": "I1",
- "item_tax_rate": "{}",
- "margin_rate_or_amount": 0.0,
- "margin_type": "",
- "modified": "2017-09-14 17:09:51.239271",
- "modified_by": "Administrator",
- "name": "QUOD/00001",
- "net_amount": 1.0,
- "net_rate": 1.0,
- "owner": "Administrator",
- "page_break": 0,
- "parent": "QTN-00001",
- "parentfield": "items",
- "parenttype": "Quotation",
- "prevdoc_docname": null,
- "prevdoc_doctype": null,
- "price_list_rate": 1.0,
- "pricing_rule": null,
- "projected_qty": 0.0,
- "qty": 1.0,
- "rate": 1.0,
- "rate_with_margin": 0.0,
- "stock_qty": 1.0,
- "stock_uom": "Unit",
- "uom": "Unit",
- "warehouse": "Finished Goods - R"
- }
- ]
- },
- "url": "https://httpbin.org/post"
-}
-```
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/portal-development/.md b/frappe/docs/user/zh/guides/portal-development/.md
deleted file mode 100755
index 9136f09c29..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Pages
-
-You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder.
-
-Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html`
diff --git a/frappe/docs/user/zh/guides/portal-development/__init__.py b/frappe/docs/user/zh/guides/portal-development/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/portal-development/adding-pages.md b/frappe/docs/user/zh/guides/portal-development/adding-pages.md
deleted file mode 100755
index c9cd0191c3..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/adding-pages.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Adding Pages
-
-To add pages, just add `.html` or `.md` files in the `www` folder. The pages must only have the content, not the `` and `` tags.
-
-You can also write markdown pages
-
-### Index
-
-The first file in a folder must be called `index.md` or `index.html`
-
-Either file must be present for the system to make this a valid folder to build pages.
-
-### Markdown
-
- # This is a title
-
- This is some page content
- a [link](/link/to/page)
-
-### Adding Links
-
-Links urls to pages can be given without the `.html` extension for example `/home/link`
-
-### Title
-
-The first `` block if present will be the page title if not specified in a special tag. If no `` or title is specified, the file name will be the title.
-
-### Adding CSS
-
-You can also add a `.css` file with the same filename (e.g. `index.css` for `index.md`) that will be rendered with the page.
-
-### Special Tags
-
-1. `` will make the page render in Jinja
-2. `` will add a custom title
-3. `` will not add breadcrumbs in the page
-4. `` will enable caching (if you have used Jinja templating)
-
-{next}
diff --git a/frappe/docs/user/zh/guides/portal-development/contents.md b/frappe/docs/user/zh/guides/portal-development/contents.md
deleted file mode 100755
index fc2fa6936c..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/contents.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Table of Contents
-
-You can add a table of contents by adding `{index}` string on a new line.
-
-You can also make Previous and Next buttons by adding `previous` or `next` in `{}`
-
-### Showing contents
-
- # This is a title
-
- Hello paragraph
-
- ### Contents:
-
- {index}
-
-{next}
-
-### Ordering
-
-You can defining the ordering of pages in index by defining the index.txt file in your folder. The index.txt file must have the names (without extensions) of the pages in that folder indicating the order.
-
-For example for this folder the `index.txt` looks like:
-
- adding-pages
- ordering
- contents
- context
- building
diff --git a/frappe/docs/user/zh/guides/portal-development/context.md b/frappe/docs/user/zh/guides/portal-development/context.md
deleted file mode 100755
index d0fdc3cf63..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/context.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Dynamic Pages
-
-You can render pages dynamically using Jinja templating language. To query data, you can update that `context` object that you pass to the template.
-
-This can be done by adding a `.py` file with the same filename (e.g. `index.py` for `index.md`) with a `get_context` method.
-
-### Example
-
-If you want to show a page to see users, make a `users.html` and `users.py` file in the `www/` folder.
-
-In `users.py`:
-
- import frappe
- def get_context(context):
- context.users = frappe.db.sql("select first_name, last_name from `tabUser`")
-
-In `users.html`:
-
- List of Users
-
- {% for user in users %}
- - {{ user.first_name }} {{ user.last_name or "" }}
- {% endfor %}
-
-
-{next}
diff --git a/frappe/docs/user/zh/guides/portal-development/generators.md b/frappe/docs/user/zh/guides/portal-development/generators.md
deleted file mode 100644
index 8bf52d7299..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/generators.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# Generators
-
-If every document in a table (DocType) corresponds to a web-page, you can setup generators.
-
-To setup a generator you must:
-
-1. Add a field `route` that specifies the route of the page
-2. Add a condition field to indicate whether a page is viewable or not.
-3. Add the doctype name in `website_generators` in `hooks.py` of your app.
-4. Subclass the controller from `frappe.website.website_generator.WebsiteGenerator`
-5. Create a template for your page
-6. Add custom properties (context) for the template
-6. Customize route and list view
-
-Let us see this with the help of an example:
-
-## Example
-
-#### 1. Add fields
-
-We added `published`, `route` in the DocType
-
-**Note:** The field `route` is mandatory
-
-
-
-#### 2. Added Website Generator to Hooks
-
-Since Job Opening is in `erpnext`, we have added to the list of existing generator hooks:
-
- website_generators = ["Item Group", "Item", "Sales Partner", "Job Opening"]
-
-If the `website_generators` property does not exist in your hooks.py, add it!
-
-#### 3. Controller
-
-We add the `website` property to the **JobOpening** class in `job_opening.py`
-
-In `get_context`, `parents` property will indicate the breadcrumbs
-
- from frappe.website.website_generator import WebsiteGenerator
- from frappe import _
-
- # subclass from WebsiteGenerator, not Document
- class JobOpening(WebsiteGenerator):
- website = frappe._dict(
- template = "templates/generators/job_opening.html",
- condition_field = "published",
- page_title_field = "job_title",
- )
-
- def get_context(self, context):
- # show breadcrumbs
- context.parents = [{'name': 'jobs', 'title': _('All Jobs') }]
-
-**Note:** Once you do this, you should see the "See in Website" link on the document form.
-
-#### 4. Add the template
-
-Add the template in `erpnext/templates/generators/job_opening.html`
-
- {% raw %}{% extends "templates/web.html" %}
-
- {% block breadcrumbs %}
- {% include "templates/includes/breadcrumbs.html" %}
- {% endblock %}
-
- {% block header %}
- {{ job_title }}
- {% endblock %}
-
- {% block page_content %}
-
- {{ description }}
-
-
- {{ _("Apply Now") }}
-
- {% endblock %}{% endraw %}
-
-#### 5. Customizing List View
-
-If you add a method `get_list_view` in the controller file (job_opening.py), you can set properties for the listview
-
- def get_list_context(context):
- context.title = _("Jobs")
- context.introduction = _('Current Job Openings')
-{next}
diff --git a/frappe/docs/user/zh/guides/portal-development/index.md b/frappe/docs/user/zh/guides/portal-development/index.md
deleted file mode 100755
index a9aaab4312..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/index.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Making Portals
-
-Frappe has powerful tools to build portals where pages can be dynamically generated using templates (Jinja) and users can be shown records after login
-
-#### Adding Pages
-
-You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder.
-
-Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html`
-
-#### Views after Login
-
-After logging in, the user sees a "My Account" page `/me` where user can access certain documents that are shown via a menu
-
-The user can view records based on permissions and also add / edit them with **Web Forms**
-
-{index}
diff --git a/frappe/docs/user/zh/guides/portal-development/index.txt b/frappe/docs/user/zh/guides/portal-development/index.txt
deleted file mode 100755
index c0822bc8b0..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/index.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-adding-pages
-context
-generators
-contents
-web-forms
-ordering
-portal-roles
diff --git a/frappe/docs/user/zh/guides/portal-development/ordering.md b/frappe/docs/user/zh/guides/portal-development/ordering.md
deleted file mode 100755
index 179951739e..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/ordering.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Ordering
-
-You can defining the ordering of pages in index by defining the index.txt file in your folder. The index.txt file must have the names (without extensions) of the pages in that folder indicating the order.
-
-For example for this folder the `index.txt` looks like:
-
- adding-pages
- ordering
- contents
- context
- building
-
-{next}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/portal-development/portal-roles.md b/frappe/docs/user/zh/guides/portal-development/portal-roles.md
deleted file mode 100644
index 2248bb0b55..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/portal-roles.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Portal Roles
-
-Version: 7.1+
-
-Roles can be assigned to Website Users and they will see menu based on their role
-
-1. A default role can be set in **Portal Settings**
-1. Each Portal Menu Item can have a role associated with it. If that role is set, then only those users having that role can see that menu item
-1. Rules can be set for default roles that will be set on default users on hooks
-
-
-
-#### Rules for Default Role
-
-For example if the Email Address matches with a contact id, then set role Customer or Supplier:
-
- default_roles = [
- {'role': 'Customer', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(customer, "")': ('!=', '')}},
- {'role': 'Supplier', 'doctype':'Contact', 'email_field': 'email_id',
- 'filters': {'ifnull(supplier, "")': ('!=', '')}},
- {'role': 'Student', 'doctype':'Student', 'email_field': 'student_email_id'}
- ]
-
-
diff --git a/frappe/docs/user/zh/guides/portal-development/web-forms.md b/frappe/docs/user/zh/guides/portal-development/web-forms.md
deleted file mode 100644
index 7cca8de2cc..0000000000
--- a/frappe/docs/user/zh/guides/portal-development/web-forms.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Customizing Web Forms
-
-Web Forms are a powerful way to add forms to your website. Web forms are powerful and scriptable and from Version 7.1+ they also include tables, paging and other utilities
-
-
-
-### Standard Web Forms
-
-If you check on the "Is Standard" checkbox, a new folder will be created in the `module` of the Web Form for that web form. In this folder, you will see a `.py` and `.js` file that you can customize the web form with.
-
-{next}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/__init__.py b/frappe/docs/user/zh/guides/reports-and-printing/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md b/frappe/docs/user/zh/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md
deleted file mode 100755
index afe87c04f8..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Getting Information From Another Document In Print Format
-
-In a print format, you can get data from another document. For example in if you have a fields called `sales_order` in Sales Invoice, then you can get the sales order details using `frappe.get_doc`:
-
-{% raw %}
- {% set sales_order_doc = frappe.get_doc("Sales Order", sales_order) %}
-
- {{ sales_order_doc.customer }}
-{% endraw %}
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-query-report.md b/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-query-report.md
deleted file mode 100755
index b794eb229b..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-query-report.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# How To Make Query Report
-
-You can create tabulated reports using complex SQL queries by creating a new Report. These reports can be created by a System Manager and are stored in the Database
-
-> Note: You will need System Manager Permissions for this.
-
-To create a new Query Report:
-
-### 1. Create a new Report
-
-
-
-1. Set type as "Query Report"
-1. Set the reference DocType - Users that have access to the reference DocType will have access to the report
-1. Set the module - The report will appear in the "Custom Reports" section of the module.
-1. Add your Query
-
-### 2. Set the Query
-
-You can define complex queries such as:
-
-
- SELECT
- `tabWork Order`.name as "Work Order:Link/Work Order:200",
- `tabWork Order`.creation as "Date:Date:120",
- `tabWork Order`.production_item as "Item:Link/Item:150",
- `tabWork Order`.qty as "To Produce:Int:100",
- `tabWork Order`.produced_qty as "Produced:Int:100"
- FROM
- `tabWork Order`
- WHERE
- `tabWork Order`.docstatus=1
- AND ifnull(`tabWork Order`.produced_qty,0) < `tabWork Order`.qty
- AND EXISTS (SELECT name from `tabStock Entry` where work_order =`tabWork Order`.name)
-
-1. To format the columns, set labels for each column in the format: [Label]:[Field Type]/[Options]:[Width]
-
-### 3. Check the Report
-
-
-
-### 4. Advanced (adding filters)
-
-If you are making a standard report, you can add filters in your query report just like [script reports](https://frappe.io/docs/user/en/guides/reports-and-printing/how-to-make-script-reports) by adding a `.js` file in your query report folder. To include filters in your query, use `%(filter_key)s` where your filter value will be shown.
-
-For example
-
- SELECT ... FROM ... WHERE item_code = %(item_code)s ORDER BY ...
-
----
-
-### Note: Standard Script Report
-
-If you are developing a standard report for an app, make sure to set "Is Standard" as "Yes"
-
-
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-script-reports.md b/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-script-reports.md
deleted file mode 100755
index 80522d435b..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/how-to-make-script-reports.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Script Report
-
-You can create tabulated reports using server side scripts by creating a new Report.
-
-> Note: You will need Administrator Permissions for this.
-
-Since these reports give you unrestricted access via Python scripts, they can only be created by Administrators. The script part of the report becomes a part of the repository of the application. If you have not created an app, [read this](https://frappe.io/docs/user/en/guides/app-development/).
-
-> Note: You must be in [Developer Mode](https://frappe.io/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe) to do this
-
-### 1. Create a new Report
-
-
-
-1. Set Report Type as "Script Report"
-1. Set "Is Standard" as "Yes"
-1. Select the Module in which you want to add this report
-1. In the module folder (for example if it is Accounts in ERPnext the folder will be `erpnext/accounts/report/[report-name]`) you will see that templates for the report files will be created.
-1. In the `.js` file, you can set filters for the reports
-1. In the `.py` file, you can write the script that will generate the report
-
-### 2. Add Filters
-
-You can add filters in the `.js`. See an example below:
-
- frappe.query_reports["Accounts Receivable"] = {
- "filters": [
- {
- "fieldname":"company",
- "label": __("Company"),
- "fieldtype": "Link",
- "options": "Company",
- "default": frappe.defaults.get_user_default("company")
- },
- ]
- }
-
-1. These properties are the same as you would set in a DocField in a DocType
-
-### 3. Add the Script
-
-In the `.py` file you can add the script for generating the report.
-
-1. In the `execute` method, two lists `columns` and `data` are returned
-2. Columns must be a list of labels in the same format as query report. **[Label]:[Field Type]/[Options]:[Width]**. For example `Item:Link/Item:150`
-3. You can use all server side modules to build your report.
-4. For example see existing reports. ([Balance Sheet](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/balance_sheet/balance_sheet.py))
-
-### 4. Commit and Push the app
-
-Don't forget to commit and push your app.
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/index.md b/frappe/docs/user/zh/guides/reports-and-printing/index.md
deleted file mode 100755
index 42a169f9f0..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Reports and Printing
-
-{index}
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/index.txt b/frappe/docs/user/zh/guides/reports-and-printing/index.txt
deleted file mode 100755
index ec34e2b102..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/index.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-how-to-make-script-reports
-how-to-make-query-report
-getting-information-from-another-document-in-print-format
-where-do-i-find-standard-print-formats
-print-format-for-reports
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/print-format-for-reports.md b/frappe/docs/user/zh/guides/reports-and-printing/print-format-for-reports.md
deleted file mode 100755
index 07a7bc222b..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/print-format-for-reports.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Report Print Formats
-
-In version 4.1 we introduce Report Print Formats. These are HTML templates that you can use to format Query Report data for printing.
-
-### 1. Creating New Print Formats
-
-To create a new Print Format, just drop in a `.html` file in the folder of the query report. For example, for the [General Ledger](https://github.com/frappe/erpnext/tree/develop/erpnext/accounts/report/general_ledger) report in ERPNext, you can drop in a file called `general_ledger.html` along side the `.js` and `.py` files.
-
-##### Tree Of `erpnext/accounts/general_ledger`
-
- general_ledger/
- ├── __init__.py
- ├── general_ledger.html
- ├── general_ledger.js
- ├── general_ledger.json
- └── general_ledger.py
-
-
-### 2. Templating
-
-For templating, we use an adapted version of [John Resig's microtemplating script](http://ejohn.org/blog/javascript-micro-templating/). If you know Javascript, it is very easy to follow this templating language.
-
-##### Here are some examples (from John Resig's Blog):
-
-Example: Properities:
-
- ">
-
-
-
-
-
- <%=from_user%>: <%=text%>
-
-
-
-Example: Code structures, Loops
-
- <% for ( var i = 0; i < users.length; i++ ) { %>
-
<%=users[i].name%>
- <% } %>
-
-> **Note**: It is important to note that you should not use single quotes (') in your template as the engine cannot handle them effectively.
-
-### 3. Data
-
-Data is available to the template as:
-
-- `data`: this is a list of records, with each record as an object with slugified properties from labels. For example "Posting Date" becomes "posting_date"
-- `filters`: filters set in the report
-- `report`: reportview object
-
-### 4. Example
-
-Here is how the General Ledger Report is built:
-
-[General Ledger Print Format Template](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/general_ledger/general_ledger.html)
-
-Here is what the report looks like:
-
-
-
-##### Comments:
-
-1. [Bootstrap Stylesheet](http://getbootstrap.com) is pre-loaded.
-1. You can use all global functions like `fmt_money` and dateutil.
-1. Translatable strings should be written as `__("text")`
-1. You can create modules and import using `{% raw %}{% include "templates/includes/formats/common_format" %}{% endraw %}`
-
-
\ No newline at end of file
diff --git a/frappe/docs/user/zh/guides/reports-and-printing/where-do-i-find-standard-print-formats.md b/frappe/docs/user/zh/guides/reports-and-printing/where-do-i-find-standard-print-formats.md
deleted file mode 100755
index c1816751dd..0000000000
--- a/frappe/docs/user/zh/guides/reports-and-printing/where-do-i-find-standard-print-formats.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Where Do I Find Standard Print Formats
-
-Standard Print formats are auto generated from the layout of the DocType. You can customize the standard format by
-
-
-
-1. Customizing Standard Print
-Go to Setup > Customize > Customize Form View and you can:
-
-
- - Re-arranging fields by dragging and dropping
- - Add static elements by adding HTML type fields and adding your HTML in Options
-
-
- - Hiding fields by setting the Print Hide property
-
-
-
-2. Creating new layouts based on Print Formats
-
-As there are not templates that are generated for standard Print Formats, you will have to create new templates from scratch using the Jinja Templating Language via
-Setup > Printing and Branding > Print Format
-
-
-
- - See Print Format help.
-
-
- - You can use the Bootstrap CSS framework to layout your print formats
-
-
-
-
-Tip: You can import Standard Template macros for building your print formats.
-
-
-Example, adding the standard header:
-
-
-{% raw %}{%- from "templates/print_formats/standard_macros.html" import add_header -%}
-{{ add_header() }}{% endraw %}
-
diff --git a/frappe/docs/user/zh/index.md b/frappe/docs/user/zh/index.md
deleted file mode 100755
index c066d09864..0000000000
--- a/frappe/docs/user/zh/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# 使用 Frappe 开发应用
-
-{index}
-
-
diff --git a/frappe/docs/user/zh/index.txt b/frappe/docs/user/zh/index.txt
deleted file mode 100755
index 85c302b8cf..0000000000
--- a/frappe/docs/user/zh/index.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tutorial
-bench
-guides
-videos
diff --git a/frappe/docs/user/zh/tutorial/__init__.py b/frappe/docs/user/zh/tutorial/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/tutorial/app.md b/frappe/docs/user/zh/tutorial/app.md
deleted file mode 100755
index 51767b9d70..0000000000
--- a/frappe/docs/user/zh/tutorial/app.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# 什么是应用
-
-Frappe 中的应用只是标准的 Python 应用。 您可以采用与标准 Python 应用相同的方式来构造 Frappe 应用。 对于部署,Frappe 使用标准的 Python Setuptools,因此您可以在任何计算机上轻松地进行应用移植和安装。
-
-Frappe 框架提供了 WSGI 接口,您可以使用内置的 Werkzeug 服务进行开发。 对于生产环境的实施,我们建议使用 Nginx 和 Gunicorn。
-
-Frappe 也拥有多租户架构。 这意味着您可以在安装中运行多个 "站点",每个都可以为不同的应用和用户提供服务。 每个站点的数据库也是独立的。
-
-{next}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/tutorial/before.md b/frappe/docs/user/zh/tutorial/before.md
deleted file mode 100755
index 3d300e37cd..0000000000
--- a/frappe/docs/user/zh/tutorial/before.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# 在您开始之前
-
-帮助您开始使用 Frappe 创建应用的资源列表
-
----
-
-#### 1. Python
-
-Frappe 使用 Python (v2.7) 进行服务器端编程。 在您开始使用 Frappe 构建应用之前,强烈建议您学习 Python。
-
-要编写高质量的服务器端代码,还必须包括自动测试。
-
-相关资源:
-
- 1. [Codecademy Python 教程](https://www.codecademy.com/learn/python)
- 1. [官方 Python 教程](https://docs.python.org/2.7/tutorial/index.html)
- 1. [测试驱动开发基础](http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137)
-
----
-
-#### 2. MariaDB / MySQL
-
-要使用 Frappe 创建数据库驱动的应用,您必须了解数据库管理的基本知识,比如如何安装、登录、创建新数据库以及基本的 SQL 查询。
-
-相关资源:
-
- 1. [Codecademy SQL 教程](https://www.codecademy.com/learn/learn-sql)
- 1. [DigitalOcean 基础 MySQL 教程](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial)
- 1. [MariaDB 入门](https://mariadb.com/kb/en/mariadb/documentation/getting-started/)
-
----
-
-#### 3. HTML / CSS
-
-如果要使用 Frappe 构建用户界面,您需要学习基本的 HTML/CSS 和 Boostrap CSS 框架。
-
-相关资源:
-
- 1. [Codecademy HTML/CSS 教程](https://www.codecademy.com/learn/learn-html-css)
- 1. [Bootstrap 入门](https://getbootstrap.com/getting-started/)
-
----
-
-#### 4. JavaScript 和 jQuery
-
-要自定义表单并创建丰富的用户界面,您应该学习 JavaScript 和流行的 jQuery。
-
-
-相关资源:
-
- 1. [Codecademy JavaScript 教程](https://www.codecademy.com/learn/learn-javascript)
- 1. [Codecademy jQuery 教程](https://www.codecademy.com/learn/jquery)
----
-
-#### 5. Jinja 模板
-
-如果您要自定义打印模板或 Web 页面,则需要了解 Jinja 模板语言。 这是创建动态 Web 页面 (HTML) 的一种简单方法。
-
-相关资源:
-
- 1. [Jinja 模板入门](https://realpython.com/blog/python/primer-on-jinja-templating/)
- 1. [官方文档](http://jinja.pocoo.org/)
-
----
-
-#### 6. Git 和 GitHub
-
-了解如何使用 Git 和 GitHub 为开源项目做出贡献,这两个工具可以帮助您管理代码并与他人共享。
-
-相关资源:
-
- 1. [Git 基础教程](https://try.github.io)
- 2. [如何贡献开源](https://opensource.guide/how-to-contribute/)
-
----
-
-当您准备好时,您可以尝试使用 Frappe [构建示例应用](/docs/user/en/tutorial/app)。
-
diff --git a/frappe/docs/user/zh/tutorial/bench.md b/frappe/docs/user/zh/tutorial/bench.md
deleted file mode 100755
index 2a09d7cefb..0000000000
--- a/frappe/docs/user/zh/tutorial/bench.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 安装 Frappe Bench
-
-在类 Unix 系统上设置 Frappe 最简单的方法是使用 frappe-bench。 阅读有关如何使用 Frappe Bench 安装的详细说明。
-
-> [https://github.com/frappe/bench](https://github.com/frappe/bench)
-
-有了 Frappe Bench,您将能够设置并服务多个应用和站点,它还将设置一个 Python Virtualenv,以便您可以有一个独立的环境来运行您的应用 (并不会与其他开发环境的版本冲突)。
-
-还将安装 `bench` 命令行工具,这将帮助您开发及管理安装。
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/conclusion.md b/frappe/docs/user/zh/tutorial/conclusion.md
deleted file mode 100755
index f45b64ba23..0000000000
--- a/frappe/docs/user/zh/tutorial/conclusion.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Conclusion
-
-
-We hope this will give you an overview of how applications are developed in Frappe. The objective was to briefly touch on the various aspects of application development and give a broad overview. To get help on specific issues, look at the API.
-
-For help, join the community at the [chat channel on Gitter](https://gitter.im/frappe/erpnext) or the [developer forum](https://discuss.erpnext.com)
-
diff --git a/frappe/docs/user/zh/tutorial/controllers.md b/frappe/docs/user/zh/tutorial/controllers.md
deleted file mode 100755
index 09edce15d0..0000000000
--- a/frappe/docs/user/zh/tutorial/controllers.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Controllers
-
-Next step would be adding methods and event handlers to models. In the app, we should ensure that if a Library Transaction is made, the Article in question must be in stock and the member loaning the Article must have a valid membership.
-
-For this, we can write a validation just before the Library Transaction object is saved. To do this, open the `library_management/doctype/library_transaction/library_transaction.py` template.
-
-This file is the controller for the Library Transaction object. In this you can write methods for:
-
-1. `before_insert`
-1. `validate` (before inserting or updating)
-1. `on_update` (after saving)
-1. `on_submit` (when document is set as submitted)
-1. `on_cancel`
-1. `on_trash` (before it is about to be deleted)
-
-You can write methods for these events and they will be called by the framework when the document is saved etc.
-
-Here is the finished controller:
-
- from __future__ import unicode_literals
- import frappe
- from frappe import _
- from frappe.model.document import Document
-
- class LibraryTransaction(Document):
- def validate(self):
- last_transaction = frappe.get_list("Library Transaction",
- fields=["transaction_type", "transaction_date"],
- filters = {
- "article": self.article,
- "transaction_date": ("<=", self.transaction_date),
- "name": ("!=", self.name)
- })
- if self.transaction_type=="Issue":
- msg = _("Article {0} {1} has not been recorded as returned since {2}")
- if last_transaction and last_transaction[0].transaction_type=="Issue":
- frappe.throw(msg.format(self.article, self.article_name,
- last_transaction[0].transaction_date))
- else:
- if not last_transaction or last_transaction[0].transaction_type!="Issue":
- frappe.throw(_("Cannot return article not issued"))
-
-In this script:
-
-1. We get the last transaction before the current transaction date using the query function `frappe.get_list`
-1. If the last transaction is something we don't like we throw an exception using `frappe.throw`
-1. We use `_("text")` method to identify translatable strings.
-
-Check if your validations work by creating new records
-
-
-
-#### Debugging
-
-To Debug, always keep your JS Console open. Lookout for both Javascript and server tracebacks.
-
-Also check your terminal window for exceptions. Any **500 Internal Server Errors** will get printed in your terminal where on which your server is running.
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/doctype-directory-structure.md b/frappe/docs/user/zh/tutorial/doctype-directory-structure.md
deleted file mode 100755
index b5e1b10006..0000000000
--- a/frappe/docs/user/zh/tutorial/doctype-directory-structure.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# DocType Directory Structure
-
-After saving the DocTypes, check that the model `.json` and `.py` files are created in the `apps/library_management/library_management` module. The directory structure after creating the models should look like this:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- ..
- │ ├── library_management
- │ │ ├── __init__.py
- │ │ └── doctype
- │ │ ├── __init__.py
- │ │ ├── article
- │ │ │ ├── __init__.py
- │ │ │ ├── article.json
- │ │ │ └── article.py
- │ │ ├── library_member
- │ │ │ ├── __init__.py
- │ │ │ ├── library_member.json
- │ │ │ └── library_member.py
- │ │ ├── library_membership
- │ │ │ ├── __init__.py
- │ │ │ ├── library_membership.json
- │ │ │ └── library_membership.py
- │ │ └── library_transaction
- │ │ ├── __init__.py
- │ │ ├── library_transaction.json
- │ │ └── library_transaction.py
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/doctypes.md b/frappe/docs/user/zh/tutorial/doctypes.md
deleted file mode 100755
index b57aca5afa..0000000000
--- a/frappe/docs/user/zh/tutorial/doctypes.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# DocType
-
-After creating the Roles, let us create the **DocTypes**
-
-To create a new **DocType**, go to:
-
-> Developer > Documents > Doctype > New
-
-
-
-In the DocType, first the Module, which in our case is **Library Management**
-
-#### Adding Fields
-
-In the Fields Table, you can add the fields (properties) of the DocType (Article).
-
-Fields are much more than database columns, they can be:
-
-1. Columns in the database
-1. Layout helpers (section / column breaks)
-1. Child tables (Table type field)
-1. HTML
-1. Actions (button)
-1. Attachments or Images
-
-Let us add the fields of the Article.
-
-
-
-When you add fields, you need to enter the **Type**. **Label** is optional for Section Break and Column Break. **Name** (`fieldname`) is the name of the database table column and also the property of the controller. This has to be *code friendly*, i.e. it has to have small cases are _ instead of " ". If you leave the Fieldname blank, it will be automatically set when you save it.
-
-You can also set other properties of the field like whether it is mandatory, read only etc.
-
-We can add the following fields:
-
-1. Article Name (Data)
-2. Author (Data)
-3. Description
-4. ISBN
-5. Status (Select): For Select fields, you will enter the Options. Enter **Issued** and **Available** each on a new line in the Options box. See diagram below
-6. Publisher (Data)
-7. Language (Data)
-8. Image (Attach Image)
-
-
-#### Add Permissions
-
-After adding the fields, hit done and add a new row in the Permission Rules section. For now, let us give Read, Write, Create, Delete and Report access to **Librarian**. Frappe has a finely grained Role based permission model. You can also change permissions later using the **Role Permissions Manager** from **Setup**.
-
-
-
-#### Saving
-
-Click on the **Save** button. When the button is clicked, a popup will ask you for the name. Give it the name **Article** and save the DocType.
-
-Now login into mysql and check the database table created:
-
- $ bench mysql
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MariaDB connection id is 3931
- Server version: 5.5.36-MariaDB-log Homebrew
-
- Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- MariaDB [library]> DESC tabArticle;
- +--------------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+--------------+------+-----+---------+-------+
- | name | varchar(255) | NO | PRI | NULL | |
- | creation | datetime(6) | YES | | NULL | |
- | modified | datetime(6) | YES | | NULL | |
- | modified_by | varchar(40) | YES | | NULL | |
- | owner | varchar(60) | YES | | NULL | |
- | docstatus | int(1) | YES | | 0 | |
- | parent | varchar(255) | YES | MUL | NULL | |
- | parentfield | varchar(255) | YES | | NULL | |
- | parenttype | varchar(255) | YES | | NULL | |
- | idx | int(8) | YES | | NULL | |
- | article_name | varchar(255) | YES | | NULL | |
- | status | varchar(255) | YES | | NULL | |
- | description | text | YES | | NULL | |
- | image | varchar(255) | YES | | NULL | |
- | publisher | varchar(255) | YES | | NULL | |
- | isbn | varchar(255) | YES | | NULL | |
- | language | varchar(255) | YES | | NULL | |
- | author | varchar(255) | YES | | NULL | |
- +--------------+--------------+------+-----+---------+-------+
- 18 rows in set (0.00 sec)
-
-
-As you can see, along with the DocFields, several standard columns have also been added to the table. Important to note here are, the primary key, `name`, `owner`(the user who has created the record), `creation` and `modified` (timestamps for creation and last modification).
-
-{next}
-
diff --git a/frappe/docs/user/zh/tutorial/form-client-scripting.md b/frappe/docs/user/zh/tutorial/form-client-scripting.md
deleted file mode 100755
index d4673c55d4..0000000000
--- a/frappe/docs/user/zh/tutorial/form-client-scripting.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Form Client Scripting
-
-## Scripting Forms
-
-Now we have created a basic system that works out of the box without us having to write any code. Let us now write some scripts to make the application richer and add validations so that the user does not enter wrong data.
-
-### Client Side Scripting
-
-In the **Library Transaction** DocType, we have only field for Member Name. We have not made two fields. Now this could well be two fields (and probably should), but for the sake of example, let us consider we have to implement this. To do this we would have to write a event handler for the event when the user selects the `library_member` field and then access the member resource from the server using REST API and set the values in the form.
-
-To start the script, in the `library_management/doctype/library_transaction` folder, create a new file `library_transaction.js`. This file will be automatically executed when the first Library Transaction is opened by the user. So in this file, we can bind events and write other functions.
-
-#### library_transaction.js
-
- frappe.ui.form.on("Library Transaction", "library_member",
- function(frm) {
- frappe.call({
- "method": "frappe.client.get",
- args: {
- doctype: "Library Member",
- name: frm.doc.library_member
- },
- callback: function (data) {
- frappe.model.set_value(frm.doctype,
- frm.docname, "member_name",
- data.message.first_name
- + (data.message.last_name ?
- (" " + data.message.last_name) : ""))
- }
- })
- });
-
-1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** is used to bind a handler to the event when the property library_member is set.
-1. In the handler, we trigger an AJAX call to `frappe.client.get`. In response we get the requested object as JSON. [Learn more about the API](/frappe/user/en/guides/integration/rest_api).
-1. Using **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** we set the value in the form.
-
-**Note:** To check if your script works, remember to 'reload' the page before testing your script. Client script changes are not automatically picked up when you are in developer mode.
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/index.md b/frappe/docs/user/zh/tutorial/index.md
deleted file mode 100755
index 207e7367b0..0000000000
--- a/frappe/docs/user/zh/tutorial/index.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Frappe 教程
-
-在本指南中,我们将向您展示如何使用 **Frappe** 从头开始创建一个应用。 以图书馆管理系统为例,我们将涵盖:
-
-1. 安装
-2. 制作新的应用
-3. 制作模块
-4. 创建用户和记录
-5. 创建控制器
-6. 创建 Web 视图
-7. 配置钩子和任务
-
-## 这是给谁的?
-
-本指南适用于熟悉 Web 应用生成和维护的软件开发人员。 Frappe 框架是建立在 Python 上,并使用 MariaDB 数据库以及 HTML/CSS/Javascript 创建 Web 视图。 如果您熟悉所有这些技术将会非常有帮助。 如果您以前从未使用过 Python,则在使用本指南之前,至少应先阅读快速教程。
-
-Frappe 在 GitHub 上使用 git 版本控制系统。 您熟悉基本的 git 操作,并在 GitHub 上有一个帐户来管理您的应用也同样重要。
-
-## 示例
-
-在本指南中,我们将构建一个简单的 **图书馆管理** 应用。 在这个应用中,我们将有如下模型:
-
-1. 物品 (可以借出的图书或任何其他物品)
-2. 图书馆用户
-3. 图书馆交易 (借出或归物品)
-4. 图书馆会籍 (允许会员交易期间)
-5. 图书馆管理设置 (如借出期限的全局设置)
-
-图书管理员的用户界面(UI)将会是 **Frappe 桌面**,一个内置的根据模型、角色和权限自动生成的基于浏览器的 UI 环境。
-
-我们还将为图书馆创建 Web 视图,用户可以从网站浏览物品。
-
-{index}
\ No newline at end of file
diff --git a/frappe/docs/user/zh/tutorial/index.txt b/frappe/docs/user/zh/tutorial/index.txt
deleted file mode 100755
index 1fed6aed93..0000000000
--- a/frappe/docs/user/zh/tutorial/index.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-before
-app
-bench
-new-app
-setting-up-the-site
-start
-models
-roles
-doctypes
-naming-and-linking
-doctype-directory-structure
-users-and-records
-form-client-scripting
-controllers
-reports
-web-views
-single-doctypes
-task-runner
-conclusion
diff --git a/frappe/docs/user/zh/tutorial/models.md b/frappe/docs/user/zh/tutorial/models.md
deleted file mode 100755
index 04114e1369..0000000000
--- a/frappe/docs/user/zh/tutorial/models.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Making Models
-
-The next step is to create the models as we discussed in the introduction. In Frappe, models are called **DocTypes**. You can create new DocTypes from the Desk UI. **DocTypes** are made of fields called **DocField** and role based permissions are integrated into the models, these are called **DocPerms**.
-
-When a DocType is saved, a new table is created in the database. This table is named as `tab[doctype]`.
-
-When you create a **DocType** a new folder is created in the **Module** and a model JSON file and a controller template in Python are automatically created. When you update the DocType, the JSON model file is updated and whenever `bench migrate` is executed, it is synced with the database. This makes it easy to propagate schema changes and migrate.
-
-### Developer Mode
-
-To create models, you must set `developer_mode` as 1 in the `site_config.json` file located in /sites/library and execute command `bench clear-cache` or use the user menu in UI and click on "Reload" for the changes to take effect. You should now see the "Developer" app on your desk
-
- {
- "db_name": "bcad64afbf",
- "db_password": "v3qHDeVKvWVi7s97",
- "developer_mode": 1
- }
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/naming-and-linking.md b/frappe/docs/user/zh/tutorial/naming-and-linking.md
deleted file mode 100755
index a3400ae527..0000000000
--- a/frappe/docs/user/zh/tutorial/naming-and-linking.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# DocType Naming and Linking
-
-Then let us create the other DocType and save it too:
-
-1. Library Member (First Name, Last Name, Email Address, Phone, Address)
-
-
-
-
-#### Naming of DocTypes
-
-DocTypes can be named in different ways:
-
-1. Based on a field
-1. Based on a series
-1. By controller (code)
-1. Prompt
-
-This can be set by entering the **Autoname** field. For controller, leave blank.
-
-> **Search Fields**: A DocType may be named on a series but it still needs to be searched by name. In our case, the Article will be searched by the title or the author name. So this can be entered in search field.
-
-
-
-#### Link and Select Fields
-
-Foreign keys are specified in Frappe as **Link** type fields. The target DocType must be mentioned in the Options text area.
-
-In our example, in the Library Transaction DocType, we have to link both the Library Member and the Article.
-
-**Note:** Remeber that Link fields are not automatically set as Foreign Keys in the MariaDB database, because that will implicitly index the column. This may not be optimum hence the Foreign Key validation is done by the Framework.
-
-
-
-For select fields, as we mentioned earlier, add the various options in the **Options** input box, each option on a new row.
-
-
-
-Similary complete making the other models.
-
-#### Linked Values
-
-A standard pattern is when you select an ID, say **Library Member** in **Library Membership**, then the Member's first and last names should be copied into relevant fields in the Library Membership Transaction.
-
-To do this, we can use Read Only fields and in options, we can set the the name of the link and the fieldname of the property we want to fetch. For this example in **Member First Name** we can set `library_member.first_name`
-
-
-
-### Complete the Models
-
-In the same way, you can complete all the models so that the final fields look like this:
-
-#### Article
-
-
-
-#### Library Member
-
-
-
-#### Library Membership
-
-
-
-#### Library Transaction
-
-
-
-> Make sure to give permissions to **Librarian** on each DocType
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/new-app.md b/frappe/docs/user/zh/tutorial/new-app.md
deleted file mode 100755
index 6b1c36b8ca..0000000000
--- a/frappe/docs/user/zh/tutorial/new-app.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# 制作新的应用
-
-一旦安装了 bench,你会看到两个主要的文件夹,`apps` 和 `sites`。 所有的应用将安装在 apps 中。
-
-要制作新的应用,请转到您的 bench 文件夹,然后运行 `bench new-app {app_name}`,填写有关该应用的详细信息。 这将为您创建样板应用。
-
- $ bench new-app library_management
- App Title (defaut: Lib Mgt): Library Management
- App Description: App for managing Articles, Members, Memberships and Transactions for Libraries
- App Publisher: Frappe
- App Email: info@frappe.io
- App Icon (default 'octicon octicon-file-directory'): octicon octicon-book
- App Color (default 'grey'): #589494
- App License (default 'MIT'): GNU General Public License
-
-### 应用结构
-
-该应用将创建在一个名为 `library_management` 的文件夹中,并具有以下结构:
-
- .
- ├── MANIFEST.in
- ├── README.md
- ├── library_management
- │ ├── __init__.py
- │ ├── config
- │ │ ├── __init__.py
- │ │ └── desktop.py
- │ ├── hooks.py
- │ ├── library_management
- │ │ └── __init__.py
- │ ├── modules.txt
- │ ├── patches.txt
- │ └── templates
- │ ├── __init__.py
- │ ├── generators
- │ │ └── __init__.py
- │ ├── pages
- │ │ └── __init__.py
- │ └── statics
- ├── license.txt
- ├── requirements.txt
- └── setup.py
-
-1. `config` 文件夹包含应用配置信息。
-1. `desktop.py` 是可以添加到工作台 (Desk) 的桌面图标。
-1. `hooks.py` 是指与环境和其他应用进行集成的地方。
-
-1. `library_management` (内部) 是引导**模块**。 在 Frappe 中,**模块**是模型和控制器文件所在的地方。
-1. `modules.txt` 包含应用中**模块**的列表。 当您创建新模块时,需要在该文件中更新它。
-1. `patches.txt` 是编写迁移补丁的地方。 它们是使用点表示法的 Python 模块引用。
-1. `templates` 是维护 Web 视图模板的文件夹。 **登录**以及其他标准页面的模板由 Frappe 处理。
-1. `generators` 是维护模型模板的地方,其中每个模型实例都有一个分离的 web 路由,例如**博客帖子**每个帖子都有其唯一的 Web URL。 在 Frappe 中,使用的模板引擎是 Jinja2。
-1. `pages` 是维护单个路由模板的位置。 例如 "/blog" 类型的页面。
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/reports.md b/frappe/docs/user/zh/tutorial/reports.md
deleted file mode 100755
index 6e2a2b6c42..0000000000
--- a/frappe/docs/user/zh/tutorial/reports.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Reports
-
-You can also click on the Reports text on the sidebar (left) to see tabulated records
-
-
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/roles.md b/frappe/docs/user/zh/tutorial/roles.md
deleted file mode 100755
index 42b8246bec..0000000000
--- a/frappe/docs/user/zh/tutorial/roles.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Creating Roles
-
-Before creating Models, we must create Roles so that we can set permissions on the Model. There are two Roles we will create:
-
-1. Librarian
-1. Library Member
-
-To create a new Role, go to:
-
-> Setup > Users > Role > New
-
-
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/setting-up-the-site.md b/frappe/docs/user/zh/tutorial/setting-up-the-site.md
deleted file mode 100755
index 30f4b86d1f..0000000000
--- a/frappe/docs/user/zh/tutorial/setting-up-the-site.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Setting up the Site
-
-Let us create a new site and call it `library`.
-
-*Note: Before you create any new site, you need to activate the Barracuda storage engine on your MariaDB installation.*
-*Copy the following default ERPNext database settings into your `my.cnf` file.*
-
- [mysqld]
- innodb-file-format=barracuda
- innodb-file-per-table=1
- innodb-large-prefix=1
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
-
- [mysql]
- default-character-set = utf8mb4
-
-You can then install a new site, by the command `bench new-site library`.
-
-This will create a new database and site folder and install `frappe` (which is also an application!) in the new site. The `frappe` application has two built-in modules **Core** and **Website**. The Core module contains the basic models for the application. Frappe is a batteries included framework and comes with a lot of built-in models. These models are called **DocTypes**. More on that later.
-
- $ bench new-site library
- MySQL root password:
- Installing frappe...
- Updating frappe : [========================================]
- Updating country info : [========================================]
- Set Administrator password:
- Re-enter Administrator password:
- Installing fixtures...
- *** Scheduler is disabled ***
-
-### Site Structure
-
-A new folder called `library` will be created in the `sites` folder. Here is the standard folder structure for a site.
-
- .
- ├── locks
- ├── private
- │ └── backups
- ├── public
- │ └── files
- └── site_config.json
-
-1. `public/files` is where user uploaded files are stored.
-1. `private/backups` is where backups are dumped
-1. `site_config.json` is where site level configurations are maintained.
-
-### Setting Default Site
-
-In case you have multiple sites on you bench use `bench use [site_name]` to set the default site.
-
-Example:
-
- $ bench use library
-
-### Install App
-
-Now let us install our app `library_management` in our site `library`
-
-1. Install library_management in library with: `bench --site [site_name] install-app [app_name]`
-
-Example:
-
- $ bench --site library install-app library_management
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/single-doctypes.md b/frappe/docs/user/zh/tutorial/single-doctypes.md
deleted file mode 100755
index a9f1b853ad..0000000000
--- a/frappe/docs/user/zh/tutorial/single-doctypes.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Single DocTypes
-
-A application will usually have a Settings page. In our application, we can define a page where we can set the loan period. We also need to save this property. In Frappe, this can be done using a **Single** type DocType. A Single DocType is like the Singleton pattern in Java. It is an object with only one instance. Let us call this as **Library Managment Settings**.
-
-To create an new Single DocType, mark the **Is Single** property as checked.
-
-
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/start.md b/frappe/docs/user/zh/tutorial/start.md
deleted file mode 100755
index 4b7f60db73..0000000000
--- a/frappe/docs/user/zh/tutorial/start.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Starting the Bench
-
-Now we can login and check if everything works.
-
-To start the development server, run `bench start`
-
- $ bench start
- 13:58:51 web.1 | started with pid 22135
- 13:58:51 worker.1 | started with pid 22136
- 13:58:51 workerbeat.1 | started with pid 22137
- 13:58:52 web.1 | * Running on http://0.0.0.0:8000/
- 13:58:52 web.1 | * Restarting with reloader
- 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting...
-
-You can now open your browser and go to `http://localhost:8000`. You should see this login page if all goes well:
-
-
-
-Now login with :
-
-Login ID: **Administrator**
-
-Password : **Use the password that was created during installation**
-
-When you login, you should see the "Desk" home page
-
-
-
-As you can see, the Frappe basic system comes with several pre-loaded applications like To Do, File Manager etc. These apps can integrated in your app workflow as we progress.
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/task-runner.md b/frappe/docs/user/zh/tutorial/task-runner.md
deleted file mode 100755
index ef532874be..0000000000
--- a/frappe/docs/user/zh/tutorial/task-runner.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# Scheduled Tasks
-
-Finally, an application also has to send email notifications and do other kind of scheduled tasks. In Frappe, if you have setup the bench, the task / scheduler is setup via RQ using Redis Queue.
-
-To add a new task handler, go to `hooks.py` and add a new handler. Default handlers are `all`, `daily`, `weekly`, `monthly`, `cron`. The `all` handler is called every 4 minutes by default.
-
- # Scheduled Tasks
- # ---------------
-
- scheduler_events = {
- "daily": [
- "library_management.tasks.daily"
- ],
- "cron": {
- "0/10 * * * *": [
- "library_management.task.run_every_ten_mins"
- ],
- "15 18 * * *": [
- "library_management.task.every_day_at_18_15"
- ]
- }
-
- }
-
-Here we can point to a Python function and that function will be executed every day. Let us look what this function looks like:
-
- # Copyright (c) 2013, Frappe
- # For license information, please see license.txt
-
- from __future__ import unicode_literals
- import frappe
- from frappe.utils import datediff, nowdate, format_date, add_days
-
- def every_ten_minutes():
- # stuff to do every 10 minutes
- pass
-
- def every_day_at_18_15():
- # stuff to do every day at 6:15pm
- pass
-
- def daily():
- loan_period = frappe.db.get_value("Library Management Settings",
- None, "loan_period")
-
- overdue = get_overdue(loan_period)
-
- for member, items in overdue.iteritems():
- content = """Following Items are Overdue
- Please return them as soon as possible
"""
-
- for i in items:
- content += "- {0} ({1}) due on {2}
".format(i.article_name,
- i.article,
- format_date(add_days(i.transaction_date, loan_period)))
-
- content += "
"
-
- recipient = frappe.db.get_value("Library Member", member, "email_id")
- frappe.sendmail(recipients=[recipient],
- sender="test@example.com",
- subject="Library Articles Overdue", content=content, bulk=True)
-
- def get_overdue(loan_period):
- # check for overdue articles
- today = nowdate()
-
- overdue_by_member = {}
- articles_transacted = []
-
- for d in frappe.db.sql("""select name, article, article_name,
- library_member, member_name
- from `tabLibrary Transaction`
- order by transaction_date desc, modified desc""", as_dict=1):
-
- if d.article in articles_transacted:
- continue
-
- if d.transaction_type=="Issue" and \
- datediff(today, d.transaction_date) > loan_period:
- overdue_by_member.setdefault(d.library_member, [])
- overdue_by_member[d.library_member].append(d)
-
- articles_transacted.append(d.article)
-
-We can place the above code in any accessible Python module. The route is defined in `hooks.py`, so for our purposes we would place this code in `library_management/tasks.py`.
-
-Note:
-
-1. We get the loan period from **Library Management Settings** by using `frappe.db.get_value`.
-1. We run a query in the database with `frappe.db.sql`
-1. Email is sent via `frappe.sendmail`
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/users-and-records.md b/frappe/docs/user/zh/tutorial/users-and-records.md
deleted file mode 100755
index fd86030a40..0000000000
--- a/frappe/docs/user/zh/tutorial/users-and-records.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Making Users and Records
-
-Now that we have created the models, we can directly start making records using Frappe Desk UI. You do not have to create views! Views in Frappe are automatically made based on the DocType properties.
-
-### 4.1 Creating User
-
-To make records, we will first create a User. To create a user, go to:
-
-> Setup > Users > User > New
-
-Create a new User and set the name and first name and new password.
-
-Also give the Librarian and Library Member Roles to this user
-
-
-
-Now logout and login using the new user id and password.
-
-### 4.2 Creating Records
-
-You will now see an icon for the Library Management module. Click on that icon and you will see the Module page:
-
-
-
-Here you can see the DocTypes that we have created for the application. Let us start creating a few records.
-
-First let us create a new Article:
-
-
-
-Here you will see that the DocType you had created has been rendered as a form. The validations and other rules will also apply as designed. Let us fill out one Article.
-
-
-
-You can also add an image.
-
-
-
-Now let us create a new member:
-
-
-
-After this, let us create a new membership record for the member.
-
-Here if you remember we had set the values of Member First Name and Member Last Name to be directly fetched from the Member records and as soon as you will select the member id, the names will be updated.
-
-
-
-As you can see that the date is formatted as year-month-day which is a system format. To set / change date, time and number formats, go to
-
-> Setup > Settings > System Settings
-
-
-
-{next}
diff --git a/frappe/docs/user/zh/tutorial/web-views.md b/frappe/docs/user/zh/tutorial/web-views.md
deleted file mode 100755
index 1affecea77..0000000000
--- a/frappe/docs/user/zh/tutorial/web-views.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Web Views
-
-Frappe has two main user environments, the Desk and Web. Desk is a controlled UI environment with a rich AJAX application and the web is more traditional HTML templates served for public consumption. Web views can also be generated to create more controlled views for users who may login but still do not have access to the Desk.
-
-In Frappe, Web Views are managed by templates and they are usually in the `templates` folder. There are 2 main types of templates.
-
-1. Pages: These are Jinja templates where a single view exists for a single web route e.g. `/blog`.
-2. Generators: These are templates where each instance of a DocType has a separate web route `/blog/a-blog`, `blog/b-blog` etc.
-3. Lists and Views: These are standard lists and views with the route `[doctype]/[name]` and are rendered based on permission.
-
-### Standard Web Views
-
-> This features is still under development.
-
-Let us look at the standard Web Views:
-
-If you are logged in as the test user, go to `/article` and you should see the list of articles:
-
-
-
-Click on one article and you will see the default web view
-
-
-
-Now if you want to make a better list view for the article, drop a file called `row_template.html` in the
-`library_management/templates/includes/list/` folder. Here is an example file:
-
- {% raw %}
-
-
-
-
-
-
- {{ doc.article_name }}
- {{ doc.author }}
- {{ (doc.description[:200] + "...")
- if doc.description|len > 200 else doc.description }}
- Publisher: {{ doc.publisher }}
-
- {% endraw %}
-
-
-Here, you will get all the properties of the article in the `doc` object.
-
-The updated list view looks like this!
-
-
-
-#### Home Page
-
-Frappe also has a built-in signup workflow which also includes 3rd party signups via Google, Facebook and GitHub. When a user signs up on the web, she does not have access to the desk interface by default.
-
-> To allow user access into the Desk, open set the user from Setup > User and set the User Type as "System User"
-
-Now for the non system users, we can set a home page when they login via `hooks.py` based on the role.
-
-To when library members sign in, they must be redirected to the `article` page, to set this open `library_management/hooks.py` and add this:
-
- role_home_page = {
- "Library Member": "article"
- }
-
-{next}
diff --git a/frappe/docs/user/zh/videos/__init__.py b/frappe/docs/user/zh/videos/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/docs/user/zh/videos/index.md b/frappe/docs/user/zh/videos/index.md
deleted file mode 100755
index 07f718e172..0000000000
--- a/frappe/docs/user/zh/videos/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Frappe 框架视频教程
-
-这里的10部视频教程,将教你如何在 Frappe 下构建复杂的应用
-
-必备条件: 在你开始该教程前,你必须对 Python、Javascript 以及 MySQL 有一定的了解。
-
----
-
-
\ No newline at end of file
diff --git a/frappe/hooks.py b/frappe/hooks.py
index 0d6ace3cd0..fa1b45f298 100755
--- a/frappe/hooks.py
+++ b/frappe/hooks.py
@@ -12,9 +12,10 @@ source_link = "https://github.com/frappe/frappe"
app_license = "MIT"
develop_version = '11.x.x-develop'
-
app_email = "info@frappe.io"
+docs_app = "frappe_io"
+
before_install = "frappe.utils.install.before_install"
after_install = "frappe.utils.install.after_install"
diff --git a/frappe/utils/help.py b/frappe/utils/help.py
index cfba8a05a5..b3f09d7a8f 100644
--- a/frappe/utils/help.py
+++ b/frappe/utils/help.py
@@ -157,12 +157,19 @@ class HelpDatabase(object):
apps = os.listdir('../apps') if self.global_help_setup else frappe.get_installed_apps()
for app in apps:
- docs_folder = '../apps/{app}/{app}/docs/user'.format(app=app)
- self.out_base_path = '../apps/{app}/{app}/docs'.format(app=app)
+ # Expect handling of cloning docs apps in bench
+ docs_app = frappe.get_hooks('docs_app', app, app)[0]
+
+ web_folder = 'www/' if docs_app != app else ''
+
+ docs_folder = '../apps/{docs_app}/{docs_app}/{web_folder}docs/user'.format(
+ docs_app=docs_app, web_folder=web_folder)
+ self.out_base_path = '../apps/{docs_app}/{docs_app}/{web_folder}docs'.format(
+ docs_app=docs_app, web_folder=web_folder)
if os.path.exists(docs_folder):
app_name = getattr(frappe.get_module(app), '__title__', None) or app.title()
- doc_contents += '{app_name} '.format(
- app=app, app_name=app_name)
+ doc_contents += '{app_name} '.format(
+ docs_app=docs_app, app_name=app_name)
for basepath, folders, files in os.walk(docs_folder):
files = self.reorder_files(files)
@@ -172,7 +179,7 @@ class HelpDatabase(object):
with io.open(fpath, 'r', encoding = 'utf-8') as f:
try:
content = frappe.render_template(f.read(),
- {'docs_base_url': '/assets/{app}_docs'.format(app=app)})
+ {'docs_base_url': '/assets/{docs_app}_docs'.format(docs_app=docs_app)})
relpath = self.get_out_path(fpath)
relpath = relpath.replace("user", app)
@@ -216,7 +223,6 @@ class HelpDatabase(object):
target = path.split('/', 3)[-1]
app_name = path.split('/', 3)[2]
- html += get_improve_page_html(app_name, target)
soup = BeautifulSoup(html, 'html.parser')