From a66845036b924a8f236abd0e967a8db6c026c702 Mon Sep 17 00:00:00 2001 From: Makarand Bauskar Date: Thu, 27 Jul 2017 09:01:48 +0530 Subject: [PATCH 01/52] [minor] revert enable all roles (#3790) --- frappe/utils/install.py | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/frappe/utils/install.py b/frappe/utils/install.py index ad08a0f2a5..a483487fc5 100644 --- a/frappe/utils/install.py +++ b/frappe/utils/install.py @@ -110,7 +110,6 @@ def before_tests(): "timezone" :"America/New_York", "currency" :"USD" }) - enable_all_roles_and_domains() frappe.db.commit() frappe.clear_cache() @@ -153,26 +152,4 @@ def add_country_and_currency(name, country): "smallest_currency_fraction_value": country.smallest_currency_fraction_value, "number_format": country.number_format, "docstatus": 0 - }).db_insert() - -def enable_all_roles_and_domains(): - """ enable all roles and domain for testing """ - roles = frappe.get_list("Role", filters={"disabled": 1}) - for role in roles: - _role = frappe.get_doc("Role", role.get("name")) - _role.disabled = 0 - _role.flags.ignore_mandatory = True - _role.flags.ignore_permissions = True - _role.save() - - domains = frappe.get_list("Domain") - if not domains: - return - - domain_settigns = frappe.get_doc("Domain Settings", "Domain Settings") - domain_settigns.set("active_domains", []) - for domain in domains: - row = domain_settigns.append("active_domains", {}) - row.domain=domain.get("name") - - domain_settigns.save() \ No newline at end of file + }).db_insert() \ No newline at end of file From bc8044c4e085b6fc3a8b65db2cd4266fcb621252 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 20 Jul 2017 17:48:24 +0530 Subject: [PATCH 02/52] [fix] no breadcrumbs in update-password --- frappe/public/less/website.less | 2 +- frappe/www/update_password.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/less/website.less b/frappe/public/less/website.less index 55b70f2d86..a9d80cc494 100644 --- a/frappe/public/less/website.less +++ b/frappe/public/less/website.less @@ -689,7 +689,7 @@ li.footer-child-item { margin: 70px auto; border: 1px solid @border-color; border-radius: 4px; - background-color: #fff; + background-color: #fff; box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.1); .page-card-head { diff --git a/frappe/www/update_password.py b/frappe/www/update_password.py index 5ed7ad913d..7dc23cd494 100644 --- a/frappe/www/update_password.py +++ b/frappe/www/update_password.py @@ -8,4 +8,5 @@ no_sitemap = 1 no_cache = 1 def get_context(context): + context.no_breadcrumbs = True context.parents = [{"name":"me", "title":_("My Account")}] From 25dcdd24623e350a14e2eb2a96085859c4d4aea0 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 24 Jul 2017 11:52:18 +0530 Subject: [PATCH 03/52] [minor] add clear in msgpring --- frappe/public/js/frappe/ui/messages.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index 761f87a202..35f3e93f8a 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -137,11 +137,16 @@ frappe.msgprint = function(msg, title) { data.message = ''; } - if(data.message.search(/
|

|

  • /)==-1) + if(data.message.search(/
    |

    |

  • /)==-1) { msg = replace_newlines(data.message); + } - - var msg_exists = msg_dialog.msg_area.html(); + if(data.clear) { + msg_dialog.msg_area.empty(); + var msg_exists = false; + } else { + var msg_exists = msg_dialog.msg_area.html(); + } if(data.title || !msg_exists) { // set title only if it is explicitly given From 377f233ca46da8f1172f4ca2f46e22c846a1e53a Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Wed, 26 Jul 2017 22:54:50 -0700 Subject: [PATCH 04/52] Allow workflow state and status in listview (#3757) * Allow workflow state and status in listview * Clear trailing blankspace * Fixed bug when missing override_status * Commonized duplicate code --- frappe/public/js/frappe/list/list_renderer.js | 10 ++++++---- frappe/public/js/frappe/model/indicator.js | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/list/list_renderer.js b/frappe/public/js/frappe/list/list_renderer.js index 02940e1bec..1a6b6aa07c 100644 --- a/frappe/public/js/frappe/list/list_renderer.js +++ b/frappe/public/js/frappe/list/list_renderer.js @@ -405,7 +405,7 @@ frappe.views.ListRenderer = Class.extend({ }, get_indicator_html: function (doc) { - var indicator = frappe.get_indicator(doc, this.doctype); + var indicator = this.get_indicator_from_doc(doc); if (indicator) { return ` @@ -414,15 +414,17 @@ frappe.views.ListRenderer = Class.extend({ } return ''; }, - get_indicator_dot: function (doc) { - var indicator = frappe.get_indicator(doc, this.doctype); + var indicator = this.get_indicator_from_doc(doc); if (!indicator) { return ''; } return ``; }, - + get_indicator_from_doc: function (doc) { + var workflow = frappe.workflow.workflows[this.doctype]; + return frappe.get_indicator(doc, this.doctype, (workflow && workflow['override_status']) || true); + }, prepare_data: function (data) { if (data.modified) this.prepare_when(data, data.modified); diff --git a/frappe/public/js/frappe/model/indicator.js b/frappe/public/js/frappe/model/indicator.js index d033b3e8c9..d4c0807d7c 100644 --- a/frappe/public/js/frappe/model/indicator.js +++ b/frappe/public/js/frappe/model/indicator.js @@ -14,7 +14,7 @@ frappe.has_indicator = function(doctype) { return false; } -frappe.get_indicator = function(doc, doctype) { +frappe.get_indicator = function(doc, doctype, without_workflow = true) { if(doc.__unsaved) { return [__("Not Saved"), "orange"]; } @@ -27,7 +27,7 @@ frappe.get_indicator = function(doc, doctype) { workflow_fieldname = frappe.workflow.get_state_fieldname(doctype); // workflow - if(workflow_fieldname) { + if(workflow_fieldname && !without_workflow) { var value = doc[workflow_fieldname]; if(value) { var colour = ""; From d56fbaba41c6e244fe4a1de6fb8a93c16bef06c9 Mon Sep 17 00:00:00 2001 From: omkarghaisas Date: Thu, 27 Jul 2017 11:32:40 +0530 Subject: [PATCH 05/52] Third party apps portal (#3782) * Added third party apps portal page stub * [WIP] third party apps portal page * Added portal page third party apps Added page to manage OAuth 2.0 active sessions * [Fix] Typo me.html * frappe/www/third_party_apps. * [Fix] Added column for last log in --- .../includes/integrations/third_party_apps.js | 9 +++ frappe/www/me.html | 6 +- frappe/www/third_party_apps.html | 66 +++++++++++++++++++ frappe/www/third_party_apps.py | 53 +++++++++++++++ 4 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 frappe/templates/includes/integrations/third_party_apps.js create mode 100644 frappe/www/third_party_apps.html create mode 100644 frappe/www/third_party_apps.py diff --git a/frappe/templates/includes/integrations/third_party_apps.js b/frappe/templates/includes/integrations/third_party_apps.js new file mode 100644 index 0000000000..fe75f23db9 --- /dev/null +++ b/frappe/templates/includes/integrations/third_party_apps.js @@ -0,0 +1,9 @@ +frappe.ready(() => { + $(".btn-delete-app").on("click", function(event) { + frappe.call({ + method:"frappe.www.third_party_apps.delete_client", + args: {"client_id": $(this).data("client_id"), + } + }).done(r => location.href="/third_party_apps"); + }); +}); diff --git a/frappe/www/me.html b/frappe/www/me.html index 1397eb9437..593fefc012 100644 --- a/frappe/www/me.html +++ b/frappe/www/me.html @@ -18,10 +18,12 @@
  • {{ _("Reset Password") }}
  • -
  • +
  • {{ _("Edit Profile") }}
  • - +
  • +
    {{ _("Manage Third Party Apps") }}
    +
  • diff --git a/frappe/www/third_party_apps.html b/frappe/www/third_party_apps.html new file mode 100644 index 0000000000..baf62fa641 --- /dev/null +++ b/frappe/www/third_party_apps.html @@ -0,0 +1,66 @@ +{% extends "templates/web.html" %} + +{% block title %} {{ _("Third Party Apps") }} {% endblock %} +{% block header %} +

    {{ _("Third Party Apps") }}

    +{% endblock %} + +{% block page_sidebar %} +{% include "templates/pages/web_sidebar.html" %} +{% endblock %} + +{% block style %} +{% endblock %} + +{% block page_content %} + + + +
    + +{% if app %} +

    {{ app.app_name }}

    +
    +
    +
    +
    +
    {{ _("This will log out {0} from all other devices".format(app.app_name)) }}
    +
    +
    + + +
    +
    +
    +
    +
    +{% elif apps|length > 0 %} +

    {{ _("Active Sessions") }}

    + {% for app in apps %} +
    +
    +
    + {{ app.app_name }} +
    +
    + + {{ _("logged in") }} {{ frappe.utils.pretty_date(app.creation) }} + +
    + +
    +
    + {% endfor %} +{% else %} +
    + {{ _("No Active Sessions")}} +
    +{% endif %} +
    + + +{% endblock %} diff --git a/frappe/www/third_party_apps.py b/frappe/www/third_party_apps.py new file mode 100644 index 0000000000..b70f795948 --- /dev/null +++ b/frappe/www/third_party_apps.py @@ -0,0 +1,53 @@ +from __future__ import unicode_literals +import frappe +from frappe import _ +import frappe.www.list + +no_cache = 1 +no_sitemap = 1 + +def get_context(context): + if frappe.session.user == 'Guest': + frappe.throw(_("You need to be logged in to access this page"), frappe.PermissionError) + + active_tokens = frappe.get_all("OAuth Bearer Token", + filters=[["user", "=", frappe.session.user]], + fields=["client"], distinct=True, order_by="creation") + + client_apps = [] + + for token in active_tokens: + creation = get_first_login(token.client) + app = { + "name": token.get("client"), + "app_name": frappe.db.get_value("OAuth Client", token.get("client"), "app_name"), + "creation": creation + } + client_apps.append(app) + + app = None + if (frappe.form_dict.has_key("app")): + app = frappe.get_doc("OAuth Client", frappe.form_dict.app) + app = app.__dict__ + app["client_secret"] = None + + if app: + context.app = app + + context.apps = client_apps + context.show_sidebar = True + +def get_first_login(client): + login_date = frappe.get_all("OAuth Bearer Token", + filters=[["user", "=", frappe.session.user], ["client", "=", client]], + fields=["creation"], order_by="creation", limit=1) + + login_date = login_date[0].get("creation") if login_date and len(login_date) > 0 else None + + return login_date + +@frappe.whitelist() +def delete_client(client_id): + active_client_id_tokens = frappe.get_all("OAuth Bearer Token", filters=[["user", "=", frappe.session.user], ["client","=", client_id]]) + for token in active_client_id_tokens: + frappe.delete_doc("OAuth Bearer Token", token.get("name"), ignore_permissions=True) \ No newline at end of file From 1332710982f9b7242025e9b8506ece004c4eb7dc Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 27 Jul 2017 11:33:31 +0530 Subject: [PATCH 06/52] Email footer (#3784) * Add frappe.preview_email for faster feedback on email design * Set Unsubscribe link color to text-muted * error handling for header * codacy fixes --- frappe/email/email_body.py | 14 ++++++++++++-- frappe/email/queue.py | 2 +- frappe/public/build.json | 1 + frappe/public/js/frappe/misc/preview_email.js | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 frappe/public/js/frappe/misc/preview_email.js diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 7f97a34b4d..80005eef1d 100755 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -251,6 +251,16 @@ def get_formatted_html(subject, message, footer=None, print_html=None, email_acc transformed_html = inline_style_in_html(sanitized_html) return transformed_html +@frappe.whitelist() +def get_email_html(template, args, subject, header=None): + import json + + args = json.loads(args) + if header and header.startswith('['): + header = json.loads(header) + email = frappe.utils.jinja.get_email_from_template(template, args) + return get_formatted_html(subject, email[0], header=header) + def inline_style_in_html(html): ''' Convert email.css and html to inline-styled html ''' @@ -334,8 +344,6 @@ def get_footer(email_account, footer=None): if email_account and email_account.footer: footer += '
    {0}
    '.format(email_account.footer) - footer += "" - company_address = frappe.db.get_default("email_footer_address") if company_address: @@ -347,6 +355,8 @@ def get_footer(email_account, footer=None): .format(x) footer += "" + footer += "" + if not cint(frappe.db.get_default("disable_standard_email_footer")): for default_mail_footer in frappe.get_hooks("default_mail_footer"): footer += '
    {0}
    '.format(default_mail_footer) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index e5630bc88e..ed7337bd93 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -236,7 +236,7 @@ def get_unsubscribe_message(unsubscribe_message, expose_recipients): html = """

    - " style="color: #8d99a6; text-decoration: underline;" target="_blank">{unsubscribe_message}

    diff --git a/frappe/public/build.json b/frappe/public/build.json index 3fafb6c5f2..433631c0a9 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -132,6 +132,7 @@ "public/js/frappe/misc/help.js", "public/js/frappe/misc/help_links.js", "public/js/frappe/misc/address_and_contact.js", + "public/js/frappe/misc/preview_email.js", "public/js/frappe/ui/upload.html", "public/js/frappe/upload.js", diff --git a/frappe/public/js/frappe/misc/preview_email.js b/frappe/public/js/frappe/misc/preview_email.js new file mode 100644 index 0000000000..b3e3bfddce --- /dev/null +++ b/frappe/public/js/frappe/misc/preview_email.js @@ -0,0 +1,16 @@ +frappe.preview_email = function(template, args, header) { + frappe.call({ + method: 'frappe.email.email_body.get_email_html', + args: { + subject: 'Test', + template, + args, + header + } + }).then((r) => { + var html = r.message; + html = html.replace(/embed=/, 'src='); + var d = frappe.msgprint(html); + d.$wrapper.find('.modal-dialog').css('width', '70%'); + }); +}; From aef98daae42b1316ab7bc19efb1cc421ee25ef78 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 27 Jul 2017 11:34:44 +0530 Subject: [PATCH 07/52] [add] catch errors flake8 (#3800) --- .travis.yml | 3 +++ .../{controller.py => controller._py} | 0 ...test_controller.py => test_controller._py} | 0 frappe/core/doctype/doctype/doctype.py | 4 ++-- frappe/core/doctype/domain/domain.json | 4 ++-- frappe/core/doctype/domain/test_domain.js | 23 +++++++++++++++++++ frappe/core/doctype/has_role/has_role.py | 5 ++-- frappe/email/doctype/newsletter/newsletter.py | 3 +-- .../gsuite_settings/gsuite_settings.py | 2 +- frappe/modules/utils.py | 2 ++ 10 files changed, 36 insertions(+), 10 deletions(-) rename frappe/core/doctype/doctype/boilerplate/{controller.py => controller._py} (100%) rename frappe/core/doctype/doctype/boilerplate/{test_controller.py => test_controller._py} (100%) create mode 100644 frappe/core/doctype/domain/test_domain.js diff --git a/.travis.yml b/.travis.yml index 1551f17ec5..2a60d20c6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,9 @@ services: - mysql install: + - pip install flake8 # pytest + # stop the build if there are Python syntax errors or undefined names + - flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics - sudo rm /etc/apt/sources.list.d/docker.list - sudo apt-get purge -y mysql-common mysql-server mysql-client - nvm install v7.10.0 diff --git a/frappe/core/doctype/doctype/boilerplate/controller.py b/frappe/core/doctype/doctype/boilerplate/controller._py similarity index 100% rename from frappe/core/doctype/doctype/boilerplate/controller.py rename to frappe/core/doctype/doctype/boilerplate/controller._py diff --git a/frappe/core/doctype/doctype/boilerplate/test_controller.py b/frappe/core/doctype/doctype/boilerplate/test_controller._py similarity index 100% rename from frappe/core/doctype/doctype/boilerplate/test_controller.py rename to frappe/core/doctype/doctype/boilerplate/test_controller._py diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 2e13e64f57..40207a24dd 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -330,10 +330,10 @@ class DocType(Document): def make_controller_template(self): """Make boilerplate controller template.""" - make_boilerplate("controller.py", self) + make_boilerplate("controller._py", self) if not (self.istable or self.issingle): - make_boilerplate("test_controller.py", self.as_dict()) + make_boilerplate("test_controller._py", self.as_dict()) if not self.istable: make_boilerplate("controller.js", self.as_dict()) diff --git a/frappe/core/doctype/domain/domain.json b/frappe/core/doctype/domain/domain.json index 35b68d0714..f257d02ae8 100644 --- a/frappe/core/doctype/domain/domain.json +++ b/frappe/core/doctype/domain/domain.json @@ -26,7 +26,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Domain", "length": 0, @@ -54,7 +54,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-16 13:03:25.430679", + "modified": "2017-07-26 21:29:00.353105", "modified_by": "Administrator", "module": "Core", "name": "Domain", diff --git a/frappe/core/doctype/domain/test_domain.js b/frappe/core/doctype/domain/test_domain.js new file mode 100644 index 0000000000..6d8bd8039d --- /dev/null +++ b/frappe/core/doctype/domain/test_domain.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Domain", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially('Domain', [ + // insert a new Domain + () => frappe.tests.make([ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/frappe/core/doctype/has_role/has_role.py b/frappe/core/doctype/has_role/has_role.py index 44c27098d9..45e76c85a1 100644 --- a/frappe/core/doctype/has_role/has_role.py +++ b/frappe/core/doctype/has_role/has_role.py @@ -7,7 +7,6 @@ import frappe from frappe.model.document import Document class HasRole(Document): - def validate(self): - if cint(self.get("__islocal")) and frappe.db.exists("Has Role", { - "parent": self.parent, "role": self.role}): + def before_insert(self): + if frappe.db.exists("Has Role", {"parent": self.parent, "role": self.role}): frappe.throw(frappe._("User '{0}' already has the role '{1}'").format(self.parent, self.role)) diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 29ecbee853..4f4713edbe 100755 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -13,7 +13,6 @@ from frappe.utils.background_jobs import enqueue from frappe.utils.scheduler import log from frappe.email.queue import send from frappe.email.doctype.email_group.email_group import add_subscribers -from frappe.utils.file_manager import get_file from frappe.utils import parse_addr @@ -68,7 +67,7 @@ class Newsletter(Document): files = frappe.get_all("File", fields = ["name"], filters = {"attached_to_doctype": "Newsletter", "attached_to_name":self.name}, order_by="creation desc") - for file in files: + for a in files: try: # these attachments will be attached on-demand # and won't be stored in the message diff --git a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py b/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py index 9b6be3422d..29b1b64897 100644 --- a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py +++ b/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py @@ -17,7 +17,7 @@ class GSuiteSettings(Document): def get_access_token(self): if not self.refresh_token: - raise UserError(_("Google GSuite is not configured.")) + raise frappe.ValidationError(_("Google GSuite is not configured.")) data = { 'client_id': self.client_id, 'client_secret': self.get_password(fieldname='client_secret',raise_exception=False), diff --git a/frappe/modules/utils.py b/frappe/modules/utils.py index 2acb5b5db6..20ff7bb28f 100644 --- a/frappe/modules/utils.py +++ b/frappe/modules/utils.py @@ -206,6 +206,8 @@ def get_app_publisher(module): def make_boilerplate(template, doc, opts=None): target_path = get_doc_path(doc.module, doc.doctype, doc.name) template_name = template.replace("controller", scrub(doc.name)) + if template_name.endswith('._py'): + template_name = template_name[:-4] + '.py' target_file_path = os.path.join(target_path, template_name) if not doc: doc = {} From be60a22365893aad82d6dd474b448e6a2ce01120 Mon Sep 17 00:00:00 2001 From: Utkarsh Goswami Date: Thu, 27 Jul 2017 17:44:54 +0530 Subject: [PATCH 08/52] [UI Test Report] Test for Query Report (#3801) * Updated Test for Query Report * Correct path updated --- .../core/doctype/report/test_query_report.js | 33 +++++++++++++++++++ frappe/tests/ui/tests.txt | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 frappe/core/doctype/report/test_query_report.js diff --git a/frappe/core/doctype/report/test_query_report.js b/frappe/core/doctype/report/test_query_report.js new file mode 100644 index 0000000000..c51884cd21 --- /dev/null +++ b/frappe/core/doctype/report/test_query_report.js @@ -0,0 +1,33 @@ +// Test for creating query report +QUnit.test("Test Query Report", function(assert){ + assert.expect(2); + let done = assert.async(); + let random = 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), + () => frappe.quick_entry.insert(), + () => { + return frappe.tests.make('Report', [ + {report_name: 'ToDo List Report'}, + {report_type: 'Query Report'}, + {ref_doctype: 'ToDo'} + ]); + }, + () => frappe.set_route('Form','Report', 'ToDo List Report'), + + //Query + () => cur_frm.set_value('query','select description,owner,status from `tabToDo`'), + () => cur_frm.save(), + () => frappe.set_route('query-report','ToDo List Report'), + () => frappe.timeout(5), + () => { + assert.ok($('div.slick-header-column').length == 4,'Correct numbers of columns visible'); + //To check if the result is present + assert.ok($('div.r1:contains('+random+')').is(':visible'),'Result is visible in report'); + frappe.timeout(3); + }, + () => done() + ]); +}); diff --git a/frappe/tests/ui/tests.txt b/frappe/tests/ui/tests.txt index ce0c91c77e..aeb562f76e 100644 --- a/frappe/tests/ui/tests.txt +++ b/frappe/tests/ui/tests.txt @@ -6,4 +6,5 @@ frappe/tests/ui/test_calendar_view.js frappe/tests/ui/test_kanban/test_kanban_creation.js frappe/tests/ui/test_kanban/test_kanban_view.js frappe/tests/ui/test_kanban/test_kanban_filters.js -frappe/tests/ui/test_kanban/test_kanban_column.js \ No newline at end of file +frappe/tests/ui/test_kanban/test_kanban_column.js +frappe/core/doctype/report/test_query_report.js \ No newline at end of file From 3f93565553f0e64c243671d7a7698d363348be0f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 27 Jul 2017 17:51:20 +0530 Subject: [PATCH 09/52] Email designs (#3786) * New message email * Mentioned in a comment * File backup email * Feedback email * Administrator logged in email * Upcoming events email * minor * Add header title and indicator color --- frappe/core/doctype/communication/comment.py | 15 +++++----- .../feedback_trigger/feedback_trigger.py | 10 +++++-- frappe/core/doctype/user/user.py | 30 ++++++++----------- frappe/desk/doctype/event/event.py | 20 +++++++------ frappe/desk/page/backups/backups.py | 11 +++++-- frappe/desk/page/chat/chat.py | 9 ++++-- frappe/public/css/email.css | 3 ++ frappe/public/less/email.less | 4 +++ .../emails/administrator_logged_in.html | 3 ++ .../emails/feedback_request_url.html | 2 +- frappe/templates/emails/new_message.html | 6 ++-- frappe/templates/emails/upcoming_events.html | 9 ++++++ frappe/utils/jinja.py | 4 +-- 13 files changed, 78 insertions(+), 48 deletions(-) create mode 100644 frappe/templates/emails/administrator_logged_in.html create mode 100644 frappe/templates/emails/upcoming_events.html diff --git a/frappe/core/doctype/communication/comment.py b/frappe/core/doctype/communication/comment.py index 96c3e59d84..b5f0f141bc 100644 --- a/frappe/core/doctype/communication/comment.py +++ b/frappe/core/doctype/communication/comment.py @@ -82,12 +82,7 @@ def notify_mentions(doc): sender_fullname = get_fullname(frappe.session.user) parent_doc_label = "{0} {1}".format(_(doc.reference_doctype), doc.reference_name) - subject = _("{0} mentioned you in a comment in {1}").format(sender_fullname, parent_doc_label) - message = frappe.get_template("templates/emails/mentioned_in_comment.html").render({ - "sender_fullname": sender_fullname, - "comment": doc, - "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label) - }) + subject = _("{0} mentioned you in a comment").format(sender_fullname) recipients = [frappe.db.get_value("User", {"enabled": 1, "username": username, "user_type": "System User"}) for username in mentions] @@ -96,7 +91,13 @@ def notify_mentions(doc): recipients=recipients, sender=frappe.session.user, subject=subject, - message=message + template="mentioned_in_comment", + args={ + "sender_fullname": sender_fullname, + "comment": doc, + "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label) + }, + header=[_('New Mention'), 'orange'] ) def get_comments_from_parent(doc): diff --git a/frappe/core/doctype/feedback_trigger/feedback_trigger.py b/frappe/core/doctype/feedback_trigger/feedback_trigger.py index 6b9ca3e46a..e40f668d58 100644 --- a/frappe/core/doctype/feedback_trigger/feedback_trigger.py +++ b/frappe/core/doctype/feedback_trigger/feedback_trigger.py @@ -66,12 +66,16 @@ def send_feedback_request(reference_doctype, reference_name, trigger="Manual", d feedback_request, url = get_feedback_request_url(reference_doctype, reference_name, details.get("recipients"), trigger) - feedback_url = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url }) + feedback_msg = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url }) # appending feedback url to message body - details.update({ "message": "{message}{feedback_url}".format( + message = "{message}{feedback_msg}".format( message=details.get("message"), - feedback_url=feedback_url) + feedback_msg=feedback_msg + ) + details.update({ + "message": message, + "header": [details.get('subject'), 'blue'] }) if details: diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index da08997456..61324618eb 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -858,25 +858,21 @@ def notify_admin_access_to_system_manager(login_manager=None): and login_manager.user == "Administrator" and frappe.local.conf.notify_admin_access_to_system_manager): - message = """

    - {dear_system_manager}

    - {access_message}

    - {is_it_unauthorized} -

    """.format( - dear_system_manager=_("Dear System Manager,"), - - access_message=_("""Administrator accessed {0} on {1} via IP Address {2}.""").format( - """{site}""".format(site=frappe.local.request.host_url), - """{date_and_time}""".format(date_and_time=format_datetime(now_datetime(), format_string="medium")), - frappe.local.request_ip - ), - - is_it_unauthorized=_("If you think this is unauthorized, please change the Administrator password.") + site = '{0}'.format(frappe.local.request.host_url) + date_and_time = '{0}'.format(format_datetime(now_datetime(), format_string="medium")) + ip_address = frappe.local.request_ip + + access_message = _('Administrator accessed {0} on {1} via IP Address {2}.').format( + site, date_and_time, ip_address) + + frappe.sendmail( + recipients=get_system_managers(), + subject=_("Administrator Logged In"), + template="administrator_logged_in", + args={'access_message': access_message}, + header=[subject, 'orange'] ) - frappe.sendmail(recipients=get_system_managers(), subject=_("Administrator Logged In"), - message=message) - def extract_mentions(txt): """Find all instances of @username in the string. The mentions will be separated by non-word characters or may appear at the start of the string""" diff --git a/frappe/desk/doctype/event/event.py b/frappe/desk/doctype/event/event.py index 66701c9c5a..b77b708ae6 100644 --- a/frappe/desk/doctype/event/event.py +++ b/frappe/desk/doctype/event/event.py @@ -7,7 +7,7 @@ import frappe import json from frappe.utils import (getdate, cint, add_months, date_diff, add_days, - nowdate, get_datetime_str, cstr, get_datetime, now_datetime) + nowdate, get_datetime_str, cstr, get_datetime, now_datetime, format_datetime) from frappe.model.document import Document from frappe.utils.user import get_enabled_system_users from frappe.desk.reportview import get_filters_cond @@ -48,20 +48,22 @@ def send_event_digest(): for user in get_enabled_system_users(): events = get_events(today, today, user.name, for_reminder=True) if events: - text = "" frappe.set_user_lang(user.name, user.language) - text = "

    " + frappe._("Events In Today's Calendar") + "

    " for e in events: + e.starts_on = format_datetime(e.starts_on, 'hh:mm a') if e.all_day: e.starts_on = "All Day" - text += "

    %(starts_on)s: %(subject)s

    %(description)s

    " % e - text += '

    '\ - + frappe._("Daily Event Digest is sent for Calendar Events where reminders are set.")+'

    ' - - frappe.sendmail(recipients=user.email, subject=frappe._("Upcoming Events for Today"), - content = text) + frappe.sendmail( + recipients=user.email, + subject=frappe._("Upcoming Events for Today"), + template="upcoming_events", + args={ + 'events': events, + }, + header=[frappe._("Events in Today's Calendar"), 'blue'] + ) @frappe.whitelist() def get_events(start, end, user=None, for_reminder=False, filters=None): diff --git a/frappe/desk/page/backups/backups.py b/frappe/desk/page/backups/backups.py index f3517c6953..2d493515b7 100644 --- a/frappe/desk/page/backups/backups.py +++ b/frappe/desk/page/backups/backups.py @@ -76,9 +76,14 @@ def backup_files_and_notify_user(user_email=None): backup_files = backup(with_files=True) get_downloadable_links(backup_files) - subject = "File backup is ready" - message = frappe.render_template('frappe/templates/emails/file_backup_notification.html', backup_files, is_path=True) - frappe.sendmail(recipients=[user_email], subject=subject, message=message) + subject = _("File backup is ready") + frappe.sendmail( + recipients=[user_email], + subject=subject, + template="file_backup_notification", + args=backup_files, + header=[subject, 'green'] + ) def get_downloadable_links(backup_files): for key in ['backup_path_files', 'backup_path_private_files']: diff --git a/frappe/desk/page/chat/chat.py b/frappe/desk/page/chat/chat.py index a0ea8b7393..19f4d4cae4 100644 --- a/frappe/desk/page/chat/chat.py +++ b/frappe/desk/page/chat/chat.py @@ -6,6 +6,7 @@ import frappe from frappe.desk.notifications import delete_notification_count_for from frappe.core.doctype.user.user import STANDARD_USERS from frappe.utils import cint +from frappe import _ @frappe.whitelist() def get_list(arg=None): @@ -132,11 +133,13 @@ def _notify(contact, txt, subject=None): frappe.sendmail(\ recipients=contact, sender= frappe.db.get_value("User", frappe.session.user, "email"), - subject=subject or "New Message from " + get_fullname(frappe.session.user), - message=frappe.get_template("templates/emails/new_message.html").render({ + subject=subject or _("New Message from {0}").format(get_fullname(frappe.session.user)), + template="new_message", + args={ "from": get_fullname(frappe.session.user), "message": txt, "link": get_url() - })) + }, + header=[_('New Message'), 'orange']) except frappe.OutgoingEmailError: pass diff --git a/frappe/public/css/email.css b/frappe/public/css/email.css index 3f2df6d15f..57b2033d49 100644 --- a/frappe/public/css/email.css +++ b/frappe/public/css/email.css @@ -121,6 +121,9 @@ hr { .text-small { font-size: 10px; } +.text-bold { + font-weight: bold; +} .indicator { width: 8px; height: 8px; diff --git a/frappe/public/less/email.less b/frappe/public/less/email.less index d4d48482ea..640c300daa 100644 --- a/frappe/public/less/email.less +++ b/frappe/public/less/email.less @@ -152,6 +152,10 @@ hr { font-size: @text-small; } +.text-bold { + font-weight: bold; +} + .indicator { width: 8px; height: 8px; diff --git a/frappe/templates/emails/administrator_logged_in.html b/frappe/templates/emails/administrator_logged_in.html new file mode 100644 index 0000000000..d16034bfd1 --- /dev/null +++ b/frappe/templates/emails/administrator_logged_in.html @@ -0,0 +1,3 @@ +

    {{ _("Dear System Manager,") }}

    +

    {{ access_message }}

    +

    {{ _("If you think this is unauthorized, please change the Administrator password.") }}

    \ No newline at end of file diff --git a/frappe/templates/emails/feedback_request_url.html b/frappe/templates/emails/feedback_request_url.html index b6d4de7f32..e9cec87b4d 100644 --- a/frappe/templates/emails/feedback_request_url.html +++ b/frappe/templates/emails/feedback_request_url.html @@ -5,5 +5,5 @@ -

    {{ _("1 star being lowest & 5 stars being highest rating") }}

    +
    {{ _("1 star being lowest & 5 stars being highest rating") }}
    diff --git a/frappe/templates/emails/new_message.html b/frappe/templates/emails/new_message.html index a4a2ea933d..90f402f51d 100644 --- a/frappe/templates/emails/new_message.html +++ b/frappe/templates/emails/new_message.html @@ -1,5 +1,5 @@ -

    New Message

    You have a new message from: {{ from }}

    {{ message }}

    -
    -

    Login and view in Browser

    + diff --git a/frappe/templates/emails/upcoming_events.html b/frappe/templates/emails/upcoming_events.html new file mode 100644 index 0000000000..8f9482b98d --- /dev/null +++ b/frappe/templates/emails/upcoming_events.html @@ -0,0 +1,9 @@ +{% for e in events %} +

    + {{ e.starts_on }}: {{ e.subject }} +

    {{ e.description or '' }}
    +

    +{% endfor %} +

    + {{ _("Daily Event Digest is sent for Calendar Events where reminders are set.") }} +

    \ No newline at end of file diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 1fd9a0d85c..749a28479f 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -28,8 +28,8 @@ def get_email_from_template(name, args): args = args or {} try: message = get_template('templates/emails/' + name + '.html').render(args) - except TemplateNotFound: - message = None + except TemplateNotFound as e: + raise e try: text_content = get_template('templates/emails/' + name + '.txt').render(args) From e7790b36d214956f64410d58145e7c426daf306d Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 27 Jul 2017 17:52:51 +0530 Subject: [PATCH 10/52] Rich Text Comment Area (#3789) * first cut * frappe.ui.CommentArea * working commit * enable airmode * Styling fixes * Add emoji support in comment * editing wip * Fixed editing area --- frappe/public/build.json | 2 + frappe/public/css/desk.css | 15 + .../js/frappe/form/footer/timeline.html | 15 +- .../public/js/frappe/form/footer/timeline.js | 168 +- frappe/public/js/frappe/ui/comment.js | 192 + frappe/public/js/frappe/ui/emoji.js | 4973 +++++++++++++++++ frappe/public/less/desk.less | 18 + 7 files changed, 5272 insertions(+), 111 deletions(-) create mode 100644 frappe/public/js/frappe/ui/comment.js create mode 100644 frappe/public/js/frappe/ui/emoji.js diff --git a/frappe/public/build.json b/frappe/public/build.json index 433631c0a9..b350c8151a 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -85,6 +85,7 @@ "public/js/frappe/dom.js", "public/js/frappe/ui/messages.js", "public/js/frappe/ui/keyboard.js", + "public/js/frappe/ui/emoji.js", "public/js/frappe/request.js", "public/js/frappe/socketio_client.js", @@ -164,6 +165,7 @@ "public/js/frappe/ui/charts.js", "public/js/frappe/ui/graph.js", + "public/js/frappe/ui/comment.js", "public/js/frappe/misc/rating_icons.html", "public/js/frappe/feedback.js" diff --git a/frappe/public/css/desk.css b/frappe/public/css/desk.css index 8ea2c5650f..bfce576e37 100644 --- a/frappe/public/css/desk.css +++ b/frappe/public/css/desk.css @@ -709,6 +709,21 @@ a.progress-small .progress-bar { .modal .note-editor [data-original-title="Table"] { display: none; } +.note-hint-popover { + border-radius: 3px; + border-color: #d1d8dd; + padding: 0; +} +.note-hint-popover .popover-content { + padding: 0; +} +.note-hint-popover .note-hint-item { + color: #36414C !important; + padding: 5px 8.8px !important; +} +.note-hint-popover .note-hint-item.active { + background-color: #F0F4F7 !important; +} .search-dialog .modal-dialog { width: 768px; } diff --git a/frappe/public/js/frappe/form/footer/timeline.html b/frappe/public/js/frappe/form/footer/timeline.html index 381b540300..f4f56e3371 100644 --- a/frappe/public/js/frappe/form/footer/timeline.html +++ b/frappe/public/js/frappe/form/footer/timeline.html @@ -1,17 +1,6 @@
    -
    -
    - {%= __("Add a comment") %} - -
    -
    - - -
    {{ __("Ctrl+Enter to add comment") }}
    -
    -
    +
    +
    {% if(doctype === "Communication") { %} \
    ').appendTo(me.list); } @@ -161,43 +162,45 @@ frappe.ui.form.Timeline = Class.extend({ .on("click", ".close", function() { var name = $timeline_item.data('name'); me.delete_comment(name); - return false; }) - .on('click', '.edit', function() { - var is_editing = 'is-editing'; - var content = $timeline_item.find('.timeline-item-content'); + .on('click', '.edit', function(e) { + e.preventDefault(); var name = $timeline_item.data('name'); - var update_comment = function() { - var val = content.find('textarea').val(); - // set content to new val so that on save and refresh the new content is shown - c.content = val; - - frappe.timeline.update_communication(c); - me.update_comment(name, val); - - // all changes to the timeline_item for editing are reset after calling refresh - me.refresh(); - } - - if(content.hasClass(is_editing)) { - update_comment(); + if($timeline_item.hasClass('is-editing')) { + me.editing_area.submit(); + me.$editing_area.detach(); } else { var $edit_btn = $(this); - var editing_textarea = me.input.clone() - .removeClass('comment-input'); - - editing_textarea.keydown("meta+return ctrl+return", function(e) { - update_comment(); - }); - - frappe.db.get_value('Communication', {name: name}, 'content', function(r) { - $edit_btn.find('i').removeClass('octicon-pencil').addClass('octicon-check'); - editing_textarea.val(r.content); - content.html(editing_textarea); - content.addClass(is_editing); - }); + var content = $timeline_item.find('.timeline-item-content').html(); + + $edit_btn + .find('i') + .removeClass('octicon-pencil') + .addClass('octicon-check'); + + me.editing_area.setup_summernote(); + me.editing_area.val(content); + me.editing_area.on_submit = (value) => { + me.editing_area.destroy(); + value = value.trim(); + // set content to new val so that on save and refresh the new content is shown + c.content = value; + frappe.timeline.update_communication(c); + me.update_comment(name, value); + // all changes to the timeline_item for editing are reset after calling refresh + me.refresh(); + }; + + $timeline_item + .find('.timeline-item-content') + .hide(); + $timeline_item + .find('.timeline-content-show') + .append(me.$editing_area); + $timeline_item + .addClass('is-editing'); } return false; @@ -295,11 +298,14 @@ frappe.ui.form.Timeline = Class.extend({ } else { c.content_html = c.content; c.content_html = frappe.utils.strip_whitespace(c.content_html); - c.content_html = c.content_html.replace(/</g,"<").replace(/>/g,">") + c.content_html = c.content_html.replace(/</g,"<").replace(/>/g,">"); } // bold @mentions - if(c.comment_type==="Comment") { + if(c.comment_type==="Comment" && + // avoid adding tag a 2nd time + !c.content_html.match(/(^|\W)(@\w+)<\/b>/) + ) { c.content_html = c.content_html.replace(/(^|\W)(@\w+)/g, "$1$2"); } @@ -519,16 +525,8 @@ frappe.ui.form.Timeline = Class.extend({ }; }, - add_comment: function(btn) { - var txt = this.input.val(); - - if(txt) { - this.insert_comment("Comment", txt, btn, this.input); - } - }, - insert_comment: function(comment_type, comment, btn, input) { + insert_comment: function(comment_type, comment, btn) { var me = this; - if(input) input.prop('disabled', true); return frappe.call({ method: "frappe.desk.form.utils.add_comment", args: { @@ -545,8 +543,7 @@ frappe.ui.form.Timeline = Class.extend({ btn: btn, callback: function(r) { if(!r.exc) { - me.input.val(""); - + me.comment_area.val(''); frappe.utils.play_sound("click"); var comment = r.message; @@ -565,9 +562,6 @@ frappe.ui.form.Timeline = Class.extend({ me.frm.get_docinfo().communications = comments.concat([r.message]); me.refresh(true); } - }, - always: function() { - if(input) input.prop('disabled', false); } }); @@ -620,7 +614,9 @@ frappe.ui.form.Timeline = Class.extend({ fieldname: 'content', value: content, }, callback: function(r) { - frappe.utils.play_sound('click'); + if(!r.exc) { + frappe.utils.play_sound('click'); + } } }); }, @@ -655,35 +651,11 @@ frappe.ui.form.Timeline = Class.extend({ return last_email; }, - setup_mentions: function() { - this.setup_awesomplete_for_mentions(); - }, + get_usernames_for_mentions: function() { + var valid_users = Object.keys(frappe.boot.user_info) + .filter(user => !["Administrator", "Guest"].includes(user)); - setup_awesomplete_for_mentions: function() { - var me = this; - var username_user_map = {}; - for (var name in frappe.boot.user_info) { - if(name !== "Administrator" && name !== "Guest") { - var _user = frappe.boot.user_info[name]; - username_user_map[_user.username] = _user; - } - } - var source = Object.keys(username_user_map); - - this.awesomplete = new Awesomplete(this.input.get(0), { - minChars: 0, - maxItems: 99, - autoFirst: true, - list: source, - filter: function(text, input) { - if(input.indexOf("@") === -1) return false; - return Awesomplete.FILTER_STARTSWITH(text, input.match(/[^@]*$/)[0]); - }, - replace: function(text) { - var before = this.input.value.match(/^.*@\s*|/)[0]; - this.input.value = before + text + " "; - } - }); + return valid_users.map(user => frappe.boot.user_info[user].username); }, setup_comment_like: function() { diff --git a/frappe/public/js/frappe/ui/comment.js b/frappe/public/js/frappe/ui/comment.js new file mode 100644 index 0000000000..e37724ddb3 --- /dev/null +++ b/frappe/public/js/frappe/ui/comment.js @@ -0,0 +1,192 @@ +/** + * CommentArea: A small rich text editor with + * support for @mentions and :emojis: + * @example + * let comment_area = new frappe.ui.CommentArea({ + * parent: '.comment-area', + * mentions: ['john', 'mary', 'kate'], + * on_submit: (value) => save_to_database(value) + * }); + */ + +frappe.ui.CommentArea = class CommentArea { + + constructor({ parent = null, mentions = [], on_submit = null, no_wrapper = false }) { + this.parent = $(parent); + this.mentions = mentions; + this.on_submit = on_submit; + this.no_wrapper = no_wrapper; + + this.make(); + } + + make() { + this.setup_dom(); + this.setup_summernote(); + this.bind_events(); + } + + setup_dom() { + const header = !this.no_wrapper ? + `
    + ${__("Add a comment")} + +
    ` : ''; + + const footer = !this.no_wrapper ? + `
    + ${__("Ctrl+Enter to add comment")} +
    ` : ''; + + this.wrapper = $(` +
    + ${ header } +
    +
    + ${ footer } +
    +
    + `); + this.wrapper.appendTo(this.parent); + this.input = this.parent.find('.comment-input'); + this.button = this.parent.find('.btn-comment'); + } + + setup_summernote() { + const { input, button } = this; + + input.summernote({ + height: 100, + toolbar: false, + airMode: true, + hint: { + mentions: this.mentions, + match: /\B([@:]\w*)/, + search: function (keyword, callback) { + let items = []; + if (keyword.startsWith('@')) { + keyword = keyword.substr(1); + items = this.mentions; + } else if (keyword.startsWith(':')) { + items = frappe.ui.emoji_keywords + .filter(k => k.startsWith(keyword)) + .slice(0, 7); + } + callback($.grep(items, function (item) { + return item.indexOf(keyword) == 0; + })); + }, + template: function (item) { + if (item.startsWith(':')) { + return frappe.ui.get_emoji(item) + ' ' + item; + } else { + return item; + } + }, + content: function (item) { + if(item.startsWith(':')) { + return frappe.ui.get_emoji(item); + } else { + return '@' + item; + } + } + }, + callbacks: { + onChange: () => { + if(input.summernote('isEmpty')) { + button + .removeClass('btn-primary') + .addClass('btn-default'); + } else { + button + .removeClass('btn-default') + .addClass('btn-primary'); + } + }, + onKeydown: (e) => { + var key = frappe.ui.keys.get_key(e); + if(key === 'ctrl+enter') { + e.preventDefault(); + this.submit(); + } + e.stopPropagation(); + }, + }, + icons: { + 'align': 'fa fa-align', + 'alignCenter': 'fa fa-align-center', + 'alignJustify': 'fa fa-align-justify', + 'alignLeft': 'fa fa-align-left', + 'alignRight': 'fa fa-align-right', + 'indent': 'fa fa-indent', + 'outdent': 'fa fa-outdent', + 'arrowsAlt': 'fa fa-arrows-alt', + 'bold': 'fa fa-bold', + 'caret': 'caret', + 'circle': 'fa fa-circle', + 'close': 'fa fa-close', + 'code': 'fa fa-code', + 'eraser': 'fa fa-eraser', + 'font': 'fa fa-font', + 'frame': 'fa fa-frame', + 'italic': 'fa fa-italic', + 'link': 'fa fa-link', + 'unlink': 'fa fa-chain-broken', + 'magic': 'fa fa-magic', + 'menuCheck': 'fa fa-check', + 'minus': 'fa fa-minus', + 'orderedlist': 'fa fa-list-ol', + 'pencil': 'fa fa-pencil', + 'picture': 'fa fa-image', + 'question': 'fa fa-question', + 'redo': 'fa fa-redo', + 'square': 'fa fa-square', + 'strikethrough': 'fa fa-strikethrough', + 'subscript': 'fa fa-subscript', + 'superscript': 'fa fa-superscript', + 'table': 'fa fa-table', + 'textHeight': 'fa fa-text-height', + 'trash': 'fa fa-trash', + 'underline': 'fa fa-underline', + 'undo': 'fa fa-undo', + 'unorderedlist': 'fa fa-list-ul', + 'video': 'fa fa-video-camera' + } + }); + + this.note_editor = this.wrapper.find('.note-editor'); + this.note_editor.css({ + 'border': '1px solid #ebeff2', + 'border-radius': '3px', + 'padding': '10px', + 'margin-bottom': '10px', + 'min-height': '80px', + 'cursor': 'text' + }); + this.note_editor.on('click', () => input.summernote('focus')); + } + + destroy() { + this.input.summernote('destroy'); + } + + bind_events() { + this.button.on('click', this.submit.bind(this)); + } + + val(value) { + // Return html if no value specified + if(value === undefined) { + return this.input.summernote('code'); + } + // Set html if value is specified + this.input.summernote('code', value); + } + + submit() { + // Pass comment's value (html) to submit handler + this.on_submit && this.on_submit(this.val()); + } +}; diff --git a/frappe/public/js/frappe/ui/emoji.js b/frappe/public/js/frappe/ui/emoji.js new file mode 100644 index 0000000000..f70fc926cb --- /dev/null +++ b/frappe/public/js/frappe/ui/emoji.js @@ -0,0 +1,4973 @@ +frappe.ui.get_emoji = function(keyword) { + if (!keyword.includes(':')) + keyword = ':' + keyword + ':'; + return frappe.ui.emoji_map[keyword]; +}; + +frappe.ui.emojis = [ + "🀄", + "🃏", + "🅰", + "🅱", + "🅾", + "🅿", + "🆎", + "🆑", + "🆒", + "🆓", + "🆔", + "🆕", + "🆖", + "🆗", + "🆘", + "🆙", + "🆚", + "🇦🇨", + "🇦🇩", + "🇦🇪", + "🇦🇫", + "🇦🇬", + "🇦🇮", + "🇦🇱", + "🇦🇲", + "🇦🇴", + "🇦🇶", + "🇦🇷", + "🇦🇸", + "🇦🇹", + "🇦🇺", + "🇦🇼", + "🇦🇽", + "🇦🇿", + "🇦", + "🇧🇦", + "🇧🇧", + "🇧🇩", + "🇧🇪", + "🇧🇫", + "🇧🇬", + "🇧🇭", + "🇧🇮", + "🇧🇯", + "🇧🇱", + "🇧🇲", + "🇧🇳", + "🇧🇴", + "🇧🇶", + "🇧🇷", + "🇧🇸", + "🇧🇹", + "🇧🇻", + "🇧🇼", + "🇧🇾", + "🇧🇿", + "🇧", + "🇨🇦", + "🇨🇨", + "🇨🇩", + "🇨🇫", + "🇨🇬", + "🇨🇭", + "🇨🇮", + "🇨🇰", + "🇨🇱", + "🇨🇲", + "🇨🇳", + "🇨🇴", + "🇨🇵", + "🇨🇷", + "🇨🇺", + "🇨🇻", + "🇨🇼", + "🇨🇽", + "🇨🇾", + "🇨🇿", + "🇨", + "🇩🇪", + "🇩🇬", + "🇩🇯", + "🇩🇰", + "🇩🇲", + "🇩🇴", + "🇩🇿", + "🇩", + "🇪🇦", + "🇪🇨", + "🇪🇪", + "🇪🇬", + "🇪🇭", + "🇪🇷", + "🇪🇸", + "🇪🇹", + "🇪🇺", + "🇪", + "🇫🇮", + "🇫🇯", + "🇫🇰", + "🇫🇲", + "🇫🇴", + "🇫🇷", + "🇫", + "🇬🇦", + "🇬🇧", + "🇬🇩", + "🇬🇪", + "🇬🇫", + "🇬🇬", + "🇬🇭", + "🇬🇮", + "🇬🇱", + "🇬🇲", + "🇬🇳", + "🇬🇵", + "🇬🇶", + "🇬🇷", + "🇬🇸", + "🇬🇹", + "🇬🇺", + "🇬🇼", + "🇬🇾", + "🇬", + "🇭🇰", + "🇭🇲", + "🇭🇳", + "🇭🇷", + "🇭🇹", + "🇭🇺", + "🇭", + "🇮🇨", + "🇮🇩", + "🇮🇪", + "🇮🇱", + "🇮🇲", + "🇮🇳", + "🇮🇴", + "🇮🇶", + "🇮🇷", + "🇮🇸", + "🇮🇹", + "🇮", + "🇯🇪", + "🇯🇲", + "🇯🇴", + "🇯🇵", + "🇯", + "🇰🇪", + "🇰🇬", + "🇰🇭", + "🇰🇮", + "🇰🇲", + "🇰🇳", + "🇰🇵", + "🇰🇷", + "🇰🇼", + "🇰🇾", + "🇰🇿", + "🇰", + "🇱🇦", + "🇱🇧", + "🇱🇨", + "🇱🇮", + "🇱🇰", + "🇱🇷", + "🇱🇸", + "🇱🇹", + "🇱🇺", + "🇱🇻", + "🇱🇾", + "🇱", + "🇲🇦", + "🇲🇨", + "🇲🇩", + "🇲🇪", + "🇲🇫", + "🇲🇬", + "🇲🇭", + "🇲🇰", + "🇲🇱", + "🇲🇲", + "🇲🇳", + "🇲🇴", + "🇲🇵", + "🇲🇶", + "🇲🇷", + "🇲🇸", + "🇲🇹", + "🇲🇺", + "🇲🇻", + "🇲🇼", + "🇲🇽", + "🇲🇾", + "🇲🇿", + "🇲", + "🇳🇦", + "🇳🇨", + "🇳🇪", + "🇳🇫", + "🇳🇬", + "🇳🇮", + "🇳🇱", + "🇳🇴", + "🇳🇵", + "🇳🇷", + "🇳🇺", + "🇳🇿", + "🇳", + "🇴🇲", + "🇴", + "🇵🇦", + "🇵🇪", + "🇵🇫", + "🇵🇬", + "🇵🇭", + "🇵🇰", + "🇵🇱", + "🇵🇲", + "🇵🇳", + "🇵🇷", + "🇵🇸", + "🇵🇹", + "🇵🇼", + "🇵🇾", + "🇵", + "🇶🇦", + "🇶", + "🇷🇪", + "🇷🇴", + "🇷🇸", + "🇷🇺", + "🇷🇼", + "🇷", + "🇸🇦", + "🇸🇧", + "🇸🇨", + "🇸🇩", + "🇸🇪", + "🇸🇬", + "🇸🇭", + "🇸🇮", + "🇸🇯", + "🇸🇰", + "🇸🇱", + "🇸🇲", + "🇸🇳", + "🇸🇴", + "🇸🇷", + "🇸🇸", + "🇸🇹", + "🇸🇻", + "🇸🇽", + "🇸🇾", + "🇸🇿", + "🇸", + "🇹🇦", + "🇹🇨", + "🇹🇩", + "🇹🇫", + "🇹🇬", + "🇹🇭", + "🇹🇯", + "🇹🇰", + "🇹🇱", + "🇹🇲", + "🇹🇳", + "🇹🇴", + "🇹🇷", + "🇹🇹", + "🇹🇻", + "🇹🇼", + "🇹🇿", + "🇹", + "🇺🇦", + "🇺🇬", + "🇺🇲", + "🇺🇳", + "🇺🇸", + "🇺🇾", + "🇺🇿", + "🇺", + "🇻🇦", + "🇻🇨", + "🇻🇪", + "🇻🇬", + "🇻🇮", + "🇻🇳", + "🇻🇺", + "🇻", + "🇼🇫", + "🇼🇸", + "🇼", + "🇽🇰", + "🇽", + "🇾🇪", + "🇾🇹", + "🇾", + "🇿🇦", + "🇿🇲", + "🇿🇼", + "🇿", + "🈁", + "🈂", + "🈚", + "🈯", + "🈲", + "🈳", + "🈴", + "🈵", + "🈶", + "🈷", + "🈸", + "🈹", + "🈺", + "🉐", + "🉑", + "🌀", + "🌁", + "🌂", + "🌃", + "🌄", + "🌅", + "🌆", + "🌇", + "🌈", + "🌉", + "🌊", + "🌋", + "🌌", + "🌍", + "🌎", + "🌏", + "🌐", + "🌑", + "🌒", + "🌓", + "🌔", + "🌕", + "🌖", + "🌗", + "🌘", + "🌙", + "🌚", + "🌛", + "🌜", + "🌝", + "🌞", + "🌟", + "🌠", + "🌡", + "🌤", + "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", + "🌭", + "🌮", + "🌯", + "🌰", + "🌱", + "🌲", + "🌳", + "🌴", + "🌵", + "🌶", + "🌷", + "🌸", + "🌹", + "🌺", + "🌻", + "🌼", + "🌽", + "🌾", + "🌿", + "🍀", + "🍁", + "🍂", + "🍃", + "🍄", + "🍅", + "🍆", + "🍇", + "🍈", + "🍉", + "🍊", + "🍋", + "🍌", + "🍍", + "🍎", + "🍏", + "🍐", + "🍑", + "🍒", + "🍓", + "🍔", + "🍕", + "🍖", + "🍗", + "🍘", + "🍙", + "🍚", + "🍛", + "🍜", + "🍝", + "🍞", + "🍟", + "🍠", + "🍡", + "🍢", + "🍣", + "🍤", + "🍥", + "🍦", + "🍧", + "🍨", + "🍩", + "🍪", + "🍫", + "🍬", + "🍭", + "🍮", + "🍯", + "🍰", + "🍱", + "🍲", + "🍳", + "🍴", + "🍵", + "🍶", + "🍷", + "🍸", + "🍹", + "🍺", + "🍻", + "🍼", + "🍽", + "🍾", + "🍿", + "🎀", + "🎁", + "🎂", + "🎃", + "🎄", + "🎅🏻", + "🎅🏼", + "🎅🏽", + "🎅🏾", + "🎅🏿", + "🎅", + "🎆", + "🎇", + "🎈", + "🎉", + "🎊", + "🎋", + "🎌", + "🎍", + "🎎", + "🎏", + "🎐", + "🎑", + "🎒", + "🎓", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", + "🎟", + "🎠", + "🎡", + "🎢", + "🎣", + "🎤", + "🎥", + "🎦", + "🎧", + "🎨", + "🎩", + "🎪", + "🎫", + "🎬", + "🎭", + "🎮", + "🎯", + "🎰", + "🎱", + "🎲", + "🎳", + "🎴", + "🎵", + "🎶", + "🎷", + "🎸", + "🎹", + "🎺", + "🎻", + "🎼", + "🎽", + "🎾", + "🎿", + "🏀", + "🏁", + "🏂🏻", + "🏂🏼", + "🏂🏽", + "🏂🏾", + "🏂🏿", + "🏂", + "🏃🏻‍♀️", + "🏃🏻‍♂️", + "🏃🏻", + "🏃🏼‍♀️", + "🏃🏼‍♂️", + "🏃🏼", + "🏃🏽‍♀️", + "🏃🏽‍♂️", + "🏃🏽", + "🏃🏾‍♀️", + "🏃🏾‍♂️", + "🏃🏾", + "🏃🏿‍♀️", + "🏃🏿‍♂️", + "🏃🏿", + "🏃‍♀️", + "🏃‍♂️", + "🏃", + "🏄🏻‍♀️", + "🏄🏻‍♂️", + "🏄🏻", + "🏄🏼‍♀️", + "🏄🏼‍♂️", + "🏄🏼", + "🏄🏽‍♀️", + "🏄🏽‍♂️", + "🏄🏽", + "🏄🏾‍♀️", + "🏄🏾‍♂️", + "🏄🏾", + "🏄🏿‍♀️", + "🏄🏿‍♂️", + "🏄🏿", + "🏄‍♀️", + "🏄‍♂️", + "🏄", + "🏅", + "🏆", + "🏇🏻", + "🏇🏼", + "🏇🏽", + "🏇🏾", + "🏇🏿", + "🏇", + "🏈", + "🏉", + "🏊🏻‍♀️", + "🏊🏻‍♂️", + "🏊🏻", + "🏊🏼‍♀️", + "🏊🏼‍♂️", + "🏊🏼", + "🏊🏽‍♀️", + "🏊🏽‍♂️", + "🏊🏽", + "🏊🏾‍♀️", + "🏊🏾‍♂️", + "🏊🏾", + "🏊🏿‍♀️", + "🏊🏿‍♂️", + "🏊🏿", + "🏊‍♀️", + "🏊‍♂️", + "🏊", + "🏋🏻‍♀️", + "🏋🏻‍♂️", + "🏋🏻", + "🏋🏼‍♀️", + "🏋🏼‍♂️", + "🏋🏼", + "🏋🏽‍♀️", + "🏋🏽‍♂️", + "🏋🏽", + "🏋🏾‍♀️", + "🏋🏾‍♂️", + "🏋🏾", + "🏋🏿‍♀️", + "🏋🏿‍♂️", + "🏋🏿", + "🏋️‍♀️", + "🏋️‍♂️", + "🏋", + "🏌🏻‍♀️", + "🏌🏻‍♂️", + "🏌🏻", + "🏌🏼‍♀️", + "🏌🏼‍♂️", + "🏌🏼", + "🏌🏽‍♀️", + "🏌🏽‍♂️", + "🏌🏽", + "🏌🏾‍♀️", + "🏌🏾‍♂️", + "🏌🏾", + "🏌🏿‍♀️", + "🏌🏿‍♂️", + "🏌🏿", + "🏌️‍♀️", + "🏌️‍♂️", + "🏌", + "🏍", + "🏎", + "🏏", + "🏐", + "🏑", + "🏒", + "🏓", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", + "🏟", + "🏠", + "🏡", + "🏢", + "🏣", + "🏤", + "🏥", + "🏦", + "🏧", + "🏨", + "🏩", + "🏪", + "🏫", + "🏬", + "🏭", + "🏮", + "🏯", + "🏰", + "🏳️‍🌈", + "🏳", + "🏴‍☠️", + "🏴", + "🏵", + "🏷", + "🏸", + "🏹", + "🏺", + "🏻", + "🏼", + "🏽", + "🏾", + "🏿", + "🐀", + "🐁", + "🐂", + "🐃", + "🐄", + "🐅", + "🐆", + "🐇", + "🐈", + "🐉", + "🐊", + "🐋", + "🐌", + "🐍", + "🐎", + "🐏", + "🐐", + "🐑", + "🐒", + "🐓", + "🐔", + "🐕", + "🐖", + "🐗", + "🐘", + "🐙", + "🐚", + "🐛", + "🐜", + "🐝", + "🐞", + "🐟", + "🐠", + "🐡", + "🐢", + "🐣", + "🐤", + "🐥", + "🐦", + "🐧", + "🐨", + "🐩", + "🐪", + "🐫", + "🐬", + "🐭", + "🐮", + "🐯", + "🐰", + "🐱", + "🐲", + "🐳", + "🐴", + "🐵", + "🐶", + "🐷", + "🐸", + "🐹", + "🐺", + "🐻", + "🐼", + "🐽", + "🐾", + "🐿", + "👀", + "👁‍🗨", + "👁", + "👂🏻", + "👂🏼", + "👂🏽", + "👂🏾", + "👂🏿", + "👂", + "👃🏻", + "👃🏼", + "👃🏽", + "👃🏾", + "👃🏿", + "👃", + "👄", + "👅", + "👆🏻", + "👆🏼", + "👆🏽", + "👆🏾", + "👆🏿", + "👆", + "👇🏻", + "👇🏼", + "👇🏽", + "👇🏾", + "👇🏿", + "👇", + "👈🏻", + "👈🏼", + "👈🏽", + "👈🏾", + "👈🏿", + "👈", + "👉🏻", + "👉🏼", + "👉🏽", + "👉🏾", + "👉🏿", + "👉", + "👊🏻", + "👊🏼", + "👊🏽", + "👊🏾", + "👊🏿", + "👊", + "👋🏻", + "👋🏼", + "👋🏽", + "👋🏾", + "👋🏿", + "👋", + "👌🏻", + "👌🏼", + "👌🏽", + "👌🏾", + "👌🏿", + "👌", + "👍🏻", + "👍🏼", + "👍🏽", + "👍🏾", + "👍🏿", + "👍", + "👎🏻", + "👎🏼", + "👎🏽", + "👎🏾", + "👎🏿", + "👎", + "👏🏻", + "👏🏼", + "👏🏽", + "👏🏾", + "👏🏿", + "👏", + "👐🏻", + "👐🏼", + "👐🏽", + "👐🏾", + "👐🏿", + "👐", + "👑", + "👒", + "👓", + "👔", + "👕", + "👖", + "👗", + "👘", + "👙", + "👚", + "👛", + "👜", + "👝", + "👞", + "👟", + "👠", + "👡", + "👢", + "👣", + "👤", + "👥", + "👦🏻", + "👦🏼", + "👦🏽", + "👦🏾", + "👦🏿", + "👦", + "👧🏻", + "👧🏼", + "👧🏽", + "👧🏾", + "👧🏿", + "👧", + "👨🏻‍🌾", + "👨🏻‍🍳", + "👨🏻‍🎓", + "👨🏻‍🎤", + "👨🏻‍🎨", + "👨🏻‍🏫", + "👨🏻‍🏭", + "👨🏻‍💻", + "👨🏻‍💼", + "👨🏻‍🔧", + "👨🏻‍🔬", + "👨🏻‍🚀", + "👨🏻‍🚒", + "👨🏻‍⚕️", + "👨🏻‍⚖️", + "👨🏻‍✈️", + "👨🏻", + "👨🏼‍🌾", + "👨🏼‍🍳", + "👨🏼‍🎓", + "👨🏼‍🎤", + "👨🏼‍🎨", + "👨🏼‍🏫", + "👨🏼‍🏭", + "👨🏼‍💻", + "👨🏼‍💼", + "👨🏼‍🔧", + "👨🏼‍🔬", + "👨🏼‍🚀", + "👨🏼‍🚒", + "👨🏼‍⚕️", + "👨🏼‍⚖️", + "👨🏼‍✈️", + "👨🏼", + "👨🏽‍🌾", + "👨🏽‍🍳", + "👨🏽‍🎓", + "👨🏽‍🎤", + "👨🏽‍🎨", + "👨🏽‍🏫", + "👨🏽‍🏭", + "👨🏽‍💻", + "👨🏽‍💼", + "👨🏽‍🔧", + "👨🏽‍🔬", + "👨🏽‍🚀", + "👨🏽‍🚒", + "👨🏽‍⚕️", + "👨🏽‍⚖️", + "👨🏽‍✈️", + "👨🏽", + "👨🏾‍🌾", + "👨🏾‍🍳", + "👨🏾‍🎓", + "👨🏾‍🎤", + "👨🏾‍🎨", + "👨🏾‍🏫", + "👨🏾‍🏭", + "👨🏾‍💻", + "👨🏾‍💼", + "👨🏾‍🔧", + "👨🏾‍🔬", + "👨🏾‍🚀", + "👨🏾‍🚒", + "👨🏾‍⚕️", + "👨🏾‍⚖️", + "👨🏾‍✈️", + "👨🏾", + "👨🏿‍🌾", + "👨🏿‍🍳", + "👨🏿‍🎓", + "👨🏿‍🎤", + "👨🏿‍🎨", + "👨🏿‍🏫", + "👨🏿‍🏭", + "👨🏿‍💻", + "👨🏿‍💼", + "👨🏿‍🔧", + "👨🏿‍🔬", + "👨🏿‍🚀", + "👨🏿‍🚒", + "👨🏿‍⚕️", + "👨🏿‍⚖️", + "👨🏿‍✈️", + "👨🏿", + "👨‍🌾", + "👨‍🍳", + "👨‍🎓", + "👨‍🎤", + "👨‍🎨", + "👨‍🏫", + "👨‍🏭", + "👨‍👦‍👦", + "👨‍👦", + "👨‍👧‍👦", + "👨‍👧‍👧", + "👨‍👧", + "👨‍👨‍👦‍👦", + "👨‍👨‍👦", + "👨‍👨‍👧‍👦", + "👨‍👨‍👧‍👧", + "👨‍👨‍👧", + "👨‍👩‍👦‍👦", + "👨‍👩‍👦", + "👨‍👩‍👧‍👦", + "👨‍👩‍👧‍👧", + "👨‍👩‍👧", + "👨‍💻", + "👨‍💼", + "👨‍🔧", + "👨‍🔬", + "👨‍🚀", + "👨‍🚒", + "👨‍⚕️", + "👨‍⚖️", + "👨‍✈️", + "👨‍❤️‍👨", + "👨‍❤️‍💋‍👨", + "👨", + "👩🏻‍🌾", + "👩🏻‍🍳", + "👩🏻‍🎓", + "👩🏻‍🎤", + "👩🏻‍🎨", + "👩🏻‍🏫", + "👩🏻‍🏭", + "👩🏻‍💻", + "👩🏻‍💼", + "👩🏻‍🔧", + "👩🏻‍🔬", + "👩🏻‍🚀", + "👩🏻‍🚒", + "👩🏻‍⚕️", + "👩🏻‍⚖️", + "👩🏻‍✈️", + "👩🏻", + "👩🏼‍🌾", + "👩🏼‍🍳", + "👩🏼‍🎓", + "👩🏼‍🎤", + "👩🏼‍🎨", + "👩🏼‍🏫", + "👩🏼‍🏭", + "👩🏼‍💻", + "👩🏼‍💼", + "👩🏼‍🔧", + "👩🏼‍🔬", + "👩🏼‍🚀", + "👩🏼‍🚒", + "👩🏼‍⚕️", + "👩🏼‍⚖️", + "👩🏼‍✈️", + "👩🏼", + "👩🏽‍🌾", + "👩🏽‍🍳", + "👩🏽‍🎓", + "👩🏽‍🎤", + "👩🏽‍🎨", + "👩🏽‍🏫", + "👩🏽‍🏭", + "👩🏽‍💻", + "👩🏽‍💼", + "👩🏽‍🔧", + "👩🏽‍🔬", + "👩🏽‍🚀", + "👩🏽‍🚒", + "👩🏽‍⚕️", + "👩🏽‍⚖️", + "👩🏽‍✈️", + "👩🏽", + "👩🏾‍🌾", + "👩🏾‍🍳", + "👩🏾‍🎓", + "👩🏾‍🎤", + "👩🏾‍🎨", + "👩🏾‍🏫", + "👩🏾‍🏭", + "👩🏾‍💻", + "👩🏾‍💼", + "👩🏾‍🔧", + "👩🏾‍🔬", + "👩🏾‍🚀", + "👩🏾‍🚒", + "👩🏾‍⚕️", + "👩🏾‍⚖️", + "👩🏾‍✈️", + "👩🏾", + "👩🏿‍🌾", + "👩🏿‍🍳", + "👩🏿‍🎓", + "👩🏿‍🎤", + "👩🏿‍🎨", + "👩🏿‍🏫", + "👩🏿‍🏭", + "👩🏿‍💻", + "👩🏿‍💼", + "👩🏿‍🔧", + "👩🏿‍🔬", + "👩🏿‍🚀", + "👩🏿‍🚒", + "👩🏿‍⚕️", + "👩🏿‍⚖️", + "👩🏿‍✈️", + "👩🏿", + "👩‍🌾", + "👩‍🍳", + "👩‍🎓", + "👩‍🎤", + "👩‍🎨", + "👩‍🏫", + "👩‍🏭", + "👩‍👦‍👦", + "👩‍👦", + "👩‍👧‍👦", + "👩‍👧‍👧", + "👩‍👧", + "👩‍👩‍👦‍👦", + "👩‍👩‍👦", + "👩‍👩‍👧‍👦", + "👩‍👩‍👧‍👧", + "👩‍👩‍👧", + "👩‍💻", + "👩‍💼", + "👩‍🔧", + "👩‍🔬", + "👩‍🚀", + "👩‍🚒", + "👩‍⚕️", + "👩‍⚖️", + "👩‍✈️", + "👩‍❤️‍👨", + "👩‍❤️‍👩", + "👩‍❤️‍💋‍👨", + "👩‍❤️‍💋‍👩", + "👩", + "👪🏻", + "👪🏼", + "👪🏽", + "👪🏾", + "👪🏿", + "👪", + "👫🏻", + "👫🏼", + "👫🏽", + "👫🏾", + "👫🏿", + "👫", + "👬🏻", + "👬🏼", + "👬🏽", + "👬🏾", + "👬🏿", + "👬", + "👭🏻", + "👭🏼", + "👭🏽", + "👭🏾", + "👭🏿", + "👭", + "👮🏻‍♀️", + "👮🏻‍♂️", + "👮🏻", + "👮🏼‍♀️", + "👮🏼‍♂️", + "👮🏼", + "👮🏽‍♀️", + "👮🏽‍♂️", + "👮🏽", + "👮🏾‍♀️", + "👮🏾‍♂️", + "👮🏾", + "👮🏿‍♀️", + "👮🏿‍♂️", + "👮🏿", + "👮‍♀️", + "👮‍♂️", + "👮", + "👯🏻‍♀️", + "👯🏻‍♂️", + "👯🏻", + "👯🏼‍♀️", + "👯🏼‍♂️", + "👯🏼", + "👯🏽‍♀️", + "👯🏽‍♂️", + "👯🏽", + "👯🏾‍♀️", + "👯🏾‍♂️", + "👯🏾", + "👯🏿‍♀️", + "👯🏿‍♂️", + "👯🏿", + "👯‍♀️", + "👯‍♂️", + "👯", + "👰🏻", + "👰🏼", + "👰🏽", + "👰🏾", + "👰🏿", + "👰", + "👱🏻‍♀️", + "👱🏻‍♂️", + "👱🏻", + "👱🏼‍♀️", + "👱🏼‍♂️", + "👱🏼", + "👱🏽‍♀️", + "👱🏽‍♂️", + "👱🏽", + "👱🏾‍♀️", + "👱🏾‍♂️", + "👱🏾", + "👱🏿‍♀️", + "👱🏿‍♂️", + "👱🏿", + "👱‍♀️", + "👱‍♂️", + "👱", + "👲🏻", + "👲🏼", + "👲🏽", + "👲🏾", + "👲🏿", + "👲", + "👳🏻‍♀️", + "👳🏻‍♂️", + "👳🏻", + "👳🏼‍♀️", + "👳🏼‍♂️", + "👳🏼", + "👳🏽‍♀️", + "👳🏽‍♂️", + "👳🏽", + "👳🏾‍♀️", + "👳🏾‍♂️", + "👳🏾", + "👳🏿‍♀️", + "👳🏿‍♂️", + "👳🏿", + "👳‍♀️", + "👳‍♂️", + "👳", + "👴🏻", + "👴🏼", + "👴🏽", + "👴🏾", + "👴🏿", + "👴", + "👵🏻", + "👵🏼", + "👵🏽", + "👵🏾", + "👵🏿", + "👵", + "👶🏻", + "👶🏼", + "👶🏽", + "👶🏾", + "👶🏿", + "👶", + "👷🏻‍♀️", + "👷🏻‍♂️", + "👷🏻", + "👷🏼‍♀️", + "👷🏼‍♂️", + "👷🏼", + "👷🏽‍♀️", + "👷🏽‍♂️", + "👷🏽", + "👷🏾‍♀️", + "👷🏾‍♂️", + "👷🏾", + "👷🏿‍♀️", + "👷🏿‍♂️", + "👷🏿", + "👷‍♀️", + "👷‍♂️", + "👷", + "👸🏻", + "👸🏼", + "👸🏽", + "👸🏾", + "👸🏿", + "👸", + "👹", + "👺", + "👻", + "👼🏻", + "👼🏼", + "👼🏽", + "👼🏾", + "👼🏿", + "👼", + "👽", + "👾", + "👿", + "💀", + "💁🏻‍♀️", + "💁🏻‍♂️", + "💁🏻", + "💁🏼‍♀️", + "💁🏼‍♂️", + "💁🏼", + "💁🏽‍♀️", + "💁🏽‍♂️", + "💁🏽", + "💁🏾‍♀️", + "💁🏾‍♂️", + "💁🏾", + "💁🏿‍♀️", + "💁🏿‍♂️", + "💁🏿", + "💁‍♀️", + "💁‍♂️", + "💁", + "💂🏻‍♀️", + "💂🏻‍♂️", + "💂🏻", + "💂🏼‍♀️", + "💂🏼‍♂️", + "💂🏼", + "💂🏽‍♀️", + "💂🏽‍♂️", + "💂🏽", + "💂🏾‍♀️", + "💂🏾‍♂️", + "💂🏾", + "💂🏿‍♀️", + "💂🏿‍♂️", + "💂🏿", + "💂‍♀️", + "💂‍♂️", + "💂", + "💃🏻", + "💃🏼", + "💃🏽", + "💃🏾", + "💃🏿", + "💃", + "💄", + "💅🏻", + "💅🏼", + "💅🏽", + "💅🏾", + "💅🏿", + "💅", + "💆🏻‍♀️", + "💆🏻‍♂️", + "💆🏻", + "💆🏼‍♀️", + "💆🏼‍♂️", + "💆🏼", + "💆🏽‍♀️", + "💆🏽‍♂️", + "💆🏽", + "💆🏾‍♀️", + "💆🏾‍♂️", + "💆🏾", + "💆🏿‍♀️", + "💆🏿‍♂️", + "💆🏿", + "💆‍♀️", + "💆‍♂️", + "💆", + "💇🏻‍♀️", + "💇🏻‍♂️", + "💇🏻", + "💇🏼‍♀️", + "💇🏼‍♂️", + "💇🏼", + "💇🏽‍♀️", + "💇🏽‍♂️", + "💇🏽", + "💇🏾‍♀️", + "💇🏾‍♂️", + "💇🏾", + "💇🏿‍♀️", + "💇🏿‍♂️", + "💇🏿", + "💇‍♀️", + "💇‍♂️", + "💇", + "💈", + "💉", + "💊", + "💋", + "💌", + "💍", + "💎", + "💏", + "💐", + "💑", + "💒", + "💓", + "💔", + "💕", + "💖", + "💗", + "💘", + "💙", + "💚", + "💛", + "💜", + "💝", + "💞", + "💟", + "💠", + "💡", + "💢", + "💣", + "💤", + "💥", + "💦", + "💧", + "💨", + "💩", + "💪🏻", + "💪🏼", + "💪🏽", + "💪🏾", + "💪🏿", + "💪", + "💫", + "💬", + "💭", + "💮", + "💯", + "💰", + "💱", + "💲", + "💳", + "💴", + "💵", + "💶", + "💷", + "💸", + "💹", + "💺", + "💻", + "💼", + "💽", + "💾", + "💿", + "📀", + "📁", + "📂", + "📃", + "📄", + "📅", + "📆", + "📇", + "📈", + "📉", + "📊", + "📋", + "📌", + "📍", + "📎", + "📏", + "📐", + "📑", + "📒", + "📓", + "📔", + "📕", + "📖", + "📗", + "📘", + "📙", + "📚", + "📛", + "📜", + "📝", + "📞", + "📟", + "📠", + "📡", + "📢", + "📣", + "📤", + "📥", + "📦", + "📧", + "📨", + "📩", + "📪", + "📫", + "📬", + "📭", + "📮", + "📯", + "📰", + "📱", + "📲", + "📳", + "📴", + "📵", + "📶", + "📷", + "📸", + "📹", + "📺", + "📻", + "📼", + "📽", + "📿", + "🔀", + "🔁", + "🔂", + "🔃", + "🔄", + "🔅", + "🔆", + "🔇", + "🔈", + "🔉", + "🔊", + "🔋", + "🔌", + "🔍", + "🔎", + "🔏", + "🔐", + "🔑", + "🔒", + "🔓", + "🔔", + "🔕", + "🔖", + "🔗", + "🔘", + "🔙", + "🔚", + "🔛", + "🔜", + "🔝", + "🔞", + "🔟", + "🔠", + "🔡", + "🔢", + "🔣", + "🔤", + "🔥", + "🔦", + "🔧", + "🔨", + "🔩", + "🔪", + "🔫", + "🔬", + "🔭", + "🔮", + "🔯", + "🔰", + "🔱", + "🔲", + "🔳", + "🔴", + "🔵", + "🔶", + "🔷", + "🔸", + "🔹", + "🔺", + "🔻", + "🔼", + "🔽", + "🕉", + "🕊", + "🕋", + "🕌", + "🕍", + "🕎", + "🕐", + "🕑", + "🕒", + "🕓", + "🕔", + "🕕", + "🕖", + "🕗", + "🕘", + "🕙", + "🕚", + "🕛", + "🕜", + "🕝", + "🕞", + "🕟", + "🕠", + "🕡", + "🕢", + "🕣", + "🕤", + "🕥", + "🕦", + "🕧", + "🕯", + "🕰", + "🕳", + "🕴🏻", + "🕴🏼", + "🕴🏽", + "🕴🏾", + "🕴🏿", + "🕴", + "🕵🏻‍♀️", + "🕵🏻‍♂️", + "🕵🏻", + "🕵🏼‍♀️", + "🕵🏼‍♂️", + "🕵🏼", + "🕵🏽‍♀️", + "🕵🏽‍♂️", + "🕵🏽", + "🕵🏾‍♀️", + "🕵🏾‍♂️", + "🕵🏾", + "🕵🏿‍♀️", + "🕵🏿‍♂️", + "🕵🏿", + "🕵️‍♀️", + "🕵️‍♂️", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", + "🕺🏻", + "🕺🏼", + "🕺🏽", + "🕺🏾", + "🕺🏿", + "🕺", + "🖇", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐🏻", + "🖐🏼", + "🖐🏽", + "🖐🏾", + "🖐🏿", + "🖐", + "🖕🏻", + "🖕🏼", + "🖕🏽", + "🖕🏾", + "🖕🏿", + "🖕", + "🖖🏻", + "🖖🏼", + "🖖🏽", + "🖖🏾", + "🖖🏿", + "🖖", + "🖤", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", + "🗂", + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🗻", + "🗼", + "🗽", + "🗾", + "🗿", + "😀", + "😁", + "😂", + "😃", + "😄", + "😅", + "😆", + "😇", + "😈", + "😉", + "😊", + "😋", + "😌", + "😍", + "😎", + "😏", + "😐", + "😑", + "😒", + "😓", + "😔", + "😕", + "😖", + "😗", + "😘", + "😙", + "😚", + "😛", + "😜", + "😝", + "😞", + "😟", + "😠", + "😡", + "😢", + "😣", + "😤", + "😥", + "😦", + "😧", + "😨", + "😩", + "😪", + "😫", + "😬", + "😭", + "😮", + "😯", + "😰", + "😱", + "😲", + "😳", + "😴", + "😵", + "😶", + "😷", + "😸", + "😹", + "😺", + "😻", + "😼", + "😽", + "😾", + "😿", + "🙀", + "🙁", + "🙂", + "🙃", + "🙄", + "🙅🏻‍♀️", + "🙅🏻‍♂️", + "🙅🏻", + "🙅🏼‍♀️", + "🙅🏼‍♂️", + "🙅🏼", + "🙅🏽‍♀️", + "🙅🏽‍♂️", + "🙅🏽", + "🙅🏾‍♀️", + "🙅🏾‍♂️", + "🙅🏾", + "🙅🏿‍♀️", + "🙅🏿‍♂️", + "🙅🏿", + "🙅‍♀️", + "🙅‍♂️", + "🙅", + "🙆🏻‍♀️", + "🙆🏻‍♂️", + "🙆🏻", + "🙆🏼‍♀️", + "🙆🏼‍♂️", + "🙆🏼", + "🙆🏽‍♀️", + "🙆🏽‍♂️", + "🙆🏽", + "🙆🏾‍♀️", + "🙆🏾‍♂️", + "🙆🏾", + "🙆🏿‍♀️", + "🙆🏿‍♂️", + "🙆🏿", + "🙆‍♀️", + "🙆‍♂️", + "🙆", + "🙇🏻‍♀️", + "🙇🏻‍♂️", + "🙇🏻", + "🙇🏼‍♀️", + "🙇🏼‍♂️", + "🙇🏼", + "🙇🏽‍♀️", + "🙇🏽‍♂️", + "🙇🏽", + "🙇🏾‍♀️", + "🙇🏾‍♂️", + "🙇🏾", + "🙇🏿‍♀️", + "🙇🏿‍♂️", + "🙇🏿", + "🙇‍♀️", + "🙇‍♂️", + "🙇", + "🙈", + "🙉", + "🙊", + "🙋🏻‍♀️", + "🙋🏻‍♂️", + "🙋🏻", + "🙋🏼‍♀️", + "🙋🏼‍♂️", + "🙋🏼", + "🙋🏽‍♀️", + "🙋🏽‍♂️", + "🙋🏽", + "🙋🏾‍♀️", + "🙋🏾‍♂️", + "🙋🏾", + "🙋🏿‍♀️", + "🙋🏿‍♂️", + "🙋🏿", + "🙋‍♀️", + "🙋‍♂️", + "🙋", + "🙌🏻", + "🙌🏼", + "🙌🏽", + "🙌🏾", + "🙌🏿", + "🙌", + "🙍🏻‍♀️", + "🙍🏻‍♂️", + "🙍🏻", + "🙍🏼‍♀️", + "🙍🏼‍♂️", + "🙍🏼", + "🙍🏽‍♀️", + "🙍🏽‍♂️", + "🙍🏽", + "🙍🏾‍♀️", + "🙍🏾‍♂️", + "🙍🏾", + "🙍🏿‍♀️", + "🙍🏿‍♂️", + "🙍🏿", + "🙍‍♀️", + "🙍‍♂️", + "🙍", + "🙎🏻‍♀️", + "🙎🏻‍♂️", + "🙎🏻", + "🙎🏼‍♀️", + "🙎🏼‍♂️", + "🙎🏼", + "🙎🏽‍♀️", + "🙎🏽‍♂️", + "🙎🏽", + "🙎🏾‍♀️", + "🙎🏾‍♂️", + "🙎🏾", + "🙎🏿‍♀️", + "🙎🏿‍♂️", + "🙎🏿", + "🙎‍♀️", + "🙎‍♂️", + "🙎", + "🙏🏻", + "🙏🏼", + "🙏🏽", + "🙏🏾", + "🙏🏿", + "🙏", + "🚀", + "🚁", + "🚂", + "🚃", + "🚄", + "🚅", + "🚆", + "🚇", + "🚈", + "🚉", + "🚊", + "🚋", + "🚌", + "🚍", + "🚎", + "🚏", + "🚐", + "🚑", + "🚒", + "🚓", + "🚔", + "🚕", + "🚖", + "🚗", + "🚘", + "🚙", + "🚚", + "🚛", + "🚜", + "🚝", + "🚞", + "🚟", + "🚠", + "🚡", + "🚢", + "🚣🏻‍♀️", + "🚣🏻‍♂️", + "🚣🏻", + "🚣🏼‍♀️", + "🚣🏼‍♂️", + "🚣🏼", + "🚣🏽‍♀️", + "🚣🏽‍♂️", + "🚣🏽", + "🚣🏾‍♀️", + "🚣🏾‍♂️", + "🚣🏾", + "🚣🏿‍♀️", + "🚣🏿‍♂️", + "🚣🏿", + "🚣‍♀️", + "🚣‍♂️", + "🚣", + "🚤", + "🚥", + "🚦", + "🚧", + "🚨", + "🚩", + "🚪", + "🚫", + "🚬", + "🚭", + "🚮", + "🚯", + "🚰", + "🚱", + "🚲", + "🚳", + "🚴🏻‍♀️", + "🚴🏻‍♂️", + "🚴🏻", + "🚴🏼‍♀️", + "🚴🏼‍♂️", + "🚴🏼", + "🚴🏽‍♀️", + "🚴🏽‍♂️", + "🚴🏽", + "🚴🏾‍♀️", + "🚴🏾‍♂️", + "🚴🏾", + "🚴🏿‍♀️", + "🚴🏿‍♂️", + "🚴🏿", + "🚴‍♀️", + "🚴‍♂️", + "🚴", + "🚵🏻‍♀️", + "🚵🏻‍♂️", + "🚵🏻", + "🚵🏼‍♀️", + "🚵🏼‍♂️", + "🚵🏼", + "🚵🏽‍♀️", + "🚵🏽‍♂️", + "🚵🏽", + "🚵🏾‍♀️", + "🚵🏾‍♂️", + "🚵🏾", + "🚵🏿‍♀️", + "🚵🏿‍♂️", + "🚵🏿", + "🚵‍♀️", + "🚵‍♂️", + "🚵", + "🚶🏻‍♀️", + "🚶🏻‍♂️", + "🚶🏻", + "🚶🏼‍♀️", + "🚶🏼‍♂️", + "🚶🏼", + "🚶🏽‍♀️", + "🚶🏽‍♂️", + "🚶🏽", + "🚶🏾‍♀️", + "🚶🏾‍♂️", + "🚶🏾", + "🚶🏿‍♀️", + "🚶🏿‍♂️", + "🚶🏿", + "🚶‍♀️", + "🚶‍♂️", + "🚶", + "🚷", + "🚸", + "🚹", + "🚺", + "🚻", + "🚼", + "🚽", + "🚾", + "🚿", + "🛀🏻", + "🛀🏼", + "🛀🏽", + "🛀🏾", + "🛀🏿", + "🛀", + "🛁", + "🛂", + "🛃", + "🛄", + "🛅", + "🛋", + "🛌🏻", + "🛌🏼", + "🛌🏽", + "🛌🏾", + "🛌🏿", + "🛌", + "🛍", + "🛎", + "🛏", + "🛐", + "🛑", + "🛒", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛫", + "🛬", + "🛰", + "🛳", + "🛴", + "🛵", + "🛶", + "🤐", + "🤑", + "🤒", + "🤓", + "🤔", + "🤕", + "🤖", + "🤗", + "🤘🏻", + "🤘🏼", + "🤘🏽", + "🤘🏾", + "🤘🏿", + "🤘", + "🤙🏻", + "🤙🏼", + "🤙🏽", + "🤙🏾", + "🤙🏿", + "🤙", + "🤚🏻", + "🤚🏼", + "🤚🏽", + "🤚🏾", + "🤚🏿", + "🤚", + "🤛🏻", + "🤛🏼", + "🤛🏽", + "🤛🏾", + "🤛🏿", + "🤛", + "🤜🏻", + "🤜🏼", + "🤜🏽", + "🤜🏾", + "🤜🏿", + "🤜", + "🤝🏻", + "🤝🏼", + "🤝🏽", + "🤝🏾", + "🤝🏿", + "🤝", + "🤞🏻", + "🤞🏼", + "🤞🏽", + "🤞🏾", + "🤞🏿", + "🤞", + "🤠", + "🤡", + "🤢", + "🤣", + "🤤", + "🤥", + "🤦🏻‍♀️", + "🤦🏻‍♂️", + "🤦🏻", + "🤦🏼‍♀️", + "🤦🏼‍♂️", + "🤦🏼", + "🤦🏽‍♀️", + "🤦🏽‍♂️", + "🤦🏽", + "🤦🏾‍♀️", + "🤦🏾‍♂️", + "🤦🏾", + "🤦🏿‍♀️", + "🤦🏿‍♂️", + "🤦🏿", + "🤦‍♀️", + "🤦‍♂️", + "🤦", + "🤧", + "🤰🏻", + "🤰🏼", + "🤰🏽", + "🤰🏾", + "🤰🏿", + "🤰", + "🤳🏻", + "🤳🏼", + "🤳🏽", + "🤳🏾", + "🤳🏿", + "🤳", + "🤴🏻", + "🤴🏼", + "🤴🏽", + "🤴🏾", + "🤴🏿", + "🤴", + "🤵🏻", + "🤵🏼", + "🤵🏽", + "🤵🏾", + "🤵🏿", + "🤵", + "🤶🏻", + "🤶🏼", + "🤶🏽", + "🤶🏾", + "🤶🏿", + "🤶", + "🤷🏻‍♀️", + "🤷🏻‍♂️", + "🤷🏻", + "🤷🏼‍♀️", + "🤷🏼‍♂️", + "🤷🏼", + "🤷🏽‍♀️", + "🤷🏽‍♂️", + "🤷🏽", + "🤷🏾‍♀️", + "🤷🏾‍♂️", + "🤷🏾", + "🤷🏿‍♀️", + "🤷🏿‍♂️", + "🤷🏿", + "🤷‍♀️", + "🤷‍♂️", + "🤷", + "🤸🏻‍♀️", + "🤸🏻‍♂️", + "🤸🏻", + "🤸🏼‍♀️", + "🤸🏼‍♂️", + "🤸🏼", + "🤸🏽‍♀️", + "🤸🏽‍♂️", + "🤸🏽", + "🤸🏾‍♀️", + "🤸🏾‍♂️", + "🤸🏾", + "🤸🏿‍♀️", + "🤸🏿‍♂️", + "🤸🏿", + "🤸‍♀️", + "🤸‍♂️", + "🤸", + "🤹🏻‍♀️", + "🤹🏻‍♂️", + "🤹🏻", + "🤹🏼‍♀️", + "🤹🏼‍♂️", + "🤹🏼", + "🤹🏽‍♀️", + "🤹🏽‍♂️", + "🤹🏽", + "🤹🏾‍♀️", + "🤹🏾‍♂️", + "🤹🏾", + "🤹🏿‍♀️", + "🤹🏿‍♂️", + "🤹🏿", + "🤹‍♀️", + "🤹‍♂️", + "🤹", + "🤺", + "🤼🏻‍♀️", + "🤼🏻‍♂️", + "🤼🏻", + "🤼🏼‍♀️", + "🤼🏼‍♂️", + "🤼🏼", + "🤼🏽‍♀️", + "🤼🏽‍♂️", + "🤼🏽", + "🤼🏾‍♀️", + "🤼🏾‍♂️", + "🤼🏾", + "🤼🏿‍♀️", + "🤼🏿‍♂️", + "🤼🏿", + "🤼‍♀️", + "🤼‍♂️", + "🤼", + "🤽🏻‍♀️", + "🤽🏻‍♂️", + "🤽🏻", + "🤽🏼‍♀️", + "🤽🏼‍♂️", + "🤽🏼", + "🤽🏽‍♀️", + "🤽🏽‍♂️", + "🤽🏽", + "🤽🏾‍♀️", + "🤽🏾‍♂️", + "🤽🏾", + "🤽🏿‍♀️", + "🤽🏿‍♂️", + "🤽🏿", + "🤽‍♀️", + "🤽‍♂️", + "🤽", + "🤾🏻‍♀️", + "🤾🏻‍♂️", + "🤾🏻", + "🤾🏼‍♀️", + "🤾🏼‍♂️", + "🤾🏼", + "🤾🏽‍♀️", + "🤾🏽‍♂️", + "🤾🏽", + "🤾🏾‍♀️", + "🤾🏾‍♂️", + "🤾🏾", + "🤾🏿‍♀️", + "🤾🏿‍♂️", + "🤾🏿", + "🤾‍♀️", + "🤾‍♂️", + "🤾", + "🥀", + "🥁", + "🥂", + "🥃", + "🥄", + "🥅", + "🥇", + "🥈", + "🥉", + "🥊", + "🥋", + "🥐", + "🥑", + "🥒", + "🥓", + "🥔", + "🥕", + "🥖", + "🥗", + "🥘", + "🥙", + "🥚", + "🥛", + "🥜", + "🥝", + "🥞", + "🦀", + "🦁", + "🦂", + "🦃", + "🦄", + "🦅", + "🦆", + "🦇", + "🦈", + "🦉", + "🦊", + "🦋", + "🦌", + "🦍", + "🦎", + "🦏", + "🦐", + "🦑", + "🧀", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", + "#⃣", + "⌚", + "⌛", + "⌨", + "⏏", + "⏩", + "⏪", + "⏫", + "⏬", + "⏭", + "⏮", + "⏯", + "⏰", + "⏱", + "⏲", + "⏳", + "⏸", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "◽", + "◾", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☔", + "☕", + "☘", + "☝🏻", + "☝🏼", + "☝🏽", + "☝🏾", + "☝🏿", + "☝", + "☠", + "☢", + "☣", + "☦", + "☪", + "☮", + "☯", + "☸", + "☹", + "☺", + "♀", + "♂", + "♈", + "♉", + "♊", + "♋", + "♌", + "♍", + "♎", + "♏", + "♐", + "♑", + "♒", + "♓", + "♠", + "♣", + "♥", + "♦", + "♨", + "♻", + "♿", + "⚒", + "⚓", + "⚔", + "⚕", + "⚖", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚡", + "⚪", + "⚫", + "⚰", + "⚱", + "⚽", + "⚾", + "⛄", + "⛅", + "⛈", + "⛎", + "⛏", + "⛑", + "⛓", + "⛔", + "⛩", + "⛪", + "⛰", + "⛱", + "⛲", + "⛳", + "⛴", + "⛵", + "⛷🏻", + "⛷🏼", + "⛷🏽", + "⛷🏾", + "⛷🏿", + "⛷", + "⛸", + "⛹🏻‍♀️", + "⛹🏻‍♂️", + "⛹🏻", + "⛹🏼‍♀️", + "⛹🏼‍♂️", + "⛹🏼", + "⛹🏽‍♀️", + "⛹🏽‍♂️", + "⛹🏽", + "⛹🏾‍♀️", + "⛹🏾‍♂️", + "⛹🏾", + "⛹🏿‍♀️", + "⛹🏿‍♂️", + "⛹🏿", + "⛹️‍♀️", + "⛹️‍♂️", + "⛹", + "⛺", + "⛽", + "✂", + "✅", + "✈", + "✉", + "✊🏻", + "✊🏼", + "✊🏽", + "✊🏾", + "✊🏿", + "✊", + "✋🏻", + "✋🏼", + "✋🏽", + "✋🏾", + "✋🏿", + "✋", + "✌🏻", + "✌🏼", + "✌🏽", + "✌🏾", + "✌🏿", + "✌", + "✍🏻", + "✍🏼", + "✍🏽", + "✍🏾", + "✍🏿", + "✍", + "✏", + "✒", + "✔", + "✖", + "✝", + "✡", + "✨", + "✳", + "✴", + "❄", + "❇", + "❌", + "❎", + "❓", + "❔", + "❕", + "❗", + "❣", + "❤", + "➕", + "➖", + "➗", + "➡", + "➰", + "➿", + "⤴", + "⤵", + "*⃣", + "⬅", + "⬆", + "⬇", + "⬛", + "⬜", + "⭐", + "⭕", + "0⃣", + "〰", + "〽", + "1⃣", + "2⃣", + "㊗", + "㊙", + "3⃣", + "4⃣", + "5⃣", + "6⃣", + "7⃣", + "8⃣", + "9⃣", + "©", + "®", + "" +]; + +frappe.ui.emoji_keywords = [ + ":mahjong:", + ":black_joker:", + ":a:", + ":b:", + ":o2:", + ":parking:", + ":ab:", + ":cl:", + ":cool:", + ":free:", + ":id:", + ":new:", + ":ng:", + ":ok:", + ":sos:", + ":up:", + ":vs:", + ":flag_ac:", + ":flag_ad:", + ":flag_ae:", + ":flag_af:", + ":flag_ag:", + ":flag_ai:", + ":flag_al:", + ":flag_am:", + ":flag_ao:", + ":flag_aq:", + ":flag_ar:", + ":flag_as:", + ":flag_at:", + ":flag_au:", + ":flag_aw:", + ":flag_ax:", + ":flag_az:", + ":regional_indicator_a:", + ":flag_ba:", + ":flag_bb:", + ":flag_bd:", + ":flag_be:", + ":flag_bf:", + ":flag_bg:", + ":flag_bh:", + ":flag_bi:", + ":flag_bj:", + ":flag_bl:", + ":flag_bm:", + ":flag_bn:", + ":flag_bo:", + ":flag_bq:", + ":flag_br:", + ":flag_bs:", + ":flag_bt:", + ":flag_bv:", + ":flag_bw:", + ":flag_by:", + ":flag_bz:", + ":regional_indicator_b:", + ":flag_ca:", + ":flag_cc:", + ":flag_cd:", + ":flag_cf:", + ":flag_cg:", + ":flag_ch:", + ":flag_ci:", + ":flag_ck:", + ":flag_cl:", + ":flag_cm:", + ":flag_cn:", + ":flag_co:", + ":flag_cp:", + ":flag_cr:", + ":flag_cu:", + ":flag_cv:", + ":flag_cw:", + ":flag_cx:", + ":flag_cy:", + ":flag_cz:", + ":regional_indicator_c:", + ":flag_de:", + ":flag_dg:", + ":flag_dj:", + ":flag_dk:", + ":flag_dm:", + ":flag_do:", + ":flag_dz:", + ":regional_indicator_d:", + ":flag_ea:", + ":flag_ec:", + ":flag_ee:", + ":flag_eg:", + ":flag_eh:", + ":flag_er:", + ":flag_es:", + ":flag_et:", + ":flag_eu:", + ":regional_indicator_e:", + ":flag_fi:", + ":flag_fj:", + ":flag_fk:", + ":flag_fm:", + ":flag_fo:", + ":flag_fr:", + ":regional_indicator_f:", + ":flag_ga:", + ":flag_gb:", + ":flag_gd:", + ":flag_ge:", + ":flag_gf:", + ":flag_gg:", + ":flag_gh:", + ":flag_gi:", + ":flag_gl:", + ":flag_gm:", + ":flag_gn:", + ":flag_gp:", + ":flag_gq:", + ":flag_gr:", + ":flag_gs:", + ":flag_gt:", + ":flag_gu:", + ":flag_gw:", + ":flag_gy:", + ":regional_indicator_g:", + ":flag_hk:", + ":flag_hm:", + ":flag_hn:", + ":flag_hr:", + ":flag_ht:", + ":flag_hu:", + ":regional_indicator_h:", + ":flag_ic:", + ":flag_id:", + ":flag_ie:", + ":flag_il:", + ":flag_im:", + ":flag_in:", + ":flag_io:", + ":flag_iq:", + ":flag_ir:", + ":flag_is:", + ":flag_it:", + ":regional_indicator_i:", + ":flag_je:", + ":flag_jm:", + ":flag_jo:", + ":flag_jp:", + ":regional_indicator_j:", + ":flag_ke:", + ":flag_kg:", + ":flag_kh:", + ":flag_ki:", + ":flag_km:", + ":flag_kn:", + ":flag_kp:", + ":flag_kr:", + ":flag_kw:", + ":flag_ky:", + ":flag_kz:", + ":regional_indicator_k:", + ":flag_la:", + ":flag_lb:", + ":flag_lc:", + ":flag_li:", + ":flag_lk:", + ":flag_lr:", + ":flag_ls:", + ":flag_lt:", + ":flag_lu:", + ":flag_lv:", + ":flag_ly:", + ":regional_indicator_l:", + ":flag_ma:", + ":flag_mc:", + ":flag_md:", + ":flag_me:", + ":flag_mf:", + ":flag_mg:", + ":flag_mh:", + ":flag_mk:", + ":flag_ml:", + ":flag_mm:", + ":flag_mn:", + ":flag_mo:", + ":flag_mp:", + ":flag_mq:", + ":flag_mr:", + ":flag_ms:", + ":flag_mt:", + ":flag_mu:", + ":flag_mv:", + ":flag_mw:", + ":flag_mx:", + ":flag_my:", + ":flag_mz:", + ":regional_indicator_m:", + ":flag_na:", + ":flag_nc:", + ":flag_ne:", + ":flag_nf:", + ":flag_ng:", + ":flag_ni:", + ":flag_nl:", + ":flag_no:", + ":flag_np:", + ":flag_nr:", + ":flag_nu:", + ":flag_nz:", + ":regional_indicator_n:", + ":flag_om:", + ":regional_indicator_o:", + ":flag_pa:", + ":flag_pe:", + ":flag_pf:", + ":flag_pg:", + ":flag_ph:", + ":flag_pk:", + ":flag_pl:", + ":flag_pm:", + ":flag_pn:", + ":flag_pr:", + ":flag_ps:", + ":flag_pt:", + ":flag_pw:", + ":flag_py:", + ":regional_indicator_p:", + ":flag_qa:", + ":regional_indicator_q:", + ":flag_re:", + ":flag_ro:", + ":flag_rs:", + ":flag_ru:", + ":flag_rw:", + ":regional_indicator_r:", + ":flag_sa:", + ":flag_sb:", + ":flag_sc:", + ":flag_sd:", + ":flag_se:", + ":flag_sg:", + ":flag_sh:", + ":flag_si:", + ":flag_sj:", + ":flag_sk:", + ":flag_sl:", + ":flag_sm:", + ":flag_sn:", + ":flag_so:", + ":flag_sr:", + ":flag_ss:", + ":flag_st:", + ":flag_sv:", + ":flag_sx:", + ":flag_sy:", + ":flag_sz:", + ":regional_indicator_s:", + ":flag_ta:", + ":flag_tc:", + ":flag_td:", + ":flag_tf:", + ":flag_tg:", + ":flag_th:", + ":flag_tj:", + ":flag_tk:", + ":flag_tl:", + ":flag_tm:", + ":flag_tn:", + ":flag_to:", + ":flag_tr:", + ":flag_tt:", + ":flag_tv:", + ":flag_tw:", + ":flag_tz:", + ":regional_indicator_t:", + ":flag_ua:", + ":flag_ug:", + ":flag_um:", + ":regional_indicator_u::regional_indicator_n:", + ":flag_us:", + ":flag_uy:", + ":flag_uz:", + ":regional_indicator_u:", + ":flag_va:", + ":flag_vc:", + ":flag_ve:", + ":flag_vg:", + ":flag_vi:", + ":flag_vn:", + ":flag_vu:", + ":regional_indicator_v:", + ":flag_wf:", + ":flag_ws:", + ":regional_indicator_w:", + ":flag_xk:", + ":regional_indicator_x:", + ":flag_ye:", + ":flag_yt:", + ":regional_indicator_y:", + ":flag_za:", + ":flag_zm:", + ":flag_zw:", + ":regional_indicator_z:", + ":koko:", + ":sa:", + ":u7121:", + ":u6307:", + ":u7981:", + ":u7a7a:", + ":u5408:", + ":u6e80:", + ":u6709:", + ":u6708:", + ":u7533:", + ":u5272:", + ":u55b6:", + ":ideograph_advantage:", + ":accept:", + ":cyclone:", + ":foggy:", + ":closed_umbrella:", + ":night_with_stars:", + ":sunrise_over_mountains:", + ":sunrise:", + ":city_dusk:", + ":city_sunset:", + ":rainbow:", + ":bridge_at_night:", + ":ocean:", + ":volcano:", + ":milky_way:", + ":earth_africa:", + ":earth_americas:", + ":earth_asia:", + ":globe_with_meridians:", + ":new_moon:", + ":waxing_crescent_moon:", + ":first_quarter_moon:", + ":waxing_gibbous_moon:", + ":full_moon:", + ":waning_gibbous_moon:", + ":last_quarter_moon:", + ":waning_crescent_moon:", + ":crescent_moon:", + ":new_moon_with_face:", + ":first_quarter_moon_with_face:", + ":last_quarter_moon_with_face:", + ":full_moon_with_face:", + ":sun_with_face:", + ":star2:", + ":stars:", + ":thermometer:", + ":white_sun_small_cloud:", + ":white_sun_cloud:", + ":white_sun_rain_cloud:", + ":cloud_rain:", + ":cloud_snow:", + ":cloud_lightning:", + ":cloud_tornado:", + ":fog:", + ":wind_blowing_face:", + ":hotdog:", + ":taco:", + ":burrito:", + ":chestnut:", + ":seedling:", + ":evergreen_tree:", + ":deciduous_tree:", + ":palm_tree:", + ":cactus:", + ":hot_pepper:", + ":tulip:", + ":cherry_blossom:", + ":rose:", + ":hibiscus:", + ":sunflower:", + ":blossom:", + ":corn:", + ":ear_of_rice:", + ":herb:", + ":four_leaf_clover:", + ":maple_leaf:", + ":fallen_leaf:", + ":leaves:", + ":mushroom:", + ":tomato:", + ":eggplant:", + ":grapes:", + ":melon:", + ":watermelon:", + ":tangerine:", + ":lemon:", + ":banana:", + ":pineapple:", + ":apple:", + ":green_apple:", + ":pear:", + ":peach:", + ":cherries:", + ":strawberry:", + ":hamburger:", + ":pizza:", + ":meat_on_bone:", + ":poultry_leg:", + ":rice_cracker:", + ":rice_ball:", + ":rice:", + ":curry:", + ":ramen:", + ":spaghetti:", + ":bread:", + ":fries:", + ":sweet_potato:", + ":dango:", + ":oden:", + ":sushi:", + ":fried_shrimp:", + ":fish_cake:", + ":icecream:", + ":shaved_ice:", + ":ice_cream:", + ":doughnut:", + ":cookie:", + ":chocolate_bar:", + ":candy:", + ":lollipop:", + ":custard:", + ":honey_pot:", + ":cake:", + ":bento:", + ":stew:", + ":cooking:", + ":fork_and_knife:", + ":tea:", + ":sake:", + ":wine_glass:", + ":cocktail:", + ":tropical_drink:", + ":beer:", + ":beers:", + ":baby_bottle:", + ":fork_knife_plate:", + ":champagne:", + ":popcorn:", + ":ribbon:", + ":gift:", + ":birthday:", + ":jack_o_lantern:", + ":christmas_tree:", + ":santa_tone1:", + ":santa_tone2:", + ":santa_tone3:", + ":santa_tone4:", + ":santa_tone5:", + ":santa:", + ":fireworks:", + ":sparkler:", + ":balloon:", + ":tada:", + ":confetti_ball:", + ":tanabata_tree:", + ":crossed_flags:", + ":bamboo:", + ":dolls:", + ":flags:", + ":wind_chime:", + ":rice_scene:", + ":school_satchel:", + ":mortar_board:", + ":military_medal:", + ":reminder_ribbon:", + ":microphone2:", + ":level_slider:", + ":control_knobs:", + ":film_frames:", + ":tickets:", + ":carousel_horse:", + ":ferris_wheel:", + ":roller_coaster:", + ":fishing_pole_and_fish:", + ":microphone:", + ":movie_camera:", + ":cinema:", + ":headphones:", + ":art:", + ":tophat:", + ":circus_tent:", + ":ticket:", + ":clapper:", + ":performing_arts:", + ":video_game:", + ":dart:", + ":slot_machine:", + ":8ball:", + ":game_die:", + ":bowling:", + ":flower_playing_cards:", + ":musical_note:", + ":notes:", + ":saxophone:", + ":guitar:", + ":musical_keyboard:", + ":trumpet:", + ":violin:", + ":musical_score:", + ":running_shirt_with_sash:", + ":tennis:", + ":ski:", + ":basketball:", + ":checkered_flag:", + ":snowboarder::tone1:", + ":snowboarder::tone2:", + ":snowboarder::tone3:", + ":snowboarder::tone4:", + ":snowboarder::tone5:", + ":snowboarder:", + ":runner_tone1:‍♀️", + ":runner_tone1:‍♂️", + ":runner_tone1:", + ":runner_tone2:‍♀️", + ":runner_tone2:‍♂️", + ":runner_tone2:", + ":runner_tone3:‍♀️", + ":runner_tone3:‍♂️", + ":runner_tone3:", + ":runner_tone4:‍♀️", + ":runner_tone4:‍♂️", + ":runner_tone4:", + ":runner_tone5:‍♀️", + ":runner_tone5:‍♂️", + ":runner_tone5:", + ":runner:‍♀️", + ":runner:‍♂️", + ":runner:", + ":surfer_tone1:‍♀️", + ":surfer_tone1:‍♂️", + ":surfer_tone1:", + ":surfer_tone2:‍♀️", + ":surfer_tone2:‍♂️", + ":surfer_tone2:", + ":surfer_tone3:‍♀️", + ":surfer_tone3:‍♂️", + ":surfer_tone3:", + ":surfer_tone4:‍♀️", + ":surfer_tone4:‍♂️", + ":surfer_tone4:", + ":surfer_tone5:‍♀️", + ":surfer_tone5:‍♂️", + ":surfer_tone5:", + ":surfer:‍♀️", + ":surfer:‍♂️", + ":surfer:", + ":medal:", + ":trophy:", + ":horse_racing_tone1:", + ":horse_racing_tone2:", + ":horse_racing_tone3:", + ":horse_racing_tone4:", + ":horse_racing_tone5:", + ":horse_racing:", + ":football:", + ":rugby_football:", + ":swimmer_tone1:‍♀️", + ":swimmer_tone1:‍♂️", + ":swimmer_tone1:", + ":swimmer_tone2:‍♀️", + ":swimmer_tone2:‍♂️", + ":swimmer_tone2:", + ":swimmer_tone3:‍♀️", + ":swimmer_tone3:‍♂️", + ":swimmer_tone3:", + ":swimmer_tone4:‍♀️", + ":swimmer_tone4:‍♂️", + ":swimmer_tone4:", + ":swimmer_tone5:‍♀️", + ":swimmer_tone5:‍♂️", + ":swimmer_tone5:", + ":swimmer:‍♀️", + ":swimmer:‍♂️", + ":swimmer:", + ":lifter_tone1:‍♀️", + ":lifter_tone1:‍♂️", + ":lifter_tone1:", + ":lifter_tone2:‍♀️", + ":lifter_tone2:‍♂️", + ":lifter_tone2:", + ":lifter_tone3:‍♀️", + ":lifter_tone3:‍♂️", + ":lifter_tone3:", + ":lifter_tone4:‍♀️", + ":lifter_tone4:‍♂️", + ":lifter_tone4:", + ":lifter_tone5:‍♀️", + ":lifter_tone5:‍♂️", + ":lifter_tone5:", + ":lifter:‍♀️", + ":lifter:‍♂️", + ":lifter:", + ":golfer::tone1:‍♀️", + ":golfer::tone1:‍♂️", + ":golfer::tone1:", + ":golfer::tone2:‍♀️", + ":golfer::tone2:‍♂️", + ":golfer::tone2:", + ":golfer::tone3:‍♀️", + ":golfer::tone3:‍♂️", + ":golfer::tone3:", + ":golfer::tone4:‍♀️", + ":golfer::tone4:‍♂️", + ":golfer::tone4:", + ":golfer::tone5:‍♀️", + ":golfer::tone5:‍♂️", + ":golfer::tone5:", + ":golfer:‍♀️", + ":golfer:‍♂️", + ":golfer:", + ":motorcycle:", + ":race_car:", + ":cricket:", + ":volleyball:", + ":field_hockey:", + ":hockey:", + ":ping_pong:", + ":mountain_snow:", + ":camping:", + ":beach:", + ":construction_site:", + ":homes:", + ":cityscape:", + ":house_abandoned:", + ":classical_building:", + ":desert:", + ":island:", + ":park:", + ":stadium:", + ":house:", + ":house_with_garden:", + ":office:", + ":post_office:", + ":european_post_office:", + ":hospital:", + ":bank:", + ":atm:", + ":hotel:", + ":love_hotel:", + ":convenience_store:", + ":school:", + ":department_store:", + ":factory:", + ":izakaya_lantern:", + ":japanese_castle:", + ":european_castle:", + ":flag_white:‍:rainbow:", + ":flag_white:", + ":flag_black:‍:skull_crossbones:", + ":flag_black:", + ":rosette:", + ":label:", + ":badminton:", + ":bow_and_arrow:", + ":amphora:", + ":tone1:", + ":tone2:", + ":tone3:", + ":tone4:", + ":tone5:", + ":rat:", + ":mouse2:", + ":ox:", + ":water_buffalo:", + ":cow2:", + ":tiger2:", + ":leopard:", + ":rabbit2:", + ":cat2:", + ":dragon:", + ":crocodile:", + ":whale2:", + ":snail:", + ":snake:", + ":racehorse:", + ":ram:", + ":goat:", + ":sheep:", + ":monkey:", + ":rooster:", + ":chicken:", + ":dog2:", + ":pig2:", + ":boar:", + ":elephant:", + ":octopus:", + ":shell:", + ":bug:", + ":ant:", + ":bee:", + ":beetle:", + ":fish:", + ":tropical_fish:", + ":blowfish:", + ":turtle:", + ":hatching_chick:", + ":baby_chick:", + ":hatched_chick:", + ":bird:", + ":penguin:", + ":koala:", + ":poodle:", + ":dromedary_camel:", + ":camel:", + ":dolphin:", + ":mouse:", + ":cow:", + ":tiger:", + ":rabbit:", + ":cat:", + ":dragon_face:", + ":whale:", + ":horse:", + ":monkey_face:", + ":dog:", + ":pig:", + ":frog:", + ":hamster:", + ":wolf:", + ":bear:", + ":panda_face:", + ":pig_nose:", + ":feet:", + ":chipmunk:", + ":eyes:", + ":eye_in_speech_bubble:", + ":eye:", + ":ear_tone1:", + ":ear_tone2:", + ":ear_tone3:", + ":ear_tone4:", + ":ear_tone5:", + ":ear:", + ":nose_tone1:", + ":nose_tone2:", + ":nose_tone3:", + ":nose_tone4:", + ":nose_tone5:", + ":nose:", + ":lips:", + ":tongue:", + ":point_up_2_tone1:", + ":point_up_2_tone2:", + ":point_up_2_tone3:", + ":point_up_2_tone4:", + ":point_up_2_tone5:", + ":point_up_2:", + ":point_down_tone1:", + ":point_down_tone2:", + ":point_down_tone3:", + ":point_down_tone4:", + ":point_down_tone5:", + ":point_down:", + ":point_left_tone1:", + ":point_left_tone2:", + ":point_left_tone3:", + ":point_left_tone4:", + ":point_left_tone5:", + ":point_left:", + ":point_right_tone1:", + ":point_right_tone2:", + ":point_right_tone3:", + ":point_right_tone4:", + ":point_right_tone5:", + ":point_right:", + ":punch_tone1:", + ":punch_tone2:", + ":punch_tone3:", + ":punch_tone4:", + ":punch_tone5:", + ":punch:", + ":wave_tone1:", + ":wave_tone2:", + ":wave_tone3:", + ":wave_tone4:", + ":wave_tone5:", + ":wave:", + ":ok_hand_tone1:", + ":ok_hand_tone2:", + ":ok_hand_tone3:", + ":ok_hand_tone4:", + ":ok_hand_tone5:", + ":ok_hand:", + ":thumbsup_tone1:", + ":thumbsup_tone2:", + ":thumbsup_tone3:", + ":thumbsup_tone4:", + ":thumbsup_tone5:", + ":thumbsup:", + ":thumbsdown_tone1:", + ":thumbsdown_tone2:", + ":thumbsdown_tone3:", + ":thumbsdown_tone4:", + ":thumbsdown_tone5:", + ":thumbsdown:", + ":clap_tone1:", + ":clap_tone2:", + ":clap_tone3:", + ":clap_tone4:", + ":clap_tone5:", + ":clap:", + ":open_hands_tone1:", + ":open_hands_tone2:", + ":open_hands_tone3:", + ":open_hands_tone4:", + ":open_hands_tone5:", + ":open_hands:", + ":crown:", + ":womans_hat:", + ":eyeglasses:", + ":necktie:", + ":shirt:", + ":jeans:", + ":dress:", + ":kimono:", + ":bikini:", + ":womans_clothes:", + ":purse:", + ":handbag:", + ":pouch:", + ":mans_shoe:", + ":athletic_shoe:", + ":high_heel:", + ":sandal:", + ":boot:", + ":footprints:", + ":bust_in_silhouette:", + ":busts_in_silhouette:", + ":boy_tone1:", + ":boy_tone2:", + ":boy_tone3:", + ":boy_tone4:", + ":boy_tone5:", + ":boy:", + ":girl_tone1:", + ":girl_tone2:", + ":girl_tone3:", + ":girl_tone4:", + ":girl_tone5:", + ":girl:", + ":man_tone1:‍:ear_of_rice:", + ":man_tone1:‍:cooking:", + ":man_tone1:‍:mortar_board:", + ":man_tone1:‍:microphone:", + ":man_tone1:‍:art:", + ":man_tone1:‍:school:", + ":man_tone1:‍:factory:", + ":man_tone1:‍:computer:", + ":man_tone1:‍:briefcase:", + ":man_tone1:‍:wrench:", + ":man_tone1:‍:microscope:", + ":man_tone1:‍:rocket:", + ":man_tone1:‍:fire_engine:", + ":man_tone1:‍⚕️", + ":man_tone1:‍:scales:", + ":man_tone1:‍:airplane:", + ":man_tone1:", + ":man_tone2:‍:ear_of_rice:", + ":man_tone2:‍:cooking:", + ":man_tone2:‍:mortar_board:", + ":man_tone2:‍:microphone:", + ":man_tone2:‍:art:", + ":man_tone2:‍:school:", + ":man_tone2:‍:factory:", + ":man_tone2:‍:computer:", + ":man_tone2:‍:briefcase:", + ":man_tone2:‍:wrench:", + ":man_tone2:‍:microscope:", + ":man_tone2:‍:rocket:", + ":man_tone2:‍:fire_engine:", + ":man_tone2:‍⚕️", + ":man_tone2:‍:scales:", + ":man_tone2:‍:airplane:", + ":man_tone2:", + ":man_tone3:‍:ear_of_rice:", + ":man_tone3:‍:cooking:", + ":man_tone3:‍:mortar_board:", + ":man_tone3:‍:microphone:", + ":man_tone3:‍:art:", + ":man_tone3:‍:school:", + ":man_tone3:‍:factory:", + ":man_tone3:‍:computer:", + ":man_tone3:‍:briefcase:", + ":man_tone3:‍:wrench:", + ":man_tone3:‍:microscope:", + ":man_tone3:‍:rocket:", + ":man_tone3:‍:fire_engine:", + ":man_tone3:‍⚕️", + ":man_tone3:‍:scales:", + ":man_tone3:‍:airplane:", + ":man_tone3:", + ":man_tone4:‍:ear_of_rice:", + ":man_tone4:‍:cooking:", + ":man_tone4:‍:mortar_board:", + ":man_tone4:‍:microphone:", + ":man_tone4:‍:art:", + ":man_tone4:‍:school:", + ":man_tone4:‍:factory:", + ":man_tone4:‍:computer:", + ":man_tone4:‍:briefcase:", + ":man_tone4:‍:wrench:", + ":man_tone4:‍:microscope:", + ":man_tone4:‍:rocket:", + ":man_tone4:‍:fire_engine:", + ":man_tone4:‍⚕️", + ":man_tone4:‍:scales:", + ":man_tone4:‍:airplane:", + ":man_tone4:", + ":man_tone5:‍:ear_of_rice:", + ":man_tone5:‍:cooking:", + ":man_tone5:‍:mortar_board:", + ":man_tone5:‍:microphone:", + ":man_tone5:‍:art:", + ":man_tone5:‍:school:", + ":man_tone5:‍:factory:", + ":man_tone5:‍:computer:", + ":man_tone5:‍:briefcase:", + ":man_tone5:‍:wrench:", + ":man_tone5:‍:microscope:", + ":man_tone5:‍:rocket:", + ":man_tone5:‍:fire_engine:", + ":man_tone5:‍⚕️", + ":man_tone5:‍:scales:", + ":man_tone5:‍:airplane:", + ":man_tone5:", + ":man:‍:ear_of_rice:", + ":man:‍:cooking:", + ":man:‍:mortar_board:", + ":man:‍:microphone:", + ":man:‍:art:", + ":man:‍:school:", + ":man:‍:factory:", + ":man:‍:boy:‍:boy:", + ":man:‍:boy:", + ":man:‍:girl:‍:boy:", + ":man:‍:girl:‍:girl:", + ":man:‍:girl:", + ":family_mmbb:", + ":family_mmb:", + ":family_mmgb:", + ":family_mmgg:", + ":family_mmg:", + ":family_mwbb:", + ":man:‍:woman:‍:boy:", + ":family_mwgb:", + ":family_mwgg:", + ":family_mwg:", + ":man:‍:computer:", + ":man:‍:briefcase:", + ":man:‍:wrench:", + ":man:‍:microscope:", + ":man:‍:rocket:", + ":man:‍:fire_engine:", + ":man:‍⚕️", + ":man:‍:scales:", + ":man:‍:airplane:", + ":couple_mm:", + ":kiss_mm:", + ":man:", + ":woman_tone1:‍:ear_of_rice:", + ":woman_tone1:‍:cooking:", + ":woman_tone1:‍:mortar_board:", + ":woman_tone1:‍:microphone:", + ":woman_tone1:‍:art:", + ":woman_tone1:‍:school:", + ":woman_tone1:‍:factory:", + ":woman_tone1:‍:computer:", + ":woman_tone1:‍:briefcase:", + ":woman_tone1:‍:wrench:", + ":woman_tone1:‍:microscope:", + ":woman_tone1:‍:rocket:", + ":woman_tone1:‍:fire_engine:", + ":woman_tone1:‍⚕️", + ":woman_tone1:‍:scales:", + ":woman_tone1:‍:airplane:", + ":woman_tone1:", + ":woman_tone2:‍:ear_of_rice:", + ":woman_tone2:‍:cooking:", + ":woman_tone2:‍:mortar_board:", + ":woman_tone2:‍:microphone:", + ":woman_tone2:‍:art:", + ":woman_tone2:‍:school:", + ":woman_tone2:‍:factory:", + ":woman_tone2:‍:computer:", + ":woman_tone2:‍:briefcase:", + ":woman_tone2:‍:wrench:", + ":woman_tone2:‍:microscope:", + ":woman_tone2:‍:rocket:", + ":woman_tone2:‍:fire_engine:", + ":woman_tone2:‍⚕️", + ":woman_tone2:‍:scales:", + ":woman_tone2:‍:airplane:", + ":woman_tone2:", + ":woman_tone3:‍:ear_of_rice:", + ":woman_tone3:‍:cooking:", + ":woman_tone3:‍:mortar_board:", + ":woman_tone3:‍:microphone:", + ":woman_tone3:‍:art:", + ":woman_tone3:‍:school:", + ":woman_tone3:‍:factory:", + ":woman_tone3:‍:computer:", + ":woman_tone3:‍:briefcase:", + ":woman_tone3:‍:wrench:", + ":woman_tone3:‍:microscope:", + ":woman_tone3:‍:rocket:", + ":woman_tone3:‍:fire_engine:", + ":woman_tone3:‍⚕️", + ":woman_tone3:‍:scales:", + ":woman_tone3:‍:airplane:", + ":woman_tone3:", + ":woman_tone4:‍:ear_of_rice:", + ":woman_tone4:‍:cooking:", + ":woman_tone4:‍:mortar_board:", + ":woman_tone4:‍:microphone:", + ":woman_tone4:‍:art:", + ":woman_tone4:‍:school:", + ":woman_tone4:‍:factory:", + ":woman_tone4:‍:computer:", + ":woman_tone4:‍:briefcase:", + ":woman_tone4:‍:wrench:", + ":woman_tone4:‍:microscope:", + ":woman_tone4:‍:rocket:", + ":woman_tone4:‍:fire_engine:", + ":woman_tone4:‍⚕️", + ":woman_tone4:‍:scales:", + ":woman_tone4:‍:airplane:", + ":woman_tone4:", + ":woman_tone5:‍:ear_of_rice:", + ":woman_tone5:‍:cooking:", + ":woman_tone5:‍:mortar_board:", + ":woman_tone5:‍:microphone:", + ":woman_tone5:‍:art:", + ":woman_tone5:‍:school:", + ":woman_tone5:‍:factory:", + ":woman_tone5:‍:computer:", + ":woman_tone5:‍:briefcase:", + ":woman_tone5:‍:wrench:", + ":woman_tone5:‍:microscope:", + ":woman_tone5:‍:rocket:", + ":woman_tone5:‍:fire_engine:", + ":woman_tone5:‍⚕️", + ":woman_tone5:‍:scales:", + ":woman_tone5:‍:airplane:", + ":woman_tone5:", + ":woman:‍:ear_of_rice:", + ":woman:‍:cooking:", + ":woman:‍:mortar_board:", + ":woman:‍:microphone:", + ":woman:‍:art:", + ":woman:‍:school:", + ":woman:‍:factory:", + ":woman:‍:boy:‍:boy:", + ":woman:‍:boy:", + ":woman:‍:girl:‍:boy:", + ":woman:‍:girl:‍:girl:", + ":woman:‍:girl:", + ":family_wwbb:", + ":family_wwb:", + ":family_wwgb:", + ":family_wwgg:", + ":family_wwg:", + ":woman:‍:computer:", + ":woman:‍:briefcase:", + ":woman:‍:wrench:", + ":woman:‍:microscope:", + ":woman:‍:rocket:", + ":woman:‍:fire_engine:", + ":woman:‍⚕️", + ":woman:‍:scales:", + ":woman:‍:airplane:", + ":woman:‍:heart:‍:man:", + ":couple_ww:", + ":woman:‍:heart:‍:kiss:‍:man:", + ":kiss_ww:", + ":woman:", + ":family::tone1:", + ":family::tone2:", + ":family::tone3:", + ":family::tone4:", + ":family::tone5:", + ":family:", + ":couple::tone1:", + ":couple::tone2:", + ":couple::tone3:", + ":couple::tone4:", + ":couple::tone5:", + ":couple:", + ":two_men_holding_hands::tone1:", + ":two_men_holding_hands::tone2:", + ":two_men_holding_hands::tone3:", + ":two_men_holding_hands::tone4:", + ":two_men_holding_hands::tone5:", + ":two_men_holding_hands:", + ":two_women_holding_hands::tone1:", + ":two_women_holding_hands::tone2:", + ":two_women_holding_hands::tone3:", + ":two_women_holding_hands::tone4:", + ":two_women_holding_hands::tone5:", + ":two_women_holding_hands:", + ":cop_tone1:‍♀️", + ":cop_tone1:‍♂️", + ":cop_tone1:", + ":cop_tone2:‍♀️", + ":cop_tone2:‍♂️", + ":cop_tone2:", + ":cop_tone3:‍♀️", + ":cop_tone3:‍♂️", + ":cop_tone3:", + ":cop_tone4:‍♀️", + ":cop_tone4:‍♂️", + ":cop_tone4:", + ":cop_tone5:‍♀️", + ":cop_tone5:‍♂️", + ":cop_tone5:", + ":cop:‍♀️", + ":cop:‍♂️", + ":cop:", + ":dancers::tone1:‍♀️", + ":dancers::tone1:‍♂️", + ":dancers::tone1:", + ":dancers::tone2:‍♀️", + ":dancers::tone2:‍♂️", + ":dancers::tone2:", + ":dancers::tone3:‍♀️", + ":dancers::tone3:‍♂️", + ":dancers::tone3:", + ":dancers::tone4:‍♀️", + ":dancers::tone4:‍♂️", + ":dancers::tone4:", + ":dancers::tone5:‍♀️", + ":dancers::tone5:‍♂️", + ":dancers::tone5:", + ":dancers:‍♀️", + ":dancers:‍♂️", + ":dancers:", + ":bride_with_veil_tone1:", + ":bride_with_veil_tone2:", + ":bride_with_veil_tone3:", + ":bride_with_veil_tone4:", + ":bride_with_veil_tone5:", + ":bride_with_veil:", + ":person_with_blond_hair_tone1:‍♀️", + ":person_with_blond_hair_tone1:‍♂️", + ":person_with_blond_hair_tone1:", + ":person_with_blond_hair_tone2:‍♀️", + ":person_with_blond_hair_tone2:‍♂️", + ":person_with_blond_hair_tone2:", + ":person_with_blond_hair_tone3:‍♀️", + ":person_with_blond_hair_tone3:‍♂️", + ":person_with_blond_hair_tone3:", + ":person_with_blond_hair_tone4:‍♀️", + ":person_with_blond_hair_tone4:‍♂️", + ":person_with_blond_hair_tone4:", + ":person_with_blond_hair_tone5:‍♀️", + ":person_with_blond_hair_tone5:‍♂️", + ":person_with_blond_hair_tone5:", + ":person_with_blond_hair:‍♀️", + ":person_with_blond_hair:‍♂️", + ":person_with_blond_hair:", + ":man_with_gua_pi_mao_tone1:", + ":man_with_gua_pi_mao_tone2:", + ":man_with_gua_pi_mao_tone3:", + ":man_with_gua_pi_mao_tone4:", + ":man_with_gua_pi_mao_tone5:", + ":man_with_gua_pi_mao:", + ":man_with_turban_tone1:‍♀️", + ":man_with_turban_tone1:‍♂️", + ":man_with_turban_tone1:", + ":man_with_turban_tone2:‍♀️", + ":man_with_turban_tone2:‍♂️", + ":man_with_turban_tone2:", + ":man_with_turban_tone3:‍♀️", + ":man_with_turban_tone3:‍♂️", + ":man_with_turban_tone3:", + ":man_with_turban_tone4:‍♀️", + ":man_with_turban_tone4:‍♂️", + ":man_with_turban_tone4:", + ":man_with_turban_tone5:‍♀️", + ":man_with_turban_tone5:‍♂️", + ":man_with_turban_tone5:", + ":man_with_turban:‍♀️", + ":man_with_turban:‍♂️", + ":man_with_turban:", + ":older_man_tone1:", + ":older_man_tone2:", + ":older_man_tone3:", + ":older_man_tone4:", + ":older_man_tone5:", + ":older_man:", + ":older_woman_tone1:", + ":older_woman_tone2:", + ":older_woman_tone3:", + ":older_woman_tone4:", + ":older_woman_tone5:", + ":older_woman:", + ":baby_tone1:", + ":baby_tone2:", + ":baby_tone3:", + ":baby_tone4:", + ":baby_tone5:", + ":baby:", + ":construction_worker_tone1:‍♀️", + ":construction_worker_tone1:‍♂️", + ":construction_worker_tone1:", + ":construction_worker_tone2:‍♀️", + ":construction_worker_tone2:‍♂️", + ":construction_worker_tone2:", + ":construction_worker_tone3:‍♀️", + ":construction_worker_tone3:‍♂️", + ":construction_worker_tone3:", + ":construction_worker_tone4:‍♀️", + ":construction_worker_tone4:‍♂️", + ":construction_worker_tone4:", + ":construction_worker_tone5:‍♀️", + ":construction_worker_tone5:‍♂️", + ":construction_worker_tone5:", + ":construction_worker:‍♀️", + ":construction_worker:‍♂️", + ":construction_worker:", + ":princess_tone1:", + ":princess_tone2:", + ":princess_tone3:", + ":princess_tone4:", + ":princess_tone5:", + ":princess:", + ":japanese_ogre:", + ":japanese_goblin:", + ":ghost:", + ":angel_tone1:", + ":angel_tone2:", + ":angel_tone3:", + ":angel_tone4:", + ":angel_tone5:", + ":angel:", + ":alien:", + ":space_invader:", + ":imp:", + ":skull:", + ":information_desk_person_tone1:‍♀️", + ":information_desk_person_tone1:‍♂️", + ":information_desk_person_tone1:", + ":information_desk_person_tone2:‍♀️", + ":information_desk_person_tone2:‍♂️", + ":information_desk_person_tone2:", + ":information_desk_person_tone3:‍♀️", + ":information_desk_person_tone3:‍♂️", + ":information_desk_person_tone3:", + ":information_desk_person_tone4:‍♀️", + ":information_desk_person_tone4:‍♂️", + ":information_desk_person_tone4:", + ":information_desk_person_tone5:‍♀️", + ":information_desk_person_tone5:‍♂️", + ":information_desk_person_tone5:", + ":information_desk_person:‍♀️", + ":information_desk_person:‍♂️", + ":information_desk_person:", + ":guardsman_tone1:‍♀️", + ":guardsman_tone1:‍♂️", + ":guardsman_tone1:", + ":guardsman_tone2:‍♀️", + ":guardsman_tone2:‍♂️", + ":guardsman_tone2:", + ":guardsman_tone3:‍♀️", + ":guardsman_tone3:‍♂️", + ":guardsman_tone3:", + ":guardsman_tone4:‍♀️", + ":guardsman_tone4:‍♂️", + ":guardsman_tone4:", + ":guardsman_tone5:‍♀️", + ":guardsman_tone5:‍♂️", + ":guardsman_tone5:", + ":guardsman:‍♀️", + ":guardsman:‍♂️", + ":guardsman:", + ":dancer_tone1:", + ":dancer_tone2:", + ":dancer_tone3:", + ":dancer_tone4:", + ":dancer_tone5:", + ":dancer:", + ":lipstick:", + ":nail_care_tone1:", + ":nail_care_tone2:", + ":nail_care_tone3:", + ":nail_care_tone4:", + ":nail_care_tone5:", + ":nail_care:", + ":massage_tone1:‍♀️", + ":massage_tone1:‍♂️", + ":massage_tone1:", + ":massage_tone2:‍♀️", + ":massage_tone2:‍♂️", + ":massage_tone2:", + ":massage_tone3:‍♀️", + ":massage_tone3:‍♂️", + ":massage_tone3:", + ":massage_tone4:‍♀️", + ":massage_tone4:‍♂️", + ":massage_tone4:", + ":massage_tone5:‍♀️", + ":massage_tone5:‍♂️", + ":massage_tone5:", + ":massage:‍♀️", + ":massage:‍♂️", + ":massage:", + ":haircut_tone1:‍♀️", + ":haircut_tone1:‍♂️", + ":haircut_tone1:", + ":haircut_tone2:‍♀️", + ":haircut_tone2:‍♂️", + ":haircut_tone2:", + ":haircut_tone3:‍♀️", + ":haircut_tone3:‍♂️", + ":haircut_tone3:", + ":haircut_tone4:‍♀️", + ":haircut_tone4:‍♂️", + ":haircut_tone4:", + ":haircut_tone5:‍♀️", + ":haircut_tone5:‍♂️", + ":haircut_tone5:", + ":haircut:‍♀️", + ":haircut:‍♂️", + ":haircut:", + ":barber:", + ":syringe:", + ":pill:", + ":kiss:", + ":love_letter:", + ":ring:", + ":gem:", + ":couplekiss:", + ":bouquet:", + ":couple_with_heart:", + ":wedding:", + ":heartbeat:", + ":broken_heart:", + ":two_hearts:", + ":sparkling_heart:", + ":heartpulse:", + ":cupid:", + ":blue_heart:", + ":green_heart:", + ":yellow_heart:", + ":purple_heart:", + ":gift_heart:", + ":revolving_hearts:", + ":heart_decoration:", + ":diamond_shape_with_a_dot_inside:", + ":bulb:", + ":anger:", + ":bomb:", + ":zzz:", + ":boom:", + ":sweat_drops:", + ":droplet:", + ":dash:", + ":poop:", + ":muscle_tone1:", + ":muscle_tone2:", + ":muscle_tone3:", + ":muscle_tone4:", + ":muscle_tone5:", + ":muscle:", + ":dizzy:", + ":speech_balloon:", + ":thought_balloon:", + ":white_flower:", + ":100:", + ":moneybag:", + ":currency_exchange:", + ":heavy_dollar_sign:", + ":credit_card:", + ":yen:", + ":dollar:", + ":euro:", + ":pound:", + ":money_with_wings:", + ":chart:", + ":seat:", + ":computer:", + ":briefcase:", + ":minidisc:", + ":floppy_disk:", + ":cd:", + ":dvd:", + ":file_folder:", + ":open_file_folder:", + ":page_with_curl:", + ":page_facing_up:", + ":date:", + ":calendar:", + ":card_index:", + ":chart_with_upwards_trend:", + ":chart_with_downwards_trend:", + ":bar_chart:", + ":clipboard:", + ":pushpin:", + ":round_pushpin:", + ":paperclip:", + ":straight_ruler:", + ":triangular_ruler:", + ":bookmark_tabs:", + ":ledger:", + ":notebook:", + ":notebook_with_decorative_cover:", + ":closed_book:", + ":book:", + ":green_book:", + ":blue_book:", + ":orange_book:", + ":books:", + ":name_badge:", + ":scroll:", + ":pencil:", + ":telephone_receiver:", + ":pager:", + ":fax:", + ":satellite:", + ":loudspeaker:", + ":mega:", + ":outbox_tray:", + ":inbox_tray:", + ":package:", + ":e-mail:", + ":incoming_envelope:", + ":envelope_with_arrow:", + ":mailbox_closed:", + ":mailbox:", + ":mailbox_with_mail:", + ":mailbox_with_no_mail:", + ":postbox:", + ":postal_horn:", + ":newspaper:", + ":iphone:", + ":calling:", + ":vibration_mode:", + ":mobile_phone_off:", + ":no_mobile_phones:", + ":signal_strength:", + ":camera:", + ":camera_with_flash:", + ":video_camera:", + ":tv:", + ":radio:", + ":vhs:", + ":projector:", + ":prayer_beads:", + ":twisted_rightwards_arrows:", + ":repeat:", + ":repeat_one:", + ":arrows_clockwise:", + ":arrows_counterclockwise:", + ":low_brightness:", + ":high_brightness:", + ":mute:", + ":speaker:", + ":sound:", + ":loud_sound:", + ":battery:", + ":electric_plug:", + ":mag:", + ":mag_right:", + ":lock_with_ink_pen:", + ":closed_lock_with_key:", + ":key:", + ":lock:", + ":unlock:", + ":bell:", + ":no_bell:", + ":bookmark:", + ":link:", + ":radio_button:", + ":back:", + ":end:", + ":on:", + ":soon:", + ":top:", + ":underage:", + ":keycap_ten:", + ":capital_abcd:", + ":abcd:", + ":1234:", + ":symbols:", + ":abc:", + ":fire:", + ":flashlight:", + ":wrench:", + ":hammer:", + ":nut_and_bolt:", + ":knife:", + ":gun:", + ":microscope:", + ":telescope:", + ":crystal_ball:", + ":six_pointed_star:", + ":beginner:", + ":trident:", + ":black_square_button:", + ":white_square_button:", + ":red_circle:", + ":large_blue_circle:", + ":large_orange_diamond:", + ":large_blue_diamond:", + ":small_orange_diamond:", + ":small_blue_diamond:", + ":small_red_triangle:", + ":small_red_triangle_down:", + ":arrow_up_small:", + ":arrow_down_small:", + ":om_symbol:", + ":dove:", + ":kaaba:", + ":mosque:", + ":synagogue:", + ":menorah:", + ":clock1:", + ":clock2:", + ":clock3:", + ":clock4:", + ":clock5:", + ":clock6:", + ":clock7:", + ":clock8:", + ":clock9:", + ":clock10:", + ":clock11:", + ":clock12:", + ":clock130:", + ":clock230:", + ":clock330:", + ":clock430:", + ":clock530:", + ":clock630:", + ":clock730:", + ":clock830:", + ":clock930:", + ":clock1030:", + ":clock1130:", + ":clock1230:", + ":candle:", + ":clock:", + ":hole:", + ":levitate::tone1:", + ":levitate::tone2:", + ":levitate::tone3:", + ":levitate::tone4:", + ":levitate::tone5:", + ":levitate:", + ":spy_tone1:‍♀️", + ":spy_tone1:‍♂️", + ":spy_tone1:", + ":spy_tone2:‍♀️", + ":spy_tone2:‍♂️", + ":spy_tone2:", + ":spy_tone3:‍♀️", + ":spy_tone3:‍♂️", + ":spy_tone3:", + ":spy_tone4:‍♀️", + ":spy_tone4:‍♂️", + ":spy_tone4:", + ":spy_tone5:‍♀️", + ":spy_tone5:‍♂️", + ":spy_tone5:", + ":spy:‍♀️", + ":spy:‍♂️", + ":spy:", + ":dark_sunglasses:", + ":spider:", + ":spider_web:", + ":joystick:", + ":man_dancing_tone1:", + ":man_dancing_tone2:", + ":man_dancing_tone3:", + ":man_dancing_tone4:", + ":man_dancing_tone5:", + ":man_dancing:", + ":paperclips:", + ":pen_ballpoint:", + ":pen_fountain:", + ":paintbrush:", + ":crayon:", + ":hand_splayed_tone1:", + ":hand_splayed_tone2:", + ":hand_splayed_tone3:", + ":hand_splayed_tone4:", + ":hand_splayed_tone5:", + ":hand_splayed:", + ":middle_finger_tone1:", + ":middle_finger_tone2:", + ":middle_finger_tone3:", + ":middle_finger_tone4:", + ":middle_finger_tone5:", + ":middle_finger:", + ":vulcan_tone1:", + ":vulcan_tone2:", + ":vulcan_tone3:", + ":vulcan_tone4:", + ":vulcan_tone5:", + ":vulcan:", + ":black_heart:", + ":desktop:", + ":printer:", + ":mouse_three_button:", + ":trackball:", + ":frame_photo:", + ":dividers:", + ":card_box:", + ":file_cabinet:", + ":wastebasket:", + ":notepad_spiral:", + ":calendar_spiral:", + ":compression:", + ":key2:", + ":newspaper2:", + ":dagger:", + ":speaking_head:", + ":speech_left:", + ":anger_right:", + ":ballot_box:", + ":map:", + ":mount_fuji:", + ":tokyo_tower:", + ":statue_of_liberty:", + ":japan:", + ":moyai:", + ":grinning:", + ":grin:", + ":joy:", + ":smiley:", + ":smile:", + ":sweat_smile:", + ":laughing:", + ":innocent:", + ":smiling_imp:", + ":wink:", + ":blush:", + ":yum:", + ":relieved:", + ":heart_eyes:", + ":sunglasses:", + ":smirk:", + ":neutral_face:", + ":expressionless:", + ":unamused:", + ":sweat:", + ":pensive:", + ":confused:", + ":confounded:", + ":kissing:", + ":kissing_heart:", + ":kissing_smiling_eyes:", + ":kissing_closed_eyes:", + ":stuck_out_tongue:", + ":stuck_out_tongue_winking_eye:", + ":stuck_out_tongue_closed_eyes:", + ":disappointed:", + ":worried:", + ":angry:", + ":rage:", + ":cry:", + ":persevere:", + ":triumph:", + ":disappointed_relieved:", + ":frowning:", + ":anguished:", + ":fearful:", + ":weary:", + ":sleepy:", + ":tired_face:", + ":grimacing:", + ":sob:", + ":open_mouth:", + ":hushed:", + ":cold_sweat:", + ":scream:", + ":astonished:", + ":flushed:", + ":sleeping:", + ":dizzy_face:", + ":no_mouth:", + ":mask:", + ":smile_cat:", + ":joy_cat:", + ":smiley_cat:", + ":heart_eyes_cat:", + ":smirk_cat:", + ":kissing_cat:", + ":pouting_cat:", + ":crying_cat_face:", + ":scream_cat:", + ":slight_frown:", + ":slight_smile:", + ":upside_down:", + ":rolling_eyes:", + ":no_good_tone1:‍♀️", + ":no_good_tone1:‍♂️", + ":no_good_tone1:", + ":no_good_tone2:‍♀️", + ":no_good_tone2:‍♂️", + ":no_good_tone2:", + ":no_good_tone3:‍♀️", + ":no_good_tone3:‍♂️", + ":no_good_tone3:", + ":no_good_tone4:‍♀️", + ":no_good_tone4:‍♂️", + ":no_good_tone4:", + ":no_good_tone5:‍♀️", + ":no_good_tone5:‍♂️", + ":no_good_tone5:", + ":no_good:‍♀️", + ":no_good:‍♂️", + ":no_good:", + ":ok_woman_tone1:‍♀️", + ":ok_woman_tone1:‍♂️", + ":ok_woman_tone1:", + ":ok_woman_tone2:‍♀️", + ":ok_woman_tone2:‍♂️", + ":ok_woman_tone2:", + ":ok_woman_tone3:‍♀️", + ":ok_woman_tone3:‍♂️", + ":ok_woman_tone3:", + ":ok_woman_tone4:‍♀️", + ":ok_woman_tone4:‍♂️", + ":ok_woman_tone4:", + ":ok_woman_tone5:‍♀️", + ":ok_woman_tone5:‍♂️", + ":ok_woman_tone5:", + ":ok_woman:‍♀️", + ":ok_woman:‍♂️", + ":ok_woman:", + ":bow_tone1:‍♀️", + ":bow_tone1:‍♂️", + ":bow_tone1:", + ":bow_tone2:‍♀️", + ":bow_tone2:‍♂️", + ":bow_tone2:", + ":bow_tone3:‍♀️", + ":bow_tone3:‍♂️", + ":bow_tone3:", + ":bow_tone4:‍♀️", + ":bow_tone4:‍♂️", + ":bow_tone4:", + ":bow_tone5:‍♀️", + ":bow_tone5:‍♂️", + ":bow_tone5:", + ":bow:‍♀️", + ":bow:‍♂️", + ":bow:", + ":see_no_evil:", + ":hear_no_evil:", + ":speak_no_evil:", + ":raising_hand_tone1:‍♀️", + ":raising_hand_tone1:‍♂️", + ":raising_hand_tone1:", + ":raising_hand_tone2:‍♀️", + ":raising_hand_tone2:‍♂️", + ":raising_hand_tone2:", + ":raising_hand_tone3:‍♀️", + ":raising_hand_tone3:‍♂️", + ":raising_hand_tone3:", + ":raising_hand_tone4:‍♀️", + ":raising_hand_tone4:‍♂️", + ":raising_hand_tone4:", + ":raising_hand_tone5:‍♀️", + ":raising_hand_tone5:‍♂️", + ":raising_hand_tone5:", + ":raising_hand:‍♀️", + ":raising_hand:‍♂️", + ":raising_hand:", + ":raised_hands_tone1:", + ":raised_hands_tone2:", + ":raised_hands_tone3:", + ":raised_hands_tone4:", + ":raised_hands_tone5:", + ":raised_hands:", + ":person_frowning_tone1:‍♀️", + ":person_frowning_tone1:‍♂️", + ":person_frowning_tone1:", + ":person_frowning_tone2:‍♀️", + ":person_frowning_tone2:‍♂️", + ":person_frowning_tone2:", + ":person_frowning_tone3:‍♀️", + ":person_frowning_tone3:‍♂️", + ":person_frowning_tone3:", + ":person_frowning_tone4:‍♀️", + ":person_frowning_tone4:‍♂️", + ":person_frowning_tone4:", + ":person_frowning_tone5:‍♀️", + ":person_frowning_tone5:‍♂️", + ":person_frowning_tone5:", + ":person_frowning:‍♀️", + ":person_frowning:‍♂️", + ":person_frowning:", + ":person_with_pouting_face_tone1:‍♀️", + ":person_with_pouting_face_tone1:‍♂️", + ":person_with_pouting_face_tone1:", + ":person_with_pouting_face_tone2:‍♀️", + ":person_with_pouting_face_tone2:‍♂️", + ":person_with_pouting_face_tone2:", + ":person_with_pouting_face_tone3:‍♀️", + ":person_with_pouting_face_tone3:‍♂️", + ":person_with_pouting_face_tone3:", + ":person_with_pouting_face_tone4:‍♀️", + ":person_with_pouting_face_tone4:‍♂️", + ":person_with_pouting_face_tone4:", + ":person_with_pouting_face_tone5:‍♀️", + ":person_with_pouting_face_tone5:‍♂️", + ":person_with_pouting_face_tone5:", + ":person_with_pouting_face:‍♀️", + ":person_with_pouting_face:‍♂️", + ":person_with_pouting_face:", + ":pray_tone1:", + ":pray_tone2:", + ":pray_tone3:", + ":pray_tone4:", + ":pray_tone5:", + ":pray:", + ":rocket:", + ":helicopter:", + ":steam_locomotive:", + ":railway_car:", + ":bullettrain_side:", + ":bullettrain_front:", + ":train2:", + ":metro:", + ":light_rail:", + ":station:", + ":tram:", + ":train:", + ":bus:", + ":oncoming_bus:", + ":trolleybus:", + ":busstop:", + ":minibus:", + ":ambulance:", + ":fire_engine:", + ":police_car:", + ":oncoming_police_car:", + ":taxi:", + ":oncoming_taxi:", + ":red_car:", + ":oncoming_automobile:", + ":blue_car:", + ":truck:", + ":articulated_lorry:", + ":tractor:", + ":monorail:", + ":mountain_railway:", + ":suspension_railway:", + ":mountain_cableway:", + ":aerial_tramway:", + ":ship:", + ":rowboat_tone1:‍♀️", + ":rowboat_tone1:‍♂️", + ":rowboat_tone1:", + ":rowboat_tone2:‍♀️", + ":rowboat_tone2:‍♂️", + ":rowboat_tone2:", + ":rowboat_tone3:‍♀️", + ":rowboat_tone3:‍♂️", + ":rowboat_tone3:", + ":rowboat_tone4:‍♀️", + ":rowboat_tone4:‍♂️", + ":rowboat_tone4:", + ":rowboat_tone5:‍♀️", + ":rowboat_tone5:‍♂️", + ":rowboat_tone5:", + ":rowboat:‍♀️", + ":rowboat:‍♂️", + ":rowboat:", + ":speedboat:", + ":traffic_light:", + ":vertical_traffic_light:", + ":construction:", + ":rotating_light:", + ":triangular_flag_on_post:", + ":door:", + ":no_entry_sign:", + ":smoking:", + ":no_smoking:", + ":put_litter_in_its_place:", + ":do_not_litter:", + ":potable_water:", + ":non-potable_water:", + ":bike:", + ":no_bicycles:", + ":bicyclist_tone1:‍♀️", + ":bicyclist_tone1:‍♂️", + ":bicyclist_tone1:", + ":bicyclist_tone2:‍♀️", + ":bicyclist_tone2:‍♂️", + ":bicyclist_tone2:", + ":bicyclist_tone3:‍♀️", + ":bicyclist_tone3:‍♂️", + ":bicyclist_tone3:", + ":bicyclist_tone4:‍♀️", + ":bicyclist_tone4:‍♂️", + ":bicyclist_tone4:", + ":bicyclist_tone5:‍♀️", + ":bicyclist_tone5:‍♂️", + ":bicyclist_tone5:", + ":bicyclist:‍♀️", + ":bicyclist:‍♂️", + ":bicyclist:", + ":mountain_bicyclist_tone1:‍♀️", + ":mountain_bicyclist_tone1:‍♂️", + ":mountain_bicyclist_tone1:", + ":mountain_bicyclist_tone2:‍♀️", + ":mountain_bicyclist_tone2:‍♂️", + ":mountain_bicyclist_tone2:", + ":mountain_bicyclist_tone3:‍♀️", + ":mountain_bicyclist_tone3:‍♂️", + ":mountain_bicyclist_tone3:", + ":mountain_bicyclist_tone4:‍♀️", + ":mountain_bicyclist_tone4:‍♂️", + ":mountain_bicyclist_tone4:", + ":mountain_bicyclist_tone5:‍♀️", + ":mountain_bicyclist_tone5:‍♂️", + ":mountain_bicyclist_tone5:", + ":mountain_bicyclist:‍♀️", + ":mountain_bicyclist:‍♂️", + ":mountain_bicyclist:", + ":walking_tone1:‍♀️", + ":walking_tone1:‍♂️", + ":walking_tone1:", + ":walking_tone2:‍♀️", + ":walking_tone2:‍♂️", + ":walking_tone2:", + ":walking_tone3:‍♀️", + ":walking_tone3:‍♂️", + ":walking_tone3:", + ":walking_tone4:‍♀️", + ":walking_tone4:‍♂️", + ":walking_tone4:", + ":walking_tone5:‍♀️", + ":walking_tone5:‍♂️", + ":walking_tone5:", + ":walking:‍♀️", + ":walking:‍♂️", + ":walking:", + ":no_pedestrians:", + ":children_crossing:", + ":mens:", + ":womens:", + ":restroom:", + ":baby_symbol:", + ":toilet:", + ":wc:", + ":shower:", + ":bath_tone1:", + ":bath_tone2:", + ":bath_tone3:", + ":bath_tone4:", + ":bath_tone5:", + ":bath:", + ":bathtub:", + ":passport_control:", + ":customs:", + ":baggage_claim:", + ":left_luggage:", + ":couch:", + ":sleeping_accommodation::tone1:", + ":sleeping_accommodation::tone2:", + ":sleeping_accommodation::tone3:", + ":sleeping_accommodation::tone4:", + ":sleeping_accommodation::tone5:", + ":sleeping_accommodation:", + ":shopping_bags:", + ":bellhop:", + ":bed:", + ":place_of_worship:", + ":octagonal_sign:", + ":shopping_cart:", + ":tools:", + ":shield:", + ":oil:", + ":motorway:", + ":railway_track:", + ":motorboat:", + ":airplane_small:", + ":airplane_departure:", + ":airplane_arriving:", + ":satellite_orbital:", + ":cruise_ship:", + ":scooter:", + ":motor_scooter:", + ":canoe:", + ":zipper_mouth:", + ":money_mouth:", + ":thermometer_face:", + ":nerd:", + ":thinking:", + ":head_bandage:", + ":robot:", + ":hugging:", + ":metal_tone1:", + ":metal_tone2:", + ":metal_tone3:", + ":metal_tone4:", + ":metal_tone5:", + ":metal:", + ":call_me_tone1:", + ":call_me_tone2:", + ":call_me_tone3:", + ":call_me_tone4:", + ":call_me_tone5:", + ":call_me:", + ":raised_back_of_hand_tone1:", + ":raised_back_of_hand_tone2:", + ":raised_back_of_hand_tone3:", + ":raised_back_of_hand_tone4:", + ":raised_back_of_hand_tone5:", + ":raised_back_of_hand:", + ":left_facing_fist_tone1:", + ":left_facing_fist_tone2:", + ":left_facing_fist_tone3:", + ":left_facing_fist_tone4:", + ":left_facing_fist_tone5:", + ":left_facing_fist:", + ":right_facing_fist_tone1:", + ":right_facing_fist_tone2:", + ":right_facing_fist_tone3:", + ":right_facing_fist_tone4:", + ":right_facing_fist_tone5:", + ":right_facing_fist:", + ":handshake_tone1:", + ":handshake_tone2:", + ":handshake_tone3:", + ":handshake_tone4:", + ":handshake_tone5:", + ":handshake:", + ":fingers_crossed_tone1:", + ":fingers_crossed_tone2:", + ":fingers_crossed_tone3:", + ":fingers_crossed_tone4:", + ":fingers_crossed_tone5:", + ":fingers_crossed:", + ":cowboy:", + ":clown:", + ":nauseated_face:", + ":rofl:", + ":drooling_face:", + ":lying_face:", + ":face_palm_tone1:‍♀️", + ":face_palm_tone1:‍♂️", + ":face_palm_tone1:", + ":face_palm_tone2:‍♀️", + ":face_palm_tone2:‍♂️", + ":face_palm_tone2:", + ":face_palm_tone3:‍♀️", + ":face_palm_tone3:‍♂️", + ":face_palm_tone3:", + ":face_palm_tone4:‍♀️", + ":face_palm_tone4:‍♂️", + ":face_palm_tone4:", + ":face_palm_tone5:‍♀️", + ":face_palm_tone5:‍♂️", + ":face_palm_tone5:", + ":face_palm:‍♀️", + ":face_palm:‍♂️", + ":face_palm:", + ":sneezing_face:", + ":pregnant_woman_tone1:", + ":pregnant_woman_tone2:", + ":pregnant_woman_tone3:", + ":pregnant_woman_tone4:", + ":pregnant_woman_tone5:", + ":pregnant_woman:", + ":selfie_tone1:", + ":selfie_tone2:", + ":selfie_tone3:", + ":selfie_tone4:", + ":selfie_tone5:", + ":selfie:", + ":prince_tone1:", + ":prince_tone2:", + ":prince_tone3:", + ":prince_tone4:", + ":prince_tone5:", + ":prince:", + ":man_in_tuxedo_tone1:", + ":man_in_tuxedo_tone2:", + ":man_in_tuxedo_tone3:", + ":man_in_tuxedo_tone4:", + ":man_in_tuxedo_tone5:", + ":man_in_tuxedo:", + ":mrs_claus_tone1:", + ":mrs_claus_tone2:", + ":mrs_claus_tone3:", + ":mrs_claus_tone4:", + ":mrs_claus_tone5:", + ":mrs_claus:", + ":shrug_tone1:‍♀️", + ":shrug_tone1:‍♂️", + ":shrug_tone1:", + ":shrug_tone2:‍♀️", + ":shrug_tone2:‍♂️", + ":shrug_tone2:", + ":shrug_tone3:‍♀️", + ":shrug_tone3:‍♂️", + ":shrug_tone3:", + ":shrug_tone4:‍♀️", + ":shrug_tone4:‍♂️", + ":shrug_tone4:", + ":shrug_tone5:‍♀️", + ":shrug_tone5:‍♂️", + ":shrug_tone5:", + ":shrug:‍♀️", + ":shrug:‍♂️", + ":shrug:", + ":cartwheel_tone1:‍♀️", + ":cartwheel_tone1:‍♂️", + ":cartwheel_tone1:", + ":cartwheel_tone2:‍♀️", + ":cartwheel_tone2:‍♂️", + ":cartwheel_tone2:", + ":cartwheel_tone3:‍♀️", + ":cartwheel_tone3:‍♂️", + ":cartwheel_tone3:", + ":cartwheel_tone4:‍♀️", + ":cartwheel_tone4:‍♂️", + ":cartwheel_tone4:", + ":cartwheel_tone5:‍♀️", + ":cartwheel_tone5:‍♂️", + ":cartwheel_tone5:", + ":cartwheel:‍♀️", + ":cartwheel:‍♂️", + ":cartwheel:", + ":juggling_tone1:‍♀️", + ":juggling_tone1:‍♂️", + ":juggling_tone1:", + ":juggling_tone2:‍♀️", + ":juggling_tone2:‍♂️", + ":juggling_tone2:", + ":juggling_tone3:‍♀️", + ":juggling_tone3:‍♂️", + ":juggling_tone3:", + ":juggling_tone4:‍♀️", + ":juggling_tone4:‍♂️", + ":juggling_tone4:", + ":juggling_tone5:‍♀️", + ":juggling_tone5:‍♂️", + ":juggling_tone5:", + ":juggling:‍♀️", + ":juggling:‍♂️", + ":juggling:", + ":fencer:", + ":wrestlers_tone1:‍♀️", + ":wrestlers_tone1:‍♂️", + ":wrestlers_tone1:", + ":wrestlers_tone2:‍♀️", + ":wrestlers_tone2:‍♂️", + ":wrestlers_tone2:", + ":wrestlers_tone3:‍♀️", + ":wrestlers_tone3:‍♂️", + ":wrestlers_tone3:", + ":wrestlers_tone4:‍♀️", + ":wrestlers_tone4:‍♂️", + ":wrestlers_tone4:", + ":wrestlers_tone5:‍♀️", + ":wrestlers_tone5:‍♂️", + ":wrestlers_tone5:", + ":wrestlers:‍♀️", + ":wrestlers:‍♂️", + ":wrestlers:", + ":water_polo_tone1:‍♀️", + ":water_polo_tone1:‍♂️", + ":water_polo_tone1:", + ":water_polo_tone2:‍♀️", + ":water_polo_tone2:‍♂️", + ":water_polo_tone2:", + ":water_polo_tone3:‍♀️", + ":water_polo_tone3:‍♂️", + ":water_polo_tone3:", + ":water_polo_tone4:‍♀️", + ":water_polo_tone4:‍♂️", + ":water_polo_tone4:", + ":water_polo_tone5:‍♀️", + ":water_polo_tone5:‍♂️", + ":water_polo_tone5:", + ":water_polo:‍♀️", + ":water_polo:‍♂️", + ":water_polo:", + ":handball_tone1:‍♀️", + ":handball_tone1:‍♂️", + ":handball_tone1:", + ":handball_tone2:‍♀️", + ":handball_tone2:‍♂️", + ":handball_tone2:", + ":handball_tone3:‍♀️", + ":handball_tone3:‍♂️", + ":handball_tone3:", + ":handball_tone4:‍♀️", + ":handball_tone4:‍♂️", + ":handball_tone4:", + ":handball_tone5:‍♀️", + ":handball_tone5:‍♂️", + ":handball_tone5:", + ":handball:‍♀️", + ":handball:‍♂️", + ":handball:", + ":wilted_rose:", + ":drum:", + ":champagne_glass:", + ":tumbler_glass:", + ":spoon:", + ":goal:", + ":first_place:", + ":second_place:", + ":third_place:", + ":boxing_glove:", + ":martial_arts_uniform:", + ":croissant:", + ":avocado:", + ":cucumber:", + ":bacon:", + ":potato:", + ":carrot:", + ":french_bread:", + ":salad:", + ":shallow_pan_of_food:", + ":stuffed_flatbread:", + ":egg:", + ":milk:", + ":peanuts:", + ":kiwi:", + ":pancakes:", + ":crab:", + ":lion_face:", + ":scorpion:", + ":turkey:", + ":unicorn:", + ":eagle:", + ":duck:", + ":bat:", + ":shark:", + ":owl:", + ":fox:", + ":butterfly:", + ":deer:", + ":gorilla:", + ":lizard:", + ":rhino:", + ":shrimp:", + ":squid:", + ":cheese:", + ":bangbang:", + ":interrobang:", + ":tm:", + ":information_source:", + ":left_right_arrow:", + ":arrow_up_down:", + ":arrow_upper_left:", + ":arrow_upper_right:", + ":arrow_lower_right:", + ":arrow_lower_left:", + ":leftwards_arrow_with_hook:", + ":arrow_right_hook:", + ":hash:", + ":watch:", + ":hourglass:", + ":keyboard:", + ":eject:", + ":fast_forward:", + ":rewind:", + ":arrow_double_up:", + ":arrow_double_down:", + ":track_next:", + ":track_previous:", + ":play_pause:", + ":alarm_clock:", + ":stopwatch:", + ":timer:", + ":hourglass_flowing_sand:", + ":pause_button:", + ":stop_button:", + ":record_button:", + ":m:", + ":black_small_square:", + ":white_small_square:", + ":arrow_forward:", + ":arrow_backward:", + ":white_medium_square:", + ":black_medium_square:", + ":white_medium_small_square:", + ":black_medium_small_square:", + ":sunny:", + ":cloud:", + ":umbrella2:", + ":snowman2:", + ":comet:", + ":telephone:", + ":ballot_box_with_check:", + ":umbrella:", + ":coffee:", + ":shamrock:", + ":point_up_tone1:", + ":point_up_tone2:", + ":point_up_tone3:", + ":point_up_tone4:", + ":point_up_tone5:", + ":point_up:", + ":skull_crossbones:", + ":radioactive:", + ":biohazard:", + ":orthodox_cross:", + ":star_and_crescent:", + ":peace:", + ":yin_yang:", + ":wheel_of_dharma:", + ":frowning2:", + ":relaxed:", + "♀", + "♂", + ":aries:", + ":taurus:", + ":gemini:", + ":cancer:", + ":leo:", + ":virgo:", + ":libra:", + ":scorpius:", + ":sagittarius:", + ":capricorn:", + ":aquarius:", + ":pisces:", + ":spades:", + ":clubs:", + ":hearts:", + ":diamonds:", + ":hotsprings:", + ":recycle:", + ":wheelchair:", + ":hammer_pick:", + ":anchor:", + ":crossed_swords:", + "⚕", + ":scales:", + ":alembic:", + ":gear:", + ":atom:", + ":fleur-de-lis:", + ":warning:", + ":zap:", + ":white_circle:", + ":black_circle:", + ":coffin:", + ":urn:", + ":soccer:", + ":baseball:", + ":snowman:", + ":partly_sunny:", + ":thunder_cloud_rain:", + ":ophiuchus:", + ":pick:", + ":helmet_with_cross:", + ":chains:", + ":no_entry:", + ":shinto_shrine:", + ":church:", + ":mountain:", + ":beach_umbrella:", + ":fountain:", + ":golf:", + ":ferry:", + ":sailboat:", + ":skier::tone1:", + ":skier::tone2:", + ":skier::tone3:", + ":skier::tone4:", + ":skier::tone5:", + ":skier:", + ":ice_skate:", + ":basketball_player_tone1:‍♀️", + ":basketball_player_tone1:‍♂️", + ":basketball_player_tone1:", + ":basketball_player_tone2:‍♀️", + ":basketball_player_tone2:‍♂️", + ":basketball_player_tone2:", + ":basketball_player_tone3:‍♀️", + ":basketball_player_tone3:‍♂️", + ":basketball_player_tone3:", + ":basketball_player_tone4:‍♀️", + ":basketball_player_tone4:‍♂️", + ":basketball_player_tone4:", + ":basketball_player_tone5:‍♀️", + ":basketball_player_tone5:‍♂️", + ":basketball_player_tone5:", + ":basketball_player:‍♀️", + ":basketball_player:‍♂️", + ":basketball_player:", + ":tent:", + ":fuelpump:", + ":scissors:", + ":white_check_mark:", + ":airplane:", + ":envelope:", + ":fist_tone1:", + ":fist_tone2:", + ":fist_tone3:", + ":fist_tone4:", + ":fist_tone5:", + ":fist:", + ":raised_hand_tone1:", + ":raised_hand_tone2:", + ":raised_hand_tone3:", + ":raised_hand_tone4:", + ":raised_hand_tone5:", + ":raised_hand:", + ":v_tone1:", + ":v_tone2:", + ":v_tone3:", + ":v_tone4:", + ":v_tone5:", + ":v:", + ":writing_hand_tone1:", + ":writing_hand_tone2:", + ":writing_hand_tone3:", + ":writing_hand_tone4:", + ":writing_hand_tone5:", + ":writing_hand:", + ":pencil2:", + ":black_nib:", + ":heavy_check_mark:", + ":heavy_multiplication_x:", + ":cross:", + ":star_of_david:", + ":sparkles:", + ":eight_spoked_asterisk:", + ":eight_pointed_black_star:", + ":snowflake:", + ":sparkle:", + ":x:", + ":negative_squared_cross_mark:", + ":question:", + ":grey_question:", + ":grey_exclamation:", + ":exclamation:", + ":heart_exclamation:", + ":heart:", + ":heavy_plus_sign:", + ":heavy_minus_sign:", + ":heavy_division_sign:", + ":arrow_right:", + ":curly_loop:", + ":loop:", + ":arrow_heading_up:", + ":arrow_heading_down:", + ":asterisk:", + ":arrow_left:", + ":arrow_up:", + ":arrow_down:", + ":black_large_square:", + ":white_large_square:", + ":star:", + ":o:", + ":zero:", + ":wavy_dash:", + ":part_alternation_mark:", + ":one:", + ":two:", + ":congratulations:", + ":secret:", + ":three:", + ":four:", + ":five:", + ":six:", + ":seven:", + ":eight:", + ":nine:", + ":copyright:", + ":registered:", + "" +]; + +frappe.ui.emoji_map = (function() { + const map = {}; + for(let i = 0; i < frappe.ui.emojis.length; i++) { + map[frappe.ui.emoji_keywords[i]] = frappe.ui.emojis[i]; + } + return map; +})(); \ No newline at end of file diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less index 45bde29460..2ada74b8f7 100644 --- a/frappe/public/less/desk.less +++ b/frappe/public/less/desk.less @@ -591,6 +591,24 @@ a.progress-small { } } +.note-hint-popover { + border-radius: 3px; + border-color: @border-color; + padding: 0; + + .popover-content { + padding: 0; + } + + .note-hint-item { + color: @text-color !important; + padding: 5px 8.8px !important; + } + .note-hint-item.active { + background-color: @btn-bg !important; + } +} + .search-dialog { .modal-dialog { width: 768px; From 7fa8148d33c74e9a4ffa8bc957c6a1dd89c37c04 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Fri, 28 Jul 2017 11:14:33 +0530 Subject: [PATCH 11/52] Graph additions (#3776) * remove hardcoded height and width * [graph] relative measures, offsets, generalise all base jobs * Multiple datasets! (individually colored) * [graph] Tooltips * [graph] animate and change values * [graph] percentage graph * [graph] custom height, window resize refresh * [graph] style changes * [graph] update docs * [graphs] make graphs.less * [graphs] prefix classes with 'graph-', nest inside parent class --- .eslintrc | 4 +- .../assets/img/desk/animated_line_graph.gif | Bin 0 -> 306915 bytes frappe/docs/assets/img/desk/bar_graph.png | Bin 30001 -> 27995 bytes frappe/docs/assets/img/desk/line_graph.png | Bin 39700 -> 0 bytes .../docs/assets/img/desk/line_graph_sales.png | Bin 0 -> 61751 bytes .../docs/assets/img/desk/percentage_graph.png | Bin 0 -> 17452 bytes .../docs/user/en/guides/desk/making_graphs.md | 149 +++-- frappe/public/build.json | 5 +- frappe/public/css/form.css | 74 --- frappe/public/css/graphs.css | 274 +++++++++ frappe/public/js/frappe/form/dashboard.js | 5 +- frappe/public/js/frappe/ui/graph.js | 308 ---------- frappe/public/js/frappe/ui/graphs.js | 569 ++++++++++++++++++ .../js/frappe/views/reports/query_report.js | 2 +- frappe/public/less/form.less | 109 +--- frappe/public/less/graphs.less | 319 ++++++++++ frappe/tests/test_goal.py | 2 +- frappe/utils/goal.py | 26 +- 18 files changed, 1291 insertions(+), 555 deletions(-) create mode 100644 frappe/docs/assets/img/desk/animated_line_graph.gif delete mode 100644 frappe/docs/assets/img/desk/line_graph.png create mode 100644 frappe/docs/assets/img/desk/line_graph_sales.png create mode 100644 frappe/docs/assets/img/desk/percentage_graph.png create mode 100644 frappe/public/css/graphs.css delete mode 100644 frappe/public/js/frappe/ui/graph.js create mode 100644 frappe/public/js/frappe/ui/graphs.js create mode 100644 frappe/public/less/graphs.less diff --git a/.eslintrc b/.eslintrc index 44af7b458f..ade1623262 100644 --- a/.eslintrc +++ b/.eslintrc @@ -118,6 +118,8 @@ "getCookie": true, "getCookies": true, "get_url_arg": true, - "QUnit": true + "QUnit": true, + "Snap": true, + "mina": true } } diff --git a/frappe/docs/assets/img/desk/animated_line_graph.gif b/frappe/docs/assets/img/desk/animated_line_graph.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b0e7b212c6b7321d344c574a9d0a2b3e68ffc17 GIT binary patch literal 306915 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 T%D(@8-Be3m|6!%7UG#qd+0S45 literal 30001 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 J)d$nB{|mG<7k2;v diff --git a/frappe/docs/assets/img/desk/line_graph.png b/frappe/docs/assets/img/desk/line_graph.png deleted file mode 100644 index 02c60c7c1868536060186648c666bd37e8e4de8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39700 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 diff --git a/frappe/docs/assets/img/desk/line_graph_sales.png b/frappe/docs/assets/img/desk/line_graph_sales.png new file mode 100644 index 0000000000000000000000000000000000000000..0e70ae00318bf724f6f2a5228ccdeb3dd08ab3ad GIT binary patch literal 61751 zcmeFYRahR&5-$AV?oM!bhX6r?y9al7cPGJvySqEVU4sR8cXxLT}FU|DGqIB0BW0000dCMqZo0D#H@06@}^;BPHi`ujEj049~GfPk!+ zfB=E4owbpvg&_c-;veS1Hi_`CCFoBXr;pw6n*J+oXGv>juu3Oz#-HUj~B$wubE!H(!2WaFTRYQ-!L-> zGi;a^x-+&pg@59bJC5>#M~BS+Y@@B>Q?_rlScR#r8OqC<3zel}bxD@Tg+_+{E-RT0_p6Ri>b5cUaI}qe(AI+kD2u`>~qR*(_(#|Av zx}3*jfO>4q$T)pnT{o)Edjb9%F?<~}!Wo2jcJQ>7c4*f67pG54V-z~z4!(G6KuDsF z5QH80ch|qBM+jG)(lG%<1VH#}U?fhY-fHYtyimgBbp+rZ{E--tkBidAk3|?kf?FTF z^FAp+oJe1RFZXqTVS~Qjd*@>H z*|O?o^!#YBNU#XiNwwis6KlC$?X@oZ5#N3*cuDHD462~Rd0qMr=?T^9n>i4|66|c} z@>w_S(<};EJ@>kdHQVA6FybdKZ--p!Jmb9C*XfV8^{-|3&@i{0IBm694g#NZ#JqUg z*0~l$S#CBM;cp^QccbFsu)nq0$K|X69J{P6RATBkGk~3ktJ^SL*w{(=fl8+rZdaBBvME+kzptV zG)C<6-3+4|A%*rb>H1fS_qRFxe9({3kznw~?q;B^9S_UT?%vDIUDOeGBug6SjO zq+7FEOST1Rpj=`~2ObSe=>4#!dDeLc>OuFy*#^bylku}6YCIAuvM5?L+BI4z#xOE2 znlM;hNe3ZC?=#;=);w8qp-VI?`Qh9%vnKU^8L!V{2j)N#RKGNO2D{3TcdIQTg{IHWs>IgmP7I-p!JaO1bqwL*9jc~W{pJfnid^9OY%c4iQ!t&<5L zbaN5o=5XbJZ0i2>_!;oA@5uDXc}|2~7AG5r z4M&7soV|$yoxPDAjzfTh-looW#Fo+4)b`%q(4N(H*lyC^+~(2N*#4uv_lEA)_zu+8 zz^3VL((d*e>qgjGYu93TbDfAu#B=&L?rC@7`~Lgb``-ltWiwMX_ zC<>T6=v0h7R25`YWCv6(N)>8$;vOOc8dPFM%BwGl1f`T7q75o8vY^!2G{^+<6cgkj z$V!OUXu}xCXad2MA@{*(A=jb$JxV=adqaBzNhwHcNQp?PNLM77#FE9xL}$dk;x-cO zq6T9RVjpPB2yiJhsh))cq<;#M@#pjJ1eO+-23oWoW#aIU@SP-Tq%AqSGP=^=OI%c- z?xFoclcuVnvY?=%j7BX%HIBQBTZ)B_4T!^vEsK?*H;)DYLg=yGSXYwTw3V zxWZH5u_U|(UTn8*B)YuVs?;hJuhh6OA%8YUrog(wTh9BJPK0j+e_m%xmft#3H#+h6 zs3N)i@k+*msz6)+^OoRfu~M;S%DkeoeW6JNqiiFRAK><}jlr(*_v$b}p*o>z5;~?9 zNroI|qy~=t2fnN`3xk}i4>@7qhvibF)!i1q*3DXC96KB_9j(m4EQ-w4bIN{d;8bL% z;W*$(x5sggwhM7|+xfL~w5ze}XK!mmX|Fn0&`xi>8e8ILUVS*`mGvBW%gf#2L~z#8 z{dEc=7~-@^cL`^?ytxd8Hn_J3%vt{y_|_FcGvX32gS(dN2e)zSRO^VVlzWML#%21s z-0i?c()IM!@O9ed1_}#r6-{=Ki{wdMLL6J74bNO*1FtQ+Sb?eK?wY`_2+ks* z!Ue)IeV9EO+0+aAh_XkO+p;JP$MbE=1)4FMXItW>h zOV;b$SVFcCGZ^TT51be&8C0eooEw}NVk-yJ{y<+(X(T-Y#T%bkO)geAw}-hC~+ zD%G0esD!MfT%1%qY3-|yRL`^Q)XeSBcO`wOx!tUE3wnaKRM4LB1!P)q_SfvgO!zFv z?DcHQR6ScE>ykIY{hAuFwf>91&p<4xEh#anlwrnU7}_ja`v?y_sTw>B&&i!BwmGZi zl}X)&^R24R%{uAhksa~_8SIQ=p0ZQOyV891tj8C7|J_@6RChDCIJd(G#Ru$% z+nbMYCh%NtS+^VKndfUi642=%1CIi=;F{qh+AlmnFMg;+$eCgURGkqMA0mm&2e@%WXtlU|+}m1dgCnt1$Jb2>S- zJ2q-=KcH>Wj_QH-;&z%cQ-9)Ga9?zqdz!*4{cP~;dYtf7F#}fOU)7u0Tboy7IJ13$ zwjDR3)Hl6fTj;ptwi3`U+-*I%YW?vm+ed+5l8u`Zz<0&i`i}tKav(k%aGy2=*MiK2 zfmSCNSj#*d06Smwn6cug)S$Xv6J38B3m0@ID?3MMm_b07YO&h^hZ+%qW9?6nOZ~y6C&+jU>1b=gCYsdd%Q`z2CY#j&VyZ+^Rz znz(n9^haL%;F|gO?QAs8SxxF3D}&V*g=y{QXSQS9#^$=)u9J+iqC(3;cg5A2v5PhS z&F8>rDYRiyTK@<;waJC>x<}_Zo-aoR`x>rHFE#at=RfLBL`FZj7rS3RbUipiK!VU~ zZ6Ua|D`IxR!XYHIhj^5+`r+;iK1r+}UzzMAF3j~bPi~rRW~^d(Rwnt77n2{8E9Y19 zhIm_~*CnN=axhY}e!4GuvOh~*TIxzTsK8q_X8yicWePoLTp6r#S=I6ql#m#g^5bf1@hTMXt9lOw+&Pf4AUV3Z)u$CYV!J2>C3V%BCxAE7g(OMOgY&3Gm?rn^17 z--cnqP`daEGYIWYCxtq!mELqwe&;CWy&qE|Wf(TwG}x}OTejq#v$k_+7NCw^uMoLc zYo}fP^9NhIRVL6SU)%XwH;RWvFGuL6CRqxawW*)_z_&^C(f1WroC6 zrn|7)=~dqCBZ5l%82*&EDfbo+&NbL=RmLPn}Ul5 z>r+_~YLl^(UztgN^zqz#-lSeWBVVyzsqcC0IZs6NXNhnAs@tmG zS1;5{H!@bYzUXD*GWly|wdl~K`l1Wm>giR=jcwa_P_&O^Im2q77wb_R&YCx^I2 z?XX(HXo7j73(({s#K8UF427g7KIB}4eFTW07^5jeIrGTSS>L3?wi&#L0%d2mAx4Z< z+tiCjnItAgu~&eK>wU3PIS6+6`pa>itI@^vBN&=csa}PAcy$bP$)Nf4XV%fy>I0Q) z#xU$*SXymMZd`s%Z0^ik1@8r&{xe^>@~VVjpMeI`^rSqFk(Obi@rk*R-h&v&7^(QO zinL_zPOo3<`I~a&D8|CO&UD+4pCd254PU!K&LJF^&#az%fNud2t?9Ap#9Fg02=^3^ zrH^cny^rQ#K0fgsoBU0kdu!p5C|L_xLxEIcBmGI5NLE-c)I{`l)>|ryPr4)B2sz7o ziF(4}ig;4r9YavU)wyQSGaQ%5`RV0Yg1141m_%P3?TEHr%^Vks95yKLCmSY-jjarG z)8P79xI~;!Y-id^8;=rkjy2LQDKXA4CNIcgROtuMi!{D8X3Nqj5orv%$JKtn!FJ_P z1!LV1JNUR{m0sGU`n)mofV*nBhG z*OJyG#V(c|5Alf{k1^b3%AZwiMQ*K%vkXNclxn#;3{d49-S9m zxwL-9d-r2QnV%9U0n7k1t~9YDy3a2)l2H!;fSCjE1r%_k2ski6fW!Mt)lfK!lE*vp`#E6{R(YEbtmu=Ba)s_5*JG5chlNwJaTMQbkzn!5fUR6&Xd}v zr_wJ5G1GMaG_}ae$?9GsTx0Bje(l499&GPI+`^ayl}Gs%tD>>R-`}uOsm?KHI2N~4 zYo&9Zab~~TzImvIy4PzT1Rf%yDGu3vDS`XG)uL7Aj^&~J;SgK{QUmG+5{un{&kQyp zqA)y~-Q$zdX;j->q(08M0Mxvg5jnbyQ9($7W9kKGcj7tSrR$8zh!NhXP#o|N2?%-- z3~f5xMlw0u`v8aOyJPBG_$m1*W!4jGbo1>K1{e7ysd?(9cJ@RLny04M<2>hGURV!@ z6wUk3x5qyb&LrIA3{CAxEo-eTZJs-Y2TsSN@{aF-EMIr{Am)4tBEgb7a2osw5FwcO zDGMQ5b)YTyBqLD`fL#TGWf`v^AACONe3LbzKt3QUhP#H_@sV23v0>#3HWFCOoE*o+ zgv<%&@N@N1?K9Iusgki}VK-hwFqAVs9riklZUvAl1XOckQ5@) zDags<<|pSn<)36RW}0SAXIkb@<{f6&=iv)6O)C9_C6miH{uQW_sA8s4rpj9_^aEv1 zf}@6=jDxvRvZ1I!#P#GNeSWjApnJ6IRdp?EO_k7E7Z(Xgj+3#4T^N{Nj8uqRiu!AU zYE)X(hxk)@m)twiB8mI3K?K&~)`^1|Y_H^XH4;m0TyjkTZZuC<5JLfhoUcD^$&@8O z4e!v-(O#DUM>5kc-n3|jd)9Ru_8AqN(m_9NXlCHAablj#9FFX+A17@(t~U1>PdE=} zQ1a1@(NQqn>4{40kt5qD^1B%H)b>YpvyAUBVu@(=LjUZ=OJP5W5sjIO!%6p(;!XKXQ zY)ZO@^U_ zFEzKh*rDZzcCQMH3SQ{>=NcavQ2?9{Tnj%{j9kn@3X+QNfxEgFu@MRyZJ`?>3hHe$4BikbiX%OY_eVYPjUk#`X{I@9Vye|?^ z-B1xIlqm3#N+I!!kPBUl)J-%@(M?Au#KyP_5R3>IVwn#Z+6+UCcJxkkIl2!<^1JB< zJ3Fd=attc?Q^@w zO&$c}a6|!3?N^EyRA+>j+$S=4vd9K_z@N><2-h``Eai~K(?!~T#{Cq*#}`+T`JC24 zKA9RT0VRPeSWYSefEtORMJ?a-RH^bKce_|iRk=~AS0`^d ztc~jH!NX#g^T=xVYDAf8g@h%d$Ji}HmTHw@U2W#_1!L1?=VYa^-f|3g!b2)JrWS0= zFHAPqS`NF-vhBTJ%|Yj32v9L+id`&bWalUkmsO1w+Hh?`qZnSi&%_%AE2DYZvluk! zD>M&ubaX;=!*p-#QNCBMSdRQfKpA2Nb>?EGt>QxkMn#3?oaNFJ+^f@rr#{L;&1y?q z?ThY;UG-uggkTW}z{tY>vVZ{4U=Oe`u(B#gv$nE|B^dar4p0Mjewm%;F*gBFxYYYM z35vwOKEDpW0!RvmJyPyPOWuwU(oGdr98{zvIrXhA>2wXO^$h7;EZ>e3-hNyzoNt$w zh7P&}E|wNn_M9%|-fBTP{$i%_HhLfJ&+1Z)SnVHVo&X}H&gM)*ffr*}piT3RdT6SAc2B4}!9Xl4I41`i`60}Iz50{`mzXUP8&RsBblnfZSt z|EuRONiO=|Gx)C={b{a0THox&1I z;{t<1f<{MH7d5ZHj##kGUqv=GyNYy=NORclBuP2lrr5Vlu2oB}2?9aO`T(P50>CKv z{<)Mb_7NyDZ}9t9$M1XiP;>zP^q}v`g#$n+wgI-R|D)|M#cxs-{|xcpqy0ar|FMP- zE|_d}lp7t?{7<`)#1hK?>iqk%0}Wb57a$bDEwS3U{4A1L@PNezq+QCX@?x5Y+tYs1 z@0@4JlE9#Z1wl(Qy>#)S!8Et?;M&Um#WN?x4!onC$g&-2}?fI(0 zd20Vu!;3!Rh0Ac0^=RWMnE9pe=rilI{^XPMnb;MOL38cTIWYwNO4nxl=JVs0SKaFo zk~@*BpL6HVS?)n1S*`cq-t)plu+mbn5a!RxU?5o3=U0cTI-^-CxkeCrQz`c6XQEK) z1n83@-2U_9VwfCm> zzE>rB?%KQTnxK47bAiD=)(93k^+q>N`qcZqPvjjlgg~mO!k}hOFHfG$$wAqaKH#Km ziAZT?pLCU)*5?%26Qn=b@uXkC1|*P2E`zB&^zY8uD@NSl(vHx$)^B|V0+&e+El^zR zb-|T~knSLF$LlUc?;un%s#w|MW`O<*0pHbaJh5h2^~v}>AMnZZnFf<3=!~kert8|< zx@331!esM$1zHJy!5L+N@6LwOWxpEIlYI3+L8ciY8q(7mHtIW?@goUb@xm!tty5`q z#i%BKhKUG+?#+?dT?@$A=^xbLV!LMiZmD|!ZcxSg{;*^^hCs0v7LOMwsU}>oIpE+q zN(Pxv4uM1MRxwtenj_iP2=L<82Ku4s*Q=s5eREdV0$!PG<*QoKN4$n>3v!G^&Ewj9 z^RvPxulnt-B3r0N_IPyZ>b}oP`0N1KJRjkWB%&80@rLqBA`B^03;q|G{&Zk6AnGAs zU=j@&Wx` zaAR1nebOGubV>mX3B1@An5njeEk3Ld;KsW;ze3c$?!y>u6o5r<8uatk@YaCSnKj@g zUEmqeA>Pua2Kq)!;zLOnt^;AFm2wpTp9RW+Wl9XDe!6$KJoW2X{WLiyUMXV8_ z5Ffe0{{AS!7(-34LCROrrT6gM9j$T!5Yp;*+4A26@E6Whas!nN`RciUD`k8K(QoKF z-Xyhk)A8TwR6^GQ|A9=&i=zl%Je*>6L>sz1R zsdD13$iIn%FAfZouZW2d=D#KWa-NQrx4x=d>R*>R|8}R$L15TS#iU5EcZg8u^sR61 z5pCyQ?%xxUH3R~eEtc#De$R5wZ+%D4(3el|bQV^>(WDZY0nj^3JlE_qG9xpVDboe! z8IT(A0UP43i&MHksMMmPcfN|Df)NG0;j^-V?RwbV_kUXt$Q-3I+~uqPV5fF_=P3CS z!%im>WVK2;Z#6vrix-|{1%3dMWos=fL{7ryu7D|+I){ti*fH^#s(PB=c1C#*(rR6z zhyCr73e%In?N z;VyffzGwZbpN*;`bk@7P*T%V_H=9^l%Ys)!K6mtt>L;7eGhe>3#pj%i@G-1*`%#=R#%R&^WW=RP{w!Oq8^lpBGt%GvI7Mbp56slzsy1A`mPmz?jUd2jHQs-6X z^Wnx39KycQ=5aX@?FGdp9^T6Rvd>gqc(@h1yJ&qXv{O6O0VNP_fd!3r^9Nh^kLx=5 z%vLyZW61fkSstI?F`5#LiY5l$S3xOqVjkUT>22d6u(LvS3g$#fy z(`1d1)-5J;l|6$R`%%238MO%JR+i;z+t~{_cKZurSY?&meJ9c-ogw!@sxPs3c~6%& zPNXsk6Ft^Cvc`12k8oA`)<~u>7&oPvWHVi5n(K)nmhK`8E zs++8!jNT>`F_C*Nc1K~kk$yzpVXoXX%zrIjPWZ`E2xd!&f&w=s7V`Pe6 z3oHT(VovhwW}sJm-e{Y)mLX9)8WhSZ-d588o!N@D->dxtK9bhiwn`g1h`4P}JmAZa?R&_Cs=q>tfC}M{SYZqkPz`rsjeUH|w0J z@sznbng@|PC{RamxM8lfp!8Uq$Y?C)qD1~i8Ea5?HQX5R&Q7C7tsDe|pi`cQ3mQjA zTCB$SWm=`J`B`8A&vCit$V3Pu>&yq{sfU{k!BIxj+@yFiu!9j%O|ghaxSC(@O}b_} zKma3?Vu*uHCYm&V2r~=X@}uOXmw3sx=qbo0;5g?(-WI7K4I9=rEw=YhDMdZ%<9H_o zDHZ8Bu*)oj-mifSBz6mU)H}_`(LlkYkWi3(JEazGJBRuZq#muTJ6~?;BH~puFpWWM zb(pcbAn=JJG|G<1`Xsm;-}1Ab7!qp128j=zd(&FEi-k#n z-|oR3Z044`&A%<76ABDRH)IfsHd^t65iEFMLR@ecocDBtR_3C96ZRcuKrPJmIfjs> za@|-8d&jQOii#ba_L+(`H%sB~bx--dfoHAHFM;>qdhs`0-(2e-zY{POg1teq8BkK- zdjwJUn;?!4`xX@5!FiZBty92E2>kzcLm$iEl(aY-QTtAyl8FxbMoC}>c<&MK;u}Hs z)>Yt}zk`T;w2*Hk2-D96`i}kTXy0hpQk!=s{om&CRYQEEUGzv-$aj3jLfr=lb+OH> zl=~g6wFDgiaaw{)#D8NT^jzJW$?H6yRovgvYR2ya6syL!L--ESRa(B8+~V<}>gFA- z|8F7x|14xIXOq|d{=TS`R7pD=n4--evf+a<3e%udr?n5yJBqBnzkbn> zkdrHyA)bT{CD0S|ya1CH^Aj*KB5`m8m{AmYVMN8pgSYaudJ(JK&olezZDRyYzZY4Z zfE|bdNKqIe5H?d+fVrsQ$4iv;?;oB;t5iyjMvs^MPL)f0M`HX>iFSKV`!3K*s+^Q9 z*0~2MO3ng2gx}e1w9r$bfWa)ZQ~eRYUKKBviXq7v+h49Ho;19v-{$rz7>;}67(SAP zsXp^)X*8fi6;<82tPI_4WSVBA#+WniUsu>ru%fklzA)x{Hm^Fg4p9uDYa^C2zq28F z!H#%+knzKuUjUq}*S~ll=XkvYB_}%*na|-RUDlx-#N*M)Me=IJtZ3S_Py&$@GI~Mu zPkO2A1N0`NO}6^eOSTvdwge@yn4v3L7+@*YzvyVA%bKa)i@b}9b#ywrK(UfE9`>}H z%Z~Kmpr1^A5gj{`H<;H}i-cBcFNIFS%SA<_*(k7z8iELFtPRw*aaYi+RK+HG$>E?9 z986a8t4#f6$OZRc8z>kP%hWsf-CAHR2fv(d(6vR~WUOLp#c zfV7IofQ=%Rw(2O#$%kE%#tR$oDb0>KhBHQ@rj=UT@YnIa1e@)|jaDX=-WH{7rMa9j zHFZOM6`N)9PN`ofe#eS4)H?8JD%Nn+>OYn?6CdqqQnB;(8c9OKc%p&@+FyOr&dpqC zlXz{|+PCa6;2@9Z6y4Lac*8e$qBO2CbjJLNri8xi$5hhKaIq*;ZNQcXL4E;Bniv}7 z1sK1FH>N<3aG4z#A2ntno|D-L1%8rz4CI-bhCap)`F^Z!E6pvo5}_?E4j>h^%XIL@tG2%u-U0>f{E!~BSJ=IJ=v=}bSxt@2XaegU!8ABg$MU?nzwf)jdtx${ z>D&7yHSgb9M28xf!;D%L)$C9w21o$H2>p)iPu?qH3wBE*L!p z{u}CnJ|Vs(gJhrBBgE4_3)^AaIi#P($CLQyFG-4FoBPyfkf%bIMb3~1i`iV9`KKJr z=rhKt#rLws|9FE925kHFZ6yZI$ZfX~Wyua527))3czN+cTl7_rqq14=5*i-w>)`Lk?<;O&CfZ)_hK!@ z&zRSF9ibQ~Yln-7;o;%e+p*?bTnh5?>sz^BQ&LDWHx*5P1B`*8VOL*Y!GxiWh{-+V z^lpZakKa;|Ls2T9o?f;`#rcd^JGCMPJ6aC}-x!)xcbEU2ps14cH$(56Rh7S^bt>4WTsnO4 z>pztcY802_+Sy9GZSmZK0*sQRP92||9Aa!16Ilyf3`LC&6Be@oc=(n;W!u^f^_?B9 zpW8!?3+59oGt0}k-2rgjlQO)PT0MW((h7~a=AFJUtQ4ZRn>>y zf-3CDxM%%E0IiMw`{B%leb!%-Z4Hb5e$u%}A2ZjkVBi~qj@fE%4WV=pFbbWrw^&W( zFiyAiZ+IwV^^I;io?7U1C4g4U0ca0R2MuKZ?nM2)5Ri}=|IF?m+xcd{sX;|sxBsW< zA0LqYZBHTsk9XVx02TuM<`;_JM&Ge@CLhwpSI zPrhx$09kM+Skze&9o~y{>#A94iTyjZc1PBML3M9R=EC^fvSunBVCg(~HcpQGfq2X7 zCbldU<;&wsLqanHZseh8(~K$le08xgX>s^fg*HXQj}ha3z`*1cjLQ2axXk|N{!5~E}|L$!7_*|!6v{h zAS`jO?U**Ubxm&u{AJY?q_<~FX;duz&z_zk&|y*TsxPY%yhnqGo(4wv<_yJ9;p>{> z6HYut9M4A%En>_|05hEe^-@@OD(+b>$Zx=Rc7Peca&Pg2VL zs}7Oz_A-d%`iqX>(B<*0C>lx5Akx(*n(G_B3PuDmzC4fx*Kz?1Q4CYL82{E3nJmqU zy8CPPR$E4N>tEg>@E^HDw1zco)-sO4U^xD&npH9b)$vvRfEk?3`isXh>p(TeIGDN| zDmy5k*im`P^?x8?dTFXdr5g~Q)YLqkUGeV%eKe!xP4xsGmrbvSw+;o|w#1XBbK5>z zdLojPsmRllbnP8|g`ZssYNO?<@vF`JZjGqsY9MZoirWG#z_9kv-vvQ?Lxbc^=LV7C zSt$#X4gfNl7px^3`26I`y_C#4tu}5zo;C{eu!oe9OTxMDEqe3@m96W zUqdMtrKcI|Dm`_YwMmGN%cwvi_^uhB5NOAAx!O@OJnN-5 zK5#RhyztmqEuoIgl{=m?qNz-@Pb>?omkQijI%n2mM7o{P<4A)nT^!inC`!JB?++v~ zRrt|Nn337iZ%kn)Oz<#?V`RRhO{32>TWPM?))f5B{5sCSd95E7mV+<89VrtGCBk8d z7(a6Jr(^vAB`O&{bSMxnA^eBygnLd(-Y#M~B#(FKslUScsG+z_ViXh{_9h|9JRnr3 zcuQm>2~Rpko_4j`%B$0Ws`^M>vh%mX?ri0>c(D@l7l?ASD!7RbAxDhF=c5w@{W%rA zVynra(wD9fi9j4>`4dlPw;gK-%;k~iXh7$z#i9B$$)NfB$FxzsZh zCBxMJz;&N8=t`J~GA)jo4-(;YB2y9ii08*POOKC=M>3q^Xn&#r-!UXR=f*^lNosrm zNtv5ahjzG|%O$!22l`Tq*|Y?hjE0TdAt%lKnScdtmV2n2q26#x_2hI5yl>brEj7qk z)+|AdxsexLnJje3C_)QrtPWk#o&N4RGFKE1DON$9Ijzbs4z+3&`I@k_R+tC;M%Ti^ z5Fq2x9t`@zF=Sk#$3Rnw8{r?9> zPvSk=qkn;WMCA-@Sv0*j=lIJ33%!6uNc2Wu3|J5n)_s{}belw7?o>urydc}m zD2S4aA~bi#{9RN0BJ{{_#6Bihj+l5on_SuPLhe@D)Z9!H@>~MowOOpSpXB1!Xv9nd zZxHx3u9z%_@zdvOESm`TGEGv0^KRm-q2JdBABYWTBid?eX%qMk{DvmCKa{YC${ zyk)0y2PP3MaBsS#%H!E9@uW3T8L)d})p<)jqqi$I4bh-87~FnQ4Slnt;RszCuBlzx z!2Do8=iwz%wXN}2t-jF7w}oAFsqUCPE%rOehgtJ1q#PlSt)3Z6(MWVEplI?u>xldY zhkODeT^1D!lk%l|?eoy@PWldKk@4hFYG)+ZQ(C3Z1#8UT$7OR{gHdzh8z5Nx+Y=C$ zLf|rv0yFdT*Md1E`4$mttQJ2b_tfzzV1;8LgND42VV}#(co!KPB!YgmL#{e;$3hZ4 z)?qBd#=uzxiIST*76~s`%dpA*6Yi!Ue8Ce8t7lQdG+!CDo+;te+?;wEX`7?Qj4)T+ z8wyC$dBZtIX?q&uagp3id2h1FcUl-EC6>^CJb3<6jrkVTpFh|5%`e2cv|3|wa#ELNr)#JrbHGA%(LPO9qC6(I)PTj-`a5Nc zcIRMBJBI!}#Q~|t2M5PDBg(dQ_`_h-erth;cfwbu#m|9OCm}EB=u64;Z9kaY8E5DA# z)%K4zfb`?rR2E~R>sVLJ@Uz4IZ$q3PSka&FnYun{%jV$PEGio3Zm2(eapyHslICvbm0%W=IE(mGue*H*Up#L3g=r ztZv7gZ{!H#p%&m3w`=3wV(ivA5YMw8TlaVn!rTrY>e%sQXnhp)s63VEF(%10)&b2I z<|^Fgy(ct+yCKExj6FNYNh_$v@O}Ifex;y}p6=Cg*u=+r^Ua0_{|a_3Bs$7LC=TSe zdQLhDGOR`Xcu=g?Im=js&GNCAN;8YnV?Nj%?1AyQZLzzu2&33H!+mS=hQ| z_9k4`d4MeRBP*5&H?w7;XrOONRrI!;WXT_fEW{tu{jN|wNm6(LCY_%)J(#k5h~;qo zF$_^>CE`DUBTBz?IBoooo|TcP-M=x{9H<#Sb88Q7;=ll4G#q>KDX6zZf#>H!C-=CZ zAATTwDj27Pv2N0cCJRB0wnEY;f7oYRoKY~&B7%??VAv+vZ{n%?1w2rXdT>D|IsNiT z#x}ihoya=(%{A2q%+iL?TU*$bJkow-1v8ts%qdx;Fv;v}HiD~U%Z#}~idC6nVqi_| zoV)ZlPB%TXUw78$Y3(be2U{-d#qONvOt@yY@z})}0#N=H?PoFpJ3WOlp=ked!J@2} z?$K|3Dos>AV=(paucj3{he=D?dzWdReSB`M1D#??%&uF`wk;~UerI3G)v zvNyuhTX|!^zKb5)`vRV@F8#>Nfw%9p%{ioI(&iN@Ozgt8=&-UKM;q(9_)#P# zqJb&m4^fz6&Zc%|Yu3Y*oHL=)er|MzJM)2Au%n@`QE>TlQ$2pqIaB;ne&&VaUr;Gx zm|=^W9x^n&MZtwu;s0zsAm>uNi*1jZeqj67G`(3UzW(+{|95j=6`4fUAs_^5#3y!3 zlD*Nbt4wq->iZVU)*jcoW{t0?RX#~r+&c3!*Sex0FDawgMef~~mQtd}l#B&;K(EVu zP?#+;OK@2H41P*vvi=}Q4lo8cNH-&kisNXJ##oOI&7W@7#G&fKWWaRx%|5>+u; zh*=o&#`IE4a>Vb{|GEYCtyY02@|HCBMFGWzd}8vEw=F5Q7yyVXT|wU%0`fYtsqEj5 zvV|(n+TOC)o5CYza9Jv9W%tKx||C3uQ0wo8VMnjv!>pU7=dF!uqUIN184v3i6pxpIZa}x6$D``lCr*iJaYX< zUMMRArU>x=&nCWpJ4A_n@O-BBxS=wsX7wrnm70-|h~c%Rq!wD7MP-o-*2yVlGm)PV zt2?s@u?BAoMY#12zJF}%_+@!&0+co1n$GW&;w{!}^A@_xh5}nzSw+5b$aPSGMsIP` zcN5%C;W(Z--uRCA2KSe3bX6k%nVkBn{eGV!zSDBwhRWo^`H7CUGP7xy#E{f{TA4p4 z9cUeyA=vLAee-ZbU!ovRTRHA=3kfT3_ra)@!FAJ{l&=P+JCAkHei^S*stkO`x(^Fl zHq#0eHu}3-AJUHl@OC^rCEnhOsUJ=O_^FpOMguty>xvw{V#;8ORw5@tf8|)fZ{>^9 zH6j&tv=`2HloI{f&0PiWtz8y5$0I`im@GCt7Rmv&u))jAN}02p6PY}rL1eDWSqs{X zq0*8JpNuf@KygkPx*VS}$U+<;DrLERMi^qXo4y}W5!t%9BpG#R^fQ0gE#5}VboyPJ z!!<794S`NB<+}c)D2-x&i=$*ZJz=0SbZ9GZ$-}ldk(+%N)AXV~6vpIuX}&Nvv`Bx{ z>+LT2)5oZlS`D=R?Np+eg28)L&!gtGe$u`}R! zvF`R}&^YmtiFo35;Yi@ZaWahPeWu{^-2fian?Y4C1a3aZg8C(+C>a1#tk9t!zVA6! zEjbN+pmISuB(%_iJw3cytNUjR2=NnU!9-YcP`yn_Reft`kep-R?08S*?M1S{y13ep zvwzS!pW*M9T}o5KP7?50I9h=)n4o!RiZg=;jkCS58{=0HmV{*XV<^M~d?XcrkAE<7!w`ahv%cWecTMYgzVJ8baCZ!m;@SohL%t z5fyLq;<{e~U*Fh+w_o%8+*`7HZ|0-kf)YZv)UKKb1l?PrMMWD)tu2VV6}m@D2*PMR zn*DjZknWqA1I;wFq4kFDRYK2bDuwJa@I$IYPo6ekJfk`_ryOztL=)?Tmb;cTo|-fs zIRq}3p_UX>lGuek6m3hgnJ>B};p^XpjgIo)=em}amMVD3**Ulx9F0SvHQJuG6y2jpAS55Q-RB=1Yy<&tR~z38HPz&k=XnGv0{=G~quzJ1ydV zN~5M@RbCTq$KW_CSC;p=<*V%%Z!P4Cf(?fS4ub|GB3Zi}7K$d~zmd9Fj9`1q%VGf~ z6zBA3P|#6;jzW&8!hWOa-2JQ*jtomjyOM~YBRrMU)Lc&AItn)Q>C;LUSNF-ZW zsO1nCDGW;kjlw`lLk$_&#NTO^S+JNhIZjvcoXLLn53OXpK69ln{4piijuvEw!(#3im)>dym{fEbk1(S&Wqm8O~+mirI;00e|vy_6I6bDo`7 zq`=6ta+`J=%*PQUy^ikDjTyF!B!zbTijh0$Dm?xM&R;O@_4vZVlRSyct_(}RNP9&# z$7g4Weji}&C)_5_o_6G7Ju;e)u)CzxZ|Wxjd-x{|=%-QNl8BE90>33%q2W!Bd1PoT za+>1c5*=H@_eAomD4jD~aSAyXSI{lcGGc!7!@JJ?X=lNhtLxf#?IX^n&VA+=b2KS$ z_4~^6C8w6^O%NOjj-s>?3GR%ZGQzJgX==j4;C6PfXE!%gHC+ANfQnl;a0Ex}uOCSx zv(>)QhTbbZHu74q;2p7p$7|9?%^`&aKr`o7b_; z^LWzmSR?aoS1>is8XXuDK8A{4Yf33U($UF-|C#nj$dc&=O=30WM@~#O+7+2k=9f5a ztvj-7&ZxJ;VDTX6M@|c|)*39AANLy4n_7gwxhb`Lredv7X`p=t-_ec6IQ}7O{B)v>neqrn?$CVl=}y&G=?8xJkDBKXH_K2H<|EjBZLgt$II(uOZN zsV%eC@i#7c=w+?y8?ENXpB*(7J29{C+P|)Dd>By31x|LZZ_itrp;2~|w6bmn7KxTI zp@n!2UoA`fc0iXetgb*jrqq{vkyBW1Kou0N+y7b8j3(I)G&76&bXO^me&~1jCc6s8 zH1ZRe$MfPV`5>{u8H$Tc^J{DXrr0LhwP*$~S)dN=@qWlX1ZmkuLn^Zow*_Ug5IRrjvy+V_3! zU33qn%6YVNJukP_KpcOIM9KwiZmAY%MK@~uS#q0L3-H^PT1LmuNPA5(pHX?C7lr7^)t< z)z#GnqLD@)k3160))bz&xWuaVtXNxDr!4nW4z;Wrz2@-np0QQDX&POy>=X0M+rBuc0kA6#*fjF`jxc^mX&YUkOHcC|z#srF-7N)H-#sPGA`m z{aTBh2m1FpB+x`vnn{AFgx$1mXX}oEufJyoJom+)TP6M*Crw{_`whjE&sx&%K;H)$ zR`I%ym~wZcgDJv|MoSD-3nmUq{ss(Ev%gHb4*TEl#6BZZ{+39k07jzBh>n9GVnX-5 zuMy~+7D!`LL)>bjBlj2;5!QJ@0)=25<$TG4;0(wtLU%4d4CV5DmyZQ8dEC`XrtW zlVWECwN0lLT^=8^bRQKxDG%<`eCZ~bFY{V@*xJ??*29#vu|tlZF_OZJl99p|A@@XD@1|cYi_Q z{}?L6L zi_J|$_(D(qT8?_SR^-0O;XTz8qTA3FjxEP+%|at_MhKnFZZ?Sp@)`^;9SqBndIf{8 zJ^e4%3i5r6%EvpXd@1hMratl|@9@cSmDT`d_O|gZQqCN7fXWeR7gQvVD`>kS2 z)Z@$da+s;@ zRt6HG{iTUwnnwPNaDB%HQTgNpqKU|%35eFLPOL9IU+YL~0(P8$&ao>6Up*!bqJFVn zb=&Kmx_S2rDSEraHcPtg@u#>WcICa`U!Y&W%ygNxJqOSco4s9NxMuz1$t5PVK@A)x z-`^8sAb-EH*I!Y^hg>9xED&KE{d&Ak7d(cwOIU)P^pBCL=0P~TeX^6|DL+n(#Xyrb zIhW7qI_uF9n3xr2l&J|%3P18VzcHdPowl_JY0sLqRVUJ-iL{f-9=B4jEDH@4p+%V> z@BX1KUZT*!@wPF!Gu@3&)S8CWlZGwHhHeh<|M+b3DH5$Je@qP1r09&>;}4;|kfR_4UgEDm z_G!Q|W9BDyu9ZNwE^9O%)8G9^txY3NiazJe=w9vug^fGRXpNSa3OA+F zX;72*xBrU1ocrC@+VX0To~yIO%>ojz0pym1tS4cKpU<5ObYD#(wc4H~J&yQ~E~lL^ z7^}cB9rUw;$R{v!#}3~J*Uz3Q05qQJnn>KUmpS$_rsENl{{a0TmO1X}$OjiUa(_!q zO>X@w>0Fu66#jJI!UUW0*?pHCb5nF>-=;TdU8#L*sDQ#`el7`uk*mKHi7uIz-x)Z7 zIhDxAgC9Llx)AlxUN=EQ3K~dl-iZ1o!SuSE&U#x#t|wK&^w^(A7&}S(2Dgaugo4OL zyZBJ=S4A+xHErF8#A32P(SGgwQkcc)S#LE?(rUHJAjeYE{y}gjQygax%hOji{jOZJ z9nowsws$n3-)1sPMt-e{U+?uFrXIdfU_$f;b&Y@lS|E znuC`(OIuw0`!lQ};XUJa>@p&e$d<=3Cdi#OxA_irw*;e8s-!>2Lga&LqItW?AC&8E z^`V$cylXqohphWvoUFI#GlDzQes;`lYoepAyLsN_^^w{^+}3YF?C~!@7iij?-5ugm zKi}nae?6vYtG7XL&x;xRD&Sh4diaP|vGCN|)8xx&!v&^qU$?rKpa9|H+=={jnu4!m z$^fA*YH9~BZnM8%%W4?a=Fk{(R1sv8-XQb6qe!n|8`x>&giv$FIsWNjSCW3({jO-g z6Fl0M0mR;WD9Wn)e#iW~zob=A62V+iBaO#v&DnWkC(poUiTE_q2l>oAYoDwnWvofe z*svx0D~ZyOe$#O-1Jep@zm8SpezJw{~Oek!ez4i+ABlqUbpl zJP)lh^~{6Zws_N7{iV;ogo8185eX6JPzxygVP~hrmwP;g!9YJMayOW>Z|gwVtozH-jeEP6|p@Jbpu?Z)wgPVAtF}TJ_`wv z@}$kkJ*i9QyMA2j$g7iolljLqIY|GKTr)@;x5I0VtcUeQf#^!rM? zdzA)ikHI}sXtgli6Q#RtrAjnG)jUbD5%JxClbtwcoST-b zJa(Vkxi!`@>g&vQh-WelC`|ogDiBm;J=yh{VOh8bE>^4D(!OQiP|+uX@3Kl|SivxkH6LiUuC$syHaco}0^*EfObw z8h?5X6fbdfck(gZd|CDYBhU^aIuROTKStKd{9*Yf4gl)Qw%o zS4E}4pEE7W2O1~5-@!31)>aKxXP6HTd-8UCzJ@$b(vvG?CNZls?OInOG3dYY<(08{ zs$LMId1P(LmZ&z5S2%XaQ6lE3FQ!jhv;T+SLj4c?sx41x>+N0G9wk{H?CF!C64* zh036;J;R|flCD>_%&agX!SaN*;3SCVjpfC`zmUebqZt}(YyKlo8R>H(23Gad;qO2u z-W0G(+06ZRybA>-_d&2b6O(8C@fgW4XJt)TGk*nqoe`Nq0Yaz9;ybN#ar9#Oyu{^7 z#3V<-3?HkL2RK`I*w6F1q2%Fo#wp@)KYjNLf1FJ2#3*RX5&}}w5+>$r?OPjBLfafD z&XwNZ`=d8Bcn~T-dZ3Z-3suLCvRo>{#Qvi~D?TcGN=XEV7-R9A@vK^3K+ zP&vE@9v~8SKus}_zuE06565saVK*4de9_0epeWUoPeq1vLVz(jFO2~B-Jg9R6U%ig z7B2YDbHS%^YQSzQd6^r1D(thiSCrv02L)1Moay|X*MGX9{VYB=Y9?z;zGmWWU zWkSnNx)ESbJ;yz_2G#USC$R-UK2~f70^*-2gO_(m%T$nQ(txpj{H-A_oamw12JbJvKO&4aspk!4P4-C-*v?T9LM{V=9V5f-22^{2w6Aui}eJ}`98d@P!`S3Qb#IIajG(+TN z1KB=7FQZdS7ak>$%k4c(U5H^|lmdcenajMlaxe#>ZUnUKhCv~aRTVN_(d%aOuto|V zcf=t7DWz8;79aTIMd%b~6`K<|Qg>vz{IkmYt-wtpJ=B!3lQKR#QX-^Vn*#h3cZ+@W z{Y{ci>Yq0bU5j$4NjwHyLe>YOwMB!(TBJE|s;v30utY^8nyh$q9c<>V55C52ek-j| zh}6`+L1ik#?ysCmBLB52z~os7M;HAx*(;;QKBx3g67)>0nAw6|HdiYE3?Q8O(w8=I zI{3o7&TxC`T(2ogaimBsfdg6>Qd%V`YO}&Ix5{c?Ft?NEtaY5H;SnDlM)nBT)R~k*K4k1j|a}Rkf=- zHFP%UqT*M`+7KI1d0sVfUH0A?gyB_$%Z-U5<>Gh*L)+WW$}IZVx%B1c25Iq!G|*Dc zqc4GNZHl#jmngs!!;VH6sD=u|H3o-=YHoOV~=$2-s}mK7Nb= zX$=_tFB*OfOfju;-(Y#XDg)a3`kY#U<7^&o7izqS*AvT|1j=G!&`~%^HqXv9a|TlN zQU!VjWc>SOp3{bF8?2Y_D$#On&i;bc%AD_O#xbTb(tc3chwt+6|4g!em)%}>b+uch zSU_B-XH~j0wKxTZR_;(4H4pvlWaO7t7_ztcXOCo)7TVRcy2RUte2a?p3IGj&7h0X{|~3}D=WWxq^F~U+!H(U@z;e&XnvWQ zp5ApV{vaf@3Q|YE2a7{3Ih#){RfR-ij0$DjCw9Vtg%f~1aWD5#Qm{h2_gf85-@h?U z%mu>$e>c?(LNN}0z^#$b$NX~21&U`EI>0(&3aPtIe@JV?*>GiIN^5`tg6dd`nwOf0 z$Ui)MG9cnDg0>Qq&W-uQ>-Uoxc^|`-_g#61)awkH;?Oa+{$r1kFQKL9ES2PyAhkd} zlE$kTN$rgSZ1W#K<*7P^O)^rEN+R_HZ|r=LW_K8u7UrgKV5`Bl&$tlbT${-I%eR_; zO9dC)9=t@Qm;OXiPj4Sv79KYG z<{4m1B>-jss8agzWB}@oZ+;C_7mlmM{m&dvgiStnsv1#;I%INdoDfTx67+0l9SclY z-0P!ip~nuM7Z7TBIhK!M+B`#(*H9MpdP@0nQ5T|WDyc!-!rP;2VuB^LP6n)`B(2Ds7RZcXQ%?TT+awxKidwd2N&f6R^& zfieJqV&_RBv5IWHsV?YVfl2-G0LlQYPdKX}s12uli|h7Qd9q0K%HJlEwpHm8M9eMUwSH=03RB`;O#|I!?hHdi zfUokuFHWxTUkE^H4HK9WI=4}VEZAhI+h&~71r6)6>MMovj@L^54zFQNZXr7*W$38m ztL2d^p6*Uuo8LpNwEw^=E3aQ_}H z)Gy`6-UiLcRo9f5zFH7#(1b_YSQNJJpEAxu`gOxP?a!yAY)z)8zkX}4)7Pz)_S04R zUrR{y%yb{cUdOD95=CS}=}YU9`GWv2Yon5qs2Ymt`}Mv4X=|&BV6yxt!J=ogR)Kt5 zC5ra`D==+fAyXO9J4aD4gtTba;8!OD>(zB(vW{C8@V~L^v;8+}wUoqPzfgEvAg{00 z-M~eEx&J;Yw>k7Jk=oWnr-qGsOH4gWx}vaj8#+;Yb<{Z^zY`ZR(~zBB}1RUrEakE^c+z;s}SXP7O& z0&)ITWR3z_e)*FH(M;{rseXS6MWAx~gFeO0mv3F($(pw|y3k*8cil;Vj=w2*K2s)k z`^J+1s!jZerHuf~4uBa03y(qm_ogL#N&M{c`MXk=Eg_u@&>`>6>Adlv=O;V%v)X7w zX^rDcp4hQ@n2CwyFOG8>3OuSSsR@Ye#WRa{{tG30DsEXNt|aUmch#&$bs!Y`UH-tZAN^o^iU_uim#+fR&6%D$ zT@o)-RjQsx)dMri&%chZ3EGO|%t87kwEc>rQt-soZZ!kUnhjn)3S#@u=DOMNed?m+ zjgkmC#+6+| z5$&mhP~mN89yF^X%GfrV^KMCn#cgokBln`oe0eAuepLIRz%FJ-4#tcl{3NvYJLr)5v{pwznk~9x1FaQl@!+dNXazrl(EN z5FXKMg0GX&j+&&hAHHjs{bVaLSx*k;hQ@4_GgeNjnm6iIA^eC>ko|fNbb?lCn+z;) z{Ks=8HgoM-?hGyJCN@4wzS-Q~dwy?Ve4ONWv4HX^`Wf1CdKW4JQMXnt5Gy#O8^?K& zv_pETt3F!?XV7uafUCt&%@i2ZaSh?U``#2XULfY6t(ftIcXx!;_dZF1HRJkaJ!?@W zF7M}~#`>Ro86;!7Lj>P0x{uVQ6Mqt5Mj#qfIg1A*eavN}axrDyddc;EWEu~UX3a7vFg^p=565?Unk%Z*E%JuQgcb7W(37596rfOG` zbg`A#XOc#1v(Xj#J62fCSD#-tRloP^Bh!+Qz73oLmJuXB`k_*<2$-A|-aFAPbeSS7 z?rJq%*jYN;PEkl8$>bN{7eW5ijZa0qS=D%PQ=Exy8ed(62GbuWE6cG}rZ?InU!FQ3 zSq*E{at9eHOWE=&jNkg(-qSziZ$wAfEYEaC#A{KhKE};yIm20K7R?-1q(jwHPK(nG z47njjj}I2bN&lh5oB^KyTl@=2h*fvO692w245;+*)NZw)r9}8Yl9!N2o4fA--~q>kWhFOLQq{1$ot*8- zB78|YKR7-liXv)F@t4hFD5X&W%&q~>l74>*SU!>6TkvAqhGl6z$3s+M@}%AV8gJtB zhtoH}Ss=AvC@jpO!^v?dtX1Hz0T7u_78FFv!k--BM*u8x>8m?D6&yYerr+1l6wk@h zn-EK%bep#Lf+3pcZ!mG@qwBX9U<9aNtLqUCLLn)&EjnquwGNFhG8`;?bFmZhENs-@ zB-(_vN>d~i`2in(pC{E!<8|hgkZS7moRDgXbz}7nP3S-XZ;=pQM$$ z6UFuXTy|0c$I0>+Vc*hy8BjGun)#JOwo?+gYObG(GX2; zww+Jz^lw#7$N<{nU44eS{69{%TOAY0RR3a^KK~I+s39Se- z_~+8I4^~r>e zdPLKmBh=Vt@l%q3%jIFbS#H_&H+D_R&k30>}pOdEKKB53J}Mwci}{j5bB1wNX}wb_-lsZ*U> zX3*--Z%JqLdg>N!!I z_+mPwY}IIfTFj+0J5{z@>s)h{CvijWv4*4aLI37LB!1S|$Z~13M&ak<8rb7IC@V}7 zGT!qZ<0(N{=+Gm*LSH_~cXPiI;g)ru+6jI-HR14TI*BWdEBiO9?bP}fC(BypCh}^! ze&LAIam}6QZ7YPWzcRIO16gQTm$W6`L>mG|b{WGZXHmghN4Hy$;ru)g1d9w(Bk0;73U63!Yz9!T2EXa&VbGe}=V6X9VDziwU%` zcHW%6;7cZr<&p??Ptcl%wj91cBk^RPALz;p*bKwQjkI%(zFReLmb>{#7+!qZAPW%) zQE)z3d>Ig=JV}PvQXUC!dNJ6GoyJ;M4qC3Q@5a_q6UVzPhvPm*bI>evmD_)OnddFY zjINZU6?%1yA6Zr%&}3bCyX#@0=vI;aZJx$s8b>TVR6mebHerO84nK-?wSQ%zNBgrW z`)%gciB;`*B@x+suHyCq=p6JycujKd5P(L0_yb8Or>X%>+9%Kd`zdj-(ZtvkHgy2A zfp-{}PyH-A8I$;F_;af9lnFGq)|Me)g}r<=DPk7xY$z$xoFE{sTn#h`IQ_P}DBEbe z6F!sHZg#Ud@x@Rm^aE1NcRx+SFrUNA5lo~XjB=SZPwl_c3uJ)xtHvm#fUD+>41dw_ zgIwO;-%pwI9R?6-?84bSTL2Lf#`k1o6)1Zp+eJPGSv&i_SQ}oB@x1|?2pCSC5 zg7Z8wt%azhIh6AJX4I?7`M}Ez8H=9{JE390yxKZlHBbCVqZbiJ9b$qP-N4T;-yw9@ zbgI30b93snX|D!w!#1ebk%@b}@}s?-`$vy@E@5zU^qXg=ky?i1PE_oaU2VJ7Z%i_o zj}zTqj1(up-`yV=n0ilQYBpy*Na=1IVzOC2Wb3;k|JUMxR?o@7l_8VnVu+m{!`VaW zyvpl;n;iJV=2Sbx^Edtrly-f%8dh0O+fJc>Pk6yo(K{nMXUcZSIrS!L z)|Hn~LhgZozC4m`FeHK5h))3XD< z=N2LJnUZL!=A?aIDCxzi(|9s&a_B$oV_|q7f63r|V)OoBD)tw?+}O#+y|XioXW^|G zbgjPTK+^H^v-0}nJ>6@RpInc%M5oLH20M3zJ^{HF5K3N1p~yw=p}=|1);%mH zzi?J5IPf(kgL5YnTe_c7M{ym#IWQG^D$Bg=|M0bpipm#P+RmShT{)u~pX#CA2{^6O zM*Gu;{^M_r>;0{%nkMe_FB-I&2vmb{5{EINo~}`hBiqp04tgChLla9=A`XI$p_t#L zx5$;6obi%&qE>el6caQ~ZDkNLrEu|7nK10%?s)xZYF6o97NLgg6l{tEGX$GPSUS&yE=atAaOzH2@F z$65ZX$-#kJ7EKILdYZW`)8+4A_m<2vcF99zVbk{*%9qqlv4AAZLXBWIM2fPW8UCX= z9==X9X^cWajv!`Y0aL6)EE-=fW8_Quwi_GMMHM`7b{y|f-Eh9y<{2ty-W$=T34=xH zjo@yvPlc(C2w(R`O>Z$m4F@>lAg7Tn(=c3INFVu~Img>`-;IO!z0I@Y}A4w5z&r({dowU+<_S4n073gnq`(=#XWhZ{sQU-(9sCtXF zfxBjl!Q406KaS}Xj%?ilLUA3=g}DvvaVr$I=V5lR$aB7$%X!-GNEo=HA)$rQev1 zP}`A3mC&Ogl*^Xtp7qgedwEg~Z0~RrI&&mV{yma$^T8QXx}kDG?%7Gn09>1%RcEYnG-SuTPp*6YmQi!Ce}O?cLaCq;V<@=)TY`+r5V6=A<&DRD zsCi28TK$T8H!2khD%Yts>w`ls7Z;1VAxCBvLq;jS{|Wyv;lKh#ohfLuOx=2yMI`0 zAvvY%?IqWePue}t{A>MS71%JsN~JtuqbhX`t|>{J5%XTU*<|38n^th7Waex#vk_PW z%_`#Wzq7sfBBQp%)Z)7cn9G~e_i35uo+6p&bvZL2WEYN%GOcQjAV zl30Vsi#R>1EA^G>C+7V=f+6(!4MhH}%w^0-E0f}wI5K_-4vA{B%i>@j_ScM$rKM`K zQXVsVUCaSEjd@`%^2%ElGIO0(2+xdLYuJ0qYKh~#nYyl}dKTq-y>-Oj1e8 z_?Y^HcSTA@tv`ZL(a;zf%AeW{3boj5Z)>Aumj)0Uk*?>b8SxYLD5t{xBx;J4d;1

    EQyS(2ooSeos$59t$P6P3ks;xz}GO9Y1Vc`QB9n*Bl7MoLQzh_`Ls7^qW#!wxM6`Rk1$!gm{89Tt@x$B&C}iIlIDdTg zbGi}Zj>n4xV)YIfWW^XVvE#65G8ScqQD;!aSgX-pofZ{-uv6G}zWYMlN3ASMY9RN% zgPTtMICK;w`mU6C{SxqcUh;+|Y~KNUd)kE}_4oWMcyV;EJQ4pxXV%p0`N9vI=`Ljg zevL^3+rQi6FGb}_qYieQ6k>ILY=!6ce&xG=y#)}bl4YFVIw#y*Ad#Zc%LnXnI=Ypu+Nm-N3W>S}O4V04S@J|)q z9gs>(ICcjuH)syN%?U;V?+bZ^{CK`*O#DU~VA?>(di}bjV<1$b9PI(+w6Jw`ySPm* zYQFoKN20U+d~R%LH&#?!_G>si_K4sYt`Co%hrKoCMG5ZcJ{nKw(6a$rtBomI9^t0 zhZRZLZqyS;64`B;#*NV3Olfy$I)Fl~c8zBwE>7$cn{=n?1a z?9512xHY7LZo08{Pn*{MChlb)A%1FMzl21`m-FhM$*?m(`HNTg6}kwBk^I{V`hYb5 z#K^zFWjh~(F#UtrZG~)>unFnUUc-};ZFq<#E9kk`CdesH?c3V4_b`_)6SfPx>p(bor$X*nR5VUKD3 zm3B8!+tSAjda52yPcW{6q!1R?K;xrVsH(!AcHuRv^@ti><`L+qe%_n4Mcnxn2M^EM zDb4xyv*lGsLmKE1_c6cNJt~6AR33(8$j5YaV#1P=DIF<6$lJGjUZUq|mQJ}PAe1^R zT63=NJ=Qa*@Rd47gc?gt>7hmNbN<^xzBJiZ=s2>NSRE1YnvBBgD+I5?C1$;o=84?G z)Pf6#orMYpw!}fPCtFA9Ysou-4?v*iEJ^UkEi4 zqID|Z%o!?wJ~eLJh^uuPi>oQ#8{XkUGYeCrqxv{dA0C-p zo2=fqEwN*##8!!aY9yIQ_xgKE)#5naV9tR>c>3UD_i+6SoY6|nATopLr;fva>O2vz z*+p5dh;`dDRCvFO(XXe1$8ThoJ7{=uI5~x?n*h$JQ(9-vlc{J7sR0{VF0K%Moa=?m z-?LUrnNNTB6_ykp$r7g1r<2)HWy<*^8uZ2Ld~HwqszpYD-3WI^)4B+_{54VW$;fnN z{Pi>;QaIq_Y)V@G3+bmuUipE#7FG6@nNP4%E0{#tvilpoIZLCSqVbhWi4)Y;!mod- z_gzY@9<{~9rn-sd@+KQp=@~mHPTzqTHcIDw;utpGS#l*|f$BMV4dX$9rU%qlua{P` zRI2D%KgU##9z^?e)0-1u;BiOAEK>Gsw_h_k(^KTxcrc1>hP_NW+Xx$)vL%+qisNOhOrlT>X z4)05J+m_dqS5?ydSj;ZRniwsaQ#&o4hfiY~Eu2ZZk~DyAQJBc1FDjEvphI^P3{(~50)HG;EKr-Fp|2zeGrrzt|n zNqC^!+Q&H+ROz?u%aL<2fW-(t`Gr{JH; zYY4lcS`Q)C-OnBu&;;nASUZA9kT^E+@&f(0w6p9YuX|i&V5Q0loB$f~YQ#B$>>{%3 z+0!%f?;RHrMR2eK0<&b4`Lb>TV5&G|`izpHN00W-<&Oy7p)Tf;Y#1`R)NP+av^8dm z%WWuJhS6NaM%@t znq!g0zdu5-$PD{!vpl?Ad=i?6Z9NNME+Owg_5Op?r-VCmdNn~FQs2NCVY=py#%8wc zCt(zdR9PI3&=grzu$)aCVCo20D7iCp@%-Ba793=&bLZx7J3%sKMuf4cn72k*?anrFQDo5f*n#NDkULnX_<}D zlpg}+vPpB+7Y#7!_OnelQ*5<)oI&adDn_mupLO{p zL8VQG&)4M0_4y@mQ7>#SX#q&Z&S^hOWPT8>hPO6eZERPoT1%$dJvos3ttHpVq5!ck zzc$ag(&_-Obggs-4G?fm^d`C)hR~E5F-he1Z2L+$z?9WIyRG74*2qoAd38;JR8xN2 zm~<74?a8Ea16a>yJ9O(5+my8av{$6#2S6*uc&_#1O6_@k)yCYC`jy;lyvBG8tI!fI zIkiNH@ETCxbmrufJ;~`SI_yAtD>@MJJM}@`V3sp?o$xM33aj{&Y7D=?4l^=?y9g5} z@M&~p!IP`=c;8g$Ahu=ai)h=Hp3f6?la#609KR=@sC2oywfnkanl2f9@*o)#qZhyX z2(CyQNmiR5{~gBh0rUjAyg#1AjLH%ReMRSWD)DF7PbG9;3YCFYX;bvVcYQb2K9 zb5GG7KO0}_I`JDR$)HyJ@?VL%nV-e45eZZ&sEw6k>a?=gIUH*-DE7IkaKm|J1oblG z7t)TSQjf*%UsGDIE(@%g>}7vqx5+sU{h||Jzr9D~00yCTExK9~l+Cl`cP$C*m@yhL zr?enSXA-QPV5`y)+l%;Q`+9EbN%fZLy2Slx%Pn>587V|2&~PnN_&8Nlw!Vv7FXYzn zL+XTxC-R2VpoZJ9qal#Wmj+3+iNW9^no85BpJZSiy7PC7(9;u}LZJ-@WP*y@<%{#$ z=%#QvKV$X2(Q?{H%PPB^G|dU=L1)ullqZ$tZATk={r=be8J2`1;~{77$-Ui!pN9I& z%?tNLa8YsT`WgyMx06Hu+E_9(-m9{h_uVtwy~xN6x3Bw40ba-qcUBVwsco*E-@~0% z(qwURP^c?@JcM`!OmDr!dTTo_3GvH~l($7NR@?oxLYw`hN-U!}ExaqU-nh2r$2oo| zIOp0t)5Rv7HpwVp`&gHGT|INVLeIOfrl$`XtR*-)ShD?N2p5$uA)i8fS(!kGMgM+$ zj~O1eulGmC|K0VEJk$Gr31g5H+iZ>FeWHBJHY>ICtuyL$*cMa9X6CtlRkueH^P``H(_Hzo83Eju#sG=MgkSK#ITjL{tG;AxN(hN zNur8(4Ct10n*zuoJu8Gr)6%IV#!jwAA$}Hu*lzJ)bY@=Jg9ck7kn}WGp&+K4{laW7 z*bv??=4=dbv=GzDd$Vt<0yGHxriCvdZJqzdA6q2&oawqX%u2N81ZW5ktY@|r6|R4i zaw|*)#Jzv?i3&@vsM=*fjMcsH7|JcIs>hjYZ!MbX_$XXG$1{v#DSI;v&Dl#-Fxj+d zu`H6pr0&ZO5QWO8FB_F`14tuTrk0;>?3t<__|n=_=r(fbpEqO-^!lx%xt<>3at>T` zYaT64GL98|!`UL|r7*eMT}a%%IPc0bvCV7lbGD%JZyZ7hJG#SzCJ1PA{L~in)BV(F z5=Z_CnmW9LxiR6Qnq=igtAaBwXaC*bmo?cgRN~3O|E#8p0}N~-X%BH|LkwSfB|lqN zbSg-)9PO$zdfHf#{L2$Yz_q{b?@?g7&t_7dwNwlL9dw$+sphmW=~{=PLZI4Dqcvta zz|}0FO5*J?8-3i;)E$lmC+`;tjeYj#8f;r!IIGEAT9lrfTd*O5l=NwFai!2M4gH>$ zR8#6dc`U&0mfv#PcsU}dJbB)RYyOt~@ZWf?Xi&5nqSGx=jSZs^RN&Agxn4LTYuwd= zV^ub+FjN3P1^x1K4Mr_PmxV-h0ZpV*<)`FKwR}g&OkTQKSU1Enxes2CJk=V$%ho8L;ReLRrKQ^@as*Yx#Z%*x z4|0UZzd?X|m#V6{6&ub@f@xF2j6+QOF}bs!f~FseSfjj@=;~#z;$1#k!P)OI;DVXL zw}>S&kr+9oq{?gar>Ps0wpL2B`Z zgV^1j&%JXl>pl9sx^2_rt_me+Iivnl1GxLFV zxBb3UZ(&KTw#o=6WyW4;XJaBzCWc?Bi{)Ry;w|;vab=eXiy^iT_=nLsbWc}0C*l`K z|NZgtS$%htikKG+QPivKjzCIRW{A`%`Pt{Ua;5)VVozjWmDKe^5Pi|@*|_2pNrnI@V$cx+JwYv-Uv zT61_eOro>dQa5O3Fkfn45b$~{5Wjg)@#8OVn5das9b`Ks1i>Kq_Zay45Y(qoX@5eh zeBWMpMmx8^;vGg_)E?NtQUww-(X`n7?9t1(o5r_N?b`R`JhT=Wqh zn-jYd)e3Zn!i7-xcYg8i?fD`}2tBJJ(0Nk$K0)Yj3`zu6!>W!#u^hA#x9I>ElX0~B z;h_O?IOl0yNFvx-{WH->V*@ZMM-w7SKohYIi)2Oe{mYtr=R8(I`L$mgN+YioErrKg zQ+)cEJg%jRvYNZOcRlUU@C-aIk$Gpp*)>xldkl3DG%c$l1~mTEv>z1{tB8$r=|qAZ z5FaXVf|H+gK;2WR(l&_;k2^#*>Ov~e8Lw2|Y<{X%7$sRA zQCDGdZ6!`CQrN*JA1ak1vb6?)By4dmH~Oa0#@vdX+ayK_w9o&Og(tOfcY0C`;e)$7t5vQ~meh zs|mXN@6WaI%q;eN*ZgJVfbyH%OE867Mq=4HOaAcXQfgfqxz4>~O3wyUK5ZB8l@thY z!-=Pcj)1FztFqf+H2f!`xG+jg9Z;=wVn_gb%0;JuU1CfNWHGwz< zgrbYNT2U4sz{A-n>|?0<~TD^=6{!I zyPPB<%D^R`@S0U3A)n7mchNEU>4>8i%0Af8x*TGiRycvh{E#P%^kD2Wh>omjEn_WSE#5T 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 literal 0 HcmV?d00001 diff --git a/frappe/docs/assets/img/desk/percentage_graph.png b/frappe/docs/assets/img/desk/percentage_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3a25d594797d00e665502aaaf94c331c943509f3 GIT binary patch literal 17452 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 literal 0 HcmV?d00001 diff --git a/frappe/docs/user/en/guides/desk/making_graphs.md b/frappe/docs/user/en/guides/desk/making_graphs.md index 9234fa58b4..720c9217bf 100644 --- a/frappe/docs/user/en/guides/desk/making_graphs.md +++ b/frappe/docs/user/en/guides/desk/making_graphs.md @@ -1,61 +1,100 @@ # Making Graphs -The Frappe UI **Graph** object enables you to render simple line and bar graphs for a discreet set of data points. You can also set special checkpoint values and summary stats. +The Frappe UI **Graph** object 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. ### Example: Line graph -Here's is an example of a simple sales graph: - - render_graph: function() { - $('.form-graph').empty(); - - var months = ['Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul']; - var values = [2410, 3100, 1700, 1200, 2700, 1600, 2740, 1000, 850, 1500, 400, 2013]; - - var goal = 2500; - var current_val = 2013; - - new frappe.ui.Graph({ - parent: $('.form-graph'), - width: 700, - height: 140, - mode: 'line-graph', - - title: 'Sales', - subtitle: 'Monthly', - y_values: values, - x_points: months, - - specific_values: [ - { - name: "Goal", - line_type: "dashed", // "dashed" or "solid" - value: goal - }, - ], - summary_values: [ - { - name: "This month", - color: 'green', // Indicator colors: 'grey', 'blue', 'red', - // 'green', 'orange', 'purple', 'darkgrey', - // 'black', 'yellow', 'lightblue' - value: '₹ ' + current_val - }, - { - name: "Goal", - color: 'blue', - value: '₹ ' + goal - }, - { - name: "Completed", - color: 'green', - value: (current_val/goal*100).toFixed(1) + "%" - } - ] - }); - }, - - - -Setting the mode to 'bar-graph': +Here's an example of a simple sales graph: + + // Data + let months = ['August, 2016', 'September, 2016', 'October, 2016', 'November, 2016', + 'December, 2016', 'January, 2017', 'February, 2017', 'March, 2017', 'April, 2017', + 'May, 2017', 'June, 2017', 'July, 2017']; + + let values1 = [24100, 31000, 17000, 12000, 27000, 16000, 27400, 11000, 8500, 15000, 4000, 20130]; + let values2 = [17890, 10400, 12350, 20400, 17050, 23000, 7100, 13800, 16000, 20400, 11000, 13000]; + let goal = 25000; + let current_val = 20130; + + let g = new frappe.ui.Graph({ + parent: $('.form-graph').empty(), + height: 200, // optional + mode: 'line', // 'line', 'bar' or 'percentage' + + title: 'Sales', + subtitle: 'Monthly', + + y: [ + { + title: 'Data 1', + values: values1, + formatted: values1.map(d => '$ ' + d), + color: 'green' // Indicator colors: 'grey', 'blue', 'red', + // 'green', 'light-green', 'orange', 'purple', 'darkgrey', + // 'black', 'yellow', 'lightblue' + }, + { + title: 'Data 2', + values: values2, + formatted: values2.map(d => '$ ' + d), + color: 'light-green' + } + ], + + x: { + values: months.map(d => d.substring(0, 3)), + formatted: months + }, + + specific_values: [ + { + name: 'Goal', + line_type: 'dashed', // 'dashed' or 'solid' + value: goal + }, + ], + + summary: [ + { + name: 'This month', + color: 'orange', + value: '$ ' + current_val + }, + { + name: 'Goal', + color: 'blue', + value: '$ ' + goal + }, + { + name: 'Completed', + color: 'green', + value: (current_val/goal*100).toFixed(1) + "%" + } + ] + }); + + + +`bar` mode yeilds: + +You can set the `colors` property of `x` to an array of color values for `percentage` mode: + + + +You can also change the values of an existing graph with a new set of `y` values: + + setTimeout(() => { + g.change_values([ + { + values: data[2], + formatted: data[2].map(d => d + 'L') + }, + { + values: data[3], + formatted: data[3].map(d => d + 'L') + } + ]); + }, 1000); + + diff --git a/frappe/public/build.json b/frappe/public/build.json index b350c8151a..054421286e 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -52,7 +52,8 @@ "public/css/desktop.css", "public/css/form.css", "public/css/mobile.css", - "public/css/kanban.css" + "public/css/kanban.css", + "public/css/graphs.css" ], "css/frappe-rtl.css": [ "public/css/bootstrap-rtl.css", @@ -164,7 +165,7 @@ "public/js/frappe/query_string.js", "public/js/frappe/ui/charts.js", - "public/js/frappe/ui/graph.js", + "public/js/frappe/ui/graphs.js", "public/js/frappe/ui/comment.js", "public/js/frappe/misc/rating_icons.html", diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 0d21271862..c56811e892 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -678,80 +678,6 @@ select.form-control { padding: 10px; margin: 10px; } -.graph-container .graphics { - margin-top: 10px; - padding: 10px 0px; -} -.graph-container .stats-group { - display: flex; - justify-content: space-around; - flex: 1; -} -.graph-container .stats-container { - display: flex; - justify-content: space-around; -} -.graph-container .stats-container .stats { - padding-bottom: 15px; -} -.graph-container .stats-container .stats-title { - color: #8D99A6; -} -.graph-container .stats-container .stats-value { - font-size: 20px; - font-weight: 300; -} -.graph-container .stats-container .stats-description { - font-size: 12px; - color: #8D99A6; -} -.graph-container .stats-container .graph-data .stats-value { - color: #98d85b; -} -.bar-graph .axis, -.line-graph .axis { - font-size: 10px; - fill: #6a737d; -} -.bar-graph .axis line, -.line-graph .axis line { - stroke: rgba(27, 31, 35, 0.1); -} -.data-points circle { - fill: #28a745; - stroke: #fff; - stroke-width: 2; -} -.data-points g.mini { - fill: #98d85b; -} -.data-points path { - fill: none; - stroke: #28a745; - stroke-opacity: 1; - stroke-width: 2px; -} -.line-graph .path { - fill: none; - stroke: #28a745; - stroke-opacity: 1; - stroke-width: 2px; -} -line.dashed { - stroke-dasharray: 5,3; -} -.tick.x-axis-label { - display: block; -} -.tick .specific-value { - text-anchor: start; -} -.tick .y-value-text { - text-anchor: end; -} -.tick .x-value-text { - text-anchor: middle; -} body[data-route^="Form/Communication"] textarea[data-fieldname="subject"] { height: 80px !important; } diff --git a/frappe/public/css/graphs.css b/frappe/public/css/graphs.css new file mode 100644 index 0000000000..a9fdf62dc9 --- /dev/null +++ b/frappe/public/css/graphs.css @@ -0,0 +1,274 @@ +/* graphs */ +.graph-container .graph-focus-margin { + margin: 0px 5%; +} +.graph-container .graph-graphics { + margin-top: 10px; + padding: 10px 0px; + position: relative; +} +.graph-container .graph-stats-group { + display: flex; + justify-content: space-around; + flex: 1; +} +.graph-container .graph-stats-container { + display: flex; + justify-content: space-around; + padding-top: 10px; +} +.graph-container .graph-stats-container .stats { + padding-bottom: 15px; +} +.graph-container .graph-stats-container .stats-title { + color: #8D99A6; +} +.graph-container .graph-stats-container .stats-value { + font-size: 20px; + font-weight: 300; +} +.graph-container .graph-stats-container .stats-description { + font-size: 12px; + color: #8D99A6; +} +.graph-container .graph-stats-container .graph-data .stats-value { + color: #98d85b; +} +.graph-container .bar-graph .axis, +.graph-container .line-graph .axis { + font-size: 10px; + fill: #6a737d; +} +.graph-container .bar-graph .axis line, +.graph-container .line-graph .axis line { + stroke: rgba(27, 31, 35, 0.1); +} +.graph-container .percentage-graph { + margin-top: 35px; +} +.graph-container .percentage-graph .progress { + margin-bottom: 0px; +} +.graph-container .graph-data-points circle { + stroke: #fff; + stroke-width: 2; +} +.graph-container .graph-data-points path { + fill: none; + stroke-opacity: 1; + stroke-width: 2px; +} +.graph-container line.graph-dashed { + stroke-dasharray: 5,3; +} +.graph-container .tick.x-axis-label { + display: block; +} +.graph-container .tick .specific-value { + text-anchor: start; +} +.graph-container .tick .y-value-text { + text-anchor: end; +} +.graph-container .tick .x-value-text { + text-anchor: middle; +} +.graph-container .graph-svg-tip { + position: absolute; + z-index: 99999; + padding: 10px; + font-size: 12px; + color: #959da5; + text-align: center; + background: rgba(0, 0, 0, 0.8); + border-radius: 3px; +} +.graph-container .graph-svg-tip.comparison { + padding: 0; + text-align: left; + pointer-events: none; +} +.graph-container .graph-svg-tip.comparison .title { + display: block; + padding: 10px; + margin: 0; + font-weight: 600; + line-height: 1; + pointer-events: none; +} +.graph-container .graph-svg-tip.comparison ul { + margin: 0; + white-space: nowrap; + list-style: none; +} +.graph-container .graph-svg-tip.comparison li { + display: inline-block; + padding: 5px 10px; +} +.graph-container .graph-svg-tip ul, +.graph-container .graph-svg-tip ol { + padding-left: 0; + display: flex; +} +.graph-container .graph-svg-tip ul.data-point-list li { + min-width: 90px; + flex: 1; +} +.graph-container .graph-svg-tip strong { + color: #dfe2e5; +} +.graph-container .graph-svg-tip::after { + position: absolute; + bottom: -10px; + left: 50%; + width: 5px; + height: 5px; + margin: 0 0 0 -5px; + content: " "; + border: 5px solid transparent; + border-top-color: rgba(0, 0, 0, 0.8); +} +.graph-container .stroke.grey { + stroke: #F0F4F7; +} +.graph-container .stroke.blue { + stroke: #5e64ff; +} +.graph-container .stroke.red { + stroke: #ff5858; +} +.graph-container .stroke.light-green { + stroke: #98d85b; +} +.graph-container .stroke.green { + stroke: #28a745; +} +.graph-container .stroke.orange { + stroke: #ffa00a; +} +.graph-container .stroke.purple { + stroke: #743ee2; +} +.graph-container .stroke.darkgrey { + stroke: #b8c2cc; +} +.graph-container .stroke.black { + stroke: #36414C; +} +.graph-container .stroke.yellow { + stroke: #FEEF72; +} +.graph-container .stroke.light-blue { + stroke: #7CD6FD; +} +.graph-container .stroke.lightblue { + stroke: #7CD6FD; +} +.graph-container .fill.grey { + fill: #F0F4F7; +} +.graph-container .fill.blue { + fill: #5e64ff; +} +.graph-container .fill.red { + fill: #ff5858; +} +.graph-container .fill.light-green { + fill: #98d85b; +} +.graph-container .fill.green { + fill: #28a745; +} +.graph-container .fill.orange { + fill: #ffa00a; +} +.graph-container .fill.purple { + fill: #743ee2; +} +.graph-container .fill.darkgrey { + fill: #b8c2cc; +} +.graph-container .fill.black { + fill: #36414C; +} +.graph-container .fill.yellow { + fill: #FEEF72; +} +.graph-container .fill.light-blue { + fill: #7CD6FD; +} +.graph-container .fill.lightblue { + fill: #7CD6FD; +} +.graph-container .background.grey { + background: #F0F4F7; +} +.graph-container .background.blue { + background: #5e64ff; +} +.graph-container .background.red { + background: #ff5858; +} +.graph-container .background.light-green { + background: #98d85b; +} +.graph-container .background.green { + background: #28a745; +} +.graph-container .background.orange { + background: #ffa00a; +} +.graph-container .background.purple { + background: #743ee2; +} +.graph-container .background.darkgrey { + background: #b8c2cc; +} +.graph-container .background.black { + background: #36414C; +} +.graph-container .background.yellow { + background: #FEEF72; +} +.graph-container .background.light-blue { + background: #7CD6FD; +} +.graph-container .background.lightblue { + background: #7CD6FD; +} +.graph-container .border-top.grey { + border-top: 3px solid #F0F4F7; +} +.graph-container .border-top.blue { + border-top: 3px solid #5e64ff; +} +.graph-container .border-top.red { + border-top: 3px solid #ff5858; +} +.graph-container .border-top.light-green { + border-top: 3px solid #98d85b; +} +.graph-container .border-top.green { + border-top: 3px solid #28a745; +} +.graph-container .border-top.orange { + border-top: 3px solid #ffa00a; +} +.graph-container .border-top.purple { + border-top: 3px solid #743ee2; +} +.graph-container .border-top.darkgrey { + border-top: 3px solid #b8c2cc; +} +.graph-container .border-top.black { + border-top: 3px solid #36414C; +} +.graph-container .border-top.yellow { + border-top: 3px solid #FEEF72; +} +.graph-container .border-top.light-blue { + border-top: 3px solid #7CD6FD; +} +.graph-container .border-top.lightblue { + border-top: 3px solid #7CD6FD; +} diff --git a/frappe/public/js/frappe/form/dashboard.js b/frappe/public/js/frappe/form/dashboard.js index d27aa619e0..ca2b4ab9bd 100644 --- a/frappe/public/js/frappe/form/dashboard.js +++ b/frappe/public/js/frappe/form/dashboard.js @@ -418,9 +418,8 @@ frappe.ui.form.Dashboard = Class.extend({ this.graph_area.empty().removeClass('hidden'); $.extend(args, { parent: me.graph_area, - width: 710, - height: 140, - mode: 'line-graph' + mode: 'line', + height: 140 }); new frappe.ui.Graph(args); diff --git a/frappe/public/js/frappe/ui/graph.js b/frappe/public/js/frappe/ui/graph.js deleted file mode 100644 index 2347f13b0d..0000000000 --- a/frappe/public/js/frappe/ui/graph.js +++ /dev/null @@ -1,308 +0,0 @@ -// specific_values = [ -// { -// name: "Average", -// line_type: "dashed", // "dashed" or "solid" -// value: 10 -// }, - -// summary_values = [ -// { -// name: "Total", -// color: 'blue', // Indicator colors: 'grey', 'blue', 'red', 'green', 'orange', -// // 'purple', 'darkgrey', 'black', 'yellow', 'lightblue' -// value: 80 -// } -// ] - -frappe.ui.Graph = class Graph { - constructor({ - parent = null, - - width = 0, height = 0, - title = '', subtitle = '', - - y_values = [], - x_points = [], - - specific_values = [], - summary_values = [], - - color = '', - mode = '', - } = {}) { - - if(Object.getPrototypeOf(this) === frappe.ui.Graph.prototype) { - if(mode === 'line-graph') { - return new frappe.ui.LineGraph(arguments[0]); - } else if(mode === 'bar-graph') { - return new frappe.ui.BarGraph(arguments[0]); - } - } - - this.parent = parent; - - this.width = width; - this.height = height; - - this.title = title; - this.subtitle = subtitle; - - this.y_values = y_values; - this.x_points = x_points; - - this.specific_values = specific_values; - this.summary_values = summary_values; - - this.color = color; - this.mode = mode; - - this.$graph = null; - - frappe.require("assets/frappe/js/lib/snap.svg-min.js", this.setup.bind(this)); - } - - setup() { - this.setup_container(); - this.refresh(); - } - - refresh() { - this.setup_values(); - this.setup_components(); - this.make_y_axis(); - this.make_x_axis(); - this.make_units(); - if(this.specific_values.length > 0) { - this.show_specific_values(); - } - this.setup_group(); - - if(this.summary_values.length > 0) { - this.show_summary(); - } - } - - setup_container() { - this.container = $('

    ') - .addClass('graph-container') - .append($(`
    ${this.title}
    `)) - .append($(`
    ${this.subtitle}
    `)) - .append($(`
    `)) - .append($(`
    `)) - .appendTo(this.parent); - - let $graphics = this.container.find('.graphics'); - this.$stats_container = this.container.find('.stats-container'); - - this.$graph = $('
    ') - .addClass(this.mode) - .appendTo($graphics); - - this.$svg = $(``); - this.$graph.append(this.$svg); - - this.snap = new Snap(this.$svg[0]); - } - - setup_values() { - this.upper_graph_bound = this.get_upper_limit_and_parts(this.y_values)[0]; - this.y_axis = this.get_y_axis(this.y_values); - this.avg_unit_width = (this.width-100)/(this.x_points.length - 1); - } - - setup_components() { - this.y_axis_group = this.snap.g().attr({ - class: "y axis" - }); - - this.x_axis_group = this.snap.g().attr({ - class: "x axis" - }); - - this.graph_list = this.snap.g().attr({ - class: "data-points", - }); - - this.specific_y_lines = this.snap.g().attr({ - class: "specific axis", - }); - } - - setup_group() { - this.snap.g( - this.y_axis_group, - this.x_axis_group, - this.graph_list, - this.specific_y_lines - ).attr({ - transform: "translate(60, 10)" // default - }); - } - - show_specific_values() { - this.specific_values.map(d => { - this.specific_y_lines.add(this.snap.g( - this.snap.line(0, 0, this.width - 70, 0).attr({ - class: d.line_type === "dashed" ? "dashed": "" - }), - this.snap.text(this.width - 95, 0, d.name.toUpperCase()).attr({ - dy: ".32em", - class: "specific-value", - }) - ).attr({ - class: "tick", - transform: `translate(0, ${100 - 100/(this.upper_graph_bound/d.value) })` - })); - }); - } - - show_summary() { - this.summary_values.map(d => { - this.$stats_container.append($(`
    - ${d.name}: ${d.value} -
    `)); - }); - } - - // Helpers - get_upper_limit_and_parts(array) { - let specific_values = this.specific_values.map(d => d.value); - let max_val = parseInt(Math.max(...array, ...specific_values)); - if((max_val+"").length <= 1) { - return [10, 5]; - } else { - let multiplier = Math.pow(10, ((max_val+"").length - 1)); - let significant = Math.ceil(max_val/multiplier); - if(significant % 2 !== 0) significant++; - let parts = (significant < 5) ? significant : significant/2; - return [significant * multiplier, parts]; - } - } - - get_y_axis(array) { - let upper_limit, parts; - [upper_limit, parts] = this.get_upper_limit_and_parts(array); - let y_axis = []; - for(var i = 0; i <= parts; i++){ - y_axis.push(upper_limit / parts * i); - } - return y_axis; - } -}; - -frappe.ui.BarGraph = class BarGraph extends frappe.ui.Graph { - constructor(args = {}) { - super(args); - } - - setup_values() { - super.setup_values(); - this.avg_unit_width = (this.width-50)/(this.x_points.length + 2); - } - - make_y_axis() { - this.y_axis.map((point) => { - this.y_axis_group.add(this.snap.g( - this.snap.line(0, 0, this.width, 0), - this.snap.text(-3, 0, point+"").attr({ - dy: ".32em", - class: "y-value-text" - }) - ).attr({ - class: "tick", - transform: `translate(0, ${100 - (100/(this.y_axis.length-1) * this.y_axis.indexOf(point)) })` - })); - }); - } - - make_x_axis() { - this.x_axis_group.attr({ - transform: "translate(0,100)" - }); - this.x_points.map((point, i) => { - this.x_axis_group.add(this.snap.g( - this.snap.line(0, 0, 0, 6), - this.snap.text(0, 9, point).attr({ - dy: ".71em", - class: "x-value-text" - }) - ).attr({ - class: "tick x-axis-label", - transform: `translate(${ ((this.avg_unit_width - 5)*3/2) + i * (this.avg_unit_width + 5) }, 0)` - })); - }); - } - - make_units() { - this.y_values.map((value, i) => { - this.graph_list.add(this.snap.g( - this.snap.rect( - 0, - (100 - 100/(this.upper_graph_bound/value)), - this.avg_unit_width - 5, - 100/(this.upper_graph_bound/value) - ) - ).attr({ - class: "bar mini", - transform: `translate(${ (this.avg_unit_width - 5) + i * (this.avg_unit_width + 5) }, 0)`, - })); - }); - } -}; - -frappe.ui.LineGraph = class LineGraph extends frappe.ui.Graph { - constructor(args = {}) { - super(args); - } - - make_y_axis() { - this.y_axis.map((point) => { - this.y_axis_group.add(this.snap.g( - this.snap.line(0, 0, -6, 0), - this.snap.text(-9, 0, point+"").attr({ - dy: ".32em", - class: "y-value-text" - }) - ).attr({ - class: "tick", - transform: `translate(0, ${100 - (100/(this.y_axis.length-1) - * this.y_axis.indexOf(point)) })` - })); - }); - } - - make_x_axis() { - this.x_axis_group.attr({ - transform: "translate(0,-7)" - }); - this.x_points.map((point, i) => { - this.x_axis_group.add(this.snap.g( - this.snap.line(0, 0, 0, this.height - 25), - this.snap.text(0, this.height - 15, point).attr({ - dy: ".71em", - class: "x-value-text" - }) - ).attr({ - class: "tick", - transform: `translate(${ i * this.avg_unit_width }, 0)` - })); - }); - } - - make_units() { - let points_list = []; - this.y_values.map((value, i) => { - let x = i * this.avg_unit_width; - let y = (100 - 100/(this.upper_graph_bound/value)); - this.graph_list.add(this.snap.circle( x, y, 4)); - points_list.push(x+","+y); - }); - - this.make_path("M"+points_list.join("L")); - } - - make_path(path_str) { - this.graph_list.prepend(this.snap.path(path_str)); - } - -}; diff --git a/frappe/public/js/frappe/ui/graphs.js b/frappe/public/js/frappe/ui/graphs.js new file mode 100644 index 0000000000..f45ced98ba --- /dev/null +++ b/frappe/public/js/frappe/ui/graphs.js @@ -0,0 +1,569 @@ +// specific_values = [ +// { +// name: "Average", +// line_type: "dashed", // "dashed" or "solid" +// value: 10 +// }, + +// summary = [ +// { +// name: "Total", +// color: 'blue', // Indicator colors: 'grey', 'blue', 'red', 'green', 'orange', +// // 'purple', 'darkgrey', 'black', 'yellow', 'lightblue' +// value: 80 +// } +// ] + +// Graph: Abstract object +frappe.ui.Graph = class Graph { + constructor({ + parent = null, + height = 240, + + title = '', subtitle = '', + + y = [], + x = [], + + specific_values = [], + summary = [], + + color = 'blue', + mode = '', + }) { + + if(Object.getPrototypeOf(this) === frappe.ui.Graph.prototype) { + if(mode === 'line') { + return new frappe.ui.LineGraph(arguments[0]); + } else if(mode === 'bar') { + return new frappe.ui.BarGraph(arguments[0]); + } else if(mode === 'percentage') { + return new frappe.ui.PercentageGraph(arguments[0]); + } + } + + this.parent = parent; + this.base_height = height; + this.height = height - 40; + + this.translate_x = 60; + this.translate_y = 10; + + this.title = title; + this.subtitle = subtitle; + + this.y = y; + this.x = x; + + this.specific_values = specific_values; + this.summary = summary; + + this.color = color; + this.mode = mode; + + this.$graph = null; + + // Validate all arguments + + frappe.require("assets/frappe/js/lib/snap.svg-min.js", this.setup.bind(this)); + } + + setup() { + this.bind_window_event(); + this.refresh(); + } + + bind_window_event() { + $(window).on('resize orientationChange', () => { + this.refresh(); + }); + } + + refresh() { + + this.base_width = this.parent.width() - 20; + this.width = this.base_width - 100; + + this.setup_container(); + + this.setup_values(); + + this.setup_utils(); + + this.setup_components(); + this.make_graph_components(); + + this.make_tooltip(); + + if(this.summary.length > 0) { + this.show_custom_summary(); + } else { + this.show_summary(); + } + } + + setup_container() { + // Graph needs a dedicated parent element + this.parent.empty(); + + this.container = $('
    ') + .addClass('graph-container') + .append($(`
    ${this.title}
    `)) + .append($(`
    ${this.subtitle}
    `)) + .append($(`
    `)) + .append($(`
    `)) + .appendTo(this.parent); + + this.$graphics = this.container.find('.graph-graphics'); + this.$stats_container = this.container.find('.graph-stats-container'); + + this.$graph = $('
    ') + .addClass(this.mode + '-graph') + .appendTo(this.$graphics); + + this.$graph.append(this.make_graph_area()); + } + + make_graph_area() { + this.$svg = $(``); + this.snap = new Snap(this.$svg[0]); + return this.$svg; + } + + setup_values() { + // Multiplier + let all_values = this.specific_values.map(d => d.value); + this.y.map(d => { + all_values = all_values.concat(d.values); + }); + [this.upper_limit, this.parts] = this.get_upper_limit_and_parts(all_values); + this.multiplier = this.height / this.upper_limit; + + // Baselines + this.set_avg_unit_width_and_x_offset(); + + this.x_axis_values = this.x.values.map((d, i) => this.x_offset + i * this.avg_unit_width); + this.y_axis_values = this.get_y_axis_values(this.upper_limit, this.parts); + + // Data points + this.y.map(d => { + d.y_tops = d.values.map( val => this.height - val * this.multiplier ); + d.data_units = []; + }); + + this.calc_min_tops(); + } + + set_avg_unit_width_and_x_offset() { + this.avg_unit_width = this.width/(this.x.values.length - 1); + this.x_offset = 0; + } + + calc_min_tops() { + this.y_min_tops = new Array(this.x_axis_values.length).fill(9999); + this.y.map(d => { + d.y_tops.map( (y_top, i) => { + if(y_top < this.y_min_tops[i]) { + this.y_min_tops[i] = y_top; + } + }); + }); + } + + setup_components() { + this.y_axis_group = this.snap.g().attr({ class: "y axis" }); + this.x_axis_group = this.snap.g().attr({ class: "x axis" }); + this.data_units = this.snap.g().attr({ class: "graph-data-points" }); + this.specific_y_lines = this.snap.g().attr({ class: "specific axis" }); + } + + make_graph_components() { + this.make_y_axis(); + this.make_x_axis(); + + this.y.map((d, i) => { + this.make_units(d.y_tops, d.color, i); + this.make_path(d); + }); + + if(this.specific_values.length > 0) { + this.show_specific_values(); + } + this.setup_group(); + } + + setup_group() { + this.snap.g( + this.y_axis_group, + this.x_axis_group, + this.data_units, + this.specific_y_lines + ).attr({ + transform: `translate(${this.translate_x}, ${this.translate_y})` + }); + } + + // make HORIZONTAL lines for y values + make_y_axis() { + let width, text_end_at = -9, label_class = '', start_at = 0; + if(this.y_axis_mode === 'span') { // long spanning lines + width = this.width + 6; + start_at = -6; + } else if(this.y_axis_mode === 'tick'){ // short label lines + width = -6; + label_class = 'y-axis-label'; + } + + this.y_axis_values.map((point) => { + this.y_axis_group.add(this.snap.g( + this.snap.line(start_at, 0, width, 0), + this.snap.text(text_end_at, 0, point+"").attr({ + dy: ".32em", + class: "y-value-text" + }) + ).attr({ + class: `tick ${label_class}`, + transform: `translate(0, ${this.height - point * this.multiplier })` + })); + }); + } + + // make VERTICAL lines for x values + make_x_axis() { + let start_at, height, text_start_at, label_class = ''; + if(this.x_axis_mode === 'span') { // long spanning lines + start_at = -7; + height = this.height + 15; + text_start_at = this.height + 25; + } else if(this.x_axis_mode === 'tick'){ // short label lines + start_at = this.height; + height = 6; + text_start_at = 9; + label_class = 'x-axis-label'; + } + + this.x_axis_group.attr({ + transform: `translate(0,${start_at})` + }); + this.x.values.map((point, i) => { + this.x_axis_group.add(this.snap.g( + this.snap.line(0, 0, 0, height), + this.snap.text(0, text_start_at, point).attr({ + dy: ".71em", + class: "x-value-text" + }) + ).attr({ + class: `tick ${label_class}`, + transform: `translate(${ this.x_axis_values[i] }, 0)` + })); + }); + } + + make_units(y_values, color, dataset_index) { + let d = this.unit_args; + y_values.map((y, i) => { + let data_unit = this.draw[d.type](this.x_axis_values[i], + y, d.args, color, dataset_index); + this.data_units.add(data_unit); + this.y[dataset_index].data_units.push(data_unit); + }); + } + + make_path() { } + + make_tooltip() { + this.tip = $(`
    + +
      +
    +
    `).attr({ + style: `top: 0px; left: 0px; opacity: 0; pointer-events: none;` + }).appendTo(this.$graphics); + + this.tip_title = this.tip.find('.title'); + this.tip_data_point_list = this.tip.find('.data-point-list'); + + this.bind_tooltip(); + } + + bind_tooltip() { + this.$graphics.on('mousemove', (e) => { + let offset = $(this.$graphics).offset(); + var relX = e.pageX - offset.left - this.translate_x; + var relY = e.pageY - offset.top - this.translate_y; + + if(relY < this.height) { + for(var i=this.x_axis_values.length - 1; i >= 0 ; i--) { + let x_val = this.x_axis_values[i]; + if(relX > x_val - this.avg_unit_width/2) { + let x = x_val - this.tip.width()/2 + this.translate_x; + let y = this.y_min_tops[i] - this.tip.height() + this.translate_y; + + this.fill_tooltip(i); + + this.tip.attr({ + style: `top: ${y}px; left: ${x-0.5}px; opacity: 1; pointer-events: none;` + }); + break; + } + } + } else { + this.tip.attr({ + style: `top: 0px; left: 0px; opacity: 0; pointer-events: none;` + }); + } + }); + + this.$graphics.on('mouseleave', () => { + this.tip.attr({ + style: `top: 0px; left: 0px; opacity: 0; pointer-events: none;` + }); + }); + } + + fill_tooltip(i) { + this.tip_title.html(this.x.formatted && this.x.formatted.length>0 + ? this.x.formatted[i] : this.x.values[i]); + this.tip_data_point_list.empty(); + this.y.map(y_set => { + let $li = $(`
  • + + ${y_set.formatted ? y_set.formatted[i] : y_set.values[i]} + + ${y_set.title ? y_set.title : '' } +
  • `).addClass(`border-top ${y_set.color}`); + this.tip_data_point_list.append($li); + }); + } + + show_specific_values() { + this.specific_values.map(d => { + this.specific_y_lines.add(this.snap.g( + this.snap.line(0, 0, this.width, 0).attr({ + class: d.line_type === "dashed" ? "graph-dashed": "" + }), + this.snap.text(this.width + 5, 0, d.name.toUpperCase()).attr({ + dy: ".32em", + class: "specific-value", + }) + ).attr({ + class: "tick", + transform: `translate(0, ${this.height - d.value * this.multiplier })` + })); + }); + } + + show_summary() { } + + show_custom_summary() { + this.summary.map(d => { + this.$stats_container.append($(`
    + ${d.name}: ${d.value} +
    `)); + }); + } + + change_values(new_y) { + let u = this.unit_args; + this.y.map((d, i) => { + let new_d = new_y[i]; + new_d.y_tops = new_d.values.map(val => this.height - val * this.multiplier); + + // below is equal to this.y[i].data_units.. + d.data_units.map((unit, j) => { + let current_y_top = d.y_tops[j]; + let current_height = this.height - current_y_top; + + let new_y_top = new_d.y_tops[j]; + let new_height = current_height - (new_y_top - current_y_top); + + this.animate[u.type](unit, new_y_top, {new_height: new_height}); + }); + }); + + // Replace values and formatted and tops + this.y.map((d, i) => { + let new_d = new_y[i]; + [d.values, d.formatted, d.y_tops] = [new_d.values, new_d.formatted, new_d.y_tops]; + }); + + this.calc_min_tops(); + + // create new x,y pair string and animate path + if(this.y[0].path) { + new_y.map((e, i) => { + let new_points_list = e.y_tops.map((y, i) => (this.x_axis_values[i] + ',' + y)); + let new_path_str = "M"+new_points_list.join("L"); + this.y[i].path.animate({d:new_path_str}, 300, mina.easein); + }); + } + } + + // Helpers + get_strwidth(string) { + return string.length * 8; + } + + get_upper_limit_and_parts(array) { + let max_val = parseInt(Math.max(...array)); + if((max_val+"").length <= 1) { + return [10, 5]; + } else { + let multiplier = Math.pow(10, ((max_val+"").length - 1)); + let significant = Math.ceil(max_val/multiplier); + if(significant % 2 !== 0) significant++; + let parts = (significant < 5) ? significant : significant/2; + return [significant * multiplier, parts]; + } + } + + get_y_axis_values(upper_limit, parts) { + let y_axis = []; + for(var i = 0; i <= parts; i++){ + y_axis.push(upper_limit / parts * i); + } + return y_axis; + } + + // Objects + setup_utils() { + this.draw = { + 'bar': (x, y, args, color, index) => { + let total_width = this.avg_unit_width - args.space_width; + let start_x = x - total_width/2; + + let width = total_width / args.no_of_datasets; + let current_x = start_x + width * index; + return this.snap.rect(current_x, y, width, this.height - y).attr({ + class: `bar mini fill ${color}` + }); + }, + 'dot': (x, y, args, color) => { + return this.snap.circle(x, y, args.radius).attr({ + class: `fill ${color}` + }); + } + }; + + this.animate = { + 'bar': (bar, new_y, args) => { + bar.animate({height: args.new_height, y: new_y}, 300, mina.easein); + }, + 'dot': (dot, new_y) => { + dot.animate({cy: new_y}, 300, mina.easein); + } + }; + } +}; + +frappe.ui.BarGraph = class BarGraph extends frappe.ui.Graph { + constructor(args = {}) { + super(args); + } + + setup_values() { + var me = this; + super.setup_values(); + this.x_offset = this.avg_unit_width; + this.y_axis_mode = 'span'; + this.x_axis_mode = 'tick'; + this.unit_args = { + type: 'bar', + args: { + space_width: this.y.length > 1 ? + me.avg_unit_width/2 : me.avg_unit_width/8, + no_of_datasets: this.y.length + } + }; + } + + set_avg_unit_width_and_x_offset() { + this.avg_unit_width = this.width/(this.x.values.length + 1); + this.x_offset = this.avg_unit_width; + } +}; + +frappe.ui.LineGraph = class LineGraph extends frappe.ui.Graph { + constructor(args = {}) { + super(args); + } + + setup_values() { + super.setup_values(); + this.y_axis_mode = 'tick'; + this.x_axis_mode = 'span'; + this.unit_args = { + type: 'dot', + args: { radius: 4 } + }; + } + + make_path(d) { + let points_list = d.y_tops.map((y, i) => (this.x_axis_values[i] + ',' + y)); + let path_str = "M"+points_list.join("L"); + d.path = this.snap.path(path_str).attr({class: `stroke ${d.color}`}); + this.data_units.prepend(d.path); + } +}; + +frappe.ui.PercentageGraph = class PercentageGraph extends frappe.ui.Graph { + constructor(args = {}) { + super(args); + } + + make_graph_area() { + this.$graphics.addClass('graph-focus-margin'); + this.$stats_container.addClass('graph-focus-margin').attr({ + style: `padding-top: 0px; margin-bottom: 30px;` + }); + this.$div = $(`
    +
    +
    `); + this.$chart = this.$div.find('.progress-chart'); + return this.$div; + } + + setup_values() { + this.x.totals = this.x.values.map((d, i) => { + let total = 0; + this.y.map(e => { + total += e.values[i]; + }); + return total; + }); + + // Calculate x unit distances for tooltips + } + + setup_utils() { } + setup_components() { + this.$percentage_bar = $(`
    +
    `).appendTo(this.$chart); + } + + make_graph_components() { + let grand_total = this.x.totals.reduce((a, b) => a + b, 0); + this.x.units = []; + this.x.totals.map((total, i) => { + let $part = $(`
    `); + this.x.units.push($part); + this.$percentage_bar.append($part); + }); + } + + make_tooltip() { } + + show_summary() { + let values = this.x.formatted.length > 0 ? this.x.formatted : this.x.values; + this.x.totals.map((d, i) => { + this.$stats_container.append($(`
    + + ${values[i]}: + ${d} + +
    `)); + }); + } +}; diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 3162cd5db1..b3762fea6f 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -43,7 +43,7 @@ frappe.views.QueryReport = Class.extend({ this.wrapper = $("
    ").appendTo(this.page.main); $('\ \ -
    \ +
    \
    - +
    - ").appendTo(me.table.find("tbody")); - - $("
    + App Name @@ -37,10 +37,10 @@

    Contents

    diff --git a/frappe/templates/autodoc/docs_home.html b/frappe/templates/autodoc/docs_home.html index 602c9fb5b0..9d38b0605b 100644 --- a/frappe/templates/autodoc/docs_home.html +++ b/frappe/templates/autodoc/docs_home.html @@ -5,57 +5,15 @@ {% if app.style %} {{ app.style }} {% endif %} - -
    -
    -
    -
    -

    {{ app.headline }}

    -

    {{ app.sub_heading }}

    -
    -
    -
    - -
    -
    -
    -
    -
    - - -{% if app.long_description %} -
    -
    -
    - {{ app.long_description|markdown }} -
    -
    -
    +{% if app.headline %} +

    {{ app.headline }}

    +{% endif %} +{% if app.sub_heading %} +

    {{ app.sub_heading }}

    {% endif %} -{% if not app.hide_install %} -
    -
    -
    -

    Install

    -

    From your site

    -

    To install this app, login to your site and click on "Installer". Search for {{ app.title }} and click on "Install"

    -

    Using Bench

    -

    Go to your bench folder and setup the new app

    -
    $ bench get-app {{app.name}} {{app.source_link}}
    -$ bench new-site testsite
    -$ bench --site testsite install-app {{app.name}}
    -

    Login to your site to configure the app.

    -

    Detailed Installation Steps

    -
    -
    -

    Author

    - -

    {{ app.publisher }} ({{ app.email }})

    -
    -
    -
    +{% if app.long_description %} +{{ app.long_description|markdown }} {% endif %} diff --git a/frappe/templates/autodoc/doctype.html b/frappe/templates/autodoc/doctype.html index 3236f0c994..b851fc52e8 100644 --- a/frappe/templates/autodoc/doctype.html +++ b/frappe/templates/autodoc/doctype.html @@ -1,10 +1,12 @@ + {% from "templates/autodoc/macros.html" import automodule, version, source_link, doctype_link %} {% set doc = frappe.get_doc("DocType", doctype) %} {% set controller = autodoc.get_controller(doctype) %} +

    {{ doctype }}

    {{ version(doctype) }} {{ source_link(app, app.name + "/" + scrub(doc.module) @@ -22,7 +24,7 @@

    Fields

    - +
    diff --git a/frappe/templates/autodoc/macros.html b/frappe/templates/autodoc/macros.html index 29e1d520b8..1401454967 100644 --- a/frappe/templates/autodoc/macros.html +++ b/frappe/templates/autodoc/macros.html @@ -59,7 +59,7 @@ {% macro doctype_link(app, doctype) %} {% set module = frappe.db.get_value("DocType", doctype, "module") %} {% if doctype and module %} -{{ doctype }} {% endif %} {% endmacro %} diff --git a/frappe/templates/autodoc/models_home.html b/frappe/templates/autodoc/models_home.html index c9f960d416..44c5057ca2 100644 --- a/frappe/templates/autodoc/models_home.html +++ b/frappe/templates/autodoc/models_home.html @@ -1,6 +1,9 @@ + {% from "templates/autodoc/macros.html" import source_link, version %} + +

    {{ app.title }}: Models (DocTypes)

    {{ version(app.name) }} {{ source_link(app, app.name, True) }} diff --git a/frappe/templates/autodoc/module_home.html b/frappe/templates/autodoc/module_home.html index 3e75f3aeca..c10994841b 100644 --- a/frappe/templates/autodoc/module_home.html +++ b/frappe/templates/autodoc/module_home.html @@ -1,6 +1,9 @@ + {% from "templates/autodoc/macros.html" import source_link, version %} + +

    Module {{ name }}

    {{ version(app.name) }} {{ source_link(app, app.name + "/" + scrub(name), True) }} diff --git a/frappe/templates/autodoc/package_index.html b/frappe/templates/autodoc/package_index.html index 0381e07af0..9107996dfa 100644 --- a/frappe/templates/autodoc/package_index.html +++ b/frappe/templates/autodoc/package_index.html @@ -1,6 +1,9 @@ + {% from "templates/autodoc/macros.html" import source_link, version %} + +

    {{ title }}

    {{ version(app.name) }} {{ source_link(app, title, True) }} diff --git a/frappe/templates/autodoc/pymodule.html b/frappe/templates/autodoc/pymodule.html index ab6301ae85..537b37ead0 100644 --- a/frappe/templates/autodoc/pymodule.html +++ b/frappe/templates/autodoc/pymodule.html @@ -1,7 +1,10 @@ + {%- from "templates/autodoc/macros.html" import automodule, source_link, version -%} + +

    {{ name }}

    {{ version(app.name) }} {{ source_link(app, full_module_name.replace(".", "/") + ".py") }} diff --git a/frappe/templates/includes/blog/blog.html b/frappe/templates/includes/blog/blog.html index 18617a3cf7..01e3e44d6b 100644 --- a/frappe/templates/includes/blog/blog.html +++ b/frappe/templates/includes/blog/blog.html @@ -5,6 +5,25 @@ {% block hero %}{% endblock %} {% block page_content %} +
    diff --git a/frappe/templates/includes/comments/comment.html b/frappe/templates/includes/comments/comment.html index 2d7e1603ed..e0f923b2e0 100644 --- a/frappe/templates/includes/comments/comment.html +++ b/frappe/templates/includes/comments/comment.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/frappe/templates/includes/full_index.html b/frappe/templates/includes/full_index.html index 1f798c66ed..a7443c482a 100644 --- a/frappe/templates/includes/full_index.html +++ b/frappe/templates/includes/full_index.html @@ -2,10 +2,12 @@
      {% for item in children_map[route] %}
    1. - {{ item.title }} + {{ item.title }} + {# {% if children_map[item.route] %} {{ make_item_list(item.route, children_map) }} {% endif %} + #}
    2. {% endfor %}
    diff --git a/frappe/templates/includes/web_sidebar.html b/frappe/templates/includes/web_sidebar.html index 764ce4d277..d452e8af3f 100644 --- a/frappe/templates/includes/web_sidebar.html +++ b/frappe/templates/includes/web_sidebar.html @@ -22,7 +22,7 @@ {% endif %} {% for item in sidebar_items -%}
    diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 749a28479f..cccf4f079c 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -75,7 +75,7 @@ def get_allowed_functions_for_jenv(): import frappe.utils.data from frappe.utils.autodoc import automodule, get_version from frappe.model.document import get_controller - from frappe.website.utils import get_shade + from frappe.website.utils import (get_shade, get_toc, get_next_link) from frappe.modules import scrub import mimetypes from html2text import html2text @@ -128,11 +128,16 @@ def get_allowed_functions_for_jenv(): 'csrf_token': frappe.local.session.data.csrf_token if getattr(frappe.local, "session", None) else '' }, }, + 'style': { + 'border_color': '#d1d8dd' + }, "autodoc": { "get_version": get_version, "automodule": automodule, "get_controller": get_controller }, + 'get_toc': get_toc, + 'get_next_link': get_next_link, "_": frappe._, "get_shade": get_shade, "scrub": scrub, @@ -159,8 +164,10 @@ def get_jloader(): if frappe.local.flags.in_setup_help: apps = ['frappe'] else: - apps = frappe.local.flags.web_pages_apps or frappe.get_installed_apps(sort=True) - apps.reverse() + apps = frappe.get_hooks('template_apps') + if not apps: + apps = frappe.local.flags.web_pages_apps or frappe.get_installed_apps(sort=True) + apps.reverse() if not "frappe" in apps: apps.append('frappe') diff --git a/frappe/utils/setup_docs.py b/frappe/utils/setup_docs.py index 78f8a9602b..08092c472f 100644 --- a/frappe/utils/setup_docs.py +++ b/frappe/utils/setup_docs.py @@ -13,12 +13,12 @@ from frappe.utils import markdown from six import iteritems class setup_docs(object): - def __init__(self, app): + def __init__(self, app, target_app): """Generate source templates for models reference and module API and templates at `templates/autodoc` """ self.app = app - + self.target_app = target_app frappe.flags.web_pages_folders = ['docs',] frappe.flags.web_pages_apps = [self.app,] @@ -44,7 +44,6 @@ class setup_docs(object): "sub_heading": self.docs_config.sub_heading, "source_link": self.docs_config.source_link, "hide_install": getattr(self.docs_config, "hide_install", False), - "docs_base_url": self.docs_config.docs_base_url, "long_description": markdown(getattr(self.docs_config, "long_description", "")), "license": self.hooks.get("app_license")[0], "branch": getattr(self.docs_config, "branch", None) or "develop", @@ -59,7 +58,7 @@ class setup_docs(object): def build(self, docs_version): """Build templates for docs models and Python API""" - self.docs_path = frappe.get_app_path(self.app, "docs") + self.docs_path = frappe.get_app_path(self.target_app, 'www', "docs") self.path = os.path.join(self.docs_path, docs_version) self.app_context["app"]["docs_version"] = docs_version @@ -91,14 +90,50 @@ class setup_docs(object): #print parts module, doctype = parts[-3], parts[-1] - if doctype not in ("doctype", "boilerplate"): + if doctype != "boilerplate": self.write_model_file(basepath, module, doctype) # standard python module if self.is_py_module(basepath, folders, files): self.write_modules(basepath, folders, files) - self.build_user_docs() + #self.build_user_docs() + self.copy_user_assets() + self.add_sidebars() + self.add_breadcrumbs_for_user_pages() + + def add_breadcrumbs_for_user_pages(self): + for basepath, folders, files in os.walk(os.path.join(self.docs_path, + 'user')): # pylint: disable=unused-variable + for fname in files: + if fname.endswith('.md') or fname.endswith('.html'): + add_breadcrumbs_tag(os.path.join(basepath, fname)) + + def add_sidebars(self): + '''Add _sidebar.json in each folder in docs''' + for basepath, folders, files in os.walk(self.docs_path): # pylint: disable=unused-variable + with open(os.path.join(basepath, '_sidebar.json'), 'w') as sidebarfile: + sidebarfile.write(frappe.as_json([ + {"title": "Docs Home", "route": "/docs"}, + {"title": "User Guide", "route": "/docs/user"}, + {"title": "Server API", "route": "/docs/current/api"}, + {"title": "Models (Reference)", "route": "/docs/current/models"}, + {"title": "Improve Docs", "route": + "{0}/tree/develop/{1}/docs".format(self.docs_config.source_link, self.app)} + ])) + + + def copy_user_assets(self): + '''Copy docs/user and docs/assets to the target app''' + print('Copying docs/user and docs/assets...') + shutil.rmtree(os.path.join(self.docs_path, 'user'), + ignore_errors=True) + shutil.rmtree(os.path.join(self.docs_path, 'assets'), + ignore_errors=True) + shutil.copytree(os.path.join(self.app_path, 'docs', 'user'), + os.path.join(self.docs_path, 'user')) + shutil.copytree(os.path.join(self.app_path, 'docs', 'assets'), + frappe.get_app_path(self.target_app, 'www', 'docs', 'assets')) def make_home_pages(self): """Make standard home pages for docs, developer docs, api and models @@ -463,3 +498,9 @@ edit_link = '''
    ''' + +def add_breadcrumbs_tag(path): + with open(path, 'r') as f: + content = frappe.as_unicode(f.read()) + with open(path, 'w') as f: + f.write(('\n' + content).encode('utf-8')) diff --git a/frappe/website/context.py b/frappe/website/context.py index b800571aaa..99cb9371bc 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -16,15 +16,17 @@ def get_context(path, args=None): if args: context.update(args) - context = build_context(context) - if hasattr(frappe.local, 'request'): # for (remove leading slash) # path could be overriden in render.resolve_from_map - context["path"] = frappe.local.request.path[1:] + context["path"] = frappe.local.request.path.strip('/ ') else: context["path"] = path + context.route = context.path + + context = build_context(context) + # set using frappe.respond_as_web_page if hasattr(frappe.local, 'response') and frappe.local.response.get('context'): context.update(frappe.local.response.context) @@ -69,6 +71,9 @@ def build_context(context): if context.url_prefix and context.url_prefix[-1]!='/': context.url_prefix += '/' + # for backward compatibility + context.docs_base_url = '/docs' + context.update(get_website_settings()) context.update(frappe.local.conf.get("website_context") or {}) @@ -105,7 +110,21 @@ def build_context(context): update_controller_context(context, extension) add_metatags(context) + add_sidebar_and_breadcrumbs(context) + + # determine templates to be used + if not context.base_template_path: + app_base = frappe.get_hooks("base_template") + context.base_template_path = app_base[0] if app_base else "templates/base.html" + + if context.title_prefix and context.title and not context.title.startswith(context.title_prefix): + context.title = '{0} - {1}'.format(context.title_prefix, context.title) + return context + +def add_sidebar_and_breadcrumbs(context): + '''Add sidebar and breadcrumbs to context''' + from frappe.website.router import get_page_info_from_template if context.show_sidebar: context.no_cache = 1 add_sidebar_data(context) @@ -117,16 +136,12 @@ def build_context(context): context.sidebar_items = json.loads(sidebarfile.read()) context.show_sidebar = 1 - - # determine templates to be used - if not context.base_template_path: - app_base = frappe.get_hooks("base_template") - context.base_template_path = app_base[0] if app_base else "templates/base.html" - - if context.title_prefix and context.title and not context.title.startswith(context.title_prefix): - context.title = '{0} - {1}'.format(context.title_prefix, context.title) - - return context + if context.add_breadcrumbs and not context.parents: + if context.basepath: + parent_path = os.path.dirname(context.path).rstrip('/') + page_info = get_page_info_from_template(parent_path) + if page_info: + context.parents = [dict(route=parent_path, title=page_info.title)] def add_sidebar_data(context): from frappe.utils.user import get_fullname_and_avatar diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index 7ae1ed778e..24a128ddd6 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -1,6 +1,36 @@ {% extends "templates/web.html" %} {% block page_content %} +
    diff --git a/frappe/website/doctype/blog_post/templates/blog_post_row.html b/frappe/website/doctype/blog_post/templates/blog_post_row.html index 097feff8b9..42c1833920 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post_row.html +++ b/frappe/website/doctype/blog_post/templates/blog_post_row.html @@ -12,11 +12,11 @@

    {{ _("By") }} {{ post.full_name }} - {{ frappe.format_date(post.published_on) }} - + {{ frappe.format_date(post.published_on) }} + {{ post.category.title }} - {{ post.comment_text }} + {{ post.comment_text }}

    diff --git a/frappe/website/purifycss.py b/frappe/website/purifycss.py new file mode 100644 index 0000000000..00ca06b0c4 --- /dev/null +++ b/frappe/website/purifycss.py @@ -0,0 +1,32 @@ +import frappe, re, os + +def purifycss(): + source = frappe.get_app_path('frappe_theme', 'public', 'less', 'frappe_theme.less') + target_apps = ['erpnext_com', 'frappe_io', 'translator', 'chart_of_accounts_builder', 'frappe_theme'] + with open(source, 'r') as f: + src = f.read() + + classes = [] + for line in src.splitlines(): + line = line.strip() + if not line: + continue + if line[0]=='@': + continue + classes.extend(re.findall('\.([^0-9][^ :&.{,(]*)', line)) + + classes = list(set(classes)) + + for app in target_apps: + for basepath, folders, files in os.walk(frappe.get_app_path(app)): + for fname in files: + if fname.endswith('.html') or fname.endswith('.md'): + #print 'checking {0}...'.format(fname) + with open(os.path.join(basepath, fname), 'r') as f: + src = f.read() + for c in classes: + if c in src: + classes.remove(c) + + for c in sorted(classes): + print c diff --git a/frappe/website/render.py b/frappe/website/render.py index a36013fa43..ed446065fb 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -6,14 +6,16 @@ import frappe from frappe import _ import frappe.sessions from frappe.utils import cstr -import mimetypes, json +import os, mimetypes, json from six import iteritems from werkzeug.wrappers import Response from werkzeug.routing import Map, Rule, NotFound +from werkzeug.wsgi import wrap_file from frappe.website.context import get_context -from frappe.website.utils import get_home_page, can_cache, delete_page_cache +from frappe.website.utils import (get_home_page, can_cache, delete_page_cache, + get_toc, get_next_link) from frappe.website.router import clear_sitemap from frappe.translate import guess_language @@ -21,14 +23,16 @@ class PageNotFoundError(Exception): pass def render(path=None, http_status_code=None): """render html page""" - path = resolve_path(path or frappe.local.request.path.strip('/ ')) + path = resolve_path(path or frappe.local.request.path) + path = path.strip('/ ') data = None # if in list of already known 404s, send it if can_cache() and frappe.cache().hget('website_404', frappe.request.url): data = render_page('404') http_status_code = 404 - + elif is_static_file(path): + return get_static_file_reponse() else: try: data = render_page_by_language(path) @@ -71,6 +75,32 @@ def render(path=None, http_status_code=None): return build_response(path, data, http_status_code or 200) +def is_static_file(path): + if ('.' not in path): + return False + extn = path.rsplit('.', 1)[-1] + if extn in ('html', 'md', 'js'): + return False + + for app in frappe.get_installed_apps(): + file_path = frappe.get_app_path(app, 'www') + '/' + path + if os.path.exists(file_path): + frappe.flags.file_path = file_path + return True + + return False + +def get_static_file_reponse(): + try: + f = open(frappe.flags.file_path, 'rb') + except IOError: + raise NotFound + + response = Response(wrap_file(frappe.local.request.environ, f), direct_passthrough=True) + response.mimetype = mimetypes.guess_type(frappe.flags.file_path)[0] or b'application/octet-stream' + return response + + def build_response(path, data, http_status_code, headers=None): # build response response = Response() @@ -143,6 +173,12 @@ def build_page(path): elif context.template: html = frappe.get_template(context.template).render(context) + if '{index}' in html: + html = html.replace('{index}', get_toc(context.route)) + + if '{next}' in html: + html = html.replace('{next}', get_next_link(context.route)) + # html = frappe.get_template(context.base_template_path).render(context) if can_cache(context.no_cache): @@ -221,7 +257,9 @@ def clear_cache(path=None): '''Clear website caches :param path: (optional) for the given path''' - frappe.cache().delete_value("website_generator_routes") + for key in ('website_generator_routes', 'website_pages', + 'website_full_index'): + frappe.cache().delete_value(key) delete_page_cache(path) frappe.cache().delete_value("website_404") if not path: diff --git a/frappe/website/router.py b/frappe/website/router.py index 4ce5655f78..38799b72ff 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -6,7 +6,6 @@ import frappe, os from frappe.website.utils import can_cache, delete_page_cache, extract_title from frappe.model.document import get_controller -from frappe import _ def resolve_route(path): """Returns the page route object based on searching in pages and generators. @@ -15,7 +14,7 @@ def resolve_route(path): The only exceptions are `/about` and `/contact` these will be searched in Web Pages first before checking the standard pages.""" if path not in ("about", "contact"): - context = get_page_context_from_template(path) + context = get_page_info_from_template(path) if context: return context return get_page_context_from_doctype(path) @@ -23,7 +22,7 @@ def resolve_route(path): context = get_page_context_from_doctype(path) if context: return context - return get_page_context_from_template(path) + return get_page_info_from_template(path) def get_page_context(path): page_context = None @@ -54,12 +53,12 @@ def make_page_context(path): return context -def get_page_context_from_template(path): +def get_page_info_from_template(path): '''Return page_info from path''' for app in frappe.get_installed_apps(frappe_last=True): app_path = frappe.get_app_path(app) - folders = frappe.local.flags.web_pages_folders or ('www', 'templates/pages') + folders = get_start_folders() for start in folders: search_path = os.path.join(app_path, start, path) @@ -68,14 +67,15 @@ def get_page_context_from_template(path): for o in options: option = frappe.as_unicode(o) if os.path.exists(option) and not os.path.isdir(option): - return get_page_info(option, app, app_path=app_path) + return get_page_info(option, app, start, app_path=app_path) return None def get_page_context_from_doctype(path): page_info = get_page_info_from_doctypes(path) if page_info: - return frappe.get_doc(page_info.get("doctype"), page_info.get("name")).get_page_info() + return frappe.get_doc(page_info.get("doctype"), + page_info.get("name")).get_page_info() def clear_sitemap(): delete_page_cache("*") @@ -120,57 +120,60 @@ def get_page_info_from_doctypes(path=None): def get_pages(app=None): '''Get all pages. Called for docs / sitemap''' - pages = {} - frappe.local.flags.in_get_all_pages = True - folders = frappe.local.flags.web_pages_folders or ('www', 'templates/pages') + def _build(app): + pages = {} - if app: - apps = [app] - else: - apps = frappe.local.flags.web_pages_apps or frappe.get_installed_apps() + if app: + apps = [app] + else: + apps = frappe.local.flags.web_pages_apps or frappe.get_installed_apps() - for app in apps: - app_path = frappe.get_app_path(app) + for app in apps: + app_path = frappe.get_app_path(app) - for start in folders: - path = os.path.join(app_path, start) - pages.update(get_pages_from_path(path, app, app_path)) - frappe.local.flags.in_get_all_pages = False + for start in get_start_folders(): + pages.update(get_pages_from_path(start, app, app_path)) - return pages + return pages + + return frappe.cache().get_value('website_pages', lambda: _build(app)) -def get_pages_from_path(path, app, app_path): +def get_pages_from_path(start, app, app_path): pages = {} - if os.path.exists(path): - for basepath, folders, files in os.walk(path): + start_path = os.path.join(app_path, start) + if os.path.exists(start_path): + for basepath, folders, files in os.walk(start_path): # add missing __init__.py if not '__init__.py' in files: open(os.path.join(basepath, '__init__.py'), 'a').close() for fname in files: fname = frappe.utils.cstr(fname) + if not '.' in fname: + continue page_name, extn = fname.rsplit(".", 1) if extn in ('js', 'css') and os.path.exists(os.path.join(basepath, fname + '.html')): # js, css is linked to html, skip continue if extn in ("html", "xml", "js", "css", "md"): - page_info = get_page_info(path, app, basepath, app_path, fname) + page_info = get_page_info(os.path.join(basepath, fname), + app, start, basepath, app_path, fname) pages[page_info.route] = page_info # print frappe.as_json(pages[-1]) return pages -def get_page_info(path, app, basepath=None, app_path=None, fname=None): +def get_page_info(path, app, start, basepath=None, app_path=None, fname=None): '''Load page info''' - if not fname: + if fname is None: fname = os.path.basename(path) - if not app_path: + if app_path is None: app_path = frappe.get_app_path(app) - if not basepath: + if basepath is None: basepath = os.path.dirname(path) page_name, extn = fname.rsplit(".", 1) @@ -187,9 +190,16 @@ def get_page_info(path, app, basepath=None, app_path=None, fname=None): if page_info.basename == 'index': page_info.basename = "" - page_info.route = page_info.name = page_info.page_name = os.path.join(os.path.relpath(basepath, path), - page_info.basename).strip('/.') + # get route from template name + page_info.route = page_info.template.replace(start, '').strip('/') + if os.path.basename(page_info.route) in ('index.html', 'index.md'): + page_info.route = os.path.dirname(page_info.route) + # remove the extension + if page_info.route.endswith('.md') or page_info.route.endswith('.html'): + page_info.route = page_info.route.rsplit('.', 1)[0] + + page_info.name = page_info.page_name = page_info.route # controller page_info.controller_path = os.path.join(basepath, page_name.replace("-", "_") + ".py") @@ -202,9 +212,11 @@ def get_page_info(path, app, basepath=None, app_path=None, fname=None): # get the source setup_source(page_info) - if page_info.only_content: - # extract properties from HTML comments - load_properties(page_info) + # extract properties from HTML comments + load_properties(page_info) + + # if not page_info.title: + # print('no-title-for', page_info.route) return page_info @@ -255,48 +267,14 @@ def setup_index(page_info): if os.path.exists(index_txt_path): page_info.index = open(index_txt_path, 'r').read().splitlines() -def make_toc(context, out, app=None): - '''Insert full index (table of contents) for {index} tag''' - from frappe.website.utils import get_full_index - if '{index}' in out: - html = frappe.get_template("templates/includes/full_index.html").render({ - "full_index": get_full_index(app=app), - "url_prefix": context.url_prefix or "/", - "route": context.route - }) - - out = out.replace('{index}', html) - - if '{next}' in out: - # insert next link - next_item = None - children_map = get_full_index(app=app) - parent_route = os.path.dirname(context.route) - children = children_map[parent_route] - - if parent_route and children: - for i, c in enumerate(children): - if c.route == context.route and i < (len(children) - 1): - next_item = children[i+1] - next_item.url_prefix = context.url_prefix or "/" - - if next_item: - if next_item.route and next_item.title: - html = ('

    '+_("Next")\ - +': {title}

    ').format(**next_item) - - out = out.replace('{next}', html) - - return out - - def load_properties(page_info): '''Load properties like no_cache, title from raw''' if not page_info.title: - page_info.title = extract_title(page_info.source, page_info.name) + page_info.title = extract_title(page_info.source, page_info.route) - if page_info.title and not '{% block title %}' in page_info.source: - page_info.source += '\n{% block title %}{{ title }}{% endblock %}' + # if page_info.title and not '{% block title %}' in page_info.source: + # if not page_info.only_content: + # page_info.source += '\n{% block title %}{{ title }}{% endblock %}' if "" in page_info.source: page_info.no_breadcrumbs = 1 @@ -304,13 +282,19 @@ def load_properties(page_info): if "" in page_info.source: page_info.show_sidebar = 1 + if "" in page_info.source: + page_info.add_breadcrumbs = 1 + if "" in page_info.source: page_info.no_header = 1 - else: - # every page needs a header - # add missing header if there is no

    tag - if (not '{% block header %}' in page_info.source) and (not ' tag + # if (not '{% block header %}' in page_info.source) and (not '" in page_info.source: page_info.no_cache = 1 @@ -346,7 +330,7 @@ def sync_global_search(): for app in frappe.get_installed_apps(frappe_last=True): app_path = frappe.get_app_path(app) - folders = frappe.local.flags.web_pages_folders or ('www', 'templates/pages') + folders = get_start_folders() for start in folders: for basepath, folders, files in os.walk(os.path.join(app_path, start)): @@ -374,3 +358,5 @@ def sync_global_search(): sync_global_search() +def get_start_folders(): + return frappe.local.flags.web_pages_folders or ('www', 'templates/pages') \ No newline at end of file diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 31ff4acddc..9424ec722e 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -5,9 +5,9 @@ from __future__ import unicode_literals import frappe, re, os from six import iteritems - def delete_page_cache(path): cache = frappe.cache() + cache.delete_value('full_index') groups = ("website_page", "page_context") if path: for name in groups: @@ -184,38 +184,89 @@ def abs_url(path): path = "/" + path return path +def get_toc(route, url_prefix=None, app=None): + '''Insert full index (table of contents) for {index} tag''' + from frappe.website.utils import get_full_index + + full_index = get_full_index(app=app) + + return frappe.get_template("templates/includes/full_index.html").render({ + "full_index": full_index, + "url_prefix": url_prefix or "/", + "route": route.rstrip('/') + }) + +def get_next_link(route, url_prefix=None, app=None): + # insert next link + next_item = None + route = route.rstrip('/') + children_map = get_full_index(app=app) + parent_route = os.path.dirname(route) + children = children_map[parent_route] + + if parent_route and children: + for i, c in enumerate(children): + if c.route == route and i < (len(children) - 1): + next_item = children[i+1] + next_item.url_prefix = url_prefix or "/" + + if next_item: + if next_item.route and next_item.title: + html = ('

    ' + frappe._("Next")\ + +': {title}

    ').format(**next_item) + + return html + + return '' + def get_full_index(route=None, app=None): """Returns full index of the website for www upto the n-th level""" + from frappe.website.router import get_pages + if not frappe.local.flags.children_map: - from frappe.website.router import get_pages - children_map = {} - pages = get_pages(app=app) - - # make children map - for route, page_info in iteritems(pages): - parent_route = os.path.dirname(route) - children_map.setdefault(parent_route, []).append(page_info) - - if frappe.flags.local_docs: - page_info.extn = '.html' - - # order as per index if present - for route, children in children_map.items(): - page_info = pages[route] - if page_info.index: - new_children = [] - page_info.extn = '' - for name in page_info.index: - child_route = page_info.route + '/' + name - if child_route in pages: - new_children.append(pages[child_route]) - - # add remaining pages not in index.txt - for c in children: - if c not in new_children: - new_children.append(c) - - children_map[route] = new_children + def _build(): + children_map = {} + added = [] + pages = get_pages(app=app) + + # make children map + for route, page_info in iteritems(pages): + parent_route = os.path.dirname(route) + if parent_route not in added: + children_map.setdefault(parent_route, []).append(page_info) + + # order as per index if present + for route, children in children_map.items(): + if not route in pages: + # no parent (?) + continue + + page_info = pages[route] + if page_info.index or ('index' in page_info.template): + new_children = [] + page_info.extn = '' + for name in (page_info.index or []): + child_route = page_info.route + '/' + name + if child_route in pages: + if child_route not in added: + new_children.append(pages[child_route]) + added.append(child_route) + + # add remaining pages not in index.txt + _children = sorted(children, lambda a, b: cmp( + os.path.basename(a.route), os.path.basename(b.route))) + + for child_route in _children: + if child_route not in new_children: + if child_route not in added: + new_children.append(child_route) + added.append(child_route) + + children_map[route] = new_children + + return children_map + + children_map = frappe.cache().get_value('website_full_index', _build) frappe.local.flags.children_map = children_map @@ -223,12 +274,14 @@ def get_full_index(route=None, app=None): def extract_title(source, path): '''Returns title from `<!-- title -->` or <h1> or path''' + title = '' + if "', source)[0].strip() elif "

    " in source: match = re.findall('

    ([^<]*)', source) title = match[0].strip()[:300] - else: - title = os.path.basename(path).replace('_', ' ').replace('-', ' ').title() + if not title: + title = os.path.basename(path.rsplit('.', )[0].rstrip('/')).replace('_', ' ').replace('-', ' ').title() return title diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index 3b84bdd084..fd361f8986 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -1,7 +1,8 @@ +// website_script.js {% if javascript -%}{{ javascript }}{%- endif %} {% if google_analytics_id -%} - +// Google Analytics (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) @@ -9,5 +10,5 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) ga('create', '{{ google_analytics_id }}', 'auto'); ga('send', 'pageview'); - +// End Google Analytics {%- endif %} diff --git a/frappe/www/website_script.py b/frappe/www/website_script.py index 2f5ee0d654..0db00bc3d8 100644 --- a/frappe/www/website_script.py +++ b/frappe/www/website_script.py @@ -10,7 +10,8 @@ no_sitemap = 1 base_template_path = "templates/www/website_script.js" def get_context(context): - context.javascript = frappe.db.get_single_value('Website Script', 'javascript') or "" + context.javascript = frappe.db.get_single_value('Website Script', + 'javascript') or "" theme = get_active_theme() js = strip(theme and theme.js or "") From f609a478ae4863cd2d0108235035e20bd078ce03 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 28 Jul 2017 14:33:31 +0530 Subject: [PATCH 15/52] [refactor] user permissions (#3713) * [refactor] user permissions * [fix] tests * [ux] user-permissions * [minor] cleanup system settings * [minor] end progress --- frappe/boot.py | 2 + frappe/core/doctype/communication/feed.py | 3 +- .../system_settings/system_settings.json | 112 ++++-- .../system_settings/system_settings.py | 1 + .../system_settings/test_system_settings.js | 23 ++ frappe/core/doctype/user/user.js | 6 +- .../core/doctype/user_permission/__init__.py | 0 .../user_permission/test_user_permission.js | 23 ++ .../user_permission/test_user_permission.py | 10 + .../user_permission/user_permission.js | 10 + .../user_permission/user_permission.json | 188 +++++++++ .../user_permission/user_permission.py | 80 ++++ .../permission_manager/permission_manager.js | 24 +- .../permission_manager/permission_manager.py | 16 +- frappe/core/page/user_permissions/README.md | 1 - frappe/core/page/user_permissions/__init__.py | 3 - .../page/user_permissions/user_permissions.js | 365 ------------------ .../user_permissions/user_permissions.json | 19 - .../page/user_permissions/user_permissions.py | 109 ------ frappe/defaults.py | 23 +- frappe/desk/form/load.py | 11 - frappe/model/create_new.py | 5 +- frappe/model/db_query.py | 2 +- frappe/model/delete_doc.py | 11 +- frappe/patches.txt | 1 + frappe/patches/v8_x/__init__.py | 0 frappe/patches/v8_x/update_user_permission.py | 25 ++ frappe/permissions.py | 75 +++- frappe/public/js/frappe/defaults.js | 6 +- frappe/public/js/frappe/list/list_view.js | 6 +- frappe/public/js/frappe/model/create_new.js | 6 +- frappe/public/js/frappe/model/model.js | 1 - .../js/frappe/views/reports/query_report.js | 2 +- .../js/frappe/views/reports/reportview.js | 4 +- frappe/test_runner.py | 4 +- frappe/tests/test_permissions.py | 108 ++++-- 36 files changed, 621 insertions(+), 664 deletions(-) create mode 100644 frappe/core/doctype/system_settings/test_system_settings.js create mode 100644 frappe/core/doctype/user_permission/__init__.py create mode 100644 frappe/core/doctype/user_permission/test_user_permission.js create mode 100644 frappe/core/doctype/user_permission/test_user_permission.py create mode 100644 frappe/core/doctype/user_permission/user_permission.js create mode 100644 frappe/core/doctype/user_permission/user_permission.json create mode 100644 frappe/core/doctype/user_permission/user_permission.py delete mode 100644 frappe/core/page/user_permissions/README.md delete mode 100644 frappe/core/page/user_permissions/__init__.py delete mode 100644 frappe/core/page/user_permissions/user_permissions.js delete mode 100644 frappe/core/page/user_permissions/user_permissions.json delete mode 100644 frappe/core/page/user_permissions/user_permissions.py create mode 100644 frappe/patches/v8_x/__init__.py create mode 100644 frappe/patches/v8_x/update_user_permission.py diff --git a/frappe/boot.py b/frappe/boot.py index d413d03fb6..1cc8202123 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,6 +17,7 @@ from frappe.utils.change_log import get_versions from frappe.translate import get_lang_dict from frappe.email.inbox import get_email_accounts from frappe.core.doctype.feedback_trigger.feedback_trigger import get_enabled_feedback_trigger +from frappe.core.doctype.user_permission.user_permission import get_user_permissions def get_bootinfo(): """build and return boot info""" @@ -30,6 +31,7 @@ def get_bootinfo(): # system info bootinfo.sysdefaults = frappe.defaults.get_defaults() + bootinfo.user_permissions = get_user_permissions() bootinfo.server_date = frappe.utils.nowdate() if frappe.session['user'] != 'Guest': diff --git a/frappe/core/doctype/communication/feed.py b/frappe/core/doctype/communication/feed.py index ded84a469c..2d939447cd 100644 --- a/frappe/core/doctype/communication/feed.py +++ b/frappe/core/doctype/communication/feed.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals import frappe -import frappe.defaults import frappe.permissions from frappe.model.document import Document from frappe.utils import get_fullname @@ -68,7 +67,7 @@ def get_feed_match_conditions(user=None, force=True): conditions = ['`tabCommunication`.owner="{user}" or `tabCommunication`.reference_owner="{user}"'.format(user=frappe.db.escape(user))] - user_permissions = frappe.defaults.get_user_permissions(user) + user_permissions = frappe.permissions.get_user_permissions(user) can_read = frappe.get_user().get_can_read() can_read_doctypes = ['"{}"'.format(doctype) for doctype in diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 87d85449ba..bbdf75c085 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -527,7 +527,7 @@ "bold": 0, "collapsible": 1, "columns": 0, - "fieldname": "security", + "fieldname": "permissions", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, @@ -536,10 +536,11 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Security", + "label": "Permissions", "length": 0, "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, @@ -556,10 +557,9 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "06:00", - "description": "Session Expiry in Hours e.g. 06:00", - "fieldname": "session_expiry", - "fieldtype": "Data", + "description": "If Apply User Permissions is checked for Report DocType but no User Permissions are defined for Report for a User, then all Reports are shown to that User", + "fieldname": "ignore_user_permissions_if_missing", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -567,11 +567,11 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Session Expiry", + "label": "Ignore User Permissions If Missing", "length": 0, "no_copy": 0, - "options": "", "permlevel": 0, + "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, @@ -588,10 +588,10 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "720:00", - "description": "In Hours", - "fieldname": "session_expiry_mobile", - "fieldtype": "Data", + "default": "0", + "description": "If Apply Strict User Permission is checked and User Permission is defined for a DocType for a User, then all the documents where value of the link is blank, will not be shown to that User", + "fieldname": "apply_strict_user_permissions", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -599,7 +599,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Session Expiry Mobile", + "label": "Apply Strict User Permissions", "length": 0, "no_copy": 0, "permlevel": 0, @@ -614,16 +614,45 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "security", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Security", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "default": "0", - "description": "If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.", - "fieldname": "enable_password_policy", - "fieldtype": "Check", + "default": "06:00", + "description": "Session Expiry in Hours e.g. 06:00", + "fieldname": "session_expiry", + "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -631,11 +660,11 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Enable Password Policy", + "label": "Session Expiry", "length": 0, "no_copy": 0, + "options": "", "permlevel": 0, - "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, @@ -652,10 +681,10 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "2", - "depends_on": "eval:doc.enable_password_policy==1", - "fieldname": "minimum_password_score", - "fieldtype": "Select", + "default": "720:00", + "description": "In Hours", + "fieldname": "session_expiry_mobile", + "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -663,10 +692,9 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Minimum Password Score", + "label": "Session Expiry Mobile", "length": 0, "no_copy": 0, - "options": "2\n4", "permlevel": 0, "precision": "", "print_hide": 0, @@ -685,8 +713,10 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "column_break_13", - "fieldtype": "Column Break", + "default": "0", + "description": "If enabled, the password strength will be enforced based on the Minimum Password Score value. A value of 2 being medium strong and 4 being very strong.", + "fieldname": "enable_password_policy", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -694,6 +724,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, + "label": "Enable Password Policy", "length": 0, "no_copy": 0, "permlevel": 0, @@ -714,9 +745,10 @@ "bold": 0, "collapsible": 0, "columns": 0, - "description": "Note: Multiple sessions will be allowed in case of mobile device", - "fieldname": "deny_multiple_sessions", - "fieldtype": "Check", + "default": "2", + "depends_on": "eval:doc.enable_password_policy==1", + "fieldname": "minimum_password_score", + "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -724,9 +756,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Allow only one session per user", + "label": "Minimum Password Score", "length": 0, "no_copy": 0, + "options": "2\n4", "permlevel": 0, "precision": "", "print_hide": 0, @@ -745,9 +778,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "description": "If Apply User Permissions is checked for Report DocType but no User Permissions are defined for Report for a User, then all Reports are shown to that User", - "fieldname": "ignore_user_permissions_if_missing", - "fieldtype": "Check", + "fieldname": "column_break_13", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -755,7 +787,6 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Ignore User Permissions If Missing", "length": 0, "no_copy": 0, "permlevel": 0, @@ -776,9 +807,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "0", - "description": "If Apply Strict User Permission is checked and User Permission is defined for a DocType for a User, then all the documents where value of the link is blank, will not be shown to that User", - "fieldname": "apply_strict_user_permissions", + "description": "Note: Multiple sessions will be allowed in case of mobile device", + "fieldname": "deny_multiple_sessions", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -787,7 +817,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Apply Strict User Permissions", + "label": "Allow only one session per user", "length": 0, "no_copy": 0, "permlevel": 0, @@ -997,7 +1027,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-06-23 07:48:10.453011", + "modified": "2017-07-20 22:57:56.466867", "modified_by": "Administrator", "module": "Core", "name": "System Settings", @@ -1032,4 +1062,4 @@ "sort_order": "ASC", "track_changes": 1, "track_seen": 0 -} +} \ No newline at end of file diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py index 8f64feda9f..f7ecfc00bb 100644 --- a/frappe/core/doctype/system_settings/system_settings.py +++ b/frappe/core/doctype/system_settings/system_settings.py @@ -35,6 +35,7 @@ class SystemSettings(Document): frappe.cache().delete_value('system_settings') frappe.cache().delete_value('time_zone') + frappe.local.system_settings = {} @frappe.whitelist() def load(): diff --git a/frappe/core/doctype/system_settings/test_system_settings.js b/frappe/core/doctype/system_settings/test_system_settings.js new file mode 100644 index 0000000000..53edaba99d --- /dev/null +++ b/frappe/core/doctype/system_settings/test_system_settings.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: System Settings", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially('System Settings', [ + // insert a new System Settings + () => frappe.tests.make([ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index aa7f7940e3..49c1f8b437 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -59,9 +59,13 @@ frappe.ui.form.on('User', { frappe.route_options = { "user": doc.name }; - frappe.set_route("user-permissions"); + frappe.set_route('List', 'User Permission'); }, null, "btn-default") + frm.add_custom_button(__('View Permitted Documents'), + () => frappe.set_route('query-report', 'Permitted Documents For User', + {user: frm.doc.name})); + frm.toggle_display(['sb1', 'sb3', 'modules_access'], true); } diff --git a/frappe/core/doctype/user_permission/__init__.py b/frappe/core/doctype/user_permission/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/core/doctype/user_permission/test_user_permission.js b/frappe/core/doctype/user_permission/test_user_permission.js new file mode 100644 index 0000000000..1770dddf81 --- /dev/null +++ b/frappe/core/doctype/user_permission/test_user_permission.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: User Permission", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially('User Permission', [ + // insert a new User Permission + () => frappe.tests.make([ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py new file mode 100644 index 0000000000..157fa44ae2 --- /dev/null +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +#import frappe +import unittest + +class TestUserPermission(unittest.TestCase): + pass diff --git a/frappe/core/doctype/user_permission/user_permission.js b/frappe/core/doctype/user_permission/user_permission.js new file mode 100644 index 0000000000..fbd6ed5616 --- /dev/null +++ b/frappe/core/doctype/user_permission/user_permission.js @@ -0,0 +1,10 @@ +// Copyright (c) 2017, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('User Permission', { + refresh: function(frm) { + frm.add_custom_button(__('View Permitted Documents'), + () => frappe.set_route('query-report', 'Permitted Documents For User', + {user: frm.doc.user})); + } +}); diff --git a/frappe/core/doctype/user_permission/user_permission.json b/frappe/core/doctype/user_permission/user_permission.json new file mode 100644 index 0000000000..2e67de5ce0 --- /dev/null +++ b/frappe/core/doctype/user_permission/user_permission.json @@ -0,0 +1,188 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2017-07-17 14:25:27.881871", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "User", + "length": 0, + "no_copy": 0, + "options": "User", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Allow", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "for_value", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "For Value", + "length": 0, + "no_copy": 0, + "options": "allow", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "If you un-check this, you will have to apply manually for each Role + Document Type combination", + "fieldname": "apply_for_all_roles", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Apply for all Roles for this User", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-07-27 22:55:58.647315", + "modified_by": "Administrator", + "module": "Core", + "name": "User Permission", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "user", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py new file mode 100644 index 0000000000..e14a900e19 --- /dev/null +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe, json +from frappe.model.document import Document +from frappe.permissions import (get_valid_perms, update_permission_property) +from frappe import _ + +class UserPermission(Document): + def on_update(self): + frappe.cache().delete_value('user_permissions') + + if self.apply_for_all_roles: + self.apply_user_permissions_to_all_roles() + + def apply_user_permissions_to_all_roles(self): + # add apply user permissions for all roles that + # for this doctype + def show_progress(i, l): + if l > 2: + frappe.publish_realtime("progress", + dict(progress=[i, l], title=_('Updating...')), + user=frappe.session.user) + + + roles = frappe.get_roles(self.user) + linked = frappe.db.sql('''select distinct parent from tabDocField + where fieldtype="Link" and options=%s''', self.allow) + for i, link in enumerate(linked): + doctype = link[0] + for perm in get_valid_perms(doctype, self.user): + # if the role is applicable to the user + show_progress(i+1, len(linked)) + if perm.role in roles: + if not perm.apply_user_permissions: + update_permission_property(doctype, perm.role, 0, + 'apply_user_permissions', '1') + + try: + user_permission_doctypes = json.loads(perm.user_permission_doctypes or '[]') + except ValueError: + user_permission_doctypes = [] + + if self.allow not in user_permission_doctypes: + user_permission_doctypes.append(self.allow) + update_permission_property(doctype, perm.role, 0, + 'user_permission_doctypes', json.dumps(user_permission_doctypes), validate=False) + + show_progress(len(linked), len(linked)) + + def on_trash(self): # pylint: disable=no-self-use + frappe.cache().delete_value('user_permissions') + +def get_user_permissions(user=None): + '''Get all users permissions for the user as a dict of doctype''' + if not user: + user = frappe.session.user + + out = frappe.cache().hget("user_permissions", user) + + if not out: + out = {} + try: + for perm in frappe.get_all('User Permission', + fields=['allow', 'for_value'], filters=dict(user=user)): + out.setdefault(perm.allow, []).append(perm.for_value) + + # add profile match + if user not in out.get("User", []): + out.setdefault("User", []).append(user) + + frappe.cache().hset("user_permissions", user, out) + except frappe.SQLError, e: + if e.args[0]==1146: + # called from patch + pass + + return out \ No newline at end of file diff --git a/frappe/core/page/permission_manager/permission_manager.js b/frappe/core/page/permission_manager/permission_manager.js index 400043a5fd..020db1d16b 100644 --- a/frappe/core/page/permission_manager/permission_manager.js +++ b/frappe/core/page/permission_manager/permission_manager.js @@ -21,6 +21,7 @@ frappe.pages['permission-manager'].refresh = function(wrapper) { frappe.PermissionEngine = Class.extend({ init: function(wrapper) { this.wrapper = wrapper; + this.page = wrapper.page; this.body = $(this.wrapper).find(".perm-engine"); this.make(); this.refresh(); @@ -55,6 +56,10 @@ frappe.PermissionEngine = Class.extend({ .change(function() { me.refresh(); }); + + this.page.add_inner_button(__('Set User Permissions'), () => { + return frappe.set_route('List', 'User Permission'); + }); this.set_from_route(); }, set_from_route: function() { @@ -133,11 +138,11 @@ frappe.PermissionEngine = Class.extend({ refresh: function() { var me = this; if(!me.doctype_select) { - this.body.html("

    " + __("Loading") + "...

    "); + this.body.html("

    " + __("Loading") + "...

    "); return; } if(!me.get_doctype() && !me.get_role()) { - this.body.html("

    "+__("Select Document Type or Role to start.")+"

    "); + this.body.html("

    "+__("Select Document Type or Role to start.")+"

    "); return; } // get permissions @@ -247,10 +252,13 @@ frappe.PermissionEngine = Class.extend({ setup_user_permissions: function(d, role_cell) { var me = this; - d.help = frappe.render('', {}); + d.help = ``; var checkbox = this.add_check(role_cell, d, "apply_user_permissions") .removeClass("col-md-4") @@ -336,8 +344,8 @@ frappe.PermissionEngine = Class.extend({ var me = this; this.body.on("click", ".show-user-permissions", function() { - frappe.route_options = { doctype: me.get_doctype() || "" }; - frappe.set_route("user-permissions"); + frappe.route_options = { allow: me.get_doctype() || "" }; + frappe.set_route('List', 'User Permission'); }); this.body.on("click", "input[type='checkbox']", function() { diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py index 626bb1c20d..ae3a3971e6 100644 --- a/frappe/core/page/permission_manager/permission_manager.py +++ b/frappe/core/page/permission_manager/permission_manager.py @@ -7,7 +7,7 @@ import frappe.defaults from frappe.modules.import_file import get_file_path, read_doc_from_file from frappe.translate import send_translations from frappe.permissions import (reset_perms, get_linked_doctypes, get_all_perms, - setup_custom_perms, add_permission) + setup_custom_perms, add_permission, update_permission_property) from frappe.core.doctype.doctype.doctype import (clear_permissions_cache, validate_permissions_for_doctype) from frappe import _ @@ -68,18 +68,8 @@ def add(parent, role, permlevel): @frappe.whitelist() def update(doctype, role, permlevel, ptype, value=None): frappe.only_for("System Manager") - - out = None - if setup_custom_perms(doctype): - out = 'refresh' - - name = frappe.get_value('Custom DocPerm', dict(parent=doctype, role=role, permlevel=permlevel)) - - frappe.db.sql("""update `tabCustom DocPerm` set `%s`=%s where name=%s"""\ - % (frappe.db.escape(ptype), '%s', '%s'), (value, name)) - validate_permissions_for_doctype(doctype) - - return out + out = update_permission_property(doctype, role, permlevel, ptype, value) + return 'refresh' if out else None @frappe.whitelist() def remove(doctype, role, permlevel): diff --git a/frappe/core/page/user_permissions/README.md b/frappe/core/page/user_permissions/README.md deleted file mode 100644 index e4fc779c6c..0000000000 --- a/frappe/core/page/user_permissions/README.md +++ /dev/null @@ -1 +0,0 @@ -Interface to set user defaults (DefaultValue). \ No newline at end of file diff --git a/frappe/core/page/user_permissions/__init__.py b/frappe/core/page/user_permissions/__init__.py deleted file mode 100644 index 0e57cb68c3..0000000000 --- a/frappe/core/page/user_permissions/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - diff --git a/frappe/core/page/user_permissions/user_permissions.js b/frappe/core/page/user_permissions/user_permissions.js deleted file mode 100644 index 5cb81900eb..0000000000 --- a/frappe/core/page/user_permissions/user_permissions.js +++ /dev/null @@ -1,365 +0,0 @@ -frappe.pages['user-permissions'].on_page_load = function(wrapper) { - var page = frappe.ui.make_app_page({ - parent: wrapper, - title: __("User Permissions Manager"), - icon: "fa fa-shield", - single_column: true - }); - - frappe.breadcrumbs.add("Setup"); - - $("\ -

    \ - " + __("Edit Role Permissions") + "\ -


    \ -

    "+__("Help for User Permissions")+":

    \ -
      \ -
    1. " - + __("Apart from Role based Permission Rules, you can apply User Permissions based on DocTypes.") - + "
    2. " - - + "
    3. " - + __("These permissions will apply for all transactions where the permitted record is linked. For example, if Company C is added to User Permissions of user X, user X will only be able to see transactions that has company C as a linked value.") - + "
    4. " - - + "
    5. " - + __("These will also be set as default values for those links, if only one such permission record is defined.") - + "
    6. " - - + "
    7. " - + __("A user can be permitted to multiple records of the same DocType.") - + "
    8. \ -
    ").appendTo(page.main); - wrapper.user_permissions = new frappe.UserPermissions(wrapper); -} - -frappe.pages['user-permissions'].refresh = function(wrapper) { - wrapper.user_permissions.set_from_route(); -} - -frappe.UserPermissions = Class.extend({ - init: function(wrapper) { - this.wrapper = wrapper; - this.body = $(this.wrapper).find(".user-settings"); - this.filters = {}; - this.make(); - this.refresh(); - }, - make: function() { - var me = this; - - $(this.wrapper).find(".view-role-permissions").on("click", function() { - frappe.route_options = { doctype: me.get_doctype() || "" }; - frappe.set_route("permission-manager"); - }) - - return frappe.call({ - module:"frappe.core", - page:"user_permissions", - method: "get_users_and_links", - callback: function(r) { - me.options = r.message; - - me.filters.user = me.wrapper.page.add_field({ - fieldname: "user", - label: __("User"), - fieldtype: "Select", - options: ([__("Select User") + "..."].concat(r.message.users)).join("\n") - }); - - me.filters.doctype = me.wrapper.page.add_field({ - fieldname: "doctype", - label: __("DocType"), - fieldtype: "Select", - options: ([__("Select DocType") + "..."].concat(me.get_link_names())).join("\n") - }); - - me.filters.user_permission = me.wrapper.page.add_field({ - fieldname: "user_permission", - label: __("Name"), - fieldtype: "Link", - options: "[Select]" - }); - - if(frappe.user_roles.includes("System Manager")) { - me.download = me.wrapper.page.add_field({ - fieldname: "download", - label: __("Download"), - fieldtype: "Button", - icon: "fa fa-download" - }); - - me.upload = me.wrapper.page.add_field({ - fieldname: "upload", - label: __("Upload"), - fieldtype: "Button", - icon: "fa fa-upload" - }); - } - - // bind change event - $.each(me.filters, function(k, f) { - f.$input.on("change", function() { - me.refresh(); - }); - }); - - // change options in user_permission link - me.filters.doctype.$input.on("change", function() { - me.filters.user_permission.df.options = me.get_doctype(); - }); - - me.set_from_route(); - me.setup_download_upload(); - } - }); - }, - setup_download_upload: function() { - var me = this; - me.download.$input.on("click", function() { - window.location.href = frappe.urllib.get_base_url() - + "/api/method/frappe.core.page.user_permissions.user_permissions.get_user_permissions_csv"; - }); - - me.upload.$input.on("click", function() { - var d = new frappe.ui.Dialog({ - title: __("Upload User Permissions"), - fields: [ - { - fieldtype:"HTML", - options: '

      '+ - "
    1. "+__("Upload CSV file containing all user permissions in the same format as Download.")+"
    2. "+ - "
    3. "+__("Any existing permission will be deleted / overwritten.")+"
    4. "+ - '

      ' - }, - { - fieldtype:"Attach", fieldname:"attach", - } - ], - primary_action_label: __("Upload and Sync"), - primary_action: function() { - var filedata = d.fields_dict.attach.get_value(); - if(!filedata) { - frappe.msgprint(__("Please attach a file")); - return; - } - frappe.call({ - method:"frappe.core.page.user_permissions.user_permissions.import_user_permissions", - args: { - filedata: filedata - }, - callback: function(r) { - if(!r.exc) { - frappe.msgprint(__("Permissions Updated")); - d.hide(); - } - } - }); - } - }); - d.show(); - }) - }, - get_link_names: function() { - return this.options.link_fields; - }, - set_from_route: function() { - var me = this; - if(frappe.route_options && this.filters && !$.isEmptyObject(this.filters)) { - $.each(frappe.route_options, function(key, value) { - if(me.filters[key] && frappe.route_options[key]!=null) - me.set_filter(key, value); - }); - frappe.route_options = null; - } - this.refresh(); - }, - set_filter: function(key, value) { - this.filters[key].$input.val(value); - }, - get_user: function() { - var user = this.filters.user.$input.val(); - return user== __("Select User") + "..." ? null : user; - }, - get_doctype: function() { - var doctype = this.filters.doctype.$input.val(); - return doctype== __("Select DocType") + "..." ? null : doctype; - }, - get_user_permission: function() { - // autosuggest hack! - var user_permission = this.filters.user_permission.$input.val(); - return (user_permission === "%") ? null : user_permission; - }, - render: function(prop_list) { - var me = this; - this.body.empty(); - this.prop_list = prop_list; - if(!prop_list || !prop_list.length) { - this.add_message(__("No User Restrictions found.")); - } else { - this.show_user_permissions_table(); - } - this.show_add_user_permission(); - if(this.get_user() && this.get_doctype()) { - $('').appendTo(this.body.find(".btn-area")).on("click", function() { - frappe.route_options = {doctype: me.get_doctype(), user:me.get_user() }; - frappe.set_route("query-report/Permitted Documents For User"); - }); - } - }, - add_message: function(txt) { - $('

      ' + txt + '

      ').appendTo(this.body); - }, - refresh: function() { - var me = this; - if(!me.filters.user) { - this.body.html("

      "+__("Loading")+"...

      "); - return; - } - if(!me.get_user() && !me.get_doctype()) { - this.body.html("

      "+__("Select User or DocType to start.")+"

      "); - return; - } - // get permissions - return frappe.call({ - module: "frappe.core", - page: "user_permissions", - method: "get_permissions", - args: { - parent: me.get_user(), - defkey: me.get_doctype(), - defvalue: me.get_user_permission() - }, - callback: function(r) { - me.render(r.message); - } - }); - }, - show_user_permissions_table: function() { - var me = this; - this.table = $("
    Sr
    \ - \ - \ -
    ").appendTo(this.body); - - $('

    ' - +__("These restrictions will apply for Document Types where 'Apply User Permissions' is checked for the permission rule and a field with this value is present.") - +'

    ').appendTo(this.body); - - $.each([[__("Allow User"), 150], [__("If Document Type"), 150], [__("Is"),150], ["", 50]], - function(i, col) { - $("
    ") - .html(col[0]) - .css("width", col[1]+"px") - .appendTo(me.table.find("thead tr")); - }); - - - $.each(this.prop_list, function(i, d) { - var row = $("
    ").html('' - +d.parent+'').appendTo(row); - $("").html(d.defkey).appendTo(row); - $("").html(d.defvalue).appendTo(row); - - me.add_delete_button(row, d); - }); - - }, - add_delete_button: function(row, d) { - var me = this; - $("") - .appendTo($("").appendTo(row)) - .attr("data-name", d.name) - .attr("data-user", d.parent) - .attr("data-defkey", d.defkey) - .attr("data-defvalue", d.defvalue) - .click(function() { - return frappe.call({ - module: "frappe.core", - page: "user_permissions", - method: "remove", - args: { - name: $(this).attr("data-name"), - user: $(this).attr("data-user"), - defkey: $(this).attr("data-defkey"), - defvalue: $(this).attr("data-defvalue") - }, - callback: function(r) { - if(r.exc) { - frappe.msgprint(__("Did not remove")); - } else { - me.refresh(); - } - } - }) - }); - }, - - show_add_user_permission: function() { - var me = this; - $("") - .appendTo($('

    ').appendTo(this.body)) - .click(function() { - var d = new frappe.ui.Dialog({ - title: __("Add A New Restriction"), - fields: [ - {fieldtype:"Select", label:__("Allow User"), - options:me.options.users, reqd:1, fieldname:"user"}, - {fieldtype:"Select", label: __("If Document Type"), fieldname:"defkey", - options:me.get_link_names(), reqd:1}, - {fieldtype:"Link", label:__("Is"), fieldname:"defvalue", - options:'[Select]', reqd:1}, - {fieldtype:"Button", label: __("Add"), fieldname:"add"}, - ] - }); - if(me.get_user()) { - d.set_value("user", me.get_user()); - d.get_input("user").prop("disabled", true); - } - if(me.get_doctype()) { - d.set_value("defkey", me.get_doctype()); - d.get_input("defkey").prop("disabled", true); - } - if(me.get_user_permission()) { - d.set_value("defvalue", me.get_user_permission()); - d.get_input("defvalue").prop("disabled", true); - } - - d.fields_dict["defvalue"].get_query = function(txt) { - if(!d.get_value("defkey")) { - frappe.throw(__("Please select Document Type")); - } - - return { - doctype: d.get_value("defkey") - } - }; - - d.get_input("add").click(function() { - var args = d.get_values(); - if(!args) { - return; - } - frappe.call({ - module: "frappe.core", - page: "user_permissions", - method: "add", - args: args, - callback: function(r) { - if(r.exc) { - frappe.msgprint(__("Did not add")); - } else { - me.refresh(); - } - } - }) - d.hide(); - }); - d.show(); - }); - } -}) diff --git a/frappe/core/page/user_permissions/user_permissions.json b/frappe/core/page/user_permissions/user_permissions.json deleted file mode 100644 index ab831e1919..0000000000 --- a/frappe/core/page/user_permissions/user_permissions.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "content": null, - "creation": "2013-01-01 18:50:55", - "docstatus": 0, - "doctype": "Page", - "icon": "fa fa-user", - "idx": 1, - "modified": "2014-05-28 16:53:43.103533", - "modified_by": "Administrator", - "module": "Core", - "name": "user-permissions", - "owner": "Administrator", - "page_name": "user-permissions", - "roles": [], - "script": null, - "standard": "Yes", - "style": null, - "title": "User Permissions Manager" -} \ No newline at end of file diff --git a/frappe/core/page/user_permissions/user_permissions.py b/frappe/core/page/user_permissions/user_permissions.py deleted file mode 100644 index 98d7e90095..0000000000 --- a/frappe/core/page/user_permissions/user_permissions.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe import _ -import frappe.defaults -from frappe.permissions import (can_set_user_permissions, add_user_permission, - remove_user_permission, get_valid_perms) -from frappe.core.doctype.user.user import get_system_users -from frappe.utils.csvutils import UnicodeWriter, read_csv_content_from_uploaded_file -from frappe.defaults import clear_default - -@frappe.whitelist() -def get_users_and_links(): - return { - "users": get_system_users(), - "link_fields": get_doctypes_for_user_permissions() - } - -@frappe.whitelist() -def get_permissions(parent=None, defkey=None, defvalue=None): - if defkey and not can_set_user_permissions(defkey, defvalue): - raise frappe.PermissionError - - conditions, values = _build_conditions(locals()) - - permissions = frappe.db.sql("""select name, parent, defkey, defvalue - from tabDefaultValue - where parent not in ('__default', '__global') - and substr(defkey,1,1)!='_' - and parenttype='User Permission' - {conditions} - order by parent, defkey""".format(conditions=conditions), values, as_dict=True) - - if not defkey: - out = [] - doctypes = get_doctypes_for_user_permissions() - for p in permissions: - if p.defkey in doctypes: - out.append(p) - permissions = out - - return permissions - -def _build_conditions(filters): - conditions = [] - values = {} - for key, value in filters.items(): - if filters.get(key): - conditions.append("and `{key}`=%({key})s".format(key=key)) - values[key] = value - - return "\n".join(conditions), values - -@frappe.whitelist() -def remove(user, name, defkey, defvalue): - if not can_set_user_permissions(defkey, defvalue): - frappe.throw(_("Cannot remove permission for DocType: {0} and Name: {1}").format( - defkey, defvalue), frappe.PermissionError) - - remove_user_permission(defkey, defvalue, user, name) - -@frappe.whitelist() -def add(user, defkey, defvalue): - if not can_set_user_permissions(defkey, defvalue): - frappe.throw(_("Cannot set permission for DocType: {0} and Name: {1}").format( - defkey, defvalue), frappe.PermissionError) - - add_user_permission(defkey, defvalue, user, with_message=True) - -def get_doctypes_for_user_permissions(): - '''Get doctypes for the current user where user permissions are applicable''' - user_roles = frappe.get_roles() - - if "System Manager" in user_roles: - doctypes = set([p.parent for p in get_valid_perms()]) - else: - doctypes = set([p.parent for p in get_valid_perms() if p.set_user_permissions]) - - single_doctypes = set([d.name for d in frappe.get_all("DocType", {"issingle": 1})]) - - return sorted(doctypes.difference(single_doctypes)) - - -@frappe.whitelist() -def get_user_permissions_csv(): - out = [["User Permissions"], ["User", "Document Type", "Value"]] - out += [[a.parent, a.defkey, a.defvalue] for a in get_permissions()] - - csv = UnicodeWriter() - for row in out: - csv.writerow(row) - - frappe.response['result'] = str(csv.getvalue()) - frappe.response['type'] = 'csv' - frappe.response['doctype'] = "User Permissions" - -@frappe.whitelist() -def import_user_permissions(): - frappe.only_for("System Manager") - rows = read_csv_content_from_uploaded_file(ignore_encoding=True) - clear_default(parenttype="User Permission") - - if rows[0][0]!="User Permissions" and rows[1][0] != "User": - frappe.throw(frappe._("Please upload using the same template as download.")) - - for row in rows[2:]: - add_user_permission(row[1], row[2], row[0]) diff --git a/frappe/defaults.py b/frappe/defaults.py index b4c7ff6452..0e6e23ffdc 100644 --- a/frappe/defaults.py +++ b/frappe/defaults.py @@ -48,25 +48,10 @@ def is_a_user_permission_key(key): return ":" not in key and key != frappe.scrub(key) def get_user_permissions(user=None): - if not user: - user = frappe.session.user - - return build_user_permissions(user) - -def build_user_permissions(user): - out = frappe.cache().hget("user_permissions", user) - if out==None: - out = {} - for key, value in frappe.db.sql("""select defkey, ifnull(defvalue, '') as defvalue - from tabDefaultValue where parent=%s and parenttype='User Permission'""", (user,)): - out.setdefault(key, []).append(value) - - # add profile match - if user not in out.get("User", []): - out.setdefault("User", []).append(user) - - frappe.cache().hset("user_permissions", user, out) - return out + from frappe.core.doctype.user_permission.user_permission \ + import get_user_permissions as _get_user_permissions + '''Return frappe.core.doctype.user_permissions.user_permissions._get_user_permissions (kept for backward compatibility)''' + return _get_user_permissions(user) def get_defaults(user=None): globald = get_defaults_for() diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index 87e48b0450..ee7fffa242 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -70,7 +70,6 @@ def getdoctype(doctype, with_parent=False, cached_timestamp=None): if not docs: docs = get_meta_bundle(doctype) - frappe.response['user_permissions'] = get_user_permissions(docs) frappe.response['user_settings'] = get_user_settings(parent_dt or doctype) if cached_timestamp and docs[0].modified==cached_timestamp: @@ -102,16 +101,6 @@ def get_docinfo(doc=None, doctype=None, name=None): "rating": get_feedback_rating(doc.doctype, doc.name) } -def get_user_permissions(meta): - out = {} - all_user_permissions = frappe.defaults.get_user_permissions() - - for m in meta: - for df in m.get_fields_to_check_permissions(all_user_permissions): - out[df.options] = list(set(all_user_permissions[df.options])) - - return out - def get_attachments(dt, dn): return frappe.get_all("File", fields=["name", "file_name", "file_url", "is_private"], filters = {"attached_to_name": dn, "attached_to_doctype": dt}) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index cc5c394d9f..846d8101e6 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -11,6 +11,7 @@ from frappe.utils import nowdate, nowtime, now_datetime import frappe.defaults from frappe.model.db_schema import type_map import copy +from frappe.core.doctype.user_permission.user_permission import get_user_permissions def get_new_doc(doctype, parent_doc = None, parentfield = None, as_dict=False): if doctype not in frappe.local.new_doc_templates: @@ -47,7 +48,7 @@ def make_new_doc(doctype): return doc def set_user_and_static_default_values(doc): - user_permissions = frappe.defaults.get_user_permissions() + user_permissions = get_user_permissions() defaults = frappe.defaults.get_defaults() for df in doc.meta.get("fields"): @@ -103,7 +104,7 @@ def get_static_default_value(df, user_permissions): def set_dynamic_default_values(doc, parent_doc, parentfield): # these values should not be cached - user_permissions = frappe.defaults.get_user_permissions() + user_permissions = get_user_permissions() for df in frappe.get_meta(doc["doctype"]).get("fields"): if df.get("default"): diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index eeee7f4bf7..56e4cc343d 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -388,7 +388,7 @@ class DatabaseQuery(object): # apply user permissions? if role_permissions.get("apply_user_permissions", {}).get("read"): # get user permissions - user_permissions = frappe.defaults.get_user_permissions(self.user) + user_permissions = frappe.permissions.get_user_permissions(self.user) self.add_user_permissions(user_permissions, user_permission_doctypes=role_permissions.get("user_permission_doctypes").get("read")) diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 3bf49a5f6a..e242a48c88 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -11,7 +11,7 @@ from frappe.utils.file_manager import remove_all from frappe.utils.password import delete_all_passwords_for from frappe import _ from frappe.model.naming import revert_series_if_last -from frappe.utils.global_search import delete_for_document +from frappe.utils.global_search import delete_for_document def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False, ignore_permissions=False, flags=None, ignore_on_trash=False): @@ -158,8 +158,13 @@ def update_flags(doc, flags=None, ignore_permissions=False): def check_permission_and_not_submitted(doc): # permission - if not doc.flags.ignore_permissions and frappe.session.user!="Administrator" and (not doc.has_permission("delete") or (doc.doctype=="DocType" and not doc.custom)): - frappe.msgprint(_("User not allowed to delete {0}: {1}").format(doc.doctype, doc.name), raise_exception=True) + if (not doc.flags.ignore_permissions + and frappe.session.user!="Administrator" + and ( + not doc.has_permission("delete") + or (doc.doctype=="DocType" and not doc.custom))): + frappe.msgprint(_("User not allowed to delete {0}: {1}") + .format(doc.doctype, doc.name), raise_exception=frappe.PermissionError) # check if submitted if doc.docstatus == 1: diff --git a/frappe/patches.txt b/frappe/patches.txt index 8adf636701..3347ae8287 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -189,3 +189,4 @@ frappe.patches.v8_1.enable_allow_error_traceback_in_system_settings frappe.patches.v8_1.update_format_options_in_auto_email_report frappe.patches.v8_1.delete_custom_docperm_if_doctype_not_exists frappe.patches.v8_5.delete_email_group_member_with_invalid_emails +frappe.patches.v8_x.update_user_permission diff --git a/frappe/patches/v8_x/__init__.py b/frappe/patches/v8_x/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/patches/v8_x/update_user_permission.py b/frappe/patches/v8_x/update_user_permission.py new file mode 100644 index 0000000000..4ceb26e945 --- /dev/null +++ b/frappe/patches/v8_x/update_user_permission.py @@ -0,0 +1,25 @@ +import frappe + +def execute(): + frappe.reload_doc('core', 'doctype', 'user_permission') + frappe.delete_doc('core', 'page', 'user-permissions') + for perm in frappe.db.sql(""" + select + name, parent, defkey, defvalue + from + tabDefaultValue + where + parent not in ('__default', '__global') + and + substr(defkey,1,1)!='_' + and + parenttype='User Permission' + """, as_dict=True): + frappe.get_doc(dict( + doctype='User Permission', + user=perm.parent, + allow=perm.defkey, + for_value=perm.defvalue + )).insert(ignore_permissions = True) + + frappe.db.sql('delete from tabDefaultValue where parenttype="User Permission"') diff --git a/frappe/permissions.py b/frappe/permissions.py index 13da62d366..29f223d08e 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -7,7 +7,6 @@ import frappe, copy, json from frappe import _, msgprint from frappe.utils import cint import frappe.share - rights = ("read", "write", "create", "delete", "submit", "cancel", "amend", "print", "email", "report", "import", "export", "set_user_permissions", "share") @@ -25,6 +24,9 @@ def has_permission(doctype, ptype="read", doc=None, verbose=False, user=None): """ if not user: user = frappe.session.user + if verbose: + print('--- Checking for {0} {1} ---'.format(doctype, doc.name if doc else '-')) + if frappe.is_table(doctype): if verbose: print("Table type, always true") return True @@ -40,7 +42,7 @@ def has_permission(doctype, ptype="read", doc=None, verbose=False, user=None): return False if user=="Administrator": - if verbose: print("Administrator") + if verbose: print("Allowing Administrator") return True def false_if_not_shared(): @@ -210,7 +212,10 @@ def get_role_permissions(meta, user=None, verbose=False): if p.user_permission_doctypes: # set user_permission_doctypes in perms - user_permission_doctypes = json.loads(p.user_permission_doctypes) + try: + user_permission_doctypes = json.loads(p.user_permission_doctypes) + except ValueError: + user_permission_doctypes = [] else: user_permission_doctypes = get_linked_doctypes(meta.name) @@ -247,8 +252,12 @@ def get_role_permissions(meta, user=None, verbose=False): return frappe.local.role_permissions[cache_key] +def get_user_permissions(user): + from frappe.core.doctype.user_permission.user_permission import get_user_permissions + return get_user_permissions(user) + def user_has_permission(doc, verbose=True, user=None, user_permission_doctypes=None): - from frappe.defaults import get_user_permissions + from frappe.core.doctype.user_permission.user_permission import get_user_permissions user_permissions = get_user_permissions(user) user_permission_doctypes = get_user_permission_doctypes(user_permission_doctypes, user_permissions) @@ -258,6 +267,10 @@ def user_has_permission(doc, verbose=True, user=None, user_permission_doctypes=N messages = {} + if not user_permission_doctypes: + # no doctypes restricted + end_result = True + # check multiple sets of user_permission_doctypes using OR condition for doctypes in user_permission_doctypes: result = True @@ -309,9 +322,9 @@ def has_controller_permissions(doc, ptype, user=None): def get_doctypes_with_read(): return list(set([p.parent for p in get_valid_perms()])) -def get_valid_perms(doctype=None): +def get_valid_perms(doctype=None, user=None): '''Get valid permissions for the current user from DocPerm and Custom DocPerm''' - roles = get_roles() + roles = get_roles(user) perms = get_perms_for(roles) custom_perms = get_perms_for(roles, 'Custom DocPerm') @@ -360,7 +373,8 @@ def get_roles(user=None, with_standard=True): def get_perms_for(roles, perm_doctype='DocPerm'): '''Get perms for given roles''' - return frappe.db.sql("""select * from `tab{doctype}` where docstatus=0 + return frappe.db.sql(""" + select * from `tab{doctype}` where docstatus=0 and ifnull(permlevel,0)=0 and role in ({roles})""".format(doctype = perm_doctype, roles=", ".join(["%s"]*len(roles))), tuple(roles), as_dict=1) @@ -386,22 +400,28 @@ def set_user_permission_if_allowed(doctype, name, user, with_message=False): if get_role_permissions(frappe.get_meta(doctype), user).set_user_permissions!=1: add_user_permission(doctype, name, user, with_message) -def add_user_permission(doctype, name, user, with_message=False): - '''Add user default''' - if name not in frappe.defaults.get_user_permissions(user).get(doctype, []): +def add_user_permission(doctype, name, user, apply=False): + '''Add user permission''' + from frappe.core.doctype.user_permission.user_permission import get_user_permissions + if name not in get_user_permissions(user).get(doctype, []): if not frappe.db.exists(doctype, name): frappe.throw(_("{0} {1} not found").format(_(doctype), name), frappe.DoesNotExistError) - frappe.defaults.add_default(doctype, name, user, "User Permission") - elif with_message: - msgprint(_("Permission already set")) + frappe.get_doc(dict( + doctype='User Permission', + user=user, + allow=doctype, + for_value=name, + apply_for_all_roles=apply + )).insert() -def remove_user_permission(doctype, name, user, default_value_name=None): - frappe.defaults.clear_default(key=doctype, value=name, parent=user, parenttype="User Permission", - name=default_value_name) +def remove_user_permission(doctype, name, user): + user_permission_name = frappe.db.get_value('User Permission', + dict(user=user, allow=doctype, for_value=name)) + frappe.delete_doc('User Permission', user_permission_name) def clear_user_permissions_for_doctype(doctype): - frappe.defaults.clear_default(parenttype="User Permission", key=doctype) + frappe.cache().delete_value('user_permissions') def can_import(doctype, raise_exception=False): if not ("System Manager" in frappe.get_roles() or has_permission(doctype, "import")): @@ -426,9 +446,10 @@ def apply_user_permissions(doctype, ptype, user=None): def get_user_permission_doctypes(user_permission_doctypes, user_permissions): """returns a list of list like [["User", "Blog Post"], ["User"]]""" - if cint(frappe.db.get_single_value("System Settings", "ignore_user_permissions_if_missing")): + if cint(frappe.get_system_settings('ignore_user_permissions_if_missing')): # select those user permission doctypes for which user permissions exist! - user_permission_doctypes = [list(set(doctypes).intersection(set(user_permissions.keys()))) + user_permission_doctypes = [ + list(set(doctypes).intersection(set(user_permissions.keys()))) for doctypes in user_permission_doctypes] if len(user_permission_doctypes) > 1: @@ -452,6 +473,22 @@ def get_user_permission_doctypes(user_permission_doctypes, user_permissions): return user_permission_doctypes +def update_permission_property(doctype, role, permlevel, ptype, value=None, validate=True): + '''Update a property in Custom Perm''' + from frappe.core.doctype.doctype.doctype import validate_permissions_for_doctype + out = setup_custom_perms(doctype) + + name = frappe.get_value('Custom DocPerm', dict(parent=doctype, role=role, + permlevel=permlevel)) + + frappe.db.sql(""" + update `tabCustom DocPerm` + set `{0}`=%s where name=%s""".format(ptype), (value, name)) + if validate: + validate_permissions_for_doctype(doctype) + + return out + def setup_custom_perms(parent): '''if custom permssions are not setup for the current doctype, set them up''' if not frappe.db.exists('Custom DocPerm', dict(parent=parent)): diff --git a/frappe/public/js/frappe/defaults.js b/frappe/public/js/frappe/defaults.js index 24ba5e630e..570ae61e2a 100644 --- a/frappe/public/js/frappe/defaults.js +++ b/frappe/public/js/frappe/defaults.js @@ -77,10 +77,6 @@ frappe.defaults = { }, get_user_permissions: function() { - return frappe.defaults.user_permissions; + return frappe.boot.user_permissions; }, - set_user_permissions: function(user_permissions) { - if(!user_permissions) return; - frappe.defaults.user_permissions = $.extend(frappe.defaults.user_permissions || {}, user_permissions); - } } diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 05facf346d..a7024a9fb7 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -599,9 +599,9 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ }, true); } if (frappe.model.can_set_user_permissions(this.doctype)) { - this.page.add_menu_item(__('User Permissions Manager'), function () { - frappe.set_route('user-permissions', { - doctype: me.doctype + this.page.add_menu_item(__('User Permissions'), function () { + frappe.set_route('List', 'User Permission', { + allow: me.doctype }); }, true); } diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js index 04496c6238..a25c3e70ca 100644 --- a/frappe/public/js/frappe/model/create_new.js +++ b/frappe/public/js/frappe/model/create_new.js @@ -127,8 +127,10 @@ $.extend(frappe.model, { var user_default = ""; var user_permissions = frappe.defaults.get_user_permissions(); var meta = frappe.get_meta(doc.doctype); - var has_user_permissions = (df.fieldtype==="Link" && user_permissions - && df.ignore_user_permissions != 1 && user_permissions[df.options]); + var has_user_permissions = (df.fieldtype==="Link" + && user_permissions + && df.ignore_user_permissions != 1 + && user_permissions[df.options]); // don't set defaults for "User" link field using User Permissions! if (df.fieldtype==="Link" && df.options!=="User") { diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index adb2e845a6..7b22c5fd47 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -112,7 +112,6 @@ $.extend(frappe.model, { localStorage["_doctype:" + doctype] = JSON.stringify(r.docs); } frappe.model.init_doctype(doctype); - frappe.defaults.set_user_permissions(r.user_permissions); if(r.user_settings) { // remember filters and other settings from last view diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index b3762fea6f..7e0bc14a13 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -103,7 +103,7 @@ frappe.views.QueryReport = Class.extend({ doctype: "Report", name: me.report_name }; - frappe.set_route("user-permissions"); + frappe.set_route('List', 'User Permission'); }, true); } diff --git a/frappe/public/js/frappe/views/reports/reportview.js b/frappe/public/js/frappe/views/reports/reportview.js index 93d6a1f1aa..b7fd287b02 100644 --- a/frappe/public/js/frappe/views/reports/reportview.js +++ b/frappe/public/js/frappe/views/reports/reportview.js @@ -821,12 +821,12 @@ frappe.views.ReportView = frappe.ui.BaseList.extend({ make_user_permissions: function() { var me = this; if(this.docname && frappe.model.can_set_user_permissions("Report")) { - this.page.add_menu_item(__("User Permissions Manager"), function() { + this.page.add_menu_item(__("User Permissions"), function() { frappe.route_options = { doctype: "Report", name: me.docname }; - frappe.set_route("user-permissions"); + frappe.set_route('List', 'User Permission'); }, true); } }, diff --git a/frappe/test_runner.py b/frappe/test_runner.py index a50febabf3..c4fa2f6f47 100644 --- a/frappe/test_runner.py +++ b/frappe/test_runner.py @@ -266,12 +266,12 @@ def make_test_records_for_doctype(doctype, verbose=0, force=False): frappe.local.test_objects[doctype] += test_module._make_test_records(verbose) elif hasattr(test_module, "test_records"): - frappe.local.test_objects[doctype] += make_test_objects(doctype, test_module.test_records, verbose) + frappe.local.test_objects[doctype] += make_test_objects(doctype, test_module.test_records, verbose, force) else: test_records = frappe.get_test_records(doctype) if test_records: - frappe.local.test_objects[doctype] += make_test_objects(doctype, test_records, verbose) + frappe.local.test_objects[doctype] += make_test_objects(doctype, test_records, verbose, force) elif verbose: print_mandatory_fields(doctype) diff --git a/frappe/tests/test_permissions.py b/frappe/tests/test_permissions.py index 6ad0e84f07..d54c484eba 100644 --- a/frappe/tests/test_permissions.py +++ b/frappe/tests/test_permissions.py @@ -9,9 +9,11 @@ import frappe.defaults import unittest import json import frappe.model.meta -from frappe.core.page.user_permissions.user_permissions import add, remove, get_permissions -from frappe.permissions import clear_user_permissions_for_doctype, get_doc_permissions +from frappe.permissions import (add_user_permission, remove_user_permission, + clear_user_permissions_for_doctype, get_doc_permissions, add_permission, + get_valid_perms) from frappe.core.page.permission_manager.permission_manager import update, reset +from frappe.test_runner import make_test_records_for_doctype test_records = frappe.get_test_records('Blog Post') @@ -24,6 +26,7 @@ class TestPermissions(unittest.TestCase): user = frappe.get_doc("User", "test1@example.com") user.add_roles("Website Manager") + user.add_roles("System Manager") user = frappe.get_doc("User", "test2@example.com") user.add_roles("Blogger") @@ -36,6 +39,8 @@ class TestPermissions(unittest.TestCase): reset('Contact') reset('Salutation') + frappe.db.sql('delete from `tabUser Permission`') + self.set_ignore_user_permissions_if_missing(0) frappe.set_user("test1@example.com") @@ -78,7 +83,7 @@ class TestPermissions(unittest.TestCase): def test_user_permissions_in_doc(self): self.set_user_permission_doctypes(["Blog Category"]) - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", + add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") frappe.set_user("test2@example.com") @@ -94,7 +99,7 @@ class TestPermissions(unittest.TestCase): def test_user_permissions_in_report(self): self.set_user_permission_doctypes(["Blog Category"]) - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") + add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") frappe.set_user("test2@example.com") names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "blog_category"])] @@ -103,7 +108,7 @@ class TestPermissions(unittest.TestCase): self.assertFalse("-test-blog-post" in names) def test_default_values(self): - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") + add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") frappe.set_user("test2@example.com") doc = frappe.new_doc("Blog Post") @@ -139,14 +144,14 @@ class TestPermissions(unittest.TestCase): def test_set_user_permissions(self): frappe.set_user("test1@example.com") - add("test2@example.com", "Blog Post", "-test-blog-post") + add_user_permission("Blog Post", "-test-blog-post", "test2@example.com") def test_not_allowed_to_set_user_permissions(self): frappe.set_user("test2@example.com") # this user can't add user permissions - self.assertRaises(frappe.PermissionError, add, - "test2@example.com", "Blog Post", "-test-blog-post") + self.assertRaises(frappe.PermissionError, add_user_permission, + "Blog Post", "-test-blog-post", "test2@example.com") def test_read_if_explicit_user_permissions_are_set(self): self.set_user_permission_doctypes(["Blog Post"]) @@ -165,13 +170,12 @@ class TestPermissions(unittest.TestCase): def test_not_allowed_to_remove_user_permissions(self): self.test_set_user_permissions() - defname = get_permissions("test2@example.com", "Blog Post", "-test-blog-post")[0].name frappe.set_user("test2@example.com") # user cannot remove their own user permissions - self.assertRaises(frappe.PermissionError, remove, - "test2@example.com", defname, "Blog Post", "-test-blog-post") + self.assertRaises(frappe.PermissionError, remove_user_permission, + "Blog Post", "-test-blog-post", "test2@example.com") def test_user_permissions_based_on_blogger(self): frappe.set_user("test2@example.com") @@ -181,7 +185,7 @@ class TestPermissions(unittest.TestCase): self.set_user_permission_doctypes(["Blog Post"]) frappe.set_user("test1@example.com") - add("test2@example.com", "Blog Post", "-test-blog-post") + add_user_permission("Blog Post", "-test-blog-post", "test2@example.com") frappe.set_user("test2@example.com") doc = frappe.get_doc("Blog Post", "-test-blog-post-1") @@ -199,9 +203,9 @@ class TestPermissions(unittest.TestCase): blog_post.get_field("title").set_only_once = 0 def test_user_permission_doctypes(self): - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", + add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") - frappe.permissions.add_user_permission("Blogger", "_Test Blogger 1", + add_user_permission("Blogger", "_Test Blogger 1", "test2@example.com") frappe.set_user("test2@example.com") @@ -221,9 +225,9 @@ class TestPermissions(unittest.TestCase): def if_owner_setup(self): update('Blog Post', 'Blogger', 0, 'if_owner', 1) - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", + add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") - frappe.permissions.add_user_permission("Blogger", "_Test Blogger 1", + add_user_permission("Blogger", "_Test Blogger 1", "test2@example.com") update('Blog Post', 'Blogger', 0, 'user_permission_doctypes', json.dumps(["Blog Category"])) @@ -231,11 +235,13 @@ class TestPermissions(unittest.TestCase): frappe.model.meta.clear_cache("Blog Post") def set_user_permission_doctypes(self, user_permission_doctypes): - set_user_permission_doctypes(doctype="Blog Post", role="Blogger", + set_user_permission_doctypes(["Blog Post"], role="Blogger", apply_user_permissions=1, user_permission_doctypes=user_permission_doctypes) def test_insert_if_owner_with_user_permissions(self): """If `If Owner` is checked for a Role, check if that document is allowed to be read, updated, submitted, etc. except be created, even if the document is restricted based on User Permissions.""" + frappe.delete_doc('Blog Post', '-test-blog-post-title') + self.set_user_permission_doctypes(["Blog Category"]) self.if_owner_setup() @@ -252,7 +258,7 @@ class TestPermissions(unittest.TestCase): self.assertRaises(frappe.PermissionError, doc.insert) frappe.set_user("Administrator") - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category", + add_user_permission("Blog Category", "_Test Blog Category", "test2@example.com") frappe.set_user("test2@example.com") @@ -273,8 +279,8 @@ class TestPermissions(unittest.TestCase): self.set_user_permission_doctypes(['Blog Category', 'Blog Post', 'Blogger']) frappe.set_user("Administrator") - frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category", - "test2@example.com") + # add_user_permission("Blog Category", "_Test Blog Category", + # "test2@example.com") frappe.set_user("test2@example.com") doc = frappe.get_doc({ @@ -294,33 +300,73 @@ class TestPermissions(unittest.TestCase): self.assertTrue(doc.has_permission("write")) def test_strict_user_permissions(self): - """If `Strict User Permissions` is checked in System Settings, show records even if User Permissions are missing for a linked doctype""" - set_user_permission_doctypes(doctype="Contact", role="Sales User", + """If `Strict User Permissions` is checked in System Settings, + show records even if User Permissions are missing for a linked + doctype""" + + frappe.set_user("Administrator") + frappe.db.sql('delete from tabContact') + make_test_records_for_doctype('Contact', force=True) + + set_user_permission_doctypes("Contact", role="Sales User", apply_user_permissions=1, user_permission_doctypes=['Salutation']) - set_user_permission_doctypes(doctype="Salutation", role="All", + set_user_permission_doctypes("Salutation", role="All", apply_user_permissions=1, user_permission_doctypes=['Salutation']) - frappe.set_user("Administrator") - frappe.permissions.add_user_permission("Salutation", "Mr", "test3@example.com") + add_user_permission("Salutation", "Mr", "test3@example.com") self.set_strict_user_permissions(0) frappe.set_user("test3@example.com") - self.assertEquals(len(frappe.get_list("Contact")),2) + self.assertEquals(len(frappe.get_list("Contact")), 2) frappe.set_user("Administrator") self.set_strict_user_permissions(1) frappe.set_user("test3@example.com") - self.assertTrue(len(frappe.get_list("Contact")),1) + self.assertTrue(len(frappe.get_list("Contact")), 1) frappe.set_user("Administrator") self.set_strict_user_permissions(0) + def test_automatic_apply_user_permissions(self): + '''Test user permissions are automatically applied when a user permission + is created''' + # create a user + frappe.get_doc(dict(doctype='User', email='test_user_perm@example.com', + first_name='tester')).insert(ignore_if_duplicate=True) + frappe.get_doc(dict(doctype='Role', role_name='Test Role User Perm') + ).insert(ignore_if_duplicate=True) + + # add a permission for event + add_permission('DocType', 'Test Role User Perm') + frappe.get_doc('User', 'test_user_perm@example.com').add_roles('Test Role User Perm') -def set_user_permission_doctypes(doctype, role, apply_user_permissions, user_permission_doctypes): + + # add user permission + add_user_permission('Module Def', 'Core', 'test_user_perm@example.com', True) + + # check if user permission is applied in the new role + _perm = None + for perm in get_valid_perms('DocType', 'test_user_perm@example.com'): + if perm.role == 'Test Role User Perm': + _perm = perm + + self.assertEqual(_perm.apply_user_permissions, 1) + + # restrict by module + self.assertTrue('Module Def' in json.loads(_perm.user_permission_doctypes)) + + +def set_user_permission_doctypes(doctypes, role, apply_user_permissions, + user_permission_doctypes): user_permission_doctypes = None if not user_permission_doctypes else json.dumps(user_permission_doctypes) - update(doctype, role, 0, 'apply_user_permissions', 1) - update(doctype, role, 0, 'user_permission_doctypes', user_permission_doctypes) + if isinstance(doctypes, basestring): + doctypes = [doctypes] + + for doctype in doctypes: + update(doctype, role, 0, 'apply_user_permissions', 1) + update(doctype, role, 0, 'user_permission_doctypes', + user_permission_doctypes) - frappe.clear_cache(doctype=doctype) + frappe.clear_cache(doctype=doctype) From 50d06d120219623e03443a300dba5b0082a938b3 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 28 Jul 2017 14:41:58 +0530 Subject: [PATCH 16/52] [minor] sitemap.xml is also programmable --- frappe/website/render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/render.py b/frappe/website/render.py index ed446065fb..846df30590 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -79,7 +79,7 @@ def is_static_file(path): if ('.' not in path): return False extn = path.rsplit('.', 1)[-1] - if extn in ('html', 'md', 'js'): + if extn in ('html', 'md', 'js', 'xml'): return False for app in frappe.get_installed_apps(): From df66dfe941e92cb2ba8f6bb4f52bdcefd6cc9eac Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 28 Jul 2017 15:16:24 +0530 Subject: [PATCH 17/52] [fix] render.py for home --- frappe/website/render.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/website/render.py b/frappe/website/render.py index 846df30590..283862499e 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -23,8 +23,9 @@ class PageNotFoundError(Exception): pass def render(path=None, http_status_code=None): """render html page""" - path = resolve_path(path or frappe.local.request.path) - path = path.strip('/ ') + if not path: + path = frappe.local.request.path + path = resolve_path(path.strip('/ ')) data = None # if in list of already known 404s, send it From f0f16ff815ae2d826e3321c1c22dc7bcdce5bd12 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 28 Jul 2017 15:18:53 +0530 Subject: [PATCH 18/52] [fix] save last route on error so user logs in to the correct page, fixes frappe/erpnext#8174 --- frappe/www/message.html | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/frappe/www/message.html b/frappe/www/message.html index 0eb183fcfd..4697534a2e 100644 --- a/frappe/www/message.html +++ b/frappe/www/message.html @@ -3,7 +3,19 @@ {% block title %}{{ title or _("Message") }}{% endblock %} {% block page_content %} - +

    @@ -18,17 +30,11 @@ {% if error_code %}

    {{ _("Status: {0}").format(error_code) }}

    {% endif %} - + {% endblock %} From bab692ff599fcb3ab7bf8388f616b94f4f991652 Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 31 Jul 2017 10:50:26 +0530 Subject: [PATCH 19/52] Replaced mixed usage of tabs and spaces for indents with tabs only (#3813) Python 3 (PEP 8) strictly disallows mixed use of tabs and spaces for indentation frappe innstalltion only throws error on frappe/utils/jinja.py as of now but the rest are almost equally likely to fail, so changed all of them in one commit --- frappe/utils/boilerplate.py | 2 +- frappe/utils/global_search.py | 6 +++--- frappe/utils/jinja.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/utils/boilerplate.py b/frappe/utils/boilerplate.py index b94ef134d1..53b20102ad 100755 --- a/frappe/utils/boilerplate.py +++ b/frappe/utils/boilerplate.py @@ -39,7 +39,7 @@ def make_boilerplate(dest, app_name): if hook_key=="app_name" and hook_val.lower().replace(" ", "_") != hook_val: print("App Name must be all lowercase and without spaces") - hook_val = "" + hook_val = "" elif hook_key=="app_title" and not re.match("^(?![\W])[^\d_\s][\w -]+$", hook_val, re.UNICODE): print("App Title should start with a letter and it can only consist of letters, numbers, spaces and underscores") hook_val = "" diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index 2351ee8960..a92222731e 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -218,9 +218,9 @@ def update_global_search(doc): # Get children for child in doc.meta.get_table_fields(): for d in doc.get(child.fieldname): - if d.parent == doc.name: - for field in d.meta.get_global_search_fields(): - if d.get(field.fieldname): + if d.parent == doc.name: + for field in d.meta.get_global_search_fields(): + if d.get(field.fieldname): content.append(get_formatted_value(d.get(field.fieldname), field)) if content: diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index cccf4f079c..4827363415 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -47,7 +47,7 @@ def validate_template(html): try: jenv.from_string(html) except TemplateSyntaxError as e: - frappe.msgprint('Line {}: {}'.format(e.lineno, e.message)) + frappe.msgprint('Line {}: {}'.format(e.lineno, e.message)) frappe.throw(frappe._("Syntax error in template")) def render_template(template, context, is_path=None): From f3f21554b2c90c3b1c47304813fb914095051b25 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 31 Jul 2017 10:53:15 +0530 Subject: [PATCH 20/52] Email footer refactor (#3807) * Email footer refactor * styling fixes * Unsubscribe message * fix test --- frappe/email/email_body.py | 32 +++++++++---------- frappe/email/queue.py | 38 ++++++++++++++--------- frappe/public/css/email.css | 10 ++++++ frappe/public/less/email.less | 13 ++++++++ frappe/templates/emails/email_footer.html | 29 +++++++++++++++++ 5 files changed, 92 insertions(+), 30 deletions(-) create mode 100644 frappe/templates/emails/email_footer.html diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 80005eef1d..a3f54659e2 100755 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -233,7 +233,8 @@ class EMail: self.make() return self.msg_root.as_string() -def get_formatted_html(subject, message, footer=None, print_html=None, email_account=None, header=None): +def get_formatted_html(subject, message, footer=None, print_html=None, + email_account=None, header=None, unsubscribe_link=None): if not email_account: email_account = get_outgoing_email_account(False) @@ -247,9 +248,13 @@ def get_formatted_html(subject, message, footer=None, print_html=None, email_acc "subject": subject }) - sanitized_html = scrub_urls(rendered_email) - transformed_html = inline_style_in_html(sanitized_html) - return transformed_html + html = scrub_urls(rendered_email) + + if unsubscribe_link: + html = html.replace("", unsubscribe_link.html) + + html = inline_style_in_html(html) + return html @frappe.whitelist() def get_email_html(template, args, subject, header=None): @@ -341,25 +346,20 @@ def get_footer(email_account, footer=None): """append a footer (signature)""" footer = footer or "" + args = {} + if email_account and email_account.footer: - footer += '
    {0}
    '.format(email_account.footer) + args.update({'email_account_footer': email_account.footer}) company_address = frappe.db.get_default("email_footer_address") if company_address: - company_address = company_address.splitlines(True) - footer += '' - footer += '' - for x in company_address: - footer += ''\ - .format(x) - footer += "
    {0}
    " - - footer += "" + args.update({'company_address': company_address}) if not cint(frappe.db.get_default("disable_standard_email_footer")): - for default_mail_footer in frappe.get_hooks("default_mail_footer"): - footer += '
    {0}
    '.format(default_mail_footer) + args.update({'default_mail_footer': frappe.get_hooks('default_mail_footer')}) + + footer += frappe.utils.jinja.get_email_from_template('email_footer', args)[0] return footer diff --git a/frappe/email/queue.py b/frappe/email/queue.py index 44a987fb81..87056e1d01 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -75,8 +75,6 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= except HTMLParser.HTMLParseError: text_content = "See html attachment" - formatted = get_formatted_html(subject, message, email_account=email_account, header=header) - if reference_doctype and reference_name: unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", {"reference_doctype": reference_doctype, "reference_name": reference_name})] @@ -88,14 +86,22 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= recipients = [r for r in list(set(recipients)) if r and r not in unsubscribed] - email_content = formatted email_text_context = text_content - if add_unsubscribe_link and reference_doctype and (unsubscribe_message or reference_doctype=="Newsletter") and add_unsubscribe_link==1: + should_append_unsubscribe = (add_unsubscribe_link + and reference_doctype + and (unsubscribe_message or reference_doctype=="Newsletter") + and add_unsubscribe_link==1) + + unsubscribe_link = None + if should_append_unsubscribe or True: unsubscribe_link = get_unsubscribe_message(unsubscribe_message, expose_recipients) - email_content = email_content.replace("", unsubscribe_link.html) email_text_context += unsubscribe_link.text + email_content = get_formatted_html(subject, message, + email_account=email_account, header=header, + unsubscribe_link=unsubscribe_link) + # add to queue add(recipients, sender, subject, formatted=email_content, @@ -230,17 +236,21 @@ def get_emails_sent_this_month(): status='Sent' and MONTH(creation)=MONTH(CURDATE())""")[0][0] def get_unsubscribe_message(unsubscribe_message, expose_recipients): - if not unsubscribe_message: - unsubscribe_message = _("Unsubscribe from this list") + if unsubscribe_message: + unsubscribe_html = '''{0}'''.format(unsubscribe_message) + else: + unsubscribe_link = '''{0}'''.format(_('Unsubscribe')) + unsubscribe_html = _("{0} to stop receiving emails of this type").format(unsubscribe_link) - html = """
    + html = """""".format(unsubscribe_message=unsubscribe_message) +
    + {0} +
    +
    """.format(unsubscribe_html) + if expose_recipients == "footer": text = "\n" else: diff --git a/frappe/public/css/email.css b/frappe/public/css/email.css index 57b2033d49..4e9dfbaa6e 100644 --- a/frappe/public/css/email.css +++ b/frappe/public/css/email.css @@ -48,6 +48,16 @@ hr { .body-table.has-header .email-footer { border-top: none; } +.email-footer-container { + margin-top: 10px; +} +.email-footer-container > div:not(:last-child) { + margin-bottom: 5px; +} +.email-unsubscribe a { + color: #8D99A6; + text-decoration: underline; +} .btn { text-decoration: none; padding: 7px 10px; diff --git a/frappe/public/less/email.less b/frappe/public/less/email.less index 640c300daa..f07107891a 100644 --- a/frappe/public/less/email.less +++ b/frappe/public/less/email.less @@ -63,6 +63,19 @@ hr { } } +.email-footer-container { + margin-top: 10px; + + & > div:not(:last-child) { + margin-bottom: 5px; + } +} + +.email-unsubscribe a { + color: @text-muted; + text-decoration: underline; +} + .btn { text-decoration: none; padding: 7px 10px; diff --git a/frappe/templates/emails/email_footer.html b/frappe/templates/emails/email_footer.html new file mode 100644 index 0000000000..5352d817d5 --- /dev/null +++ b/frappe/templates/emails/email_footer.html @@ -0,0 +1,29 @@ + \ No newline at end of file From e6e16d112b559e5095ccf15476bc353fbf0f7118 Mon Sep 17 00:00:00 2001 From: Makarand Bauskar Date: Mon, 31 Jul 2017 10:53:40 +0530 Subject: [PATCH 21/52] [minor] set apply_for_all_roles to 1 in update user permissions patch (#3809) --- frappe/patches/v8_x/update_user_permission.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/patches/v8_x/update_user_permission.py b/frappe/patches/v8_x/update_user_permission.py index 4ceb26e945..017ed45758 100644 --- a/frappe/patches/v8_x/update_user_permission.py +++ b/frappe/patches/v8_x/update_user_permission.py @@ -19,7 +19,8 @@ def execute(): doctype='User Permission', user=perm.parent, allow=perm.defkey, - for_value=perm.defvalue + for_value=perm.defvalue, + apply_for_all_roles=0, )).insert(ignore_permissions = True) frappe.db.sql('delete from tabDefaultValue where parenttype="User Permission"') From d3395dfd28bc164056114c54e403e78afed7e6da Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 31 Jul 2017 10:54:17 +0530 Subject: [PATCH 22/52] Replaced StringIO and cStringIO imports with six.StringIO (#3810) StringIO and cStringIO modules are replaced with io.StringIO in Python 3. six.StringIO is an alias for StringIO.StringIO in Python 2 and io.StringIO in Python 3 --- frappe/build.py | 2 +- frappe/commands/__init__.py | 4 ++-- frappe/core/doctype/file/file.py | 4 ++-- frappe/desk/form/run_method.py | 2 +- frappe/desk/query_builder.py | 2 +- frappe/desk/reportview.py | 2 +- frappe/test_runner.py | 8 ++++---- frappe/utils/csvutils.py | 5 +++-- frappe/utils/identicon.py | 4 ++-- frappe/utils/minify.py | 2 +- frappe/utils/xlsxutils.py | 2 +- 11 files changed, 19 insertions(+), 18 deletions(-) diff --git a/frappe/build.py b/frappe/build.py index 6c86518f18..7622f4a69a 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -121,7 +121,7 @@ def get_build_maps(): timestamps = {} def pack(target, sources, no_compress, verbose): - from cStringIO import StringIO + from six import StringIO outtype, outtxt = target.split(".")[-1], '' jsm = JavascriptMinify() diff --git a/frappe/commands/__init__.py b/frappe/commands/__init__.py index 51cb08fbae..579da214c5 100644 --- a/frappe/commands/__init__.py +++ b/frappe/commands/__init__.py @@ -5,11 +5,11 @@ from __future__ import unicode_literals, absolute_import, print_function import sys import click import cProfile -import StringIO import pstats import frappe import frappe.utils from functools import wraps +from six import StringIO click.disable_unicode_literals_warning = True @@ -25,7 +25,7 @@ def pass_context(f): if profile: pr.disable() - s = StringIO.StringIO() + s = StringIO() ps = pstats.Stats(pr, stream=s)\ .sort_stats('cumtime', 'tottime', 'ncalls') ps.print_stats() diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 324353c882..ddc54aafe3 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -15,7 +15,6 @@ import os import shutil import requests import requests.exceptions -import StringIO import mimetypes, imghdr from frappe.utils.file_manager import delete_file_data_content, get_content_hash, get_random_filename @@ -23,6 +22,7 @@ from frappe import _ from frappe.utils.nestedset import NestedSet from frappe.utils import strip, get_files_path from PIL import Image, ImageOps +from six import StringIO import zipfile class FolderNotEmpty(frappe.ValidationError): pass @@ -372,7 +372,7 @@ def get_web_image(file_url): frappe.msgprint(_("Unable to read file format for {0}").format(file_url)) raise - image = Image.open(StringIO.StringIO(r.content)) + image = Image.open(StringIO(r.content)) try: filename, extn = file_url.rsplit("/", 1)[1].rsplit(".", 1) diff --git a/frappe/desk/form/run_method.py b/frappe/desk/form/run_method.py index dc1f267b66..ab7ec46b2a 100644 --- a/frappe/desk/form/run_method.py +++ b/frappe/desk/form/run_method.py @@ -53,7 +53,7 @@ def make_csv_output(res, dt): """send method response as downloadable CSV file""" import frappe - from cStringIO import StringIO + from six import StringIO import csv f = StringIO() diff --git a/frappe/desk/query_builder.py b/frappe/desk/query_builder.py index 4e23318d07..f1dc76590b 100644 --- a/frappe/desk/query_builder.py +++ b/frappe/desk/query_builder.py @@ -239,7 +239,7 @@ def runquery_csv(): rows = [[rep_name], out['colnames']] + out['values'] - from cStringIO import StringIO + from six import StringIO import csv f = StringIO() diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index fbb363300f..205d86dad0 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -145,7 +145,7 @@ def export_query(): # convert to csv import csv - from cStringIO import StringIO + from six import StringIO f = StringIO() writer = csv.writer(f) diff --git a/frappe/test_runner.py b/frappe/test_runner.py index c4fa2f6f47..9e2610e5d0 100644 --- a/frappe/test_runner.py +++ b/frappe/test_runner.py @@ -10,8 +10,8 @@ import importlib from frappe.modules import load_doctype_module, get_module_name from frappe.utils import cstr import frappe.utils.scheduler -import cProfile, StringIO, pstats - +import cProfile, pstats +from six import StringIO unittest_runner = unittest.TextTestRunner @@ -110,7 +110,7 @@ def run_all_tests(app=None, verbose=False, profile=False, ui_tests=False): if profile: pr.disable() - s = StringIO.StringIO() + s = StringIO() ps = pstats.Stats(pr, stream=s).sort_stats('cumulative') ps.print_stats() print(s.getvalue()) @@ -167,7 +167,7 @@ def _run_unittest(module, verbose=False, tests=(), profile=False): if profile: pr.disable() - s = StringIO.StringIO() + s = StringIO() ps = pstats.Stats(pr, stream=s).sort_stats('cumulative') ps.print_stats() print(s.getvalue()) diff --git a/frappe/utils/csvutils.py b/frappe/utils/csvutils.py index f128d61a1b..3d72ad1f5f 100644 --- a/frappe/utils/csvutils.py +++ b/frappe/utils/csvutils.py @@ -5,7 +5,8 @@ from __future__ import unicode_literals import frappe from frappe import msgprint, _ import json -import csv, cStringIO +import csv +from six import StringIO from frappe.utils import encode, cstr, cint, flt, comma_or def read_csv_content_from_uploaded_file(ignore_encoding=False): @@ -97,7 +98,7 @@ def to_csv(data): class UnicodeWriter: def __init__(self, encoding="utf-8"): self.encoding = encoding - self.queue = cStringIO.StringIO() + self.queue = StringIO() self.writer = csv.writer(self.queue, quoting=csv.QUOTE_NONNUMERIC) def writerow(self, row): diff --git a/frappe/utils/identicon.py b/frappe/utils/identicon.py index f7f54d9d31..57dec6fbe9 100644 --- a/frappe/utils/identicon.py +++ b/frappe/utils/identicon.py @@ -1,8 +1,8 @@ from PIL import Image, ImageDraw from hashlib import md5 import base64 -import StringIO import random +from six import StringIO GRID_SIZE = 5 BORDER_SIZE = 20 @@ -98,7 +98,7 @@ class Identicon(object): bug report: https://github.com/liuzheng712/identicons/issues ''' self.calculate() - fp = StringIO.StringIO() + fp = StringIO() self.image.encoderinfo = {} self.image.encoderconfig = () diff --git a/frappe/utils/minify.py b/frappe/utils/minify.py index 667879f056..303a88900c 100644 --- a/frappe/utils/minify.py +++ b/frappe/utils/minify.py @@ -28,7 +28,7 @@ # SOFTWARE. # */ -from StringIO import StringIO +from six import StringIO def jsmin(js): ins = StringIO(js) diff --git a/frappe/utils/xlsxutils.py b/frappe/utils/xlsxutils.py index 2915bad06f..e41888a6cb 100644 --- a/frappe/utils/xlsxutils.py +++ b/frappe/utils/xlsxutils.py @@ -6,9 +6,9 @@ import frappe from frappe.utils import encode, cstr, cint, flt, comma_or import openpyxl -from cStringIO import StringIO from openpyxl.styles import Font from openpyxl import load_workbook +from six import StringIO # return xlsx file object From 839874b3576b90e3a6af69c144de26b6bf24bfc0 Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 31 Jul 2017 10:55:00 +0530 Subject: [PATCH 23/52] Redefine lambdas to accept multiple args instead of a packed tuple (#3811) Unlike Python 2, Python 3 does not automatically unpack arguments to lambdas passed as a tuple into named arguments. Redefinining lamdas to accept separate arguments instead of a tuple allows them to work in both Python 2 and 3. --- frappe/utils/data.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 24bff1663d..803adba796 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -667,21 +667,21 @@ def get_url_to_report(name, report_type = None, doctype = None): operator_map = { # startswith - "^": lambda (a, b): (a or "").startswith(b), + "^": lambda a, b: (a or "").startswith(b), # in or not in a list - "in": lambda (a, b): operator.contains(b, a), - "not in": lambda (a, b): not operator.contains(b, a), + "in": lambda a, b: operator.contains(b, a), + "not in": lambda a, b: not operator.contains(b, a), # comparison operators - "=": lambda (a, b): operator.eq(a, b), - "!=": lambda (a, b): operator.ne(a, b), - ">": lambda (a, b): operator.gt(a, b), - "<": lambda (a, b): operator.lt(a, b), - ">=": lambda (a, b): operator.ge(a, b), - "<=": lambda (a, b): operator.le(a, b), - "not None": lambda (a, b): a and True or False, - "None": lambda (a, b): (not a) and True or False + "=": lambda a, b: operator.eq(a, b), + "!=": lambda a, b: operator.ne(a, b), + ">": lambda a, b: operator.gt(a, b), + "<": lambda a, b: operator.lt(a, b), + ">=": lambda a, b: operator.ge(a, b), + "<=": lambda a, b: operator.le(a, b), + "not None": lambda a, b: a and True or False, + "None": lambda a, b: (not a) and True or False } def evaluate_filters(doc, filters): @@ -704,7 +704,7 @@ def evaluate_filters(doc, filters): def compare(val1, condition, val2): ret = False if condition in operator_map: - ret = operator_map[condition]((val1, val2)) + ret = operator_map[condition](val1, val2) return ret From 928ebb66a63de63b0fab686873325420b92b7ab7 Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 31 Jul 2017 10:58:22 +0530 Subject: [PATCH 24/52] Replaced HTMLParser imports with six.moves.html_parser (#3812) --- frappe/email/queue.py | 2 +- frappe/utils/data.py | 2 +- frappe/utils/global_search.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index 87056e1d01..7c93920e98 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals from six.moves import range import frappe -import HTMLParser +from six.moves import html_parser as HTMLParser import smtplib, quopri, json from frappe import msgprint, throw, _ from frappe.email.smtp import SMTPServer, get_outgoing_email_account diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 803adba796..ce468e0a38 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -11,7 +11,7 @@ import babel.dates from babel.core import UnknownLocaleError from dateutil import parser from num2words import num2words -import HTMLParser +from six.moves import html_parser as HTMLParser from html2text import html2text from six import iteritems diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index a92222731e..b619682ab3 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -235,7 +235,7 @@ def update_global_search(doc): def get_formatted_value(value, field): '''Prepare field from raw data''' - from HTMLParser import HTMLParser + from six.moves.html_parser import HTMLParser if(getattr(field, 'fieldtype', None) in ["Text", "Text Editor"]): h = HTMLParser() From 343af6af46963dff72b4d373891f640d3f19eda5 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 31 Jul 2017 10:59:24 +0530 Subject: [PATCH 25/52] Hide links in pdf (#3814) * Hide links in pdf * Show footer in print preview --- frappe/public/js/frappe/form/print.js | 11 +++++++++++ frappe/templates/print_formats/pdf_header_footer.html | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 18a5891f36..0e7e75299a 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -125,9 +125,20 @@ frappe.ui.form.PrintPreview = Class.extend({ var me = this; this.get_print_html(function (out) { me.wrapper.find(".print-format").html(out.html); + me.show_footer(); me.set_style(out.style); }); }, + show_footer: function() { + // footer is hidden by default as reqd by pdf generation + // simple hack to show it in print preview + this.wrapper.find('.print-format').css('position', 'relative'); + this.wrapper.find('#footer-html').attr('style', ` + display: block !important; + position: absolute; + bottom: 0.75in; + `); + }, printit: function () { this.new_page_preview(true); }, diff --git a/frappe/templates/print_formats/pdf_header_footer.html b/frappe/templates/print_formats/pdf_header_footer.html index ed50c3db3b..ca72a990e3 100644 --- a/frappe/templates/print_formats/pdf_header_footer.html +++ b/frappe/templates/print_formats/pdf_header_footer.html @@ -34,6 +34,13 @@ .letter-head-footer { margin-top: -15mm !important; } + + /* Dont show explicit links for tags */ + @media print { + a[href]:after { + content: none; + } + } From 8f2b001bd067b9d7f34d61012262adf976241e7e Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 31 Jul 2017 16:20:27 +0530 Subject: [PATCH 26/52] [docs] add headings --- .../bench/guides/diagnosing-the-scheduler.md | 2 ++ frappe/docs/user/en/bench/guides/index.md | 4 ++++ .../docs/user/en/bench/guides/manual-setup.md | 2 ++ .../en/bench/guides/setup-multitenancy.md | 2 ++ .../user/en/bench/guides/setup-production.md | 2 ++ frappe/docs/user/en/bench/index.md | 3 ++- .../en/bench/resources/background-services.md | 2 ++ .../resources/bench-commands-cheatsheet.md | 2 ++ .../user/en/bench/resources/bench-procfile.md | 2 ++ frappe/docs/user/en/bench/resources/index.md | 4 ++++ .../adding-custom-button-to-form.md | 2 ++ .../adding-module-icons-on-desktop.md | 2 ++ .../app-development/custom-module-icon.md | 2 ++ .../guides/app-development/dialogs-types.md | 2 ++ .../executing-code-on-doctype-events.md | 2 ++ .../how-enable-developer-mode-in-frappe.md | 2 ++ ...e-custom-fields-during-app-installation.md | 2 ++ .../how-to-improve-a-standard-control.md | 2 ++ .../insert-a-document-via-api.md | 2 ++ .../overriding-link-query-by-custom-script.md | 2 ++ .../running-background-jobs.md | 2 ++ .../app-development/single-type-doctype.md | 2 ++ .../trigger-event-on-deletion-of-grid-row.md | 2 ++ .../using-html-templates-in-javascript.md | 2 ++ .../user/en/guides/basics/frappe_ajax_call.md | 2 ++ .../user/en/guides/basics/translations.md | 2 ++ .../en/guides/data/import-large-csv-file.md | 2 ++ ...otifications-for-failed-background-jobs.md | 2 ++ .../deployment/how-to-enable-social-logins.md | 2 ++ ...o-migrate-doctype-changes-to-production.md | 2 ++ .../guides/desk/formatter_for_link_fields.md | 2 ++ .../guides/portal-development/adding-pages.md | 2 +- ...n-from-another-document-in-print-format.md | 2 ++ .../how-to-make-query-report.md | 2 ++ .../where-do-i-find-standard-print-formats.md | 2 ++ .../user/en/tutorial/form-client-scripting.md | 2 ++ .../bench/guides/diagnosing-the-scheduler.md | 2 ++ frappe/docs/user/es/bench/guides/index.md | 4 ++++ .../docs/user/es/bench/guides/manual-setup.md | 2 ++ .../es/bench/guides/setup-multitenancy.md | 2 ++ .../user/es/bench/guides/setup-production.md | 2 ++ frappe/docs/user/es/bench/index.md | 4 ++++ .../es/bench/resources/background-services.md | 2 ++ .../resources/bench-commands-cheatsheet.md | 2 ++ .../user/es/bench/resources/bench-procfile.md | 2 ++ frappe/docs/user/es/bench/resources/index.md | 4 ++++ .../user/es/tutorial/form-client-scripting.md | 2 ++ .../user/fr/tutorial/form-client-scripting.md | 2 ++ .../user/pt/tutorial/form-client-scripting.md | 2 ++ frappe/website/purifycss.py | 14 +++++++++++-- frappe/website/utils.py | 21 +++++++++++++++++++ 51 files changed, 140 insertions(+), 4 deletions(-) diff --git a/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md b/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md index a0661dbb17..492205cf5b 100755 --- a/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md +++ b/frappe/docs/user/en/bench/guides/diagnosing-the-scheduler.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/en/bench/guides/index.md b/frappe/docs/user/en/bench/guides/index.md index 0dff60b400..8ab035a2f5 100644 --- a/frappe/docs/user/en/bench/guides/index.md +++ b/frappe/docs/user/en/bench/guides/index.md @@ -1 +1,5 @@ +# Guides + + + {index} \ No newline at end of file diff --git a/frappe/docs/user/en/bench/guides/manual-setup.md b/frappe/docs/user/en/bench/guides/manual-setup.md index a0c55f374f..a9ee314650 100755 --- a/frappe/docs/user/en/bench/guides/manual-setup.md +++ b/frappe/docs/user/en/bench/guides/manual-setup.md @@ -1,3 +1,5 @@ +# Manual Setup + Manual Setup -------------- diff --git a/frappe/docs/user/en/bench/guides/setup-multitenancy.md b/frappe/docs/user/en/bench/guides/setup-multitenancy.md index 8f204cd9eb..1404fd707c 100755 --- a/frappe/docs/user/en/bench/guides/setup-multitenancy.md +++ b/frappe/docs/user/en/bench/guides/setup-multitenancy.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/en/bench/guides/setup-production.md b/frappe/docs/user/en/bench/guides/setup-production.md index 414aab10e2..4c5e2a7dc2 100644 --- a/frappe/docs/user/en/bench/guides/setup-production.md +++ b/frappe/docs/user/en/bench/guides/setup-production.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/en/bench/index.md b/frappe/docs/user/en/bench/index.md index 0dff60b400..a91b00e4b9 100644 --- a/frappe/docs/user/en/bench/index.md +++ b/frappe/docs/user/en/bench/index.md @@ -1 +1,2 @@ -{index} \ No newline at end of file +# Bench + diff --git a/frappe/docs/user/en/bench/resources/background-services.md b/frappe/docs/user/en/bench/resources/background-services.md index d019d25d8c..6e7a20730b 100755 --- a/frappe/docs/user/en/bench/resources/background-services.md +++ b/frappe/docs/user/en/bench/resources/background-services.md @@ -1,3 +1,5 @@ +# Background Services + External services ----------------- diff --git a/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md b/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md index b412d5f78a..054cd072f6 100755 --- a/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md +++ b/frappe/docs/user/en/bench/resources/bench-commands-cheatsheet.md @@ -1,3 +1,5 @@ +# Bench Commands Cheatsheet + ### General Usage * `bench --version` - Show bench version * `bench src` - Show bench repo directory diff --git a/frappe/docs/user/en/bench/resources/bench-procfile.md b/frappe/docs/user/en/bench/resources/bench-procfile.md index 61ecfc6eec..9a9176556c 100755 --- a/frappe/docs/user/en/bench/resources/bench-procfile.md +++ b/frappe/docs/user/en/bench/resources/bench-procfile.md @@ -1,3 +1,5 @@ +# Bench Procfile + `bench start` uses [honcho](http://honcho.readthedocs.org) to manage multiple processes in **developer mode**. ### Processes diff --git a/frappe/docs/user/en/bench/resources/index.md b/frappe/docs/user/en/bench/resources/index.md index 0dff60b400..48852466ed 100644 --- a/frappe/docs/user/en/bench/resources/index.md +++ b/frappe/docs/user/en/bench/resources/index.md @@ -1 +1,5 @@ +# Resources + + + {index} \ No newline at end of file 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 index 29a1a608b3..1e41bcfa16 100644 --- 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 @@ -1,3 +1,5 @@ +# 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. 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 index 44b014267d..4fbf6fda1e 100755 --- 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 @@ -1,3 +1,5 @@ +# 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 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 index 609f7f3803..4a9903fbf7 100755 --- a/frappe/docs/user/en/guides/app-development/custom-module-icon.md +++ b/frappe/docs/user/en/guides/app-development/custom-module-icon.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/en/guides/app-development/dialogs-types.md b/frappe/docs/user/en/guides/app-development/dialogs-types.md index a1aa4f9a07..0c0550688e 100755 --- a/frappe/docs/user/en/guides/app-development/dialogs-types.md +++ b/frappe/docs/user/en/guides/app-development/dialogs-types.md @@ -1,3 +1,5 @@ +# Dialogs Types + Frappe provide a group of standard dialogs that are very usefull while coding. ## Alert Dialog 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 index a5b57e0920..ff03f85236 100755 --- 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 @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md b/frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md index 5c47385fbd..8895fc7bec 100755 --- a/frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md +++ b/frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md @@ -1,3 +1,5 @@ +# 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: diff --git a/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md b/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md index 20b7fdce30..3169297850 100755 --- a/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md +++ b/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md b/frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md index e3c8ef82c0..df137db2a9 100755 --- a/frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md +++ b/frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md @@ -1,3 +1,5 @@ +# How To Improve A Standard Control + Frappé 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: diff --git a/frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md b/frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md index aab15b4ac9..c3a8358ddb 100755 --- a/frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md +++ b/frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md @@ -1,3 +1,5 @@ +# Insert A Document Via Api + You can insert documents via a script using the `frappe.get_doc` method ### Examples: diff --git a/frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md b/frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md index cc8c8058fd..4e78d7fd58 100755 --- a/frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md +++ b/frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md @@ -1,3 +1,5 @@ +# Overriding Link Query By Custom Script + You can override the standard link query by using `set_query` ### 1. Adding Fitlers diff --git a/frappe/docs/user/en/guides/app-development/running-background-jobs.md b/frappe/docs/user/en/guides/app-development/running-background-jobs.md index ae2972b855..d1823d1bb8 100644 --- a/frappe/docs/user/en/guides/app-development/running-background-jobs.md +++ b/frappe/docs/user/en/guides/app-development/running-background-jobs.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/en/guides/app-development/single-type-doctype.md b/frappe/docs/user/en/guides/app-development/single-type-doctype.md index ee5c24b492..560b2a1a6d 100755 --- a/frappe/docs/user/en/guides/app-development/single-type-doctype.md +++ b/frappe/docs/user/en/guides/app-development/single-type-doctype.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md b/frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md index cc60f6d0b8..776742d4ea 100755 --- a/frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md +++ b/frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md @@ -1,3 +1,5 @@ +# 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: diff --git a/frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md b/frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md index f6242babb7..13f7073e4d 100755 --- a/frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md +++ b/frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md @@ -1,3 +1,5 @@ +# 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 `<%` diff --git a/frappe/docs/user/en/guides/basics/frappe_ajax_call.md b/frappe/docs/user/en/guides/basics/frappe_ajax_call.md index a92356843a..657cd3e7f2 100644 --- a/frappe/docs/user/en/guides/basics/frappe_ajax_call.md +++ b/frappe/docs/user/en/guides/basics/frappe_ajax_call.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/en/guides/basics/translations.md b/frappe/docs/user/en/guides/basics/translations.md index e5ff22e9f2..86d630898f 100755 --- a/frappe/docs/user/en/guides/basics/translations.md +++ b/frappe/docs/user/en/guides/basics/translations.md @@ -1,3 +1,5 @@ +# Translations + diff --git a/frappe/docs/user/en/guides/data/import-large-csv-file.md b/frappe/docs/user/en/guides/data/import-large-csv-file.md index 5194ebd98d..013d02ac92 100755 --- a/frappe/docs/user/en/guides/data/import-large-csv-file.md +++ b/frappe/docs/user/en/guides/data/import-large-csv-file.md @@ -1,3 +1,5 @@ +# 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. 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 index 03f57eb410..cd9f18e1e1 100755 --- 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 @@ -1,3 +1,5 @@ +# 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.

    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 index 441fa64ab0..ad8cc36623 100755 --- 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 @@ -1,3 +1,5 @@ +# 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. 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 index 35a15645ab..4bf2ab9351 100755 --- 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 @@ -1,3 +1,5 @@ +# 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. 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 index ceb2a4474c..586477f32e 100644 --- a/frappe/docs/user/en/guides/desk/formatter_for_link_fields.md +++ b/frappe/docs/user/en/guides/desk/formatter_for_link_fields.md @@ -1,3 +1,5 @@ +# 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: diff --git a/frappe/docs/user/en/guides/portal-development/adding-pages.md b/frappe/docs/user/en/guides/portal-development/adding-pages.md index c8bdd53552..c9cd0191c3 100755 --- a/frappe/docs/user/en/guides/portal-development/adding-pages.md +++ b/frappe/docs/user/en/guides/portal-development/adding-pages.md @@ -13,7 +13,7 @@ Either file must be present for the system to make this a valid folder to build ### Markdown # This is a title - + This is some page content a [link](/link/to/page) 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 index 321028d7af..afe87c04f8 100755 --- 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 @@ -1,3 +1,5 @@ +# 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 %} 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 index 1e22757d7e..32ed2a016e 100755 --- 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 @@ -1,3 +1,5 @@ +# 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. 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 index 00e351c615..c1816751dd 100755 --- 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 @@ -1,3 +1,5 @@ +# 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

    diff --git a/frappe/docs/user/en/tutorial/form-client-scripting.md b/frappe/docs/user/en/tutorial/form-client-scripting.md index a70b8475ff..d4673c55d4 100755 --- a/frappe/docs/user/en/tutorial/form-client-scripting.md +++ b/frappe/docs/user/en/tutorial/form-client-scripting.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md b/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md index d1317c9bcc..18faa2fbe2 100644 --- a/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md +++ b/frappe/docs/user/es/bench/guides/diagnosing-the-scheduler.md @@ -1,3 +1,5 @@ +# Diagnosing The Scheduler + En caso que estes experimentando inconvenientes con las tareas programadas, puedes ejecutar varios comandos para diagnosticar el problema. diff --git a/frappe/docs/user/es/bench/guides/index.md b/frappe/docs/user/es/bench/guides/index.md index 0dff60b400..8ab035a2f5 100644 --- a/frappe/docs/user/es/bench/guides/index.md +++ b/frappe/docs/user/es/bench/guides/index.md @@ -1 +1,5 @@ +# Guides + + + {index} \ No newline at end of file diff --git a/frappe/docs/user/es/bench/guides/manual-setup.md b/frappe/docs/user/es/bench/guides/manual-setup.md index e07c56433c..aa60dc61a6 100644 --- a/frappe/docs/user/es/bench/guides/manual-setup.md +++ b/frappe/docs/user/es/bench/guides/manual-setup.md @@ -1,3 +1,5 @@ +# Manual Setup + Instalación Manual -------------- diff --git a/frappe/docs/user/es/bench/guides/setup-multitenancy.md b/frappe/docs/user/es/bench/guides/setup-multitenancy.md index f663704521..ca7469f1fd 100644 --- a/frappe/docs/user/es/bench/guides/setup-multitenancy.md +++ b/frappe/docs/user/es/bench/guides/setup-multitenancy.md @@ -1,3 +1,5 @@ +# 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, diff --git a/frappe/docs/user/es/bench/guides/setup-production.md b/frappe/docs/user/es/bench/guides/setup-production.md index 2ab7e290dc..f97c582bd0 100644 --- a/frappe/docs/user/es/bench/guides/setup-production.md +++ b/frappe/docs/user/es/bench/guides/setup-production.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/es/bench/index.md b/frappe/docs/user/es/bench/index.md index ccd28db145..24baef4875 100644 --- a/frappe/docs/user/es/bench/index.md +++ b/frappe/docs/user/es/bench/index.md @@ -1 +1,5 @@ +# Bench + + + {index} diff --git a/frappe/docs/user/es/bench/resources/background-services.md b/frappe/docs/user/es/bench/resources/background-services.md index 093d666e3a..5145897996 100644 --- a/frappe/docs/user/es/bench/resources/background-services.md +++ b/frappe/docs/user/es/bench/resources/background-services.md @@ -1,3 +1,5 @@ +# Background Services + Servicios Externos ----------------- diff --git a/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md b/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md index e816124fe4..c5277c45bc 100644 --- a/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md +++ b/frappe/docs/user/es/bench/resources/bench-commands-cheatsheet.md @@ -1,3 +1,5 @@ +# Bench Commands Cheatsheet + ### Uso General * `bench --version` - Muestra la versión del bench * `bench src` - Muestra el directorio repo del bench diff --git a/frappe/docs/user/es/bench/resources/bench-procfile.md b/frappe/docs/user/es/bench/resources/bench-procfile.md index c80bf03481..dc357bdd4e 100644 --- a/frappe/docs/user/es/bench/resources/bench-procfile.md +++ b/frappe/docs/user/es/bench/resources/bench-procfile.md @@ -1,3 +1,5 @@ +# Bench Procfile + `bench start` usa [honcho](http://honcho.readthedocs.org) para manejar múltiples procesos en **developer mode**. ### Procesos diff --git a/frappe/docs/user/es/bench/resources/index.md b/frappe/docs/user/es/bench/resources/index.md index 0dff60b400..48852466ed 100644 --- a/frappe/docs/user/es/bench/resources/index.md +++ b/frappe/docs/user/es/bench/resources/index.md @@ -1 +1,5 @@ +# Resources + + + {index} \ No newline at end of file diff --git a/frappe/docs/user/es/tutorial/form-client-scripting.md b/frappe/docs/user/es/tutorial/form-client-scripting.md index b0c4b97f21..26f5410b83 100644 --- a/frappe/docs/user/es/tutorial/form-client-scripting.md +++ b/frappe/docs/user/es/tutorial/form-client-scripting.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/fr/tutorial/form-client-scripting.md b/frappe/docs/user/fr/tutorial/form-client-scripting.md index f2f2e21894..a6ab64a60c 100644 --- a/frappe/docs/user/fr/tutorial/form-client-scripting.md +++ b/frappe/docs/user/fr/tutorial/form-client-scripting.md @@ -1,3 +1,5 @@ +# 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 diff --git a/frappe/docs/user/pt/tutorial/form-client-scripting.md b/frappe/docs/user/pt/tutorial/form-client-scripting.md index c37196757f..faf453c57a 100755 --- a/frappe/docs/user/pt/tutorial/form-client-scripting.md +++ b/frappe/docs/user/pt/tutorial/form-client-scripting.md @@ -1,3 +1,5 @@ +# 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. diff --git a/frappe/website/purifycss.py b/frappe/website/purifycss.py index 00ca06b0c4..faf5b8b94b 100644 --- a/frappe/website/purifycss.py +++ b/frappe/website/purifycss.py @@ -1,8 +1,18 @@ +''' +Check for unused CSS Classes + +sUpdate source and target apps below and run from CLI + + bench --site [sitename] execute frappe.website.purifycss.purify.css + +''' + import frappe, re, os +source = frappe.get_app_path('frappe_theme', 'public', 'less', 'frappe_theme.less') +target_apps = ['erpnext_com', 'frappe_io', 'translator', 'chart_of_accounts_builder', 'frappe_theme'] + def purifycss(): - source = frappe.get_app_path('frappe_theme', 'public', 'less', 'frappe_theme.less') - target_apps = ['erpnext_com', 'frappe_io', 'translator', 'chart_of_accounts_builder', 'frappe_theme'] with open(source, 'r') as f: src = f.read() diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 9424ec722e..efd50295f3 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -285,3 +285,24 @@ def extract_title(source, path): title = os.path.basename(path.rsplit('.', )[0].rstrip('/')).replace('_', ' ').replace('-', ' ').title() return title + +def add_missing_headers(): + '''Walk and add missing headers in docs (to be called from bench execute)''' + path = frappe.get_app_path('erpnext', 'docs') + for basepath, folders, files in os.walk(path): + for fname in files: + if fname.endswith('.md'): + with open(os.path.join(basepath, fname), 'r') as f: + content = frappe.as_unicode(f.read()) + + if not content.startswith('# ') and not '

    ' in content: + with open(os.path.join(basepath, fname), 'w') as f: + if fname=='index.md': + fname = os.path.basename(basepath) + else: + fname = fname[:-3] + h = fname.replace('_', ' ').replace('-', ' ').title() + print h + content = '# {0}\n\n'.format(h) + content + f.write(content.encode('utf-8')) + From 590310091b05d7c78842c0e32a7e684a542498e8 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 31 Jul 2017 16:41:19 +0530 Subject: [PATCH 27/52] [docs] remove {{docs_base_url}} --- .../user/en/bench/guides/settings-limits.md | 2 +- .../adding-custom-button-to-form.md | 2 +- .../guides/app-development/dialogs-types.md | 10 ++++---- .../exporting-customizations.md | 4 ++-- ...from-master-to-all-related-transactions.md | 6 ++--- .../guides/app-development/generating-docs.md | 2 +- .../guides/automated-testing/qunit-testing.md | 2 +- .../deployment/how-to-enable-social-logins.md | 2 +- .../docs/user/en/guides/desk/making_graphs.md | 8 +++---- .../guides/integration/how_to_setup_oauth.md | 4 ++-- .../openid_connect_and_frappe_social_login.md | 16 ++++++------- .../user/en/guides/integration/using_oauth.md | 2 +- .../guides/portal-development/generators.md | 2 +- .../guides/portal-development/portal-roles.md | 2 +- .../en/guides/portal-development/web-forms.md | 2 +- .../how-to-make-query-report.md | 4 ++-- .../how-to-make-script-reports.md | 2 +- .../print-format-for-reports.md | 2 +- frappe/docs/user/en/tutorial/before.md | 2 +- frappe/docs/user/en/tutorial/controllers.md | 2 +- frappe/docs/user/en/tutorial/doctypes.md | 6 ++--- .../user/en/tutorial/naming-and-linking.md | 18 +++++++------- frappe/docs/user/en/tutorial/reports.md | 2 +- frappe/docs/user/en/tutorial/roles.md | 2 +- .../docs/user/en/tutorial/single-doctypes.md | 2 +- frappe/docs/user/en/tutorial/start.md | 4 ++-- .../user/en/tutorial/users-and-records.md | 16 ++++++------- frappe/docs/user/en/tutorial/web-views.md | 6 ++--- frappe/docs/user/en/videos/index.md | 2 +- .../user/es/bench/guides/settings-limits.md | 2 +- frappe/docs/user/es/tutorial/before.md | 2 +- frappe/docs/user/es/tutorial/controllers.md | 2 +- frappe/docs/user/es/tutorial/doctypes.md | 6 ++--- .../user/es/tutorial/naming-and-linking.md | 18 +++++++------- frappe/docs/user/es/tutorial/reports.md | 2 +- frappe/docs/user/es/tutorial/roles.md | 2 +- .../docs/user/es/tutorial/single-doctypes.md | 2 +- frappe/docs/user/es/tutorial/start.md | 4 ++-- .../user/es/tutorial/users-and-records.md | 16 ++++++------- frappe/docs/user/es/tutorial/web-views.md | 6 ++--- frappe/docs/user/es/videos/index.md | 2 +- frappe/docs/user/fr/tutorial/before.md | 2 +- frappe/docs/user/fr/tutorial/controllers.md | 2 +- frappe/docs/user/fr/tutorial/doctypes.md | 6 ++--- .../user/fr/tutorial/naming-and-linking.md | 18 +++++++------- frappe/docs/user/fr/tutorial/reports.md | 2 +- frappe/docs/user/fr/tutorial/roles.md | 2 +- .../docs/user/fr/tutorial/single-doctypes.md | 2 +- frappe/docs/user/fr/tutorial/start.md | 4 ++-- .../user/fr/tutorial/users-and-records.md | 16 ++++++------- frappe/docs/user/fr/tutorial/web-views.md | 6 ++--- frappe/docs/user/index.md | 8 +++---- frappe/docs/user/pt/tutorial/before.md | 2 +- frappe/docs/user/pt/tutorial/controllers.md | 2 +- frappe/docs/user/pt/tutorial/doctypes.md | 6 ++--- .../user/pt/tutorial/naming-and-linking.md | 18 +++++++------- frappe/docs/user/pt/tutorial/reports.md | 2 +- frappe/docs/user/pt/tutorial/roles.md | 2 +- .../docs/user/pt/tutorial/single-doctypes.md | 2 +- frappe/docs/user/pt/tutorial/start.md | 4 ++-- .../user/pt/tutorial/users-and-records.md | 16 ++++++------- frappe/docs/user/pt/tutorial/web-views.md | 6 ++--- frappe/templates/autodoc/base_template.html | 24 +++++++++---------- frappe/templates/autodoc/macros.html | 2 +- 64 files changed, 177 insertions(+), 177 deletions(-) diff --git a/frappe/docs/user/en/bench/guides/settings-limits.md b/frappe/docs/user/en/bench/guides/settings-limits.md index 8d2a9e4b1d..b6ca06265c 100644 --- a/frappe/docs/user/en/bench/guides/settings-limits.md +++ b/frappe/docs/user/en/bench/guides/settings-limits.md @@ -36,4 +36,4 @@ Example: You can check your usage by opening the "Usage Info" page from the toolbar / AwesomeBar. A limit will only show up on the page if it has been set. -Doctype Saved +Doctype Saved 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 index 1e41bcfa16..fba6397b94 100644 --- 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 @@ -24,7 +24,7 @@ We should edit `frappe\core\doctype\user\user.js` You should be seeing a button on user form as shown below, -Custom Button +Custom Button diff --git a/frappe/docs/user/en/guides/app-development/dialogs-types.md b/frappe/docs/user/en/guides/app-development/dialogs-types.md index 0c0550688e..e511346823 100755 --- a/frappe/docs/user/en/guides/app-development/dialogs-types.md +++ b/frappe/docs/user/en/guides/app-development/dialogs-types.md @@ -4,7 +4,7 @@ Frappe provide a group of standard dialogs that are very usefull while coding. ## Alert Dialog - + Is helpfull for show a non-obstructive message. @@ -18,7 +18,7 @@ This dialog have 2 parameters `txt`that is the message and `seconds` that is the ## Prompt Dialog - + Is helpful for ask a value for the user @@ -44,7 +44,7 @@ This dialog have 4 parameters, they are: --- ## Confirm Dialog - + Usefull to get a confirmation from the user before do an action @@ -70,7 +70,7 @@ This dialog have 3 arguments, they are: ## Message Print - + Is helpfull for show a informational dialog for the user; @@ -93,7 +93,7 @@ This dialog have 2 arguments, they are: ### Custom Dialog - + Frappé provide too a `Class` that you can extend and build your own custom dialogs diff --git a/frappe/docs/user/en/guides/app-development/exporting-customizations.md b/frappe/docs/user/en/guides/app-development/exporting-customizations.md index 12592ecb02..710db1d3e5 100644 --- a/frappe/docs/user/en/guides/app-development/exporting-customizations.md +++ b/frappe/docs/user/en/guides/app-development/exporting-customizations.md @@ -4,12 +4,12 @@ A common use case is to extend a DocType via Custom Fields and Property Setters 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 index d6e495ca1e..7e47d63f5f 100755 --- 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 @@ -5,11 +5,11 @@ Let's say, there is a custom field "VAT Number" in Supplier, which should be fet #### 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 index 0775967494..72db83324d 100755 --- a/frappe/docs/user/en/guides/app-development/generating-docs.md +++ b/frappe/docs/user/en/guides/app-development/generating-docs.md @@ -40,7 +40,7 @@ Some quick tips: ### 3. Linking -While linking make sure you add `{{ docs_base_url }}` to all your links. +While linking make sure you add `/docs` to all your links. {% raw %}Link Description{% endraw %} diff --git a/frappe/docs/user/en/guides/automated-testing/qunit-testing.md b/frappe/docs/user/en/guides/automated-testing/qunit-testing.md index ac7a1f3ccf..b22c738876 100644 --- a/frappe/docs/user/en/guides/automated-testing/qunit-testing.md +++ b/frappe/docs/user/en/guides/automated-testing/qunit-testing.md @@ -12,7 +12,7 @@ To run your files, you can use the **Test Runner**. The **Test Runner** gives a In the CI, all QUnit tests are run by the **Test Runner** using `frappe/tests/test_test_runner.py` - + ### Running Tests 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 index ad8cc36623..26d3de446a 100755 --- 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 @@ -5,7 +5,7 @@ Use Facebook, Google or GitHub authentication to login to Frappe, and your users 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 -Login screen with Social Logins enabled +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. diff --git a/frappe/docs/user/en/guides/desk/making_graphs.md b/frappe/docs/user/en/guides/desk/making_graphs.md index 720c9217bf..aea5015261 100644 --- a/frappe/docs/user/en/guides/desk/making_graphs.md +++ b/frappe/docs/user/en/guides/desk/making_graphs.md @@ -72,15 +72,15 @@ Here's an example of a simple sales graph: ] }); - + `bar` mode yeilds: - + You can set the `colors` property of `x` to an array of color values for `percentage` mode: - + You can also change the values of an existing graph with a new set of `y` values: @@ -97,4 +97,4 @@ You can also change the values of an existing graph with a new set of `y` values ]); }, 1000); - + 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 index 37fd85de85..27f9746eae 100644 --- a/frappe/docs/user/en/guides/integration/how_to_setup_oauth.md +++ b/frappe/docs/user/en/guides/integration/how_to_setup_oauth.md @@ -26,7 +26,7 @@ Go to > Setup > Integrations > OAuth Provider Settings - + ### Add Primary Server @@ -40,7 +40,7 @@ As a System Manager go to > Setup > Integrations > OAuth Client - + To add a client fill in the following details 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 index b214841f90..75f9086ee9 100644 --- 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 @@ -40,33 +40,33 @@ Now you will see Frappe icon on the login page. Click on this icon to login with ### 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/en/guides/integration/using_oauth.md b/frappe/docs/user/en/guides/integration/using_oauth.md index 48bb853d0a..208e07b452 100644 --- a/frappe/docs/user/en/guides/integration/using_oauth.md +++ b/frappe/docs/user/en/guides/integration/using_oauth.md @@ -20,7 +20,7 @@ redirect_uri = #### Confirmation Dialog - + Click 'Allow' to receive authorization code in redirect uri. diff --git a/frappe/docs/user/en/guides/portal-development/generators.md b/frappe/docs/user/en/guides/portal-development/generators.md index 78d83d20f6..8bf52d7299 100644 --- a/frappe/docs/user/en/guides/portal-development/generators.md +++ b/frappe/docs/user/en/guides/portal-development/generators.md @@ -22,7 +22,7 @@ We added `published`, `route` in the DocType **Note:** The field `route` is mandatory -Generator fields +Generator fields #### 2. Added Website Generator to Hooks diff --git a/frappe/docs/user/en/guides/portal-development/portal-roles.md b/frappe/docs/user/en/guides/portal-development/portal-roles.md index d3f5be7287..2248bb0b55 100644 --- a/frappe/docs/user/en/guides/portal-development/portal-roles.md +++ b/frappe/docs/user/en/guides/portal-development/portal-roles.md @@ -8,7 +8,7 @@ Roles can be assigned to Website Users and they will see menu based on their rol 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 -Portal Settings +Portal Settings #### Rules for Default Role diff --git a/frappe/docs/user/en/guides/portal-development/web-forms.md b/frappe/docs/user/en/guides/portal-development/web-forms.md index 533790952e..7cca8de2cc 100644 --- a/frappe/docs/user/en/guides/portal-development/web-forms.md +++ b/frappe/docs/user/en/guides/portal-development/web-forms.md @@ -2,7 +2,7 @@ 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 -Web Form +Web Form ### Standard Web Forms 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 index 32ed2a016e..c4c047a63f 100755 --- 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 @@ -8,7 +8,7 @@ To create a new Query Report: ### 1. Create a new Report -Query Report +Query 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 @@ -37,7 +37,7 @@ You can define complex queries such as: ### 3. Check the Report -Query Report +Query Report ### 4. Advanced (adding filters) 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 index 74479a8b9c..80522d435b 100755 --- 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 @@ -10,7 +10,7 @@ Since these reports give you unrestricted access via Python scripts, they can on ### 1. Create a new Report -Script Report +Script Report 1. Set Report Type as "Script Report" 1. Set "Is Standard" as "Yes" 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 index f663816757..07a7bc222b 100755 --- 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 @@ -58,7 +58,7 @@ Here is how the General Ledger Report is built: Here is what the report looks like: -General Ledger +General Ledger ##### Comments: diff --git a/frappe/docs/user/en/tutorial/before.md b/frappe/docs/user/en/tutorial/before.md index 426101e1cc..705e8b8fab 100755 --- a/frappe/docs/user/en/tutorial/before.md +++ b/frappe/docs/user/en/tutorial/before.md @@ -74,5 +74,5 @@ Resources: --- -When you are ready, you can try [building a sample application]({{ docs_base_url }}/user/en/tutorial/app) using Frappe. +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/controllers.md b/frappe/docs/user/en/tutorial/controllers.md index b994f71971..09edce15d0 100755 --- a/frappe/docs/user/en/tutorial/controllers.md +++ b/frappe/docs/user/en/tutorial/controllers.md @@ -48,7 +48,7 @@ In this script: Check if your validations work by creating new records -Transaction +Transaction #### Debugging diff --git a/frappe/docs/user/en/tutorial/doctypes.md b/frappe/docs/user/en/tutorial/doctypes.md index 2e70ab4146..b57aca5afa 100755 --- a/frappe/docs/user/en/tutorial/doctypes.md +++ b/frappe/docs/user/en/tutorial/doctypes.md @@ -6,7 +6,7 @@ To create a new **DocType**, go to: > Developer > Documents > Doctype > New -New Doctype +New Doctype In the DocType, first the Module, which in our case is **Library Management** @@ -25,7 +25,7 @@ Fields are much more than database columns, they can be: Let us add the fields of the Article. -Adding Fields +Adding Fields 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. @@ -47,7 +47,7 @@ We can add the following fields: 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**. -Adding Permissions +Adding Permissions #### Saving diff --git a/frappe/docs/user/en/tutorial/naming-and-linking.md b/frappe/docs/user/en/tutorial/naming-and-linking.md index dd0fca7245..a3400ae527 100755 --- a/frappe/docs/user/en/tutorial/naming-and-linking.md +++ b/frappe/docs/user/en/tutorial/naming-and-linking.md @@ -4,7 +4,7 @@ Then let us create the other DocType and save it too: 1. Library Member (First Name, Last Name, Email Address, Phone, Address) -Doctype Saved +Doctype Saved #### Naming of DocTypes @@ -20,7 +20,7 @@ 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. -Autonaming and Search Field +Autonaming and Search Field #### Link and Select Fields @@ -30,11 +30,11 @@ In our example, in the Library Transaction DocType, we have to link both the Lib **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. -Link Field +Link Field For select fields, as we mentioned earlier, add the various options in the **Options** input box, each option on a new row. -Select Field +Select Field Similary complete making the other models. @@ -44,7 +44,7 @@ A standard pattern is when you select an ID, say **Library Member** in **Library 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` -Fetch values +Fetch values ### Complete the Models @@ -52,19 +52,19 @@ In the same way, you can complete all the models so that the final fields look l #### Article -Article +Article #### Library Member -Library Member +Library Member #### Library Membership -Library Membership +Library Membership #### Library Transaction -Library Transaction +Library Transaction > Make sure to give permissions to **Librarian** on each DocType diff --git a/frappe/docs/user/en/tutorial/reports.md b/frappe/docs/user/en/tutorial/reports.md index 03b61822f2..6e2a2b6c42 100755 --- a/frappe/docs/user/en/tutorial/reports.md +++ b/frappe/docs/user/en/tutorial/reports.md @@ -2,6 +2,6 @@ You can also click on the Reports text on the sidebar (left) to see tabulated records -Report +Report {next} diff --git a/frappe/docs/user/en/tutorial/roles.md b/frappe/docs/user/en/tutorial/roles.md index d358556083..42b8246bec 100755 --- a/frappe/docs/user/en/tutorial/roles.md +++ b/frappe/docs/user/en/tutorial/roles.md @@ -9,6 +9,6 @@ To create a new Role, go to: > Setup > Users > Role > New -Adding Roles +Adding Roles {next} diff --git a/frappe/docs/user/en/tutorial/single-doctypes.md b/frappe/docs/user/en/tutorial/single-doctypes.md index 9b0e4171b1..a9f1b853ad 100755 --- a/frappe/docs/user/en/tutorial/single-doctypes.md +++ b/frappe/docs/user/en/tutorial/single-doctypes.md @@ -4,6 +4,6 @@ A application will usually have a Settings page. In our application, we can defi To create an new Single DocType, mark the **Is Single** property as checked. -Single Doctypes +Single Doctypes {next} diff --git a/frappe/docs/user/en/tutorial/start.md b/frappe/docs/user/en/tutorial/start.md index 0182654494..4b7f60db73 100755 --- a/frappe/docs/user/en/tutorial/start.md +++ b/frappe/docs/user/en/tutorial/start.md @@ -14,7 +14,7 @@ To start the development server, run `bench start` You can now open your browser and go to `http://localhost:8000`. You should see this login page if all goes well: -Login Screen +Login Screen Now login with : @@ -24,7 +24,7 @@ Password : **Use the password that was created during installation** When you login, you should see the "Desk" home page -Desk +Desk 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. diff --git a/frappe/docs/user/en/tutorial/users-and-records.md b/frappe/docs/user/en/tutorial/users-and-records.md index 394899a795..fd86030a40 100755 --- a/frappe/docs/user/en/tutorial/users-and-records.md +++ b/frappe/docs/user/en/tutorial/users-and-records.md @@ -12,7 +12,7 @@ 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 -Add User Roles +Add User Roles Now logout and login using the new user id and password. @@ -20,36 +20,36 @@ Now logout and login using the new user id and password. You will now see an icon for the Library Management module. Click on that icon and you will see the Module page: -Library Management Module +Library Management Module 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: -New Article +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. -New Article +New Article You can also add an image. -Attach Image +Attach Image Now let us create a new member: -New Library Member +New Library 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. -New Library Membership +New Library Membership 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 -System Settings +System Settings {next} diff --git a/frappe/docs/user/en/tutorial/web-views.md b/frappe/docs/user/en/tutorial/web-views.md index 2953104958..1affecea77 100755 --- a/frappe/docs/user/en/tutorial/web-views.md +++ b/frappe/docs/user/en/tutorial/web-views.md @@ -16,11 +16,11 @@ 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: -web list +web list Click on one article and you will see the default web view -web view +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: @@ -46,7 +46,7 @@ Here, you will get all the properties of the article in the `doc` object. The updated list view looks like this! -new web list +new web list #### Home Page diff --git a/frappe/docs/user/en/videos/index.md b/frappe/docs/user/en/videos/index.md index 8b095501e4..e2c5948e37 100755 --- a/frappe/docs/user/en/videos/index.md +++ b/frappe/docs/user/en/videos/index.md @@ -2,7 +2,7 @@ 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. +Pre-requisites: You must have some understanding of Python, Javascript and MySQL before you start this tutorial. --- diff --git a/frappe/docs/user/es/bench/guides/settings-limits.md b/frappe/docs/user/es/bench/guides/settings-limits.md index a72ddc2d79..a481db66da 100644 --- a/frappe/docs/user/es/bench/guides/settings-limits.md +++ b/frappe/docs/user/es/bench/guides/settings-limits.md @@ -36,4 +36,4 @@ Ejemplo: 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. -Doctype Saved +Doctype Saved diff --git a/frappe/docs/user/es/tutorial/before.md b/frappe/docs/user/es/tutorial/before.md index e894a3301c..77b7907f09 100644 --- a/frappe/docs/user/es/tutorial/before.md +++ b/frappe/docs/user/es/tutorial/before.md @@ -68,4 +68,4 @@ Recursos: --- -Cuando estes listo, puedes intentar [crear una aplicación simple]({{ docs_base_url }}/user/es/tutorial/app) usando Frappe. +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/controllers.md b/frappe/docs/user/es/tutorial/controllers.md index e9ea7527e8..7053719970 100644 --- a/frappe/docs/user/es/tutorial/controllers.md +++ b/frappe/docs/user/es/tutorial/controllers.md @@ -48,7 +48,7 @@ En este script: Verifica si sus validaciones funcionan creando nuevos registros. -Transaction +Transaction #### Depurando diff --git a/frappe/docs/user/es/tutorial/doctypes.md b/frappe/docs/user/es/tutorial/doctypes.md index 6d574ac721..3e0a9583f8 100644 --- a/frappe/docs/user/es/tutorial/doctypes.md +++ b/frappe/docs/user/es/tutorial/doctypes.md @@ -6,7 +6,7 @@ Para crear un nuevo **DocType**, ir a: > Developer > Documents > Doctype > New -New Doctype +New Doctype En el DocType, primero el módulo, lo que en nuestro caso es **Library Management** @@ -26,7 +26,7 @@ Fields are much more than database columns, they can be: Vamos a agregar los campos de el Article. -Adding Fields +Adding Fields 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. @@ -48,7 +48,7 @@ Podemos agregar los siguientes campos: 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**. -Adding Permissions +Adding Permissions #### Guardando diff --git a/frappe/docs/user/es/tutorial/naming-and-linking.md b/frappe/docs/user/es/tutorial/naming-and-linking.md index da929b0272..be951f323c 100644 --- a/frappe/docs/user/es/tutorial/naming-and-linking.md +++ b/frappe/docs/user/es/tutorial/naming-and-linking.md @@ -4,7 +4,7 @@ Vamos a crear otro DocType y guardarlo: 1. Library Member (First Name, Last Name, Email Address, Phone, Address) -Doctype Saved +Doctype Saved #### Nombrando DocTypes @@ -20,7 +20,7 @@ Esto puede ser seteado a traves del campo **Autoname**. Para el controlador, dej > **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. -Autonaming and Search Field +Autonaming and Search Field #### Campo de Enlace y Campo Select @@ -30,11 +30,11 @@ En nuestro ejemplo, en el DocType de Library Transaction,tenemos que enlazar los **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. -Link Field +Link Field Por campos de tipo Select, como mencionamos antes, agrega varias opciones en la caja de texto **Options**, cada una en una nueva linea. -Select Field +Select Field De manera similar continua haciendo los otros modelos. @@ -44,7 +44,7 @@ Un patrón estandar es que cuando seleccionas un ID, dice **Library Member** en 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`. -Fetch values +Fetch values ### Completar los modelos @@ -52,19 +52,19 @@ En la misma forma, puedes completar todos los modelos, todos los campos deben ve #### Article -Article +Article #### Library Member -Library Member +Library Member #### Library Membership -Library Membership +Library Membership #### Library Transaction -Library Transaction +Library Transaction > Asegurate de dar permiso a **Librarian** en cada DocType diff --git a/frappe/docs/user/es/tutorial/reports.md b/frappe/docs/user/es/tutorial/reports.md index 3fb5a9d76e..99d6655792 100644 --- a/frappe/docs/user/es/tutorial/reports.md +++ b/frappe/docs/user/es/tutorial/reports.md @@ -2,6 +2,6 @@ Puedes dar click en el texto que dice Reportes en el panel lateral izquierdo para ver los registros de manera tabulada. -Report +Report {next} diff --git a/frappe/docs/user/es/tutorial/roles.md b/frappe/docs/user/es/tutorial/roles.md index d65aed184c..017cd064c9 100644 --- a/frappe/docs/user/es/tutorial/roles.md +++ b/frappe/docs/user/es/tutorial/roles.md @@ -9,6 +9,6 @@ Para crear un nuevo Role, ir a: > Setup > Users > Role > New -Adding Roles +Adding Roles {next} diff --git a/frappe/docs/user/es/tutorial/single-doctypes.md b/frappe/docs/user/es/tutorial/single-doctypes.md index 0b8d7745c2..a091a2a2ec 100644 --- a/frappe/docs/user/es/tutorial/single-doctypes.md +++ b/frappe/docs/user/es/tutorial/single-doctypes.md @@ -4,6 +4,6 @@ Una aplicación normalmente va a tener una página de configuración. En nuestra Para crear un Single DocType, marca el checkbox **Is Single**. -Single Doctypes +Single Doctypes {next} diff --git a/frappe/docs/user/es/tutorial/start.md b/frappe/docs/user/es/tutorial/start.md index f8abb4d675..f086371ccc 100644 --- a/frappe/docs/user/es/tutorial/start.md +++ b/frappe/docs/user/es/tutorial/start.md @@ -14,7 +14,7 @@ Para iniciar el servidor de desarrollo, ejecuta `bench start`. 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.: -Login Screen +Login Screen Ahora accede con : @@ -24,7 +24,7 @@ Password : **Usa la contraseña que creaste durante la instalación** Cuando accedas, deberías poder ver la página de inicio (Desk). -Desk +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. diff --git a/frappe/docs/user/es/tutorial/users-and-records.md b/frappe/docs/user/es/tutorial/users-and-records.md index e599c4301b..6020e80fe7 100644 --- a/frappe/docs/user/es/tutorial/users-and-records.md +++ b/frappe/docs/user/es/tutorial/users-and-records.md @@ -12,7 +12,7 @@ Crea un nuevo Usuario y llena los campos de nombre, primer nombre y nueva contra Luego dale los Roles de Librarian y de Library Member a este usuario. -Add User Roles +Add User Roles Ahora cierra sesión y accede usando las credenciales del nuevo usuario. @@ -20,36 +20,36 @@ Ahora cierra sesión y accede usando las credenciales del nuevo usuario. Debes ver un ícono del módulo de Library Management. Dar click en el ícono para entrar a la página del módulo: -Library Management Module +Library Management Module 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: -New Article +New 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. -New Article +New Article Puedes agregar una imagen si deseas. -Attach Image +Attach Image Ahora vamos a crear un nuevo miembro: -New Library Member +New Library Member 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. -New Library Membership +New Library Membership 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 -System Settings +System Settings {next} diff --git a/frappe/docs/user/es/tutorial/web-views.md b/frappe/docs/user/es/tutorial/web-views.md index 2fe98f1523..8556ed6308 100644 --- a/frappe/docs/user/es/tutorial/web-views.md +++ b/frappe/docs/user/es/tutorial/web-views.md @@ -16,11 +16,11 @@ 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. -web list +web list Da click en uno de los artículos y vas a ver una vista web por defecto -web view +web view 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: @@ -45,7 +45,7 @@ Aquí, vas a tener todas las propiedades de un artículo en el objeto `doc`. La lista actualizada debe lucir de esta manera! -new web list +new web list #### Página de Inicio diff --git a/frappe/docs/user/es/videos/index.md b/frappe/docs/user/es/videos/index.md index a5fb5f4638..4beb76e7a9 100644 --- a/frappe/docs/user/es/videos/index.md +++ b/frappe/docs/user/es/videos/index.md @@ -2,7 +2,7 @@ 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. +Prerrequisitos: Debes tener conocimientos básicos de Python, Javascript y MySQl antes de empezar este tutorial. --- diff --git a/frappe/docs/user/fr/tutorial/before.md b/frappe/docs/user/fr/tutorial/before.md index 9c73c934dc..12da08b512 100644 --- a/frappe/docs/user/fr/tutorial/before.md +++ b/frappe/docs/user/fr/tutorial/before.md @@ -45,5 +45,5 @@ Si vous voulez modifier les affichages, vous devez apprendre le [language de tem --- -Quand vous êtes prêts, [essayez de développer une application simple avec Frappe]({{ docs_base_url }}/user/fr/tutorial/app) +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/controllers.md b/frappe/docs/user/fr/tutorial/controllers.md index dd9f2ab69d..2175ffbac8 100644 --- a/frappe/docs/user/fr/tutorial/controllers.md +++ b/frappe/docs/user/fr/tutorial/controllers.md @@ -50,7 +50,7 @@ Dans ce script: Vérifiez vos validations en créant de nouveaux enregistrements. -Transaction +Transaction #### Debogage diff --git a/frappe/docs/user/fr/tutorial/doctypes.md b/frappe/docs/user/fr/tutorial/doctypes.md index 698e1e6c69..c1810b140b 100644 --- a/frappe/docs/user/fr/tutorial/doctypes.md +++ b/frappe/docs/user/fr/tutorial/doctypes.md @@ -6,7 +6,7 @@ Pour créer un nouveau **DocType**, rendez-vous sur: > Developer > Documents > Doctype > New -New Doctype +New Doctype Dans un premier temps, saisissez le module, dans notre cas, **Library Managment** @@ -25,7 +25,7 @@ Les champs sont bien plus que des colonnes d'une base de données, ils peuvent Ajoutons des champs pour l'article. -Adding Fields +Adding Fields 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 @@ -54,7 +54,7 @@ ajoutons les droits le lecture, écriture, création et suppression au modèle * permissions sur les modèles. Vous pouvez aussi changer les permissions plus tard en utilisant le gestionnaire de permissions dans la configuration. -Adding Permissions +Adding Permissions #### Sauvegarde diff --git a/frappe/docs/user/fr/tutorial/naming-and-linking.md b/frappe/docs/user/fr/tutorial/naming-and-linking.md index 28ef965efa..7f71fc9dfe 100644 --- a/frappe/docs/user/fr/tutorial/naming-and-linking.md +++ b/frappe/docs/user/fr/tutorial/naming-and-linking.md @@ -4,7 +4,7 @@ Définissons un nouveau **DocType**: 1. Library Member (First Name, Last Name, Email Address, Phone, Address) -Doctype Saved +Doctype Saved #### Le nommage des DocTypes @@ -21,7 +21,7 @@ Cela peut être configuré par le champs **Autoname**. Pour le controleur, laiss > **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**. -Autonaming and Search Field +Autonaming and Search Field #### Relation et champs select @@ -34,12 +34,12 @@ Dans notre exemple, pour le **doctype** `Library Transaction`, nous avons un lie 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. -Link Field +Link Field Pour les champs **select**, comme mentionné plus tôt, ajoutez chacune des options dans le champs **Options**, chaque option sur une nouvelle ligne. -Select Field +Select Field faites de même pour les autres modèles. @@ -52,7 +52,7 @@ Pour cela, nous pouvons utiliser des champs en lecture seules et, dans les optio 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` -Fetch values +Fetch values ### Completer les Modeles @@ -60,19 +60,19 @@ De la même facon, vous pouvez compléter les autres modèles pour qu'au final l #### Article -Article +Article #### Library Member -Library Member +Library Member #### Library Membership -Library Membership +Library Membership #### Library Transaction -Library Transaction +Library Transaction > Vérifiez que le modèles **Librarian** aient les permissions sur chaque **DocType**. diff --git a/frappe/docs/user/fr/tutorial/reports.md b/frappe/docs/user/fr/tutorial/reports.md index 92b0ef4d45..b9bf4d024d 100644 --- a/frappe/docs/user/fr/tutorial/reports.md +++ b/frappe/docs/user/fr/tutorial/reports.md @@ -2,6 +2,6 @@ Vous pouvez aussi cliquer sur le texte "Rapports" dans la barre latérale de gauche pour voir vos données dans un tableau. -Report +Report {next} diff --git a/frappe/docs/user/fr/tutorial/roles.md b/frappe/docs/user/fr/tutorial/roles.md index ce5add6000..e0bc38da5b 100644 --- a/frappe/docs/user/fr/tutorial/roles.md +++ b/frappe/docs/user/fr/tutorial/roles.md @@ -10,6 +10,6 @@ Pour créer un nouveau rôle, se rendre sur: > Setup > Users > Role > New -Adding Roles +Adding Roles {next} diff --git a/frappe/docs/user/fr/tutorial/single-doctypes.md b/frappe/docs/user/fr/tutorial/single-doctypes.md index e3b10a0523..0351761950 100644 --- a/frappe/docs/user/fr/tutorial/single-doctypes.md +++ b/frappe/docs/user/fr/tutorial/single-doctypes.md @@ -7,6 +7,6 @@ d'une classe. Appelons le **Library Managment Settings**. Pour créer un DocType de type **Single** cochez la case **Is Single**. -Single Doctypes +Single Doctypes {suite} diff --git a/frappe/docs/user/fr/tutorial/start.md b/frappe/docs/user/fr/tutorial/start.md index 608127c0d5..696e903aae 100644 --- a/frappe/docs/user/fr/tutorial/start.md +++ b/frappe/docs/user/fr/tutorial/start.md @@ -14,7 +14,7 @@ Pour démarrer le serveur de développement, lancez la commande `bench start` Vous pouvez maintenant ouvrir votre navigateur et vous rendre sur `http://localhost:8000`. Si tout se passe bien vous devriez voir: -Login Screen +Login Screen Maintenant, connectez vous avec les identifiants suivants: @@ -24,7 +24,7 @@ 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 -Desk +Desk 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. diff --git a/frappe/docs/user/fr/tutorial/users-and-records.md b/frappe/docs/user/fr/tutorial/users-and-records.md index e0a714c9c4..e259369a2b 100644 --- a/frappe/docs/user/fr/tutorial/users-and-records.md +++ b/frappe/docs/user/fr/tutorial/users-and-records.md @@ -12,7 +12,7 @@ Afin de créer des enregistrements, nous avons tout d'abord besoin de créer un 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`. -Add User Roles +Add User Roles Maintenant déconnectez-vous puis connectez-vous avec l'utilisateur que vous venez de créer. @@ -21,39 +21,39 @@ Maintenant déconnectez-vous puis connectez-vous avec l'utilisateur que vous ven 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: -Library Management Module +Library Management Module Vous pouvez donc voir les **DocTypes** que nous avons créés pour l'application. Créons quelques enregistrements. Définissons un nouvel Article: -New Article +New 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. -New Article +New Article Vous pouvez aussi ajouter une image. -Attach Image +Attach Image Maintenant créons un nouveau membre. -New Library Member +New Library Member 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. -New Library Membership +New Library Membership 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 -System Settings +System Settings {suite} diff --git a/frappe/docs/user/fr/tutorial/web-views.md b/frappe/docs/user/fr/tutorial/web-views.md index 9b0f80a0e9..9fc6865a67 100644 --- a/frappe/docs/user/fr/tutorial/web-views.md +++ b/frappe/docs/user/fr/tutorial/web-views.md @@ -20,11 +20,11 @@ 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: -web list +web list Cliquez sur un article et vous devriez voir une vue par défaut. -web view +web view 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: @@ -50,7 +50,7 @@ Ici, vous aurez toutes les propriétés d'un article dans l'object `doc`. La mise à jour de la liste ressemble à ca ! -new web list +new web list #### La page d'accueil diff --git a/frappe/docs/user/index.md b/frappe/docs/user/index.md index 4091cec362..b58863efc1 100644 --- a/frappe/docs/user/index.md +++ b/frappe/docs/user/index.md @@ -2,7 +2,7 @@ Select your language -1. [English]({{docs_base_url}}/user/en) -1. [Français]({{docs_base_url}}/user/fr) -1. [Português]({{docs_base_url}}/user/pt) -1. [Español]({{docs_base_url}}/user/es) \ No newline at end of file +1. [English](/docs/user/en) +1. [Français](/docs/user/fr) +1. [Português](/docs/user/pt) +1. [Español](/docs/user/es) \ No newline at end of file diff --git a/frappe/docs/user/pt/tutorial/before.md b/frappe/docs/user/pt/tutorial/before.md index 31f407a7d2..166b7b69f0 100755 --- a/frappe/docs/user/pt/tutorial/before.md +++ b/frappe/docs/user/pt/tutorial/before.md @@ -44,4 +44,4 @@ Se estiver personalizando modelos de impressão, você precisa aprender a [líng --- -Quando estiver pronto, [tente construir uma aplicação de exemplo em Frappe]({{docs_base_url}}/user/pt/tutorial/app) +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/controllers.md b/frappe/docs/user/pt/tutorial/controllers.md index cf657e9d0d..85fc8fd1f6 100755 --- a/frappe/docs/user/pt/tutorial/controllers.md +++ b/frappe/docs/user/pt/tutorial/controllers.md @@ -48,7 +48,7 @@ Nesse script: Verifique se suas validações funcionaram, criando de novos registros. -Transaction +Transaction #### Debugging diff --git a/frappe/docs/user/pt/tutorial/doctypes.md b/frappe/docs/user/pt/tutorial/doctypes.md index fa6c7a26ee..666f550bca 100755 --- a/frappe/docs/user/pt/tutorial/doctypes.md +++ b/frappe/docs/user/pt/tutorial/doctypes.md @@ -6,7 +6,7 @@ Para criar um novo **DocType**, vá para: > Developer > Documents > Doctype > New -New Doctype +New Doctype No DocType, criamos o módulo, que no nosso caso é **Library Managment** @@ -25,7 +25,7 @@ Os campos são muito mais do que colunas de banco de dados, eles podem ser: Vamos adicionar os campos do artigo. -Adding Fields +Adding Fields 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. @@ -47,7 +47,7 @@ Nós podemos adicionar os seguintes campos: 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**. -Adding Permissions +Adding Permissions #### Salvando diff --git a/frappe/docs/user/pt/tutorial/naming-and-linking.md b/frappe/docs/user/pt/tutorial/naming-and-linking.md index 1d72cd55c3..e92f656b55 100755 --- a/frappe/docs/user/pt/tutorial/naming-and-linking.md +++ b/frappe/docs/user/pt/tutorial/naming-and-linking.md @@ -4,7 +4,7 @@ Em seguida, vamos criar outro DocType e salva-lo também: 1. Library Member (First Name, Last Name, Email Address, Phone, Address) -Doctype Saved +Doctype Saved #### Nomeação de DocTypes @@ -20,7 +20,7 @@ Isso pode ser definido através do preenchimento do campo **Autoname**. Para o c > **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. -Autonaming and Search Field +Autonaming and Search Field #### Vinculando e selecionando campos @@ -30,11 +30,11 @@ No nosso exemplo, na Library Transaction DocType, temos que ligar o Membro da Bi **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. -Link Field +Link Field 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. -Select Field +Select Field Fazer o mesmo para outros modelos. @@ -44,7 +44,7 @@ Um modelo padrão é quando você seleciona um ID, **Library Member** na **Libra 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` -Fetch values +Fetch values ### Complete os modelos @@ -52,19 +52,19 @@ Da mesma forma, você pode completar todos os modelos de modo que os campos fina #### Article -Article +Article #### Library Member -Library Member +Library Member #### Library Membership -Library Membership +Library Membership #### Library Transaction -Library Transaction +Library Transaction > Lembre-se de dar permissões para **Librarian** em cada DocType diff --git a/frappe/docs/user/pt/tutorial/reports.md b/frappe/docs/user/pt/tutorial/reports.md index 1889705874..c7a241bbc4 100755 --- a/frappe/docs/user/pt/tutorial/reports.md +++ b/frappe/docs/user/pt/tutorial/reports.md @@ -2,6 +2,6 @@ Você também pode clicar sobre o texto Relatórios na barra lateral (esquerda) para ver os registros tabulados -Report +Report {next} diff --git a/frappe/docs/user/pt/tutorial/roles.md b/frappe/docs/user/pt/tutorial/roles.md index 286d39afa7..07b687f936 100755 --- a/frappe/docs/user/pt/tutorial/roles.md +++ b/frappe/docs/user/pt/tutorial/roles.md @@ -9,6 +9,6 @@ Para criar um novo roles, vá para: > Setup > Users > Role > New -Adding Roles +Adding Roles {next} diff --git a/frappe/docs/user/pt/tutorial/single-doctypes.md b/frappe/docs/user/pt/tutorial/single-doctypes.md index c21115244e..3d1f869083 100755 --- a/frappe/docs/user/pt/tutorial/single-doctypes.md +++ b/frappe/docs/user/pt/tutorial/single-doctypes.md @@ -4,6 +4,6 @@ A aplicação irá normalmente têm uma página de configurações. Em nossa apl Para criar um DocType Single, marque a propriedade **Is Single** como verdadeira. -Single Doctypes +Single Doctypes {next} diff --git a/frappe/docs/user/pt/tutorial/start.md b/frappe/docs/user/pt/tutorial/start.md index c4ed5e5f3c..da3a81b6b7 100755 --- a/frappe/docs/user/pt/tutorial/start.md +++ b/frappe/docs/user/pt/tutorial/start.md @@ -14,7 +14,7 @@ Para iniciar o servidor de desenvolvimento, digite `bench start` 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: -Login Screen +Login Screen Agora logue com : @@ -24,7 +24,7 @@ Senha : **Use a senha que foi criada durante a instalação** Quando voce logar, voce deverá ver o "Desk" da pagine home -Desk +Desk 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. diff --git a/frappe/docs/user/pt/tutorial/users-and-records.md b/frappe/docs/user/pt/tutorial/users-and-records.md index 878253bf0b..8eb1052f3d 100755 --- a/frappe/docs/user/pt/tutorial/users-and-records.md +++ b/frappe/docs/user/pt/tutorial/users-and-records.md @@ -12,7 +12,7 @@ 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 -Add User Roles +Add User Roles Agora saia e se autentique usando o novo ID de usuário e senha. @@ -20,36 +20,36 @@ Agora saia e se autentique usando o novo ID de usuário e senha. Você vai ver agora um ícone para o módulo de Library Management. Clique nesse ícone e você verá a página do modelo: -Library Management Module +Library Management Module 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: -New Article +New Article 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. -New Article +New Article Você também pode adicionar uma imagem. -Attach Image +Attach Image Agora vamos criar um novo membro: -New Library Member +New Library Member 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. -New Library Membership +New Library Membership 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 -System Settings +System Settings {next} diff --git a/frappe/docs/user/pt/tutorial/web-views.md b/frappe/docs/user/pt/tutorial/web-views.md index de7d5b93c9..8547ec7204 100755 --- a/frappe/docs/user/pt/tutorial/web-views.md +++ b/frappe/docs/user/pt/tutorial/web-views.md @@ -16,11 +16,11 @@ 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: -web list +web list Clique em um artigo e você vai ver uma Web View padrão -web view +web view 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: @@ -46,7 +46,7 @@ Aqui, você vai ter todas as propriedades do artigo no objeto `doc`. A List View atualizada se parece com isso! -new web list +new web list #### Home Page diff --git a/frappe/templates/autodoc/base_template.html b/frappe/templates/autodoc/base_template.html index 8a79832f0e..28b076d003 100644 --- a/frappe/templates/autodoc/base_template.html +++ b/frappe/templates/autodoc/base_template.html @@ -6,11 +6,11 @@ {% block title %} {{ title }} {% endblock %} - - - - - + + + + + {% block favicon %} - +

    By {{ app.publisher }}

    @@ -76,7 +76,7 @@ Issues
  • - + License
  • @@ -95,14 +95,14 @@
  • - - - - + + + + {%- block script %}{%- endblock %} diff --git a/frappe/templates/autodoc/macros.html b/frappe/templates/autodoc/macros.html index 1401454967..e77f83fb58 100644 --- a/frappe/templates/autodoc/macros.html +++ b/frappe/templates/autodoc/macros.html @@ -59,7 +59,7 @@ {% macro doctype_link(app, doctype) %} {% set module = frappe.db.get_value("DocType", doctype, "module") %} {% if doctype and module %} -{{ doctype }} {% endif %} {% endmacro %} From e75dc25a729e9ac54318b6de4d5f2c1832fb576d Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 31 Jul 2017 16:53:49 +0530 Subject: [PATCH 28/52] [minor] show breadcrumbs in mobile view --- frappe/templates/web.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/templates/web.html b/frappe/templates/web.html index 672fd4b40e..3f0fc56a85 100644 --- a/frappe/templates/web.html +++ b/frappe/templates/web.html @@ -15,7 +15,7 @@
    -