Revision: 4abddb3833
Edited Server Script
@@ -1 +1,207 @@
-No Content
+**A Server Script lets you dynamically define a Python Script that is executed on the server on a document event or API**
+
+> Introduced in Version 12
+
+1\. How to create a Server Script [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#1-how-to-create-a-server-script)
+-------------------------------------------------------------------------------------------------------------------------------------------------------
+
+To create a Server Script
+
+1. If your site is being hosted on [t](https://erpnext.com/)echoerp.in, contact support to activate Server Script. In the case of self-hosted accounts, set `server_script_enabled` as true in site\_config.json of your site.
+2. To add/edit Server Script, ensure your role is System Manager.
+3. Create a new server script via "New Server Script" in the toolbar.
+4. Select the type of server script: Document Event, API, Permission Query.
+5. Set the document type and event name, or method name, script and save.
+
+2\. Features [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#2-features)
+-------------------------------------------------------------------------------------------------------------
+
+### 2.1 Enabling Server Script [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#21-enabling-server-script)
+
+Server script must be enabled via site\_config.json
+
+bench --site site1.local set-config server\_script\_enabled true
+
+### 2.2 Document Events [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#22-document-events)
+
+For scripts that are to be called via document events, you must set the Reference Document Type and Event Name to define the trigger
+
+1. Before Insert
+2. Before Save
+3. After Save
+4. Before Submit
+5. After Submit
+6. Before Cancel
+7. After Cancel
+8. Before Delete
+9. After Delete
+10. Before Save (Submitted Document)
+11. After Save (Submitted Document)
+
+### 2.3 API Scripts [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#23-api-scripts)
+
+You can create a new API that can be accessed via `api/method/[methodname]` by the script type "API"
+
+If you want the guest user to access the API, you must check on "Allow Guest"
+
+The response can be set via `frappe.response["message"]` object
+
+### 2.4 Permission Query [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#24-permission-query)
+
+This type of script allows you to add custom conditions in where clause for a DocType list query.
+
+For example, let's say you want to show the list of ToDo records to a user only if they assigned the record or it was assigned to them. This can implemented by the following script:
+
+conditions = 'owner = {user} or assigned\_by = {user}'.format(user=frappe.db.escape(user))
+
+Now, the list view of ToDo will show restricted records. This will also restrict the results shown in Link fields.
+
+### 2.5 Security [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#25-security)
+
+Frappe Framework uses the RestrictedPython library to restrict access to methods available for server scripts. Only the safe methods, listed below are available in server scripts
+
+json # json moduledict # internal dict
+
+\_ # translator method
+
+\_dict # frappe.\_dict internal method
+
+frappe.flags # global flags# FORMATTING
+
+frappe.format # frappe.format\_value(value, dict(fieldtype='Currency'))
+
+frappe.format\_value # frappe.format\_value(value, dict(fieldtype='Currency'))
+
+frappe.date\_format # default date format
+
+frappe.format\_date # returns date as "1st September 2019"# SESSION
+
+frappe.form\_dict # form / request parameters
+
+frappe.request # request object
+
+frappe.response # response object
+
+frappe.session.user # current user
+
+frappe.session.csrf\_token # CSRF token of the current session
+
+frappe.user # current user
+
+frappe.get\_fullname # fullname of the current user
+
+frappe.get\_gravatar # frappe.utils.get\_gravatar\_url
+
+frappe.full\_name = # fullname of the current user# ORM
+
+frappe.get\_meta # get metadata object
+
+frappe.get\_doc
+
+frappe.get\_cached\_doc
+
+frappe.get\_list
+
+frappe.get\_all
+
+frappe.get\_system\_settings
+
+
+
+\# DB
+
+frappe.db.get\_list
+
+frappe.db.get\_all
+
+frappe.db.get\_value
+
+frappe.db.get\_single\_value
+
+frappe.db.get\_default
+
+frappe.db.escape
+
+frappe.db.commit
+
+
+
+\# UTILITIES
+
+frappe.msgprint # msgprint
+
+frappe.get\_hooks # app hooks
+
+frappe.utils # methods in frappe.utils
+
+frappe.render\_template # frappe.render\_template,
+
+frappe.get\_url # frappe.utils.get\_url
+
+frappe.sendmail # send email via server script
+
+frappe.get\_print # get pdf for a doc
+
+frappe.attach\_print # attach PDF to an email
+
+socketio\_port # port for socketio
+
+style.border\_color # '#d1d8dd'
+
+guess\_mimetype = mimetypes.guess\_type,
+
+html2text = html2text,
+
+dev\_server # True if in developer mode# CACHE
+
+frappe.cache.set\_value
+
+frappe.cache.get\_value
+
+frappe.cache.hset
+
+frappe.cache.hget
+
+3\. Examples [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#3-examples)
+-------------------------------------------------------------------------------------------------------------
+
+### 3.1 Change the value of a property before change [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#31-change-the-value-of-a-property-before-change)
+
+Script Type: Before Save
+
+if "test" in doc.description:
+
+ doc.status = 'Closed'
+
+### 3.2 Custom validation [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#32-custom-validation)
+
+Script Type: "Before Save"
+
+if "validate" in doc.description:
+
+ raise frappe.ValidationError
+
+### 3.3. Auto Create To Do [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#33-auto-create-to-do)
+
+Script Type: "After Save"
+
+if doc.allocated\_to:
+
+ frappe.get\_doc(dict(
+
+ doctype = 'ToDo'
+
+ owner = doc.allocated\_to,
+
+ description = doc.subject
+
+ )).insert()
+
+### 3.4 API [](https://docs.erpnext.com/docs/v13/user/manual/en/customize-erpnext/server-script#34-api)
+
+1. Script Type: API
+2. Method Name: `test_method`
+
+frappe.response\['message'\] = "hello"
+
+Request: `/api/method/test_method`