Name
global.DictionaryUtils
Description
No description available
Script
gs.include("PrototypeServer");
var DictionaryUtils = Class.create();
DictionaryUtils.prototype = {
isDeletable: function (curr) {
// works for both tables and fields
// This is to protect system things, which are:
// a) Global scoped fields/tables that don't have u_ (though you can delete them if you're maint and in developer mode)
// b) Store fields/tables that don't have u_ (can't even delete them if you're maint)
// Assume access handlers have run, so we know we're in the same scope as the field or table
var tableName = curr.name.toString();
var isColumn = !(curr.getRecordClassName() == 'sys_db_object' || curr.element.nil());
var name = isColumn ? curr.element.toString() : tableName; // deletion target, either the column or table name
var isCustomItem = this._isUserCustomization(name) || this._isFromCustomerScopedApp(name);
// user customizations are permitted for delete in all situations
if (this._isUserCustomization(name))
return true;
// allow deletion of sys_domain, sys_domain_path, or sys_overrides column on a user-created table
if (isColumn && (name == 'sys_domain' || name == 'sys_domain_path' || name == 'sys_overrides')) {
if (this._isUserCustomization(tableName))
return true;
}
// Items may be deleted form global scope if they are custom and from a deleted pkg
// (or if user is maint on a developer mode instance)
if (curr.isInGlobalScope()) {
if (gs.hasRole('maint') && GlideUtil.isDeveloperInstance())
return true;
return isCustomItem && this._fromDeletedPackage(curr);
}
// Store app items may only be deleted if the app is being uninstalled (no maint override) or user created a custom table under the app
if (curr.isInStoreScope())
return SNC.Apps.isScopeBeingUninstalled(curr.sys_scope) || this._isCustomDbTable(tableName);
// At this point we have a non-global, non-store item. If item is in same scope as user, okay to delete
if (this._isItemInUserScope(name, tableName))
return true;
// Otherwise we'll permit delete if it's a non-ServiceNow item and the package is not found
return isCustomItem && this._fromDeletedPackage(curr);
},
// u_ prefix indicates user customization of global or store apps
_isUserCustomization: function (name) {
return name.startsWith('u_');
},
// x_ prefix indicates item belongs to either a store or custom app
_isFromCustomerScopedApp: function (name) {
return name.startsWith('x_');
},
_fromDeletedPackage: function (curr) {
var pkg = curr.sys_package.toString();
if (!gs.nil(pkg) && pkg != 'global') {
var pkgGR = new GlideRecord('sys_package');
if (!pkgGR.get(pkg))
return true;
}
return false;
},
_isItemInUserScope: function (targetName, tableName) {
var userPrefix = SNC.Apps.getDatabasePrefixForUser();
return targetName.indexOf(userPrefix) == 0 || tableName.indexOf(userPrefix) == 0;
},
_isCustomDbTable: function (targetName) {
var customObject = new GlideRecord('sys_custom_db_object');
customObject.addQuery('source', targetName);
customObject.addQuery('source_type', 'table');
customObject.addQuery('source_scope', gs.getCurrentApplicationId());
customObject.query();
return customObject.hasNext();
}
};
Sys ID
9caeecd0d723210000210fae6e610339