From 96ef991e103350e72d3d6cdb8c614a9f09221ef8 Mon Sep 17 00:00:00 2001 From: gweecl Date: Fri, 22 Mar 2019 15:39:35 +0800 Subject: [PATCH 001/119] fix rds privileges issue --- frappe/database/db_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/database/db_manager.py b/frappe/database/db_manager.py index 0954657b28..96b23add3d 100644 --- a/frappe/database/db_manager.py +++ b/frappe/database/db_manager.py @@ -48,7 +48,7 @@ class DbManager: if not host: host = self.get_current_host() - self.db.sql("GRANT ALL PRIVILEGES ON `%s`.* TO '%s'@'%s';" % (target, user, host)) + self.db.sql("GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `%s`.* TO '%s'@'%s';" % (target, user, host)) def flush_privileges(self): self.db.sql("FLUSH PRIVILEGES") From d575878369ec9aaf6dffaba9ff543f2c3664f793 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 16 May 2019 16:28:51 +0530 Subject: [PATCH 002/119] feat: Ability to reorder cards --- frappe/desk/moduleview.py | 121 +++++++++++++--- frappe/patches.txt | 2 +- frappe/patches/v12_0/init_desk_settings.py | 2 +- .../frappe/views/components/DeskModuleBox.vue | 12 +- .../frappe/views/components/DeskSection.vue | 31 +++- .../js/frappe/views/components/Desktop.vue | 135 ++++++++---------- 6 files changed, 203 insertions(+), 100 deletions(-) diff --git a/frappe/desk/moduleview.py b/frappe/desk/moduleview.py index a9a460b124..24542e8abb 100644 --- a/frappe/desk/moduleview.py +++ b/frappe/desk/moduleview.py @@ -287,45 +287,132 @@ def get_onboard_items(app, module): return onboard_items or fallback_items - @frappe.whitelist() +def get_links_for_module(app, module): + return [l.get('label') for l in get_links(app, module)] + def get_links(app, module): try: sections = get_config(app, frappe.scrub(module)) except ImportError: return [] - link_names = [] - + links = [] for section in sections: - for item in section["items"]: - link_names.append(item.get("label")) - return link_names + for item in section['items']: + links.append(item) + return links @frappe.whitelist() -def hide_modules_from_desktop(modules): - modules = frappe.parse_json(modules) - home_settings = frappe.db.get_value("User", frappe.session.user, 'home_settings') +def get_desktop_settings(): + from frappe.config import get_modules_from_all_apps_for_user + all_modules = get_modules_from_all_apps_for_user() + home_settings = frappe.db.get_value('User', frappe.session.user, 'home_settings') home_settings = frappe.parse_json(home_settings or '{}') - home_settings['hidden_modules'] = modules + modules_by_name = {} + for m in all_modules: + modules_by_name[m['module_name']] = m + + module_categories = ['Modules', 'Domains', 'Places', 'Administration'] + user_modules_by_category = {} + + user_saved_modules_by_category = home_settings.modules_by_category or {} + user_saved_links_by_module = home_settings.links_by_module or {} + + def apply_user_saved_links(module): + module = frappe._dict(module) + all_links = get_links(module.app, module.module_name) + module_links_by_label = {} + for link in all_links: + module_links_by_label[link['label']] = link + + if module.module_name in user_saved_links_by_module: + user_links = frappe.parse_json(user_saved_links_by_module[module.module_name]) + module.links = [module_links_by_label[l] for l in user_links] + + return module + + for category in module_categories: + if category in user_saved_modules_by_category: + user_modules = user_saved_modules_by_category[category] + user_modules_by_category[category] = [apply_user_saved_links(modules_by_name[m]) \ + for m in user_modules] + else: + user_modules_by_category[category] = [apply_user_saved_links(m) \ + for m in all_modules if m['category'] == category] + + return user_modules_by_category + +@frappe.whitelist() +def update_modules_for_desktop(modules_by_category): + modules_by_category = frappe.parse_json(modules_by_category) + home_settings = get_home_settings() + + user_modules_by_category = home_settings.modules_by_category or {} + + for category in modules_by_category: + new_user_modules = modules_by_category[category] + user_modules = user_modules_by_category.get(category, [{'name': m, 'hidden': False} for m in new_user_modules]) + for module in user_modules: + module['hidden'] = module['name'] not in new_user_modules + user_modules_by_category[category] = user_modules + + home_settings.modules_by_category = user_modules_by_category + frappe.db.set_value('User', frappe.session.user, 'home_settings', json.dumps(home_settings)) + return get_desktop_settings() - return home_settings +@frappe.whitelist() +def update_modules_order(module_category, modules): + modules = frappe.parse_json(modules) + home_settings = get_home_settings() + home_settings.modules_by_category = home_settings.modules_by_category or {} + home_settings.modules_by_category[module_category] = modules + frappe.db.set_value('User', frappe.session.user, 'home_settings', json.dumps(home_settings)) @frappe.whitelist() def update_links_for_module(module_name, links): - home_settings = frappe.db.get_value("User", frappe.session.user, 'home_settings') - home_settings = frappe.parse_json(home_settings or '{}') + links = frappe.parse_json(links) + home_settings = get_home_settings() - home_settings.setdefault('links', {}) - home_settings['links'].setdefault(module_name, None) - home_settings['links'][module_name] = links + home_settings.setdefault('links_by_module', {}) + home_settings['links_by_module'].setdefault(module_name, None) + home_settings['links_by_module'][module_name] = links frappe.db.set_value('User', frappe.session.user, 'home_settings', json.dumps(home_settings)) - return home_settings + return get_desktop_settings() + +@frappe.whitelist() +def get_options_for_show_hide_cards(): + from frappe.config import get_modules_from_all_apps_for_user + all_modules = get_modules_from_all_apps_for_user() + home_settings = get_home_settings() + + + visible_modules_by_category = home_settings.modules_by_category or {} + visible_modules = [] + for category in visible_modules_by_category: + visible_modules += visible_modules_by_category[category] + + options = [] + for module in all_modules: + module = frappe._dict(module) + checked = module.category not in visible_modules_by_category or module.module_name in visible_modules + options.append({ + 'category': module.category, + 'label': module.label, + 'value': module.module_name, + 'checked': checked + }) + + return options + +def get_home_settings(): + home_settings = frappe.db.get_value("User", frappe.session.user, 'home_settings') + return frappe.parse_json(home_settings or '{}') def get_module_link_items_from_list(app, module, list_of_link_names): diff --git a/frappe/patches.txt b/frappe/patches.txt index c0b2a8238f..d28e7eb318 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -235,7 +235,7 @@ frappe.patches.v12_0.set_primary_key_in_series execute:frappe.delete_doc("Page", "modules", ignore_missing=True) frappe.patches.v11_0.set_default_letter_head_source frappe.patches.v12_0.setup_comments_from_communications -frappe.patches.v12_0.init_desk_settings #11-03-2019 +frappe.patches.v12_0.init_desk_settings #16-05-2019 frappe.patches.v12_0.replace_null_values_in_tables frappe.patches.v12_0.reset_home_settings frappe.patches.v12_0.update_print_format_type diff --git a/frappe/patches/v12_0/init_desk_settings.py b/frappe/patches/v12_0/init_desk_settings.py index 782ced8a26..ecd9c94d5b 100644 --- a/frappe/patches/v12_0/init_desk_settings.py +++ b/frappe/patches/v12_0/init_desk_settings.py @@ -8,4 +8,4 @@ from frappe.desk.moduleview import get_onboard_items def execute(): """Reset the initial customizations for desk, with modules, indices and links.""" frappe.reload_doc("core", "doctype", "user") - frappe.db.sql("""update tabUser set home_settings = %s""", (''), debug=True) + frappe.db.sql("""update tabUser set home_settings = ''""") diff --git a/frappe/public/js/frappe/views/components/DeskModuleBox.vue b/frappe/public/js/frappe/views/components/DeskModuleBox.vue index e57b128033..355a447475 100644 --- a/frappe/public/js/frappe/views/components/DeskModuleBox.vue +++ b/frappe/public/js/frappe/views/components/DeskModuleBox.vue @@ -3,6 +3,7 @@ v-if="!hidden" class="border module-box" :class="{ 'hovered-box': hovered }" + :data-module-name="module_name" >
-
+
this.dragging = true, + onEnd: () => { + this.dragging = false; + let modules = Array.from(modules_container.querySelectorAll('.module-box')) + .map(node => node.dataset.moduleName); + + this.$emit('module-order-change', { + module_category: this.category, + modules + }); + } + }) + }, show_module_card_customize_dialog(module) { const d = new frappe.ui.Dialog({ title: __('Customize Shortcuts'), @@ -34,7 +59,7 @@ export default { fieldname: 'links', fieldtype: 'MultiSelectPills', get_data() { - return frappe.call('frappe.desk.moduleview.get_links', { + return frappe.call('frappe.desk.moduleview.get_links_for_module', { app: module.app, module: module.module_name, }).then(r => r.message); @@ -48,7 +73,7 @@ export default { module_name: module.module_name, links }).then(r => { - this.$emit('update_home_settings', r.message); + this.$emit('update-desktop-settings', r.message); }); d.hide(); } diff --git a/frappe/public/js/frappe/views/components/Desktop.vue b/frappe/public/js/frappe/views/components/Desktop.vue index dd2f68911a..2560b8a794 100644 --- a/frappe/public/js/frappe/views/components/Desktop.vue +++ b/frappe/public/js/frappe/views/components/Desktop.vue @@ -14,7 +14,8 @@ v-if="get_modules_for_category(category).length" :category="category" :modules="get_modules_for_category(category)" - @update_home_settings="hs => update_modules_with_home_settings(hs)" + @update-desktop-settings="update_desktop_settings" + @module-order-change="update_module_order" >
@@ -30,99 +31,83 @@ export default { DeskSection }, data() { - let modules_list = frappe.boot.allowed_modules - .filter(d => (d.type==='module' || d.category==='Places') && !d.blocked) - .map(d => { - d.links = (d.links || []).map(link => { - link.route = generate_route(link); - return link; - }); - return d; - }); - return { module_categories: ['Modules', 'Domains', 'Places', 'Administration'], - modules: modules_list, + modules: [], home_settings_fetched: false }; }, created() { - this.fetch_home_settings(); + this.fetch_desktop_settings(); }, methods: { - fetch_home_settings() { - return frappe.db.get_value('User', user, 'home_settings') + fetch_desktop_settings() { + frappe.call('frappe.desk.moduleview.get_desktop_settings') .then(r => { - let home_settings = JSON.parse(r.message.home_settings || '{}'); - this.update_modules_with_home_settings(home_settings); - this.home_settings_fetched = true; + if (r.message) { + this.update_desktop_settings(r.message); + this.home_settings_fetched = true; + } }); }, - update_modules_with_home_settings(home_settings) { - this.modules = this.modules.map(m => { - let hidden_modules = home_settings.hidden_modules || []; - m.hidden = hidden_modules.includes(m.module_name); - - let links = home_settings.links && home_settings.links[m.module_name]; - - if (links) { - links = JSON.parse(links); - - let default_links = m.links.map(link => link.name); - m.links = m.links.map(link => { - link.hidden = !links.includes(link.name); + update_desktop_settings(desktop_settings) { + this.modules = this.add_routes_for_module_links(desktop_settings); + }, + add_routes_for_module_links(user_settings) { + for (let category in user_settings) { + user_settings[category] = user_settings[category].map(m => { + m.links = (m.links || []).map(link => { + link.route = generate_route(link); return link; }); - let new_links = links - .filter(link => !default_links.includes(link)) - .filter(Boolean) - .map(link => { - let new_link = { name: link, label: link, type: 'doctype' }; - new_link.route = generate_route(new_link); - return new_link; - }); - m.links = m.links.concat(new_links); - } - - return m; - }); + return m; + }); + } + return user_settings; + }, + update_module_order({ module_category, modules }) { + frappe.call('frappe.desk.moduleview.update_modules_order', { module_category, modules }); }, get_modules_for_category(category) { - return this.modules.filter(m => m.category === category && !m.hidden); + return this.modules[category] || []; }, show_hide_cards_dialog() { - let fields = this.module_categories.map(category => { - let modules = this.modules.filter(m => m.category === category); - let options = modules.map( - m => ({ label: m.label, value: m.module_name, checked: !m.hidden }) - ); - return { - label: category, - fieldname: category, - fieldtype: 'MultiCheck', - options, - columns: 2 - } - }); - const d = new frappe.ui.Dialog({ - title: __('Show / Hide Cards'), - fields: fields.filter(f => f.options.length > 0), - primary_action_label: __('Save'), - primary_action: (values) => { - let all_modules = this.modules.map(m => m.module_name); - let modules_to_show = Object.keys(values).map(k => values[k]).flatMap(m => m); - let modules_to_hide = all_modules.filter(m => !modules_to_show.includes(m)); - d.hide(); + frappe.call('frappe.desk.moduleview.get_options_for_show_hide_cards') + .then(r => { + let module_options = r.message; + let fields = this.module_categories.map(category => { + let options = module_options.filter(m => m.category === category); + return { + label: category, + fieldname: category, + fieldtype: 'MultiCheck', + options, + columns: 2 + } + }); + const d = new frappe.ui.Dialog({ + title: __('Show / Hide Cards'), + fields: fields.filter(f => f.options.length > 0), + primary_action_label: __('Save'), + primary_action: (values) => { + d.hide(); - frappe.call('frappe.desk.moduleview.hide_modules_from_desktop', { - modules: modules_to_hide - }) - .then(r => r.message) - .then(hs => this.update_modules_with_home_settings(hs)); - } - }); + let modules_by_category = {}; + for (let category of this.module_categories) { + let modules = values[category] || []; + modules_by_category[category] = this.get_modules_for_category(category) + .map(m => m.module_name) + .filter(m => modules.includes(m)); + } - d.show(); + frappe.call('frappe.desk.moduleview.update_modules_for_desktop', { + modules_by_category + }).then(r => this.update_desktop_settings(r.message)); + } + }); + + d.show(); + }); } } } From b6e8af06feeaf0e4cff84ded53fdd7911650667f Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 28 Jun 2019 23:56:40 +0530 Subject: [PATCH 003/119] feat: move to unified Google Settings --- .../__init__.py | 0 .../doctype/google_maps/google_maps.js | 8 + .../doctype/google_maps/google_maps.json | 40 +++++ .../google_maps.py} | 20 +-- .../google_maps_settings.js | 5 - .../google_maps_settings.json | 159 ------------------ .../test_google_maps_settings.js | 23 --- .../test_google_maps_settings.py | 8 - 8 files changed, 56 insertions(+), 207 deletions(-) rename frappe/integrations/doctype/{google_maps_settings => google_maps}/__init__.py (100%) create mode 100644 frappe/integrations/doctype/google_maps/google_maps.js create mode 100644 frappe/integrations/doctype/google_maps/google_maps.json rename frappe/integrations/doctype/{google_maps_settings/google_maps_settings.py => google_maps/google_maps.py} (50%) delete mode 100644 frappe/integrations/doctype/google_maps_settings/google_maps_settings.js delete mode 100644 frappe/integrations/doctype/google_maps_settings/google_maps_settings.json delete mode 100644 frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js delete mode 100644 frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py diff --git a/frappe/integrations/doctype/google_maps_settings/__init__.py b/frappe/integrations/doctype/google_maps/__init__.py similarity index 100% rename from frappe/integrations/doctype/google_maps_settings/__init__.py rename to frappe/integrations/doctype/google_maps/__init__.py diff --git a/frappe/integrations/doctype/google_maps/google_maps.js b/frappe/integrations/doctype/google_maps/google_maps.js new file mode 100644 index 0000000000..fa43eadd2e --- /dev/null +++ b/frappe/integrations/doctype/google_maps/google_maps.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Google Maps', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/integrations/doctype/google_maps/google_maps.json b/frappe/integrations/doctype/google_maps/google_maps.json new file mode 100644 index 0000000000..536dbcd9ba --- /dev/null +++ b/frappe/integrations/doctype/google_maps/google_maps.json @@ -0,0 +1,40 @@ +{ + "creation": "2019-06-28 23:49:38.545917", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "enable" + ], + "fields": [ + { + "default": "0", + "description": "Google Maps integration is used to optimize routes.", + "fieldname": "enable", + "fieldtype": "Check", + "label": "Enable" + } + ], + "issingle": 1, + "modified": "2019-06-28 23:49:38.545917", + "modified_by": "Administrator", + "module": "Integrations", + "name": "Google Maps", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py b/frappe/integrations/doctype/google_maps/google_maps.py similarity index 50% rename from frappe/integrations/doctype/google_maps_settings/google_maps_settings.py rename to frappe/integrations/doctype/google_maps/google_maps.py index 71aafd3558..a29d6062d2 100644 --- a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py +++ b/frappe/integrations/doctype/google_maps/google_maps.py @@ -1,31 +1,27 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2017, Frappe Technologies and contributors +# Copyright (c) 2019, Frappe Technologies and contributors # For license information, please see license.txt from __future__ import unicode_literals - import frappe -from frappe import _ from frappe.model.document import Document - -class GoogleMapsSettings(Document): +class GoogleMaps(Document): def validate(self): - if self.enabled: - if not self.client_key: - frappe.throw(_("Client key is required")) - if not self.home_address: - frappe.throw(_("Home Address is required")) + if self.enable and not frappe.db.get_single_value("Google Settings", "enable"): + frappe.throw(_("Enable Google API in Google Settings.")) def get_client(self): - if not self.enabled: + if not self.enable: frappe.throw(_("Google Maps integration is not enabled")) import googlemaps try: - client = googlemaps.Client(key=self.client_key) + client_id = frappe.db.get_single_value("Google Settings", "client_id") + client = googlemaps.Client(key=client_id) except Exception as e: frappe.throw(e.message) return client + diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js deleted file mode 100644 index ef98ce2c47..0000000000 --- a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) 2017, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Google Maps Settings', { -}); diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.json b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.json deleted file mode 100644 index 7a0695906e..0000000000 --- a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2017-10-16 17:13:05.684227", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "enabled", - "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": "Enabled", - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "client_key", - "fieldtype": "Data", - "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": "Client Key", - "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, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "home_address", - "fieldtype": "Link", - "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": "Home Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "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, - "translatable": 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": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2018-08-21 14:53:09.170463", - "modified_by": "Administrator", - "module": "Integrations", - "name": "Google Maps Settings", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "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", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js deleted file mode 100644 index a3c72bc42a..0000000000 --- a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Google Maps Settings", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Google Maps - () => frappe.tests.make('Google Maps Settings', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py deleted file mode 100644 index f5717e19e0..0000000000 --- a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2017, Frappe Technologies and Contributors -# See license.txt -from __future__ import unicode_literals -import unittest - -class TestGoogleMapsSettings(unittest.TestCase): - pass From 15633907be146e5cddebbc0b95152e785d12bc1d Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Sat, 29 Jun 2019 14:23:33 +0530 Subject: [PATCH 004/119] feat: refactor GMaps --- frappe/config/integrations.py | 4 +- .../doctype/google_maps/google_maps.json | 38 +++++++++++++++---- .../doctype/google_maps/google_maps.py | 15 +++++--- .../google_settings/google_settings.json | 10 ++++- .../v12_0/delete_google_maps_integration.py | 6 +++ 5 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 frappe/patches/v12_0/delete_google_maps_integration.py diff --git a/frappe/config/integrations.py b/frappe/config/integrations.py index ce71051c1d..1472b3ae58 100644 --- a/frappe/config/integrations.py +++ b/frappe/config/integrations.py @@ -94,8 +94,8 @@ def get_data(): }, { "type": "doctype", - "name": "Google Maps Settings", - "description": _("Google Maps integration"), + "name": "Google Maps", + "description": _("Google Maps Integration"), }, { "type": "doctype", diff --git a/frappe/integrations/doctype/google_maps/google_maps.json b/frappe/integrations/doctype/google_maps/google_maps.json index 536dbcd9ba..ef9fd10a0e 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.json +++ b/frappe/integrations/doctype/google_maps/google_maps.json @@ -1,22 +1,46 @@ { - "creation": "2019-06-28 23:49:38.545917", + "autoname": "format:GM-{entity}", + "creation": "2019-06-29 13:03:45.935466", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "enable" + "enabled", + "entity_type", + "address", + "cb_00", + "entity" ], "fields": [ { "default": "0", - "description": "Google Maps integration is used to optimize routes.", - "fieldname": "enable", + "fieldname": "enabled", "fieldtype": "Check", - "label": "Enable" + "label": "Enabled" + }, + { + "fieldname": "entity_type", + "fieldtype": "Select", + "label": "Entity Type" + }, + { + "fieldname": "address", + "fieldtype": "Link", + "label": "Address", + "options": "Address" + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "fieldname": "entity", + "fieldtype": "Dynamic Link", + "label": "Entity", + "options": "entity_type" } ], - "issingle": 1, - "modified": "2019-06-28 23:49:38.545917", + "modified": "2019-06-29 13:23:16.714233", "modified_by": "Administrator", "module": "Integrations", "name": "Google Maps", diff --git a/frappe/integrations/doctype/google_maps/google_maps.py b/frappe/integrations/doctype/google_maps/google_maps.py index a29d6062d2..991fdea048 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.py +++ b/frappe/integrations/doctype/google_maps/google_maps.py @@ -8,18 +8,21 @@ from frappe.model.document import Document class GoogleMaps(Document): def validate(self): - if self.enable and not frappe.db.get_single_value("Google Settings", "enable"): - frappe.throw(_("Enable Google API in Google Settings.")) + if self.enabled: + if not frappe.db.get_single_value("Google Settings", "enable"): + frappe.throw(_("Enable Google Settings for Google Maps Integration.")) + + if not frappe.db.get_single_value("Google Settings", "api_key"): + frappe.throw(_("Enter API Key for Google Maps Integration in Google Settings.")) def get_client(self): - if not self.enable: - frappe.throw(_("Google Maps integration is not enabled")) + if not self.enabled: + frappe.throw(_("Google Maps Integration is not enabled.")) import googlemaps try: - client_id = frappe.db.get_single_value("Google Settings", "client_id") - client = googlemaps.Client(key=client_id) + client = googlemaps.Client(key=frappe.db.get_single_value("Google Settings", "api_key")) except Exception as e: frappe.throw(e.message) diff --git a/frappe/integrations/doctype/google_settings/google_settings.json b/frappe/integrations/doctype/google_settings/google_settings.json index c61d6606b5..8a316fd67e 100644 --- a/frappe/integrations/doctype/google_settings/google_settings.json +++ b/frappe/integrations/doctype/google_settings/google_settings.json @@ -6,7 +6,8 @@ "enable", "google_credentials", "client_id", - "client_secret" + "client_secret", + "api_key" ], "fields": [ { @@ -32,10 +33,15 @@ "fieldtype": "Password", "in_list_view": 1, "label": "Client Secret" + }, + { + "fieldname": "api_key", + "fieldtype": "Data", + "label": "API Key" } ], "issingle": 1, - "modified": "2019-06-19 15:28:05.957380", + "modified": "2019-06-29 13:26:33.201060", "modified_by": "Administrator", "module": "Integrations", "name": "Google Settings", diff --git a/frappe/patches/v12_0/delete_google_maps_integration.py b/frappe/patches/v12_0/delete_google_maps_integration.py new file mode 100644 index 0000000000..39e3590477 --- /dev/null +++ b/frappe/patches/v12_0/delete_google_maps_integration.py @@ -0,0 +1,6 @@ +import frappe + +def execute(): + key = frappe.db.get_single_value("Google Maps Settings", "client_key") + frappe.db.set_value("Google Settings", None, "api_key", key) + frappe.db.commit() \ No newline at end of file From 4aac53a01f532e5a0f36d8e7b8dd824bad2d36af Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Sat, 29 Jun 2019 21:58:46 +0530 Subject: [PATCH 005/119] fix: rename enabled to enable --- .../doctype/google_maps/google_maps.json | 27 ++++++++++++------- .../doctype/google_maps/google_maps.py | 4 +-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/frappe/integrations/doctype/google_maps/google_maps.json b/frappe/integrations/doctype/google_maps/google_maps.json index ef9fd10a0e..97b776903d 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.json +++ b/frappe/integrations/doctype/google_maps/google_maps.json @@ -5,23 +5,19 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "enabled", + "enable", + "sb_00", "entity_type", "address", "cb_00", "entity" ], "fields": [ - { - "default": "0", - "fieldname": "enabled", - "fieldtype": "Check", - "label": "Enabled" - }, { "fieldname": "entity_type", "fieldtype": "Select", - "label": "Entity Type" + "label": "Entity Type", + "options": "Driver" }, { "fieldname": "address", @@ -38,9 +34,21 @@ "fieldtype": "Dynamic Link", "label": "Entity", "options": "entity_type" + }, + { + "depends_on": "eval: doc.enable", + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Google Maps" + }, + { + "default": "0", + "fieldname": "enable", + "fieldtype": "Check", + "label": "Enable" } ], - "modified": "2019-06-29 13:23:16.714233", + "modified": "2019-06-29 21:58:34.405715", "modified_by": "Administrator", "module": "Integrations", "name": "Google Maps", @@ -57,7 +65,6 @@ "write": 1 } ], - "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC", "track_changes": 1 diff --git a/frappe/integrations/doctype/google_maps/google_maps.py b/frappe/integrations/doctype/google_maps/google_maps.py index 991fdea048..3df460a7f7 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.py +++ b/frappe/integrations/doctype/google_maps/google_maps.py @@ -8,7 +8,7 @@ from frappe.model.document import Document class GoogleMaps(Document): def validate(self): - if self.enabled: + if self.enable: if not frappe.db.get_single_value("Google Settings", "enable"): frappe.throw(_("Enable Google Settings for Google Maps Integration.")) @@ -16,7 +16,7 @@ class GoogleMaps(Document): frappe.throw(_("Enter API Key for Google Maps Integration in Google Settings.")) def get_client(self): - if not self.enabled: + if not self.enable: frappe.throw(_("Google Maps Integration is not enabled.")) import googlemaps From 2c56796e2d0e3d27f71fdec148e48e85de8de965 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Sat, 29 Jun 2019 22:47:59 +0530 Subject: [PATCH 006/119] fix: import _ --- frappe/integrations/doctype/google_maps/google_maps.json | 3 ++- frappe/integrations/doctype/google_maps/google_maps.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/integrations/doctype/google_maps/google_maps.json b/frappe/integrations/doctype/google_maps/google_maps.json index 97b776903d..9dd1e53378 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.json +++ b/frappe/integrations/doctype/google_maps/google_maps.json @@ -43,12 +43,13 @@ }, { "default": "0", + "description": "Uses Google Maps Directions API to optimize routes.", "fieldname": "enable", "fieldtype": "Check", "label": "Enable" } ], - "modified": "2019-06-29 21:58:34.405715", + "modified": "2019-06-29 22:12:37.531852", "modified_by": "Administrator", "module": "Integrations", "name": "Google Maps", diff --git a/frappe/integrations/doctype/google_maps/google_maps.py b/frappe/integrations/doctype/google_maps/google_maps.py index 3df460a7f7..a4d604fd10 100644 --- a/frappe/integrations/doctype/google_maps/google_maps.py +++ b/frappe/integrations/doctype/google_maps/google_maps.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe +from frappe import _ from frappe.model.document import Document class GoogleMaps(Document): From 3bd3f8435dbe2fea2f4c06b932bba8b9c3ed20bf Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 2 Jul 2019 21:10:28 +0530 Subject: [PATCH 007/119] fix(UX): Form Sidebar Image Dropdown for uploading new image or removing --- .../js/frappe/form/sidebar/user_image.js | 18 +++++++--- .../frappe/form/templates/form_sidebar.html | 9 +++++ frappe/public/less/sidebar.less | 34 +++++++++++++------ 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/user_image.js b/frappe/public/js/frappe/form/sidebar/user_image.js index 8be760179a..1eb6948446 100644 --- a/frappe/public/js/frappe/form/sidebar/user_image.js +++ b/frappe/public/js/frappe/form/sidebar/user_image.js @@ -4,6 +4,7 @@ frappe.ui.form.set_user_image = function(frm) { var image_field = frm.meta.image_field; var image = frm.doc[image_field]; var title_image = frm.page.$title_area.find('.title-image'); + var image_actions = frm.sidebar.image_wrapper.find('.sidebar-image-actions'); image_section.toggleClass('hide', image_field ? false : true); @@ -32,6 +33,8 @@ frappe.ui.form.set_user_image = function(frm) { .css("background-image", 'url("' + image + '")') .html(''); + image_actions.find('.sidebar-image-change, .sidebar-image-remove').show(); + } else { image_section .find(".sidebar-image") @@ -51,6 +54,8 @@ frappe.ui.form.set_user_image = function(frm) { .css({'background-color': frappe.get_palette(title)}) .html(frappe.get_abbr(title)); + image_actions.find('.sidebar-image-change').show(); + image_actions.find('.sidebar-image-remove').hide(); } } @@ -64,11 +69,16 @@ frappe.ui.form.setup_user_image_event = function(frm) { } // bind click on image_wrapper - frm.sidebar.image_wrapper.on('click', function() { + frm.sidebar.image_wrapper.on('click', '.sidebar-image-change, .sidebar-image-remove', function(e) { + let $target = $(e.currentTarget); var field = frm.get_field(frm.meta.image_field); - if(!field.$input) { - field.make_input(); + if ($target.is('.sidebar-image-change')) { + if(!field.$input) { + field.make_input(); + } + field.$input.trigger('click'); + } else { + field.set_value('').then(() => frm.save()); } - field.$input.trigger('click'); }); } \ No newline at end of file diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index 34f9b57ef2..b4f67da23b 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -12,6 +12,15 @@ +
{% if frm.meta.beta %} diff --git a/frappe/public/less/sidebar.less b/frappe/public/less/sidebar.less index dae2045b99..9e91b48ea3 100644 --- a/frappe/public/less/sidebar.less +++ b/frappe/public/less/sidebar.less @@ -188,19 +188,31 @@ body[data-route^="Module"] .main-menu { border-radius: 6px; } - .sidebar-image-wrapper:after { - content: '\A'; - position: absolute; - width: 100%; height:100%; - top:0; left:0; - background: #fff; - opacity: 0; - transition: all 0.5s; - -webkit-transition: all 0.6s; + .sidebar-image-wrapper { + position: relative; } - .sidebar-image-wrapper:hover:after { - opacity: 0.5; + .sidebar-image, .sidebar-standard-image { + transition: opacity 0.3s; + } + + .sidebar-image-wrapper:hover { + .sidebar-image, .sidebar-standard-image { + opacity: 0.5; + } + .sidebar-image-actions { + display: block; + } + } + + .sidebar-image-actions { + display: none; + position: absolute; + top: 50%; + right: 0; + left: 0; + transform: translateY(-50%); + text-align: center; } } From 05c45b1c03e51256b54abedc9031b7ee99221391 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 3 Jul 2019 11:50:34 +0530 Subject: [PATCH 008/119] feat: Refactor Auto Repeat --- frappe/core/doctype/doctype/doctype.json | 23 +- frappe/core/doctype/doctype/doctype.py | 12 +- .../customize_form/customize_form.json | 17 +- .../doctype/customize_form/customize_form.py | 10 + .../desk/doctype/auto_repeat/auto_repeat.js | 39 +- .../desk/doctype/auto_repeat/auto_repeat.json | 2018 ++++++++--------- .../desk/doctype/auto_repeat/auto_repeat.py | 57 +- .../doctype/auto_repeat/test_auto_repeat.py | 11 +- frappe/desk/doctype/todo/todo.json | 2 +- .../js/frappe/form/sidebar/form_sidebar.js | 21 + .../frappe/form/templates/form_sidebar.html | 5 +- frappe/public/js/frappe/form/toolbar.js | 12 + frappe/public/js/frappe/utils/common.js | 60 +- 13 files changed, 1215 insertions(+), 1072 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 24a7a4c287..72520dd00b 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -18,6 +18,7 @@ "track_changes", "track_seen", "track_views", + "allow_auto_repeat", "custom", "beta", "fields_section_break", @@ -81,6 +82,7 @@ "search_index": 1 }, { + "default": "0", "depends_on": "eval:!doc.istable", "description": "Once submitted, submittable documents cannot be changed. They can only be Cancelled and Amended.", "fieldname": "is_submittable", @@ -88,6 +90,7 @@ "label": "Is Submittable" }, { + "default": "0", "description": "Child Tables are shown as a Grid in other DocTypes", "fieldname": "istable", "fieldtype": "Check", @@ -97,6 +100,7 @@ "oldfieldtype": "Check" }, { + "default": "0", "depends_on": "eval:!doc.istable", "description": "Single Types have only one record no tables associated. Values are stored in tabSingles", "fieldname": "issingle", @@ -135,6 +139,7 @@ "label": "Track Changes" }, { + "default": "0", "depends_on": "eval:!doc.istable", "description": "If enabled, the document is marked as seen, the first time a user opens it", "fieldname": "track_seen", @@ -150,11 +155,13 @@ "label": "Track Views" }, { + "default": "0", "fieldname": "custom", "fieldtype": "Check", "label": "Custom?" }, { + "default": "0", "fieldname": "beta", "fieldtype": "Check", "label": "Beta" @@ -236,6 +243,7 @@ "fieldtype": "Column Break" }, { + "default": "0", "fieldname": "hide_toolbar", "fieldtype": "Check", "label": "Hide Sidebar and Menu", @@ -243,6 +251,7 @@ "oldfieldtype": "Check" }, { + "default": "0", "fieldname": "allow_copy", "fieldtype": "Check", "label": "Hide Copy", @@ -250,6 +259,7 @@ "oldfieldtype": "Check" }, { + "default": "0", "fieldname": "allow_rename", "fieldtype": "Check", "label": "Allow Rename", @@ -257,11 +267,13 @@ "oldfieldtype": "Check" }, { + "default": "0", "fieldname": "allow_import", "fieldtype": "Check", "label": "Allow Import (via Data Import Tool)" }, { + "default": "0", "fieldname": "allow_events_in_timeline", "fieldtype": "Check", "label": "Allow events in timeline" @@ -329,6 +341,7 @@ "label": "Color" }, { + "default": "0", "fieldname": "show_name_in_global_search", "fieldtype": "Check", "label": "Make \"name\" searchable in Global Search" @@ -354,6 +367,7 @@ "options": "Domain" }, { + "default": "0", "fieldname": "read_only", "fieldtype": "Check", "label": "User Cannot Search", @@ -361,6 +375,7 @@ "oldfieldtype": "Check" }, { + "default": "0", "fieldname": "in_create", "fieldtype": "Check", "label": "User Cannot Create", @@ -417,11 +432,17 @@ "fieldname": "show_preview_popup", "fieldtype": "Check", "label": "Show Preview Popup" + }, + { + "default": "0", + "fieldname": "allow_auto_repeat", + "fieldtype": "Check", + "label": "Allow Auto Repeat" } ], "icon": "fa fa-bolt", "idx": 6, - "modified": "2019-05-16 14:58:33.405381", + "modified": "2019-07-01 21:34:33.491828", "modified_by": "Administrator", "module": "Core", "name": "DocType", diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 07da5a8fe3..7f21d884a5 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -13,6 +13,7 @@ from frappe.utils import now, cint from frappe.model import no_value_fields, default_fields, data_fieldtypes, table_fields from frappe.model.document import Document from frappe.custom.doctype.property_setter.property_setter import make_property_setter +from frappe.custom.doctype.custom_field.custom_field import create_custom_field from frappe.desk.notifications import delete_notification_count_for from frappe.modules import make_boilerplate, get_doc_path from frappe.database.schema import validate_column_name, validate_column_length @@ -47,7 +48,8 @@ class DocType(Document): - Validate series - Check fieldnames (duplication etc) - Clear permission table for child tables - - Add `amended_from` and `amended_by` if Amendable""" + - Add `amended_from` and `amended_by` if Amendable + - Add custom field `auto_repeat` if Repeatable""" self.check_developer_mode() @@ -76,6 +78,7 @@ class DocType(Document): validate_permissions(self) self.make_amendable() + self.make_repeatable() self.validate_website() if not self.is_new(): @@ -526,6 +529,13 @@ class DocType(Document): "no_copy": 1 }) + def make_repeatable(self): + """If allow_auto_repeat is set, add auto_repeat custom field.""" + if self.allow_auto_repeat: + if not frappe.db.sql("SELECT `fieldname` FROM `tabCustom Field` WHERE `fieldname`='auto_repeat' and `dt`=%s",self.name): + df = dict(fieldname='auto_repeat', label='Auto Repeat', fieldtype='Link', options='Auto Repeat') + create_custom_field(self.name, df) + def get_max_idx(self): """Returns the highest `idx`""" max_idx = frappe.db.sql("""select max(idx) from `tabDocField` where parent = %s""", diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index 5f288fe99c..d4b6bc6352 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -4,6 +4,7 @@ "doctype": "DocType", "document_type": "Document", "editable_grid": 1, + "engine": "InnoDB", "field_order": [ "doc_type", "properties", @@ -16,6 +17,7 @@ "quick_entry", "track_changes", "track_views", + "allow_auto_repeat", "image_view", "column_break_5", "title_field", @@ -59,17 +61,20 @@ "label": "Max Attachments" }, { + "default": "0", "fieldname": "allow_copy", "fieldtype": "Check", "label": "Hide Copy" }, { + "default": "0", "fieldname": "istable", "fieldtype": "Check", "label": "Is Table", "read_only": 1 }, { + "default": "0", "depends_on": "istable", "fieldname": "editable_grid", "fieldtype": "Check", @@ -82,11 +87,13 @@ "label": "Quick Entry" }, { + "default": "0", "fieldname": "track_changes", "fieldtype": "Check", "label": "Track Changes" }, { + "default": "0", "depends_on": "eval: doc.image_field", "fieldname": "image_view", "fieldtype": "Check", @@ -150,16 +157,23 @@ "options": "Customize Form Field" }, { + "default": "0", "fieldname": "track_views", "fieldtype": "Check", "label": "Track Views" + }, + { + "default": "0", + "fieldname": "allow_auto_repeat", + "fieldtype": "Check", + "label": "Allow Auto Repeat" } ], "hide_toolbar": 1, "icon": "fa fa-glass", "idx": 1, "issingle": 1, - "modified": "2019-05-13 18:54:40.610862", + "modified": "2019-07-01 22:50:50.372465", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", @@ -177,6 +191,7 @@ ], "quick_entry": 1, "search_fields": "doc_type", + "sort_field": "modified", "sort_order": "DESC", "track_changes": 1 } \ No newline at end of file diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 78ee82efcb..1249672917 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -13,6 +13,7 @@ from frappe.utils import cint from frappe.model.document import Document from frappe.model import no_value_fields, core_doctypes_list from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype +from frappe.custom.doctype.custom_field.custom_field import create_custom_field from frappe.model.docfield import supports_translation doctype_properties = { @@ -29,6 +30,7 @@ doctype_properties = { 'max_attachments': 'Int', 'track_changes': 'Check', 'track_views': 'Check', + 'allow_auto_repeat': 'Check' } docfield_properties = { @@ -65,6 +67,7 @@ docfield_properties = { 'columns': 'Int', 'remember_last_selected_value': 'Check', 'allow_bulk_edit': 'Check', + 'auto_repeat': 'Link' } allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'), @@ -108,6 +111,13 @@ class CustomizeForm(Document): translation = self.get_name_translation() self.label = translation.target_name if translation else '' + """If allow_auto_repeat is set, add auto_repeat custom field.""" + if self.allow_auto_repeat: + if not frappe.db.sql("SELECT `fieldname` FROM `tabCustom Field` WHERE `fieldname`='auto_repeat' and `dt`=%s",self.doc_type): + insert_after = self.fields[len(self.fields) - 1].fieldname + df = dict(fieldname='auto_repeat', label='Auto Repeat', fieldtype='Link', options='Auto Repeat', insert_after=insert_after, read_only=1, no_copy=1, print_hide=1) + create_custom_field(self.doc_type, df) + # NOTE doc is sent to clientside by run_method def get_name_translation(self): diff --git a/frappe/desk/doctype/auto_repeat/auto_repeat.js b/frappe/desk/doctype/auto_repeat/auto_repeat.js index ca96cb2b45..2f982e412c 100644 --- a/frappe/desk/doctype/auto_repeat/auto_repeat.js +++ b/frappe/desk/doctype/auto_repeat/auto_repeat.js @@ -13,7 +13,6 @@ frappe.ui.form.on('Auto Repeat', { frm.fields_dict['reference_document'].get_query = function() { return { filters: { - "docstatus": 1, "auto_repeat": '' } }; @@ -41,47 +40,15 @@ frappe.ui.form.on('Auto Repeat', { frappe.set_route("List", frm.doc.reference_doctype); } ); - - if(frm.doc.status != 'Stopped') { - frm.add_custom_button(__("Stop"), - function() { - frm.events.stop_resume_auto_repeat(frm, "Stopped"); - } - ); - } - - if(frm.doc.status == 'Stopped') { - frm.add_custom_button(__("Restart"), - function() { - frm.events.stop_resume_auto_repeat(frm, "Resumed"); - } - ); - } } - frm.toggle_display('auto_repeat_schedule', !in_list(['Stopped', 'Cancelled'], frm.doc.status)); - if(frm.doc.start_date && !in_list(['Stopped', 'Cancelled'], frm.doc.status)){ + frm.toggle_display('auto_repeat_schedule', !in_list(['Cancelled'], frm.doc.status)); + if(frm.doc.start_date && !in_list(['Cancelled'], frm.doc.status)){ frappe.auto_repeat.render_schedule(frm); } }, - stop_resume_auto_repeat: function(frm, status) { - frappe.call({ - method: "frappe.desk.doctype.auto_repeat.auto_repeat.stop_resume_auto_repeat", - args: { - auto_repeat: frm.doc.name, - status: status - }, - callback: function(r) { - if(r.message) { - frm.set_value("status", r.message); - frm.reload_doc(); - } - } - }); - }, - template: function(frm) { if (frm.doc.template) { frappe.model.with_doc("Email Template", frm.doc.template, () => { @@ -141,4 +108,4 @@ frappe.auto_repeat.render_schedule = function(frm) { wrapper.html(frappe.render_template ("auto_repeat_schedule", {"schedule_details" : r.message || []} )); frm.refresh_fields(); }); -}; \ No newline at end of file +}; diff --git a/frappe/desk/doctype/auto_repeat/auto_repeat.json b/frappe/desk/doctype/auto_repeat/auto_repeat.json index 701f692672..f6dea9a0de 100644 --- a/frappe/desk/doctype/auto_repeat/auto_repeat.json +++ b/frappe/desk/doctype/auto_repeat/auto_repeat.json @@ -1,1081 +1,1081 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "naming_series:", - "beta": 0, - "creation": "2018-03-09 11:22:31.192349", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "naming_series:", + "beta": 0, + "creation": "2018-03-09 11:22:31.192349", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_1", - "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, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_1", + "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, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "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": "Series", - "length": 0, - "no_copy": 0, - "options": "SUB-", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "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": "Series", + "length": 0, + "no_copy": 0, + "options": "SUB-", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "reference_doctype", - "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": 0, - "label": "Reference Doctype", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_doctype", + "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": 0, + "label": "Reference Document Type", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "reference_document", - "fieldtype": "Dynamic Link", - "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": "Reference Document", - "length": 0, - "no_copy": 1, - "options": "reference_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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_document", + "fieldtype": "Dynamic Link", + "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": "Reference Document", + "length": 0, + "no_copy": 1, + "options": "reference_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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "reference_party_doctype", - "fieldtype": "Link", - "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": "Reference Party Doctype", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_party_doctype", + "fieldtype": "Link", + "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": "Reference Party Doctype", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "reference_party", - "fieldtype": "Dynamic Link", - "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": "Reference Party", - "length": 0, - "no_copy": 0, - "options": "reference_party_doctype", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reference_party", + "fieldtype": "Dynamic Link", + "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": "Reference Party", + "length": 0, + "no_copy": 0, + "options": "reference_party_doctype", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_5", - "fieldtype": "Column 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, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_5", + "fieldtype": "Column 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, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "start_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Start Date", - "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": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Start Date", + "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": 1, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "end_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "End Date", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "End Date", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "submit_on_creation", - "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": "Submit on Creation", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "submit_on_creation", + "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": "Submit on Creation", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "disabled", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Disabled", - "length": 0, - "no_copy": 1, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 1, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_10", - "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, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_10", + "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, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "frequency", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Frequency", - "length": 0, - "no_copy": 0, - "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf-yearly\nYearly", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "frequency", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Frequency", + "length": 0, + "no_copy": 0, + "options": "\nDaily\nWeekly\nMonthly\nQuarterly\nHalf-yearly\nYearly", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_12", - "fieldtype": "Column 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, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_12", + "fieldtype": "Column 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, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: in_list([\"Monthly\", \"Quarterly\", \"Yearly\"], doc.frequency)", - "fieldname": "repeat_on_day", - "fieldtype": "Int", - "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": "Repeat on Day", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: in_list([\"Monthly\", \"Quarterly\", \"Yearly\"], doc.frequency)", + "fieldname": "repeat_on_day", + "fieldtype": "Int", + "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": "Repeat on Day", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "next_schedule_date", - "fieldtype": "Date", - "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": "Next Schedule Date", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "next_schedule_date", + "fieldtype": "Date", + "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": "Next Schedule Date", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "section_break_13", - "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": "Auto Repeat Schedule", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "section_break_13", + "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": "Auto Repeat Schedule", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: !cur_frm.doc.__islocal", - "fieldname": "auto_repeat_schedule", - "fieldtype": "HTML", - "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": "Auto Repeat Schedule", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: !cur_frm.doc.__islocal", + "fieldname": "auto_repeat_schedule", + "fieldtype": "HTML", + "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": "Auto Repeat Schedule", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "notification", - "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": "Notification", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "notification", + "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": "Notification", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "notify_by_email", - "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": "Notify by Email", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "notify_by_email", + "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": "Notify by Email", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "notify_by_email", - "fieldname": "recipients", - "fieldtype": "Small Text", - "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": "Recipients", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "notify_by_email", + "fieldname": "recipients", + "fieldtype": "Small Text", + "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": "Recipients", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: doc.notify_by_email", - "fieldname": "get_contacts", - "fieldtype": "Button", - "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": "Get Contacts", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.notify_by_email", + "fieldname": "get_contacts", + "fieldtype": "Button", + "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": "Get Contacts", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: doc.notify_by_email", - "fieldname": "template", - "fieldtype": "Link", - "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": "Template", - "length": 0, - "no_copy": 0, - "options": "Email Template", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.notify_by_email", + "fieldname": "template", + "fieldtype": "Link", + "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": "Template", + "length": 0, + "no_copy": 0, + "options": "Email Template", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: doc.notify_by_email", - "description": "To add dynamic subject, use jinja tags like\n\n
New {{ doc.doctype }} #{{ doc.name }}
", - "fieldname": "subject", - "fieldtype": "Data", - "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": "Subject", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.notify_by_email", + "description": "To add dynamic subject, use jinja tags like\n\n
New {{ doc.doctype }} #{{ doc.name }}
", + "fieldname": "subject", + "fieldtype": "Data", + "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": "Subject", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Please find attached {{ doc.doctype }} #{{ doc.name }}", - "depends_on": "eval: doc.notify_by_email", - "fieldname": "message", - "fieldtype": "Text", - "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": "Message", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Please find attached {{ doc.doctype }} #{{ doc.name }}", + "depends_on": "eval: doc.notify_by_email", + "fieldname": "message", + "fieldtype": "Text", + "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": "Message", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: doc.notify_by_email", - "fieldname": "preview_message", - "fieldtype": "Button", - "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": "Preview Message", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.notify_by_email", + "fieldname": "preview_message", + "fieldtype": "Button", + "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": "Preview Message", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "notify_by_email", - "fieldname": "print_format", - "fieldtype": "Link", - "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": "Print Format", - "length": 0, - "no_copy": 0, - "options": "Print Format", - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "notify_by_email", + "fieldname": "print_format", + "fieldtype": "Link", + "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": "Print Format", + "length": 0, + "no_copy": 0, + "options": "Print Format", + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "eval: !doc.__islocal", - "fieldname": "section_break_16", - "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, - "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, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "depends_on": "eval: !doc.__islocal", + "fieldname": "section_break_16", + "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, + "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, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "\nDraft\nStopped\nSubmitted\nCancelled\nCompleted", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "\nDraft\nSubmitted\nCancelled\nCompleted", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "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": "Amended From ", - "length": 0, - "no_copy": 1, - "options": "Auto Repeat", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "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": "Amended From ", + "length": 0, + "no_copy": 1, + "options": "Auto Repeat", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-10-12 18:59:22.463211", - "modified_by": "Administrator", - "module": "Desk", - "name": "Auto Repeat", - "name_case": "", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-10-12 18:59:22.463211", + "modified_by": "Administrator", + "module": "Desk", + "name": "Auto Repeat", + "name_case": "", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 1, - "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": 1, + "amend": 0, + "cancel": 1, + "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": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "reference_document", - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "reference_document", - "track_changes": 1, - "track_seen": 0, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "reference_document", + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "reference_document", + "track_changes": 1, + "track_seen": 0, "track_views": 0 -} \ No newline at end of file +} diff --git a/frappe/desk/doctype/auto_repeat/auto_repeat.py b/frappe/desk/doctype/auto_repeat/auto_repeat.py index 0caaf69c3a..37b405728a 100644 --- a/frappe/desk/doctype/auto_repeat/auto_repeat.py +++ b/frappe/desk/doctype/auto_repeat/auto_repeat.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe import calendar +import json from frappe import _ from frappe.desk.form import assign_to from frappe.utils.jinja import validate_template @@ -46,6 +47,7 @@ class AutoRepeat(Document): def on_cancel(self): self.update_status() + frappe.get_doc(self.reference_doctype, self.reference_document).notify_update() def on_update_after_submit(self): self.validate_dates() @@ -106,7 +108,7 @@ class AutoRepeat(Document): '2': 'Cancelled' }[cstr(self.docstatus or 0)] - if status and status != 'Resumed': + if status: self.status = status if self.docstatus == 2: @@ -122,18 +124,23 @@ class AutoRepeat(Document): start_date_copy = today_copy if not self.end_date: - days = 60 if self.frequency in ['Daily', 'Weekly'] else 365 - end_date_copy = add_days(today_copy, days) - - start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day) - while (getdate(start_date_copy) < getdate(end_date_copy)): + start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day) row = { - "reference_document" : self.reference_document, - "frequency" : self.frequency, - "next_scheduled_date" : start_date_copy + "reference_document": self.reference_document, + "frequency": self.frequency, + "next_schedule_date": start_date_copy } schedule_details.append(row) - start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day) + + if self.end_date: + while (getdate(start_date_copy) < getdate(end_date_copy)): + start_date_copy = get_next_schedule_date(start_date_copy, self.frequency, self.repeat_on_day) + row = { + "reference_document" : self.reference_document, + "frequency" : self.frequency, + "next_scheduled_date" : start_date_copy + } + schedule_details.append(row) return schedule_details @@ -164,8 +171,9 @@ def make_auto_repeat_entry(date=None): frappe.enqueue(enqueued_method, data=data) def create_repeated_entries(data): + current_date = getdate(today()) schedule_date = getdate(data.next_schedule_date) - while schedule_date <= getdate(today()) and not frappe.db.get_value('Auto Repeat', data.name, 'disabled'): + while schedule_date <= current_date and not frappe.db.get_value('Auto Repeat', data.name, 'disabled'): create_documents(data, schedule_date) schedule_date = get_next_schedule_date(schedule_date, data.frequency, data.repeat_on_day) @@ -178,7 +186,7 @@ def get_auto_repeat_entries(date): where docstatus = 1 and next_schedule_date <=%s and reference_document is not null and reference_document != '' and next_schedule_date <= ifnull(end_date, '2199-12-31') - and disabled = 0 and status != 'Stopped' """, (date), as_dict=1) + and disabled = 0 and status != 'Cancelled' """, (date), as_dict=1) def create_documents(data, schedule_date): try: @@ -334,13 +342,30 @@ def assign_task_to_owner(name, msg, users): assign_to.add(args) @frappe.whitelist() -def make_auto_repeat(doctype, docname): +def make_auto_repeat(doctype, docname, submit = False, opts = None): doc = frappe.new_doc('Auto Repeat') - - reference_doc = frappe.get_doc(doctype, docname) doc.reference_doctype = doctype doc.reference_document = docname - doc.start_date = reference_doc.get('posting_date') or reference_doc.get('transaction_date') + + if opts: + opts = json.loads(opts) + doc.update({ + 'start_date': opts['start_date'], + 'frequency': opts['frequency'] + }) + if 'end_date' in opts: + doc.update({ + 'end_date': opts['end_date'] + }) + + else: + reference_doc = frappe.get_doc(doctype, docname) + doc.start_date = reference_doc.get('posting_date') or reference_doc.get('transaction_date') + + doc.save() + if submit: + doc.submit() + return doc @frappe.whitelist() diff --git a/frappe/desk/doctype/auto_repeat/test_auto_repeat.py b/frappe/desk/doctype/auto_repeat/test_auto_repeat.py index f0cf9643ce..46782e63ca 100644 --- a/frappe/desk/doctype/auto_repeat/test_auto_repeat.py +++ b/frappe/desk/doctype/auto_repeat/test_auto_repeat.py @@ -14,13 +14,12 @@ from frappe.utils import today, add_days, getdate, add_months def add_custom_fields(): df = dict( fieldname='auto_repeat', label='Auto Repeat', fieldtype='Link', insert_after='sender', - options='Auto Repeat') + options='Auto Repeat', hidden=1, print_hide=1, read_only=1) create_custom_field('ToDo', df) - class TestAutoRepeat(unittest.TestCase): def setUp(self): - if not frappe.db.sql("SELECT `name` FROM `tabCustom Field` WHERE `name`='auto_repeat'"): + if not frappe.db.sql("SELECT `fieldname` FROM `tabCustom Field` WHERE `fieldname`='auto_repeat' and `dt`=%s", "Todo"): add_custom_fields() def test_daily_auto_repeat(self): @@ -51,8 +50,10 @@ class TestAutoRepeat(unittest.TestCase): dict(doctype='ToDo', description='test recurring todo', assigned_by='Administrator')).insert() self.monthly_auto_repeat('ToDo', todo.name, start_date, end_date) + #test without end_date + self.monthly_auto_repeat('ToDo', todo.name, start_date) - def monthly_auto_repeat(self, doctype, docname, start_date, end_date): + def monthly_auto_repeat(self, doctype, docname, start_date, end_date=""): def get_months(start, end): diff = (12 * end.year + end.month) - (12 * start.year + start.month) return diff + 1 @@ -103,7 +104,7 @@ def make_auto_repeat(**args): 'reference_document': args.reference_document or frappe.db.get_value('ToDo', {'docstatus': 1}, 'name'), 'frequency': args.frequency or 'Daily', 'start_date': args.start_date or add_days(today(), -1), - 'end_date': args.end_date or add_days(today(), 2), + 'end_date': args.end_date or "", 'submit_on_creation': args.submit_on_creation or 0, 'notify_by_email': args.notify or 0, 'recipients': args.recipients or "", diff --git a/frappe/desk/doctype/todo/todo.json b/frappe/desk/doctype/todo/todo.json index 4b70086648..a0343e9f69 100644 --- a/frappe/desk/doctype/todo/todo.json +++ b/frappe/desk/doctype/todo/todo.json @@ -684,4 +684,4 @@ "track_changes": 1, "track_seen": 1, "track_views": 0 -} \ No newline at end of file +} diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index b766d66a5f..6764ec9cfe 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -86,6 +86,27 @@ frappe.ui.form.Sidebar = Class.extend({ this.refresh_like(); frappe.ui.form.set_user_image(this.frm); } + + if(this.frm.meta.allow_auto_repeat){ + const me = this; + frappe.call({ + method: "frappe.client.get_value", + args:{ + doctype: "Auto Repeat", + filters: { + name: this.frm.doc.auto_repeat + }, + fieldname: ["frequency"] + }, + callback: function(res){ + me.sidebar.find(".auto-repeat-status").html(__("Repeats {0}", + ["" + res.message.frequency + ""])); + me.sidebar.find(".auto-repeat-status").on("click", function(){ + frappe.set_route("Form", "Auto Repeat", me.frm.doc.auto_repeat); + }); + } + }); + } }, refresh_comments: function() { diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index 34f9b57ef2..151adbf22f 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -72,6 +72,9 @@
  • {%= __("Currently Viewing") %}
  • + diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index 244bf75708..d0ea7d0428 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -186,6 +186,13 @@ frappe.ui.form.Toolbar = Class.extend({ } } + // Auto Repeat + if(this.can_repeat()) { + this.page.add_menu_item(__("Repeat"), function(){ + frappe.utils.new_auto_repeat_prompt(me.frm); + }, true); + } + // New if(p[CREATE] && !this.frm.meta.issingle) { this.page.add_menu_item(__("New {0}", [__(me.frm.doctype)]), function() { @@ -193,6 +200,11 @@ frappe.ui.form.Toolbar = Class.extend({ }, true, 'Ctrl+B'); } }, + can_repeat: function() { + return this.frm.meta.allow_auto_repeat + && !this.frm.doc.__islocal + && !this.frm.doc.auto_repeat; + }, can_save: function() { return this.get_docstatus()===0; }, diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index 0ed587534b..05384e0358 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -256,4 +256,62 @@ frappe.utils.xss_sanitise = function (string, options) { } return sanitised; -} \ No newline at end of file +} + +frappe.utils.new_auto_repeat_prompt = function(frm) { + const fields = [ + { + 'fieldname': 'frequency', + 'fieldtype': 'Select', + 'label': __('Frequency'), + 'reqd': 1, + 'options': [ + {'label': __('Daily'), 'value': 'Daily'}, + {'label': __('Weekly'), 'value': 'Weekly'}, + {'label': __('Monthly'), 'value': 'Monthly'}, + {'label': __('Quarterly'), 'value': 'Quarterly'}, + {'label': __('Half-yearly'), 'value': 'Half-yearly'}, + {'label': __('Yearly'), 'value': 'Yearly'} + ] + }, + { + 'fieldname': 'start_date', + 'fieldtype': 'Date', + 'label': __('Start Date'), + 'reqd': 1, + 'default': frappe.datetime.nowdate() + }, + { + 'fieldname': 'end_date', + 'fieldtype': 'Date', + 'label': __('End Date') + } + ]; + frappe.prompt(fields, function(values) { + frappe.call({ + method: "frappe.desk.doctype.auto_repeat.auto_repeat.make_auto_repeat", + args: { + 'doctype': frm.doc.doctype, + 'docname': frm.doc.name, + 'submit': true, + 'opts': { + 'frequency': values['frequency'], + 'start_date': values['start_date'], + 'end_date': values['end_date'] + } + }, + callback: function (r) { + if (r.message) { + frappe.show_alert({ + 'message': __("Successfully created repeating task"), + 'indicator': 'green' + }); + frm.reload_doc(); + } + } + }); + }, + __('Auto Repeat'), + __('Submit') + ); +} From f67e7a64511952897d83235dcc90b7e76e63760e Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 3 Jul 2019 12:09:54 +0530 Subject: [PATCH 009/119] changed next_schedule_date to next_scheduled_date --- frappe/desk/doctype/auto_repeat/auto_repeat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/auto_repeat/auto_repeat.py b/frappe/desk/doctype/auto_repeat/auto_repeat.py index 37b405728a..8788f9c200 100644 --- a/frappe/desk/doctype/auto_repeat/auto_repeat.py +++ b/frappe/desk/doctype/auto_repeat/auto_repeat.py @@ -128,7 +128,7 @@ class AutoRepeat(Document): row = { "reference_document": self.reference_document, "frequency": self.frequency, - "next_schedule_date": start_date_copy + "next_scheduled_date": start_date_copy } schedule_details.append(row) From 589bd26085f736d45f5b9245ecdbeb6fe836495c Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 3 Jul 2019 12:19:15 +0530 Subject: [PATCH 010/119] changed as per codacy review --- frappe/custom/doctype/customize_form/customize_form.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 1249672917..4950617e7f 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -111,7 +111,7 @@ class CustomizeForm(Document): translation = self.get_name_translation() self.label = translation.target_name if translation else '' - """If allow_auto_repeat is set, add auto_repeat custom field.""" + #If allow_auto_repeat is set, add auto_repeat custom field. if self.allow_auto_repeat: if not frappe.db.sql("SELECT `fieldname` FROM `tabCustom Field` WHERE `fieldname`='auto_repeat' and `dt`=%s",self.doc_type): insert_after = self.fields[len(self.fields) - 1].fieldname From c12f4bc0995ab9fe6c7cf542afb6addad6a3a8c4 Mon Sep 17 00:00:00 2001 From: Prssanna Desai Date: Tue, 18 Jun 2019 12:53:20 +0530 Subject: [PATCH 011/119] feat(Sidebar): Add group by to list sidebar --- frappe/desk/listview.py | 23 ++++- frappe/public/build.json | 1 + .../public/js/frappe/list/list_sidebar.html | 19 +++- frappe/public/js/frappe/list/list_sidebar.js | 99 +++++++++++++++++++ .../js/frappe/list/list_sidebar_group_by.html | 15 +++ 5 files changed, 151 insertions(+), 6 deletions(-) create mode 100644 frappe/public/js/frappe/list/list_sidebar_group_by.html diff --git a/frappe/desk/listview.py b/frappe/desk/listview.py index f31aae401e..7bac07e357 100644 --- a/frappe/desk/listview.py +++ b/frappe/desk/listview.py @@ -49,4 +49,25 @@ def get_user_assignments_and_count(doctype, current_filters): count desc limit 50""".format(subquery_condition = subquery_condition), as_dict=True) - return todo_list \ No newline at end of file + return todo_list + +@frappe.whitelist() +def get_group_by_count(doctype, current_filters, field): + current_filters = json.loads(current_filters) + subquery= '' + if current_filters: + subquery = frappe.get_all(doctype, + filters=current_filters, return_query = True) + subquery = subquery[subquery.index('where'):subquery.index('order')] + + group_by_list = frappe.db.sql("""select `tab{doctype}`.{field} as name, count(*) as count + from + `tab{doctype}` + {subquery} + group by + `tab{doctype}`.{field} + order by + count desc + limit 50""".format(subquery= subquery, doctype = doctype, field = field), as_dict=True) + + return group_by_list diff --git a/frappe/public/build.json b/frappe/public/build.json index 203a642195..e36b29f9dd 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -276,6 +276,7 @@ "public/js/frappe/list/list_sidebar.js", "public/js/frappe/list/list_sidebar.html", "public/js/frappe/list/list_sidebar_stat.html", + "public/js/frappe/list/list_sidebar_group_by.html", "public/js/frappe/list/list_view_permission_restrictions.html", "public/js/frappe/views/gantt/gantt_view.js", diff --git a/frappe/public/js/frappe/list/list_sidebar.html b/frappe/public/js/frappe/list/list_sidebar.html index c8c2239b03..09a58251a7 100644 --- a/frappe/public/js/frappe/list/list_sidebar.html +++ b/frappe/public/js/frappe/list/list_sidebar.html @@ -52,8 +52,15 @@
    -
  • {{ __("Help") }}
  • + {% } %} + + + +
    {% endif %} diff --git a/frappe/public/js/frappe/list/list_sidebar_stat.html b/frappe/public/js/frappe/list/list_sidebar_stat.html index cb9766abe4..ed51f9ae7b 100644 --- a/frappe/public/js/frappe/list/list_sidebar_stat.html +++ b/frappe/public/js/frappe/list/list_sidebar_stat.html @@ -1,22 +1,16 @@ - -
    - -
    + +{% if(!stat.length) { %} +
  • {{ __("No records tagged.") }}
  • +{% } else { + for (var i=0, l=stat.length; i < l; i++) { + var stat_label = stat[i][0]; + var stat_count = stat[i][1]; +%} +
  • + + {{ stat_count }} + {{ __(stat_label) }} + +
  • + {% } +} %} diff --git a/frappe/public/less/sidebar.less b/frappe/public/less/sidebar.less index dae2045b99..b4e06a3cdb 100644 --- a/frappe/public/less/sidebar.less +++ b/frappe/public/less/sidebar.less @@ -126,9 +126,6 @@ body[data-route^="Module"] .main-menu { } } - .stat-link { - margin-bottom: 0.5em; - } a.close { position: absolute; @@ -374,14 +371,14 @@ body[data-route^="Module"] .main-menu { } -.sidebar-left .list-sidebar { - .stat-label, - .stat-no-records { - .sidebar-padding; +.list-sidebar { + .group-by-dropdown, .list-stats-dropdown { + max-height: 300px; + overflow-y: auto; + max-width: 200px; } - - .stat-label { - margin-bottom: -10px; + .dropdown-search { + padding: 8px; } } diff --git a/frappe/tests/test_assign.py b/frappe/tests/test_assign.py index 247489b0f9..f32e3c9272 100644 --- a/frappe/tests/test_assign.py +++ b/frappe/tests/test_assign.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, unittest import frappe.desk.form.assign_to -from frappe.desk.listview import get_user_assignments_and_count +from frappe.desk.listview import get_group_by_count from frappe.automation.doctype.assignment_rule.test_assignment_rule import make_note class TestAssign(unittest.TestCase): @@ -44,13 +44,13 @@ class TestAssign(unittest.TestCase): note = make_note() assign(note, "test_assign2@example.com") - data = {d.name: d.count for d in get_user_assignments_and_count('Note', [])} + data = {d.name: d.count for d in get_group_by_count('Note', '[]', 'assigned_to')} self.assertTrue('test_assign1@example.com' in data) self.assertEqual(data['test_assign1@example.com'], 1) self.assertEqual(data['test_assign2@example.com'], 3) - data = {d.name: d.count for d in get_user_assignments_and_count('Note', [{'public': 1}])} + data = {d.name: d.count for d in get_group_by_count('Note', '[{"public": 1}]', 'assigned_to')} self.assertFalse('test_assign1@example.com' in data) self.assertEqual(data['test_assign2@example.com'], 2) From 783e68273b1a988d5db50a1610b9029a5aa1a82e Mon Sep 17 00:00:00 2001 From: Prssanna Desai Date: Tue, 2 Jul 2019 16:20:41 +0530 Subject: [PATCH 013/119] fix: move list group by logic to new class --- frappe/public/build.json | 1 + .../public/js/frappe/list/list_sidebar.html | 2 +- frappe/public/js/frappe/list/list_sidebar.js | 124 +--------------- .../js/frappe/list/list_sidebar_group_by.js | 132 ++++++++++++++++++ 4 files changed, 141 insertions(+), 118 deletions(-) create mode 100644 frappe/public/js/frappe/list/list_sidebar_group_by.js diff --git a/frappe/public/build.json b/frappe/public/build.json index e36b29f9dd..7f020b5ef2 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -276,6 +276,7 @@ "public/js/frappe/list/list_sidebar.js", "public/js/frappe/list/list_sidebar.html", "public/js/frappe/list/list_sidebar_stat.html", + "public/js/frappe/list/list_sidebar_group_by.js", "public/js/frappe/list/list_sidebar_group_by.html", "public/js/frappe/list/list_view_permission_restrictions.html", diff --git a/frappe/public/js/frappe/list/list_sidebar.html b/frappe/public/js/frappe/list/list_sidebar.html index 00c9a649bb..6a04f1db2d 100644 --- a/frappe/public/js/frappe/list/list_sidebar.html +++ b/frappe/public/js/frappe/list/list_sidebar.html @@ -57,7 +57,7 @@ {% } %} `; - } + }; let html = this.group_by_fields.map(get_item_html).join(''); this.$wrapper.find('.list-group-by-fields').html(html); } @@ -91,7 +91,7 @@ frappe.views.ListGroupBy = class ListGroupBy { }); } - get_group_by_dropdown_fields() { + get_group_by_dropdown_fields() { let group_by_fields = []; let fields = this.list_view.meta.fields.filter((f)=> ["Select", "Link"].includes(f.fieldtype)); group_by_fields.push({ @@ -115,7 +115,7 @@ frappe.views.ListGroupBy = class ListGroupBy { doctype: this.doctype, current_filters: this.list_view.get_filters_for_args(), field: field, - } + }; return frappe.call('frappe.desk.listview.get_group_by_count', args).then((data) => { if(field === 'assigned_to') { let current_user = data.message.find(user => user.name === frappe.session.user); @@ -139,7 +139,7 @@ frappe.views.ListGroupBy = class ListGroupBy { ${name} ${field.count} `; - } + }; let standard_html = `