").appendTo(this.parent);
+ this.get_stats();
+ },
+ get_stats: function() {
+ var me = this
+ wn.call({
+ type: "GET",
+ method: 'webnotes.widgets.reportview.get_stats',
+ args: {
+ stats: me.stats,
+ doctype: me.doctype
+ },
+ callback: function(r) {
+ // This gives a predictable stats order
+ $.each(me.stats, function(i, v) {
+ me.render_stat(v, r.message[v]);
+ });
+
+ // reload button at the end
+ if(me.stats.length) {
+ $('
')
+ .appendTo(me.wrapper));
+ }
+
+ }
+ });
+ },
+ render_stat: function(field, stat) {
+ var me = this;
+
+ if(!stat || !stat.length) {
+ if(field=='_user_tags') {
+ this.parent
+ .append('
'
+ +wn._('Tags')+'
\
+
'+wn._('No records tagged.')+'
'
+ +wn._('To add a tag, open the document and click on "Add Tag" on the sidebar')
+ +'
');
+ }
+ return;
+ }
+
+ var label = wn.meta.docfield_map[this.doctype][field] ?
+ wn.meta.docfield_map[this.doctype][field].label : field;
+ if(label=='_user_tags') label = 'Tags';
+
+ // grid
+ var $w = $('
\
+
'+ wn._(label) +'
\
+
\
+
\
+
');
+
+ // sort items
+ stat = stat.sort(function(a, b) { return b[1] - a[1] });
+ var sum = 0;
+ $.each(stat, function(i,v) { sum = sum + v[1]; })
+
+ // render items
+ $.each(stat, function(i, v) {
+ me.render_stat_item(i, v, sum, field).appendTo($w.find('.stat-grid'));
+ });
+
+ $w.appendTo(this.wrapper);
+ },
+ render_stat_item: function(i, v, max, field) {
+ var me = this;
+ var args = {}
+ args.label = v[0];
+ args._label = wn._(v[0]);
+ args.width = flt(v[1]) / max * 100;
+ args.count = v[1];
+ args.field = field;
+ args.bar_style = "";
+
+ $item = $(repl('
\
+
', args));
+
+ this.setup_stat_item_click($item);
+ return $item;
+ },
+ reload_stats: function() {
+ this.wrapper.find('.stat-wrapper').remove();
+ this.get_stats();
+ },
+ setup_stat_item_click: function($item) {
+ var me = this;
+ $item.find('a').click(function() {
+ var fieldname = $(this).attr('data-field');
+ var label = $(this).attr('data-label');
+ me.set_filter(fieldname, label);
+ return false;
+ });
+ },
+});
\ No newline at end of file
diff --git a/webnotes/__init__.py b/webnotes/__init__.py
index 470d027239..17d470f2bd 100644
--- a/webnotes/__init__.py
+++ b/webnotes/__init__.py
@@ -86,29 +86,14 @@ def cache():
_memc = MClient(['localhost:11211'])
return _memc
-class ValidationError(Exception):
- pass
-
-class AuthenticationError(Exception):
- pass
-
-class PermissionError(Exception):
- pass
-
-class OutgoingEmailError(ValidationError):
- pass
-
-class UnknownDomainError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class SessionStopped(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
+class ValidationError(Exception): pass
+class AuthenticationError(Exception): pass
+class PermissionError(Exception): pass
+class OutgoingEmailError(ValidationError): pass
+class UnknownDomainError(Exception): pass
+class SessionStopped(Exception): pass
+class MappingMismatchError(ValidationError): pass
+class InvalidStatusError(ValidationError): pass
def getTraceback():
import utils
@@ -280,7 +265,7 @@ def has_permission(doctype, ptype="read", doc=None):
keys = [p.match, p.match]
if doc.fields.get(keys[0],"[No Value]") \
- in get_user_default_as_list(keys[1]):
+ in get_user_default_as_list(keys[1]):
return True
else:
match_failed[keys[0]] = doc.fields.get(keys[0],"[No Value]")
diff --git a/webnotes/defaults.py b/webnotes/defaults.py
index 492c495fb0..9df7f33428 100644
--- a/webnotes/defaults.py
+++ b/webnotes/defaults.py
@@ -16,10 +16,13 @@ def get_user_default(key, user=None):
def get_user_default_as_list(key, user=None):
d = get_defaults(user or webnotes.session.user).get(key, None)
- return isinstance(d, basestring) and [d] or d
+ return (not isinstance(d, list)) and [d] or d
def get_defaults(user=None):
- userd = get_defaults_for(user or webnotes.session.user)
+ if not user:
+ user = webnotes.session.user
+ userd = get_defaults_for(user)
+ userd.update({"user": user, "owner": user})
globald = get_defaults_for()
globald.update(userd)
diff --git a/webnotes/locale/_messages_py.json b/webnotes/locale/_messages_py.json
index 84f5cf2efd..be0640c5e2 100644
--- a/webnotes/locale/_messages_py.json
+++ b/webnotes/locale/_messages_py.json
@@ -77,13 +77,12 @@
"Sales Order",
"Email Digest",
"Event",
- "Plot Control",
"Leave Allocation",
"Supplier Quotation Item",
"SMS Receiver",
"Attendance",
"Landed Cost Item",
- "Table Mapper Detail",
+ "Purchase Request Item",
"Quality Inspection Reading",
"Installation Note Item",
"HR",
@@ -130,6 +129,7 @@
"Support Ticket",
"Project Activity",
"Purchase Order Item Supplied",
+ "Purchase Request",
"Quotation Lost Reason",
"Opportunity Item",
"Event Role",
@@ -137,6 +137,7 @@
"Industry Type",
"Contact Control",
"Market Segment",
+ "Table Mapper Detail",
"Comment",
"Sales Person",
"Purchase Invoice Item",
@@ -255,7 +256,6 @@
"Stock",
"Profile",
"Authorization Control",
- "Product",
"Item Quality Inspection Parameter",
"MIS Control",
"Leave Block List Allow",
@@ -272,7 +272,6 @@
"Purchase Receipt",
"Production Plan Item",
"Address",
- "test",
"About Us Settings",
"Job Applicant",
"Manufacturing",
diff --git a/webnotes/locale/th-py.json b/webnotes/locale/th-py.json
new file mode 100644
index 0000000000..d7980c34df
--- /dev/null
+++ b/webnotes/locale/th-py.json
@@ -0,0 +1,313 @@
+{
+ "About Us Settings": "\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e40\u0e23\u0e32",
+ "About Us Team Member": "\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01\u0e43\u0e19\u0e17\u0e35\u0e21\u0e40\u0e23\u0e32",
+ "Account": "\u0e1a\u0e31\u0e0d\u0e0a\u0e35",
+ "Accounts": "\u0e1a\u0e31\u0e0d\u0e0a\u0e35",
+ "Activity Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",
+ "Address": "\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48",
+ "Answer": "\u0e15\u0e2d\u0e1a",
+ "Appraisal": "\u0e01\u0e32\u0e23\u0e15\u0e35\u0e23\u0e32\u0e04\u0e32",
+ "Appraisal Goal": "\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e40\u0e21\u0e34\u0e19",
+ "Appraisal Template": "\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e40\u0e21\u0e34\u0e19",
+ "Appraisal Template Goal": "\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e17\u0e21\u0e40\u0e1e\u0e25\u0e17\u0e1b\u0e23\u0e30\u0e40\u0e21\u0e34\u0e19",
+ "Attendance": "\u0e01\u0e32\u0e23\u0e14\u0e39\u0e41\u0e25\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Attendance Control Panel": "\u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e1b\u0e23\u0e30\u0e0a\u0e38\u0e21",
+ "Authorization Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e2d\u0e19\u0e38\u0e21\u0e31\u0e15\u0e34",
+ "Authorization Rule": "\u0e01\u0e0e\u0e01\u0e32\u0e23\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15",
+ "BOM": "BOM",
+ "BOM Explosion Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14 BOM",
+ "BOM Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 BOM",
+ "BOM Operation": "\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e07\u0e32\u0e19 BOM",
+ "BOM Replace Tool": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48 BOM",
+ "Bank Reconciliation": "\u0e01\u0e23\u0e30\u0e17\u0e1a\u0e22\u0e2d\u0e14\u0e18\u0e19\u0e32\u0e04\u0e32\u0e23",
+ "Bank Reconciliation Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e32\u0e23\u0e01\u0e23\u0e30\u0e17\u0e1a\u0e22\u0e2d\u0e14\u0e18\u0e19\u0e32\u0e04\u0e32\u0e23",
+ "Batch": "\u0e0a\u0e38\u0e14",
+ "Bin": "\u0e16\u0e31\u0e07",
+ "Blog": "\u0e1a\u0e25\u0e47\u0e2d\u0e01",
+ "Blog Subscriber": "\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01\u0e1a\u0e25\u0e47\u0e2d\u0e01",
+ "Branch": "\u0e2a\u0e32\u0e02\u0e32",
+ "Brand": "\u0e22\u0e35\u0e48\u0e2b\u0e49\u0e2d",
+ "Budget Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13",
+ "Budget Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13",
+ "Budget Distribution": "\u0e01\u0e32\u0e23\u0e41\u0e1e\u0e23\u0e48\u0e01\u0e23\u0e30\u0e08\u0e32\u0e22\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13",
+ "Budget Distribution Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e08\u0e33\u0e2b\u0e19\u0e48\u0e32\u0e22\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13",
+ "Bulk Email": "\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e4c\u0e02\u0e22\u0e30",
+ "Buying": "\u0e01\u0e32\u0e23\u0e0b\u0e37\u0e49\u0e2d",
+ "C-Form": "C-Form",
+ "C-Form Invoice Detail": "C-Form \u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Campaign": "\u0e23\u0e13\u0e23\u0e07\u0e04\u0e4c",
+ "Cancel": "\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",
+ "Comment": "\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2b\u0e47\u0e19",
+ "Communication": "\u0e01\u0e32\u0e23\u0e2a\u0e37\u0e48\u0e2d\u0e2a\u0e32\u0e23",
+ "Communication Log": "\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e01\u0e32\u0e23\u0e2a\u0e37\u0e48\u0e2d\u0e2a\u0e32\u0e23",
+ "Company": "\u0e1a\u0e23\u0e34\u0e29\u0e31\u0e17",
+ "Company Control": "\u0e01\u0e32\u0e23\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e02\u0e2d\u0e07 \u0e1a\u0e23\u0e34\u0e29\u0e31\u0e17",
+ "Company History": "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 \u0e1a\u0e23\u0e34\u0e29\u0e31\u0e17",
+ "Contact": "\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d",
+ "Contact Control": "\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21",
+ "Contact Us Settings": "\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d\u0e40\u0e23\u0e32\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
+ "Control Panel": "\u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21",
+ "Core": "\u0e41\u0e01\u0e19",
+ "Cost Center": "\u0e28\u0e39\u0e19\u0e22\u0e4c\u0e15\u0e49\u0e19\u0e17\u0e38\u0e19",
+ "Country": "\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28",
+ "Currency": "\u0e40\u0e07\u0e34\u0e19\u0e15\u0e23\u0e32",
+ "Custom Field": "\u0e1f\u0e34\u0e25\u0e14\u0e4c\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e2d\u0e07",
+ "Custom Script": "\u0e2a\u0e04\u0e23\u0e34\u0e1b\u0e15\u0e4c\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e2d\u0e07",
+ "Customer": "\u0e25\u0e39\u0e01\u0e04\u0e49\u0e32",
+ "Customer Group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e25\u0e39\u0e01\u0e04\u0e49\u0e32",
+ "Customer Issue": "\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e02\u0e2d\u0e07\u0e25\u0e39\u0e01\u0e04\u0e49\u0e32",
+ "Customize Form": "\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e15\u0e48\u0e07\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",
+ "Customize Form Field": "\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e02\u0e15\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e1f\u0e2d\u0e23\u0e4c\u0e21",
+ "Deduction Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e2b\u0e31\u0e01",
+ "Default Home Page": "\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19",
+ "DefaultValue": "\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19",
+ "Delivery Note": "\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38\u0e08\u0e31\u0e14\u0e2a\u0e48\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Delivery Note Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e2a\u0e48\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38",
+ "Delivery Note Packing Item": "\u0e08\u0e31\u0e14\u0e2a\u0e48\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e1a\u0e23\u0e23\u0e08\u0e38\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38",
+ "Department": "\u0e41\u0e1c\u0e19\u0e01",
+ "Designation": "\u0e01\u0e32\u0e23\u0e41\u0e15\u0e48\u0e07\u0e15\u0e31\u0e49\u0e07",
+ "Did not cancel": "\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",
+ "Did not save": "\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01",
+ "DocField": "DocField",
+ "DocPerm": "DocPerm",
+ "DocType": "DOCTYPE",
+ "DocType Label": "\u0e1b\u0e49\u0e32\u0e22 DocType",
+ "DocType Mapper": "Mapper DocType",
+ "Earning Type": "\u0e23\u0e32\u0e22\u0e44\u0e14\u0e49\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17",
+ "Email Digest": "\u0e02\u0e48\u0e32\u0e27\u0e2a\u0e32\u0e23\u0e17\u0e32\u0e07\u0e2d\u0e35\u0e40\u0e21\u0e25",
+ "Email Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e2d\u0e35\u0e40\u0e21\u0e25",
+ "Employee": "\u0e25\u0e39\u0e01\u0e08\u0e49\u0e32\u0e07",
+ "Employee Education": "\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e1e\u0e19\u0e31\u0e01\u0e07\u0e32\u0e19",
+ "Employee External Work History": "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e1e\u0e19\u0e31\u0e01\u0e07\u0e32\u0e19\u0e20\u0e32\u0e22\u0e19\u0e2d\u0e01",
+ "Employee Internal Work History": "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e1e\u0e19\u0e31\u0e01\u0e07\u0e32\u0e19\u0e20\u0e32\u0e22\u0e43\u0e19",
+ "Employee Training": "\u0e01\u0e32\u0e23\u0e1d\u0e36\u0e01\u0e2d\u0e1a\u0e23\u0e21\u0e1e\u0e19\u0e31\u0e01\u0e07\u0e32\u0e19",
+ "Employment Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e01\u0e32\u0e23\u0e08\u0e49\u0e32\u0e07\u0e07\u0e32\u0e19",
+ "Event": "\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c",
+ "Event Role": "\u0e1a\u0e17\u0e1a\u0e32\u0e17\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c",
+ "Event User": "\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19",
+ "Expense Claim": "\u0e40\u0e23\u0e35\u0e22\u0e01\u0e23\u0e49\u0e2d\u0e07\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22",
+ "Expense Claim Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22\u0e2a\u0e34\u0e19\u0e44\u0e2b\u0e21",
+ "Expense Claim Type": "\u0e40\u0e23\u0e35\u0e22\u0e01\u0e23\u0e49\u0e2d\u0e07\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22",
+ "Featured Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e40\u0e14\u0e48\u0e19",
+ "Features Setup": "\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e2a\u0e34\u0e48\u0e07\u0e2d\u0e33\u0e19\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e14\u0e27\u0e01",
+ "Feed": "\u0e01\u0e34\u0e19",
+ "Field Mapper Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e2a\u0e19\u0e32\u0e21\u0e41\u0e21\u0e1b\u0e40\u0e1b\u0e2d\u0e23\u0e4c",
+ "File Data": "\u0e41\u0e1f\u0e49\u0e21\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25",
+ "Fiscal Year": "\u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13",
+ "GL Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21 GL",
+ "GL Entry": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 GL",
+ "GL Mapper": "Mapper GL",
+ "GL Mapper Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14 Mapper GL",
+ "Global Defaults": "\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e17\u0e31\u0e48\u0e27\u0e42\u0e25\u0e01",
+ "Grade": "\u0e40\u0e01\u0e23\u0e14",
+ "HR": "\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e32\u0e01\u0e23\u0e1a\u0e38\u0e04\u0e04\u0e25",
+ "Holiday": "\u0e27\u0e31\u0e19\u0e2b\u0e22\u0e38\u0e14",
+ "Holiday Block List": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e27\u0e31\u0e19\u0e2b\u0e22\u0e38\u0e14",
+ "Holiday Block List Allow": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01 Holiday \u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49",
+ "Holiday Block List Date": "\u0e27\u0e31\u0e19\u0e2b\u0e22\u0e38\u0e14\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01",
+ "Holiday List": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e27\u0e31\u0e19\u0e2b\u0e22\u0e38\u0e14",
+ "Home": "\u0e1a\u0e49\u0e32\u0e19",
+ "Home Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01",
+ "Industry Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e2d\u0e38\u0e15\u0e2a\u0e32\u0e2b\u0e01\u0e23\u0e23\u0e21",
+ "Installation Note": "\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07",
+ "Installation Note Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07",
+ "Item": "\u0e0a\u0e34\u0e49\u0e19",
+ "Item Customer Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e25\u0e39\u0e01\u0e04\u0e49\u0e32\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23",
+ "Item Group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Item Price": "\u0e23\u0e32\u0e04\u0e32\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Item Quality Inspection Parameter": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e",
+ "Item Reorder": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 Reorder",
+ "Item Supplier": "\u0e1c\u0e39\u0e49\u0e1c\u0e25\u0e34\u0e15\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23",
+ "Item Tax": "\u0e20\u0e32\u0e29\u0e35\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Item Website Specification": "\u0e2a\u0e40\u0e1b\u0e01\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23",
+ "Job Applicant": "\u0e1c\u0e39\u0e49\u0e2a\u0e21\u0e31\u0e04\u0e23\u0e07\u0e32\u0e19",
+ "Job Opening": "\u0e40\u0e1b\u0e34\u0e14\u0e07\u0e32\u0e19",
+ "Jobs Email Settings": "\u0e07\u0e32\u0e19\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e2d\u0e35\u0e40\u0e21\u0e25",
+ "Journal Voucher": "\u0e1a\u0e31\u0e15\u0e23\u0e01\u0e33\u0e19\u0e31\u0e25\u0e27\u0e32\u0e23\u0e2a\u0e32\u0e23",
+ "Journal Voucher Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e1a\u0e31\u0e15\u0e23\u0e01\u0e33\u0e19\u0e31\u0e25\u0e27\u0e32\u0e23\u0e2a\u0e32\u0e23",
+ "Landed Cost Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22\u0e25\u0e07",
+ "Landed Cost Purchase Receipt": "\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22\u0e43\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e23\u0e31\u0e1a\u0e40\u0e07\u0e34\u0e19\u0e25\u0e07\u0e0b\u0e37\u0e49\u0e2d",
+ "Landed Cost Wizard": "\u0e15\u0e31\u0e27\u0e0a\u0e48\u0e27\u0e22\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e15\u0e49\u0e19\u0e17\u0e38\u0e19\u0e17\u0e35\u0e48\u0e14\u0e34\u0e19",
+ "Lead": "\u0e19\u0e33",
+ "Leave Allocation": "\u0e1d\u0e32\u0e01\u0e08\u0e31\u0e14\u0e2a\u0e23\u0e23",
+ "Leave Application": "\u0e1d\u0e32\u0e01\u0e41\u0e2d\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19",
+ "Leave Block List": "\u0e1d\u0e32\u0e01\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01",
+ "Leave Block List Allow": "\u0e1d\u0e32\u0e01\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49",
+ "Leave Block List Date": "\u0e1d\u0e32\u0e01\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01",
+ "Leave Control Panel": "\u0e1d\u0e32\u0e01\u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21",
+ "Leave Type": "\u0e1d\u0e32\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17",
+ "Letter Head": "\u0e2b\u0e31\u0e27\u0e08\u0e14\u0e2b\u0e21\u0e32\u0e22",
+ "MIS Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e23\u0e30\u0e1a\u0e1a\u0e2a\u0e32\u0e23\u0e2a\u0e19\u0e40\u0e17\u0e28",
+ "Maintenance Schedule": "\u0e15\u0e32\u0e23\u0e32\u0e07\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Maintenance Schedule Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e15\u0e32\u0e23\u0e32\u0e07\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Maintenance Schedule Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e15\u0e32\u0e23\u0e32\u0e07\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Maintenance Visit": "\u0e0a\u0e21\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Maintenance Visit Purpose": "\u0e27\u0e31\u0e15\u0e16\u0e38\u0e1b\u0e23\u0e30\u0e2a\u0e07\u0e04\u0e4c\u0e0a\u0e21\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31\u0e01\u0e29\u0e32",
+ "Manufacturing": "\u0e01\u0e32\u0e23\u0e1c\u0e25\u0e34\u0e15",
+ "Market Segment": "\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e25\u0e32\u0e14",
+ "Material Request": "\u0e02\u0e2d\u0e27\u0e31\u0e2a\u0e14\u0e38",
+ "Material Request Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e27\u0e31\u0e2a\u0e14\u0e38\u0e02\u0e2d",
+ "Mode of Payment": "\u0e42\u0e2b\u0e21\u0e14\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19",
+ "Module Def": "Def \u0e42\u0e21\u0e14\u0e39\u0e25",
+ "Multi Ledger Report Detail": "\u0e2b\u0e25\u0e32\u0e22\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e41\u0e22\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17",
+ "Naming Series": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e0a\u0e37\u0e48\u0e2d\u0e0b\u0e35\u0e23\u0e35\u0e2a\u0e4c",
+ "Naming Series Options": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e0a\u0e37\u0e48\u0e2d\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e0a\u0e38\u0e14",
+ "Newsletter": "\u0e08\u0e14\u0e2b\u0e21\u0e32\u0e22\u0e02\u0e48\u0e32\u0e27",
+ "No Permission": "\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15",
+ "No Permission to ": "\u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49",
+ "Not allowed for: ": "\u0e44\u0e21\u0e48\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49:",
+ "Notification Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19",
+ "Opportunity": "\u0e42\u0e2d\u0e01\u0e32\u0e2a",
+ "Opportunity Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e2d\u0e01\u0e32\u0e2a",
+ "Other Income Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u200b\u200b\u0e44\u0e14\u0e49\u0e2d\u0e37\u0e48\u0e19 \u0e46",
+ "POS Setting": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 POS",
+ "Packing Slip": "\u0e2a\u0e25\u0e34\u0e1b",
+ "Packing Slip Item": "\u0e1a\u0e23\u0e23\u0e08\u0e38\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e34\u0e1b",
+ "Page": "\u0e2b\u0e19\u0e49\u0e32",
+ "Page Role": "\u0e1a\u0e17\u0e1a\u0e32\u0e17\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48",
+ "Patch Log": "\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e41\u0e1e\u0e17\u0e0a\u0e4c",
+ "Payment to Invoice Matching Tool": "\u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Payment to Invoice Matching Tool Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Period Closing Voucher": "\u0e1a\u0e31\u0e15\u0e23\u0e01\u0e33\u0e19\u0e31\u0e25\u0e1b\u0e34\u0e14\u0e07\u0e27\u0e14",
+ "Permission Control": "\u0e01\u0e32\u0e23\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15",
+ "Price List": "\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e41\u0e08\u0e49\u0e07\u0e23\u0e32\u0e04\u0e32\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Print Format": "\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",
+ "Print Heading": "\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e2b\u0e31\u0e27\u0e40\u0e23\u0e37\u0e48\u0e2d\u0e07",
+ "Product Group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Product Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e1c\u0e25\u0e34\u0e15\u0e20\u0e31\u0e13\u0e11\u0e4c",
+ "Production Order": "\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e01\u0e32\u0e23\u0e1c\u0e25\u0e34\u0e15",
+ "Production Plan Item": "\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e41\u0e1c\u0e19\u0e01\u0e32\u0e23\u0e1c\u0e25\u0e34\u0e15",
+ "Production Plan Sales Order": "\u0e41\u0e1c\u0e19\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e02\u0e32\u0e22",
+ "Production Planning Tool": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e27\u0e32\u0e07\u0e41\u0e1c\u0e19\u0e01\u0e32\u0e23\u0e1c\u0e25\u0e34\u0e15",
+ "Products Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e1c\u0e25\u0e34\u0e15\u0e20\u0e31\u0e13\u0e11\u0e4c",
+ "Profile": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14",
+ "Profile Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14",
+ "Project": "\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Project Activity": "\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Project Activity Update": "\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Project Control": "\u0e01\u0e32\u0e23\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Project Milestone": "Milestone \u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Projects": "\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23",
+ "Property Setter": "\u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23 Setter",
+ "Purchase Common": "\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e32\u0e21\u0e31\u0e0d",
+ "Purchase Invoice": "\u0e0b\u0e37\u0e49\u0e2d\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Purchase Invoice Advance": "\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49\u0e01\u0e32\u0e23\u0e0b\u0e37\u0e49\u0e2d\u0e25\u0e48\u0e27\u0e07\u0e2b\u0e19\u0e49\u0e32",
+ "Purchase Invoice Item": "\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Purchase Order": "\u0e43\u0e1a\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d",
+ "Purchase Order Item": "\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d",
+ "Purchase Order Item Supplied": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e33\u0e2b\u0e19\u0e48\u0e32\u0e22",
+ "Purchase Receipt": "\u0e0b\u0e37\u0e49\u0e2d\u0e43\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e23\u0e31\u0e1a\u0e40\u0e07\u0e34\u0e19",
+ "Purchase Receipt Item": "\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e43\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e23\u0e31\u0e1a\u0e40\u0e07\u0e34\u0e19",
+ "Purchase Receipt Item Supplied": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e0b\u0e37\u0e49\u0e2d\u0e08\u0e33\u0e2b\u0e19\u0e48\u0e32\u0e22",
+ "Purchase Request": "\u0e0b\u0e37\u0e49\u0e2d\u0e02\u0e2d",
+ "Purchase Request Item": "\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e02\u0e2d",
+ "Purchase Taxes and Charges": "\u0e20\u0e32\u0e29\u0e35\u0e0b\u0e37\u0e49\u0e2d\u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23",
+ "Purchase Taxes and Charges Master": "\u0e20\u0e32\u0e29\u0e35\u0e0b\u0e37\u0e49\u0e2d\u0e41\u0e25\u0e30\u0e1b\u0e23\u0e34\u0e0d\u0e0d\u0e32\u0e42\u0e17\u0e04\u0e48\u0e32",
+ "Quality Inspection": "\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e",
+ "Quality Inspection Reading": "\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19",
+ "Question": "\u0e04\u0e33\u0e16\u0e32\u0e21",
+ "Quotation": "\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32",
+ "Quotation Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32",
+ "Quotation Lost Reason": "\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32 Lost \u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25",
+ "Related Page": "\u0e40\u0e1e\u0e08\u0e17\u0e35\u0e48\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e02\u0e49\u0e2d\u0e07",
+ "Rename Tool": "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d",
+ "Report": "\u0e23\u0e32\u0e22\u0e07\u0e32\u0e19",
+ "Role": "\u0e1a\u0e17\u0e1a\u0e32\u0e17",
+ "SMS Center": "\u0e28\u0e39\u0e19\u0e22\u0e4c SMS",
+ "SMS Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e2a\u0e48\u0e07 SMS",
+ "SMS Log": "\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a SMS",
+ "SMS Parameter": "\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c SMS",
+ "SMS Receiver": "\u0e23\u0e31\u0e1a SMS",
+ "SMS Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 SMS",
+ "Salary Manager": "Manager \u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23",
+ "Salary Slip": "\u0e2a\u0e25\u0e34\u0e1b\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19",
+ "Salary Slip Deduction": "\u0e2b\u0e31\u0e01\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e2a\u0e25\u0e34\u0e1b",
+ "Salary Slip Earning": "\u0e2a\u0e25\u0e34\u0e1b\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e23\u0e32\u0e22\u0e44\u0e14\u0e49",
+ "Salary Structure": "\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19",
+ "Salary Structure Deduction": "\u0e2b\u0e31\u0e01\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19",
+ "Salary Structure Earning": "\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e07\u0e34\u0e19\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e23\u0e32\u0e22\u0e44\u0e14\u0e49",
+ "Sales BOM": "BOM \u0e02\u0e32\u0e22",
+ "Sales BOM Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 BOM \u0e02\u0e32\u0e22",
+ "Sales Browser Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e40\u0e1a\u0e23\u0e32\u0e27\u0e4c\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e22\u0e2d\u0e14\u0e02\u0e32\u0e22",
+ "Sales Common": "\u0e02\u0e32\u0e22\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",
+ "Sales Email Settings": "\u0e02\u0e32\u0e22\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e2d\u0e35\u0e40\u0e21\u0e25",
+ "Sales Invoice": "\u0e02\u0e32\u0e22\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49",
+ "Sales Invoice Advance": "\u0e02\u0e32\u0e22\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49\u0e25\u0e48\u0e27\u0e07\u0e2b\u0e19\u0e49\u0e32",
+ "Sales Invoice Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e43\u0e1a\u0e41\u0e08\u0e49\u0e07\u0e2b\u0e19\u0e35\u0e49\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22",
+ "Sales Order": "\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e02\u0e32\u0e22",
+ "Sales Order Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22",
+ "Sales Partner": "\u0e1e\u0e31\u0e19\u0e18\u0e21\u0e34\u0e15\u0e23\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22",
+ "Sales Person": "\u0e04\u0e19\u0e02\u0e32\u0e22",
+ "Sales Taxes and Charges": "\u0e20\u0e32\u0e29\u0e35\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22\u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22",
+ "Sales Taxes and Charges Master": "\u0e20\u0e32\u0e29\u0e35\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22\u0e41\u0e25\u0e30\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22\u0e1b\u0e23\u0e34\u0e0d\u0e0d\u0e32\u0e42\u0e17",
+ "Sales Team": "\u0e17\u0e35\u0e21\u0e02\u0e32\u0e22",
+ "Sales and Purchase Return Item": "\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22\u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e01\u0e25\u0e31\u0e1a",
+ "Sales and Purchase Return Tool": "\u0e01\u0e32\u0e23\u0e02\u0e32\u0e22\u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e0b\u0e37\u0e49\u0e2d\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a",
+ "Sandbox": "sandbox",
+ "Scheduler Log": "\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e15\u0e32\u0e23\u0e32\u0e07\u0e40\u0e27\u0e25\u0e32",
+ "Search Criteria": "\u0e40\u0e01\u0e13\u0e11\u0e4c\u0e01\u0e32\u0e23\u0e04\u0e49\u0e19\u0e2b\u0e32",
+ "Selling": "\u0e02\u0e32\u0e22",
+ "Serial No": "\u0e2d\u0e19\u0e38\u0e01\u0e23\u0e21\u0e44\u0e21\u0e48\u0e21\u0e35",
+ "Series Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e0a\u0e38\u0e14",
+ "Setup": "\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07",
+ "Setup Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07",
+ "Shipping Address": "\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e08\u0e31\u0e14\u0e2a\u0e48\u0e07",
+ "State": "\u0e23\u0e31\u0e10",
+ "Stock": "\u0e04\u0e25\u0e31\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Stock Entry": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Stock Entry Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e32\u0e22\u200b\u200b\u0e01\u0e32\u0e23\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Stock Ledger": "\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e41\u0e22\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Stock Ledger Entry": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e41\u0e22\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17",
+ "Stock Reconciliation": "\u0e2a\u0e21\u0e32\u0e19\u0e09\u0e31\u0e19\u0e17\u0e4c\u0e2a\u0e15\u0e47\u0e2d\u0e01",
+ "Stock UOM Replace Utility": "\u0e2a\u0e15\u0e47\u0e2d\u0e01\u0e22\u0e39\u0e17\u0e34\u0e25\u0e34\u0e15\u0e35\u0e49\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48 UOM",
+ "Style Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30",
+ "Submit": "\u0e40\u0e2a\u0e19\u0e2d",
+ "Supplier": "\u0e1c\u0e39\u0e49\u0e08\u0e31\u0e14\u0e08\u0e33\u0e2b\u0e19\u0e48\u0e32\u0e22",
+ "Supplier Quotation": "\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e1c\u0e25\u0e34\u0e15",
+ "Supplier Quotation Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e43\u0e1a\u0e40\u0e2a\u0e19\u0e2d\u0e23\u0e32\u0e04\u0e32\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e1c\u0e25\u0e34\u0e15",
+ "Supplier Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e1c\u0e39\u0e49\u0e1c\u0e25\u0e34\u0e15",
+ "Support": "\u0e2a\u0e19\u0e31\u0e1a\u0e2a\u0e19\u0e38\u0e19",
+ "Support Ticket": "\u0e15\u0e31\u0e4b\u0e27\u0e2a\u0e19\u0e31\u0e1a\u0e2a\u0e19\u0e38\u0e19",
+ "System Console": "\u0e23\u0e30\u0e1a\u0e1a\u0e04\u0e2d\u0e19\u0e42\u0e0b\u0e25",
+ "Table Mapper Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e15\u0e32\u0e23\u0e32\u0e07\u0e41\u0e21\u0e1b\u0e40\u0e1b\u0e2d\u0e23\u0e4c",
+ "Tag": "\u0e41\u0e17\u0e47\u0e01",
+ "Target Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22",
+ "Task": "\u0e07\u0e32\u0e19",
+ "Terms and Conditions": "\u0e02\u0e49\u0e2d\u0e15\u0e01\u0e25\u0e07\u0e41\u0e25\u0e30\u0e40\u0e07\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e02",
+ "Territory": "\u0e2d\u0e32\u0e13\u0e32\u0e40\u0e02\u0e15",
+ "Timesheet": "timesheet",
+ "Timesheet Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14 Timesheet",
+ "ToDo": "\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33",
+ "Top Bar Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 Bar \u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48\u0e22\u0e2d\u0e14",
+ "Trash Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e16\u0e31\u0e07\u0e02\u0e22\u0e30",
+ "Trend Analyzer Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e27\u0e34\u0e40\u0e04\u0e23\u0e32\u0e30\u0e2b\u0e4c\u0e41\u0e19\u0e27\u0e42\u0e19\u0e49\u0e21",
+ "UOM": "UOM",
+ "UOM Conversion Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e32\u0e23\u0e41\u0e1b\u0e25\u0e07 UOM",
+ "Update": "\u0e2d\u0e31\u0e1e\u0e40\u0e14\u0e17",
+ "Update Delivery Date": "\u0e2d\u0e31\u0e1e\u0e40\u0e14\u0e17\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e48\u0e07",
+ "UserRole": "UserRole",
+ "Utilities": "\u0e22\u0e39\u0e17\u0e34\u0e25\u0e34\u0e15\u0e35\u0e49",
+ "Valuation Control": "\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e40\u0e21\u0e34\u0e19",
+ "Warehouse": "\u0e04\u0e25\u0e31\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Warehouse Type": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e04\u0e25\u0e31\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Warehouse User": "\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e25\u0e31\u0e07\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32",
+ "Web Page": "\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a",
+ "Website": "\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Item Group": "\u0e01\u0e25\u0e38\u0e48\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Product Category": "\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Script": "\u0e2a\u0e04\u0e23\u0e34\u0e1b\u0e15\u0e4c\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Slideshow": "\u0e2a\u0e44\u0e25\u0e14\u0e4c\u0e42\u0e0a\u0e27\u0e4c\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Website Slideshow Item": "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e2a\u0e44\u0e25\u0e14\u0e4c\u0e42\u0e0a\u0e27\u0e4c\u0e40\u0e27\u0e47\u0e1a\u0e44\u0e0b\u0e15\u0e4c",
+ "Workflow": "\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Action": "\u0e01\u0e32\u0e23\u0e01\u0e23\u0e30\u0e17\u0e33\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Action Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19",
+ "Workflow Document State": "\u0e23\u0e31\u0e10\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Engine": "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e22\u0e19\u0e15\u0e4c\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Rule": "\u0e01\u0e0e\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Rule Detail": "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e01\u0e0e\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow State": "\u0e23\u0e31\u0e10\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workflow Transition": "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c",
+ "Workstation": "\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e04\u0e2a\u0e40\u0e15\u0e0a\u0e31\u0e48",
+ "Write": "\u0e40\u0e02\u0e35\u0e22\u0e19"
+}
\ No newline at end of file
diff --git a/webnotes/model/utils.py b/webnotes/model/utils.py
index d719a90990..cd3d8f0830 100644
--- a/webnotes/model/utils.py
+++ b/webnotes/model/utils.py
@@ -192,9 +192,6 @@ def delete_doc(doctype=None, name=None, doclist = None, force=0):
# check if links exist
if not force:
check_if_doc_is_linked(doctype, name)
- # remove tags
- from webnotes.widgets.tags import clear_tags
- clear_tags(doctype, name)
try:
webnotes.conn.sql("delete from `tab%s` where name='%s' limit 1" % (doctype, name))
diff --git a/webnotes/widgets/query_builder.py b/webnotes/widgets/query_builder.py
index 2bcff2172d..a49be13bcc 100644
--- a/webnotes/widgets/query_builder.py
+++ b/webnotes/widgets/query_builder.py
@@ -103,7 +103,11 @@ def getmatchcondition(dt, ur):
for r in res:
if r[0] in ur: # role applicable to user
if r[1]:
- for d in webnotes.defaults.get_user_default_as_list(default_key) or ["** No Match **"]:
+ if ":" in r[1]:
+ keys = r[1].split(":")
+ else:
+ keys = [r[1], r[1]]
+ for d in webnotes.defaults.get_user_default_as_list(keys[0]) or ["** No Match **"]:
cond.append('`tab%s`.`%s`="%s"' % (dt, r[1], d))
else:
return ''
diff --git a/webnotes/widgets/reportview.py b/webnotes/widgets/reportview.py
index c70a43f478..6c22c071ed 100644
--- a/webnotes/widgets/reportview.py
+++ b/webnotes/widgets/reportview.py
@@ -344,11 +344,10 @@ def delete_items():
pass
@webnotes.whitelist()
-def get_stats():
+def get_stats(stats, doctype):
"""get tag info"""
import json
- tags = json.loads(webnotes.form_dict.get('stats'))
- doctype = webnotes.form_dict['doctype']
+ tags = json.loads(stats)
stats = {}
columns = get_table_columns(doctype)
diff --git a/webnotes/widgets/tags.py b/webnotes/widgets/tags.py
index 4196e84ca1..ba522c4317 100644
--- a/webnotes/widgets/tags.py
+++ b/webnotes/widgets/tags.py
@@ -46,7 +46,6 @@ Design:
import webnotes
from webnotes.utils import load_json
-
def check_user_tags(dt):
"if the user does not have a tags column, then it creates one"
try:
@@ -55,10 +54,6 @@ def check_user_tags(dt):
if e.args[0] == 1054:
DocTags(dt).setup()
-
-#
-# Add a new tag
-#
@webnotes.whitelist()
def add_tag():
"adds a new tag to a record, and creates the Tag master"
@@ -71,9 +66,6 @@ def add_tag():
return tag
-#
-# remove tag
-#
@webnotes.whitelist()
def remove_tag():
"removes tag from the record"
@@ -112,21 +104,14 @@ class DocTags:
if not tag in tl:
tl.append(tag)
self.update(dn, tl)
- TagCounter(self.dt).update(tag, 1)
def remove(self, dn, tag):
"""remove a user tag"""
tl = self.get_tags(dn).split(',')
self.update(dn, filter(lambda x:x!=tag, tl))
- TagCounter(self.dt).update(tag, -1)
def remove_all(self, dn):
"""remove all user tags (call before delete)"""
- tl = self.get_tags(dn).split(',')
- tl = filter(lambda x:x, tl)
- tc = TagCounter(self.dt)
- for t in tl:
- tc.update(t, -1)
self.update(dn, [])
def update(self, dn, tl):
@@ -162,122 +147,3 @@ class DocTags:
webnotes.conn.commit()
webnotes.conn.sql("alter table `tab%s` add column `_user_tags` varchar(180)" % self.dt)
webnotes.conn.begin()
-
-
-
-
-
-
-
-
-class TagCounter:
- """
- Tag Counter stores tag count per doctype in table _tag_cnt
- """
- def __init__(self, doctype):
- self.doctype = doctype
-
- # setup / update tag cnt
- # keeps tags in _tag_cnt (doctype, tag, cnt)
- # if doctype cnt does not exist
- # creates it for the first time
- def update(self, tag, diff):
- if not tag:
- return
- "updates tag cnt for a doctype and tag"
- cnt = webnotes.conn.sql("select cnt from `_tag_cnt` where doctype=%s and tag=%s", (self.doctype, tag))
-
- if not cnt:
- # first time? build a cnt and add
- self.new_tag(tag, 1)
- else:
- webnotes.conn.sql("update `_tag_cnt` set cnt = ifnull(cnt,0) + (%s) where doctype=%s and tag=%s",\
- (diff, self.doctype, tag))
-
-
- def new_tag(self, tag, cnt=0, dt=None):
- "Creates a new row for the tag and doctype"
- webnotes.conn.sql("insert into `_tag_cnt`(doctype, tag, cnt) values (%s, %s, %s)", \
- (dt or self.doctype, tag, cnt))
-
- def build(self, dt):
- "Builds / rebuilds the counting"
- webnotes.conn.sql("delete from _tag_cnt where doctype=%s", dt)
-
- # count
- tags = {}
- for ut in webnotes.conn.sql("select _user_tags from `tab%s`" % dt):
- if ut[0]:
- tag_list = ut[0].split(',')
- for t in tag_list:
- if t:
- tags[t] = tags.get(t, 0) + 1
-
- # insert
- for t in tags:
- self.new_tag(t, tags[t], dt)
-
- def load_top(self):
- try:
- return webnotes.conn.sql("select tag, cnt from `_tag_cnt` where doctype=%s and cnt>0 order by cnt desc limit 10", self.doctype, as_list = 1)
- except Exception, e:
- if e.args[0]==1146:
- self.setup()
- return self.load_top()
- else: raise e
-
- def setup(self):
- "creates the tag cnt table from the DocType"
- webnotes.conn.commit()
- webnotes.conn.sql("""
- create table `_tag_cnt` (
- doctype varchar(180), tag varchar(22), cnt int(10),
- primary key (doctype, tag), index cnt(cnt)) ENGINE=InnoDB
- """)
- webnotes.conn.begin()
-
- # build all
- for dt in webnotes.conn.sql("select name from tabDocType where ifnull(issingle,0)=0 and docstatus<2"):
- try:
- self.build(dt[0])
- except Exception, e:
- if e.args[0]==1054: pass
- else: raise e
-
-
-
-def get_top_field_tags(dt):
- from webnotes.model.doctype import get_property
- tf = get_property(dt, 'tag_fields')
-
- if not tf: return []
-
- # restrict to only 2 fields
- tf = tuple(set(tf.split(',')))[:2]
- tl = []
-
- for t in tf:
- t = t.strip()
- # disastrous query but lets try it!
- tl += webnotes.conn.sql("""select `%s`, count(*), '%s' from `tab%s`
- where docstatus!=2
- and ifnull(`%s`, '')!=''
- group by `%s`
- order by count(*) desc
- limit 10""" % (t, t, dt, t, t), as_list=1)
-
- if tl:
- tl.sort(lambda x, y: y[1]-x[1])
-
- return tl[:10]
-
-# returns the top ranked 10 tags for the
-# doctype.
-# merges the top tags from fields and user tags
-@webnotes.whitelist()
-def get_top_tags(args=''):
- "returns the top 10 tags for the doctype from fields (7) and users (3)"
- return []
-
-def clear_tags(dt, dn):
- DocTags(dt).remove_all(dn)