def deleteNode(self, uid): """ Deletes a node from the tree. B{NOTE}: You can not delete a root node of a tree @type uid: string @param uid: Unique identifier of the node we wish to delete @rtype: DirectResponse @return: B{Properties}: - msg: (string) Status message """ # make sure we are not deleting a root node if not self._canDeleteUid(uid): raise Exception('You cannot delete the root node') facade = self._getFacade() node = facade._getObject(uid) # Audit first so it can display details like "name" while they exist. # Trac #29148: When we delete a DeviceClass we also delete its devices # and child device classes and their devices, so audit them all. if isinstance(node, DeviceClass): childBrains = ICatalogTool(node).search(( 'Products.ZenModel.DeviceClass.DeviceClass', 'Products.ZenModel.Device.Device', )) for child in childBrains: audit(['UI', getDisplayType(child), 'Delete'], child.getPath()) else: audit(['UI', getDisplayType(node), 'Delete'], node) facade.deleteNode(uid) msg = "Deleted node '%s'" % uid return DirectResponse.succeed(msg=msg)
def manage_deleteOrganizer(self, orgname, REQUEST=None): """ Deletes an organizer underneath this organizer @param orgname: Name of the organizer to delete @type orgname: string @raise: KeyError @permission: ZEN_DELETE >>> dmd.Devices.manage_deleteOrganizer('/Devices/Server/Linux') """ if REQUEST: audit(('UI', getDisplayType(self), 'Delete'), orgname) if orgname.startswith("/"): try: orgroot = self.getDmdRoot(self.dmdRootName) organizer = orgroot.getOrganizer(orgname) parent = aq_parent(organizer) parent._delObject(organizer.getId()) except KeyError: pass # we may have already deleted a sub object else: self._delObject(orgname) if REQUEST: messaging.IMessageSender(self).sendToBrowser( 'Organizer Deleted', '%s "%s" was deleted.' % (getDisplayType(self), orgname) ) return self.callZenScreen(REQUEST)
def manage_deleteOrganizers(self, organizerPaths=None, REQUEST=None): """ Delete a list of Organizers from the database using their ids. @param organizerPaths: Names of organizer to be deleted @type organizerPaths: list @permission: ZEN_DELETE >>> dmd.Devices.manage_deleteOrganizers(['/Devices/Server/Linux', ... '/Devices/Server/Windows']) """ if not organizerPaths: messaging.IMessageSender(self).sendToBrowser( 'Error', 'No organizers were specified.', priority=messaging.WARNING ) return self.callZenScreen(REQUEST) for organizerName in organizerPaths: if REQUEST: audit(('UI',getDisplayType(self),'Delete'), organizerName) self.manage_deleteOrganizer(organizerName) if REQUEST: plural = '' if len(organizerPaths) > 1: plural = 's' messaging.IMessageSender(self).sendToBrowser( 'Organizers Deleted', '%s%s %s were deleted.' % (getDisplayType(self), plural, ', '.join(organizerPaths)) ) return self.callZenScreen(REQUEST)
def manage_addOrganizer(self, newPath, factory=None, properties=None, REQUEST=None): """ Adds a new organizer under this organizer. if given a fully qualified path it will create an organizer at that path @param newPath: Path of the organizer to be created @type newPath: string @raise: ZentinelException @permission: ZEN_ADD """ if factory is None: factory = self.__class__ if not newPath: return self.callZenScreen(REQUEST) try: if newPath.startswith("/"): org = self.createOrganizer(newPath) name = org.titleOrId() else: # Strip out invalid characters from the newPath name = newPath newPath = self.prepId(newPath) org = factory(newPath) self._setObject(org.id, org) # Set the display name to the original string org = self._getOb(newPath) # Allow adding additional properties to the organizer. # All organizers use this to set description. # Locations use this to set address. if properties: for k, v in properties.items(): setattr(org, k, v) org.setTitle(name) except ZentinelException as e: if REQUEST: messaging.IMessageSender(self).sendToBrowser( 'Error', e, priority=messaging.WARNING) return self.callZenScreen(REQUEST) if REQUEST: audit(('UI', getDisplayType(org), 'Add'), org) messaging.IMessageSender(self).sendToBrowser( 'Organizer Added', '%s "%s" was created.' % (getDisplayType(self), newPath)) return self.callZenScreen(REQUEST)
def zmanage_editProperties(self, REQUEST=None, redirect=False, audit=True): """ Edit a ZenModel object and return its proper page template. Object will be reindexed if nessesary. @permission: ZEN_MANAGE_DMD """ self.manage_changeProperties(**REQUEST.form) index_object = getattr(self, 'index_object', lambda self: None) index_object() if REQUEST: from Products.ZenUtils.Time import SaveMessage messaging.IMessageSender(self).sendToBrowser( 'Properties Saved', SaveMessage() ) if audit: auditType = getDisplayType(self) auditKind = 'Setting' if auditType == 'DataRoot' else auditType auditFn(['UI', auditKind, 'Edit'], data_=REQUEST.form, skipFields_=('redirect', 'zenScreenName', 'zmanage_editProperties'), maskFields_=('smtpPass')) return self.callZenScreen(REQUEST, redirect=redirect)
def setInfo(self, **data): """ Set attributes on an object. This method accepts any keyword argument for the property that you wish to set. The only required property is "uid". @type uid: string @keyword uid: Unique identifier of an object @rtype: DirectResponse @return: B{Properties}: - data: (dictionary) The modified object """ uid = data['uid'] del data['uid'] obj = self._getFacade()._getObject(uid) passwordFields = self._getPasswordFields(obj) oldData = self._getInfoData(obj, data) info = self._getFacade().setInfo(uid, data) newData = self._getInfoData(obj, data) # Trac #29376: Consistently show thresholdType with threshold operations. thresholdType = obj.getTypeName() if isinstance(obj, ThresholdClass) else None audit(['UI', getDisplayType(obj), 'Edit'], obj, thresholdType=thresholdType, data_=newData, oldData_=oldData, skipFields_=('newId',), # special case in TemplateFacade.setInfo() maskFields_=passwordFields) return DirectResponse.succeed(data=Zuul.marshal(info))
def saveZenProperties(self, pfilt=iszprop, REQUEST=None): """Save all ZenProperties found in the REQUEST.form object. """ maskFields = [] for name, value in REQUEST.form.items(): if pfilt(name): if self.zenPropIsPassword(name): maskFields.append(name) if self._onlystars(value): continue if name == 'zCollectorPlugins': if tuple(getattr(self, name, ())) != tuple(value): self.setZenProperty(name, value) else: self.setZenProperty(name, value) if REQUEST: audit(('UI', getDisplayType(self), 'EditProperties'), self, data_=REQUEST.form, skipFields_=['savezenproperties', 'zenscreenname'], maskFields_=maskFields) IMessageSender(self).sendToBrowser( 'Configuration Propeties Updated', 'Configuration properties have been updated.') return self.callZenScreen(REQUEST)
def setGraphDefinition(self, **data): """ Set attributes on an graph definition. This method accepts any keyword argument for the property that you wish to set. Properties are enumerated via getGraphDefinition(). The only required property is "uid". @type uid: string @keyword uid: Unique identifier of an object @rtype: DirectResponse @return: B{Properties}: - data: (dictionary) The modified object """ uid = data['uid'] del data['uid'] for axis_vals in ('miny', 'maxy'): try: x = float(data[axis_vals]) except (ValueError, KeyError): x = -1 data[axis_vals] = x obj = self._getFacade()._getObject(uid) oldData = self._getInfoData(obj, data) self._getFacade().setInfo(uid, data) newData = self._getInfoData(obj, data) audit(['UI', getDisplayType(obj), 'Edit'], data_=newData, oldData_=oldData, skipFields_=('newId',)) # special case in TemplateFacade.setInfo() return DirectResponse.succeed()
def removeDevices(self, deviceNames=None, deleteStatus=False, deleteHistory=False, deletePerf=False, REQUEST=None): """see IManageDevice""" from Products.ZenUtils.Utils import unused unused(deleteHistory, deletePerf, deleteStatus) if not deviceNames: return self() if isinstance(deviceNames, basestring): deviceNames = (deviceNames, ) for devname in deviceNames: self.devices._delObject(devname) if REQUEST: if self.meta_type == 'PerformanceConf': actionName = 'RemoveFromCollector' objId = self.id else: actionName = 'Remove' objId = self.getPrimaryId() objType = getDisplayType(self) audit(['UI.Device', actionName], devname, data_={objType: objId}) if REQUEST: return self()
def saveZenProperties(self, pfilt=iszprop, REQUEST=None): """Save all ZenProperties found in the REQUEST.form object. """ maskFields=[] for name, value in REQUEST.form.items(): if pfilt(name): if self.zenPropIsPassword(name): maskFields.append(name) if self._onlystars(value): continue if name == 'zCollectorPlugins': if tuple(getattr(self, name, ())) != tuple(value): self.setZenProperty(name, value) else: self.setZenProperty(name, value) if REQUEST: audit(('UI', getDisplayType(self), 'EditProperties'), self, data_=REQUEST.form, skipFields_=['savezenproperties','zenscreenname'], maskFields_=maskFields) IMessageSender(self).sendToBrowser( 'Configuration Propeties Updated', 'Configuration properties have been updated.' ) return self.callZenScreen(REQUEST)
def manage_addReport(context, id, title = None, text=None, REQUEST = None, submit=None): """make a Report""" id = str(id) if REQUEST is None: context._setObject(id, Report(id, text)) ob = getattr(context, id) if title: ob.pt_setTitle(title) return ob else: file = REQUEST.form.get('file') headers = getattr(file, 'headers', None) if headers is None or not file.filename: zpt = Report(id) else: zpt = Report(id, file, headers.get('content_type')) context._setObject(id, zpt) audit('UI.Report.Add', zpt.id, title=title, text=text, reportType=getDisplayType(zpt), organizer=context) try: u = context.DestinationURL() except AttributeError: u = REQUEST['URL1'] if submit == " Add and Edit ": u = "%s/%s" % (u, quote(id)) REQUEST.RESPONSE.redirect(u+'/manage_main') return ''
def setGraphDefinition(self, **data): """ Set attributes on an graph definition. This method accepts any keyword argument for the property that you wish to set. Properties are enumerated via getGraphDefinition(). The only required property is "uid". @type uid: string @keyword uid: Unique identifier of an object @rtype: DirectResponse @return: B{Properties}: - data: (dictionary) The modified object """ uid = data['uid'] del data['uid'] for int_attr in ('miny', 'maxy'): try: x = int(data[int_attr]) except (ValueError, KeyError): x = -1 data[int_attr] = x obj = self._getFacade()._getObject(uid) oldData = self._getInfoData(obj, data) self._getFacade().setInfo(uid, data) newData = self._getInfoData(obj, data) audit(['UI', getDisplayType(obj), 'Edit'], data_=newData, oldData_=oldData, skipFields_=( 'newId', )) # special case in TemplateFacade.setInfo() return DirectResponse.succeed()
def zmanage_editProperties(self, REQUEST=None, redirect=False, audit=True): """ Edit a ZenModel object and return its proper page template. Object will be reindexed if nessesary. @permission: ZEN_MANAGE_DMD """ self.manage_changeProperties(**REQUEST.form) index_object = getattr(self, 'index_object', lambda self: None) index_object() if REQUEST: messaging.IMessageSender(self).sendToBrowser( 'Properties Saved', "Saved At: %s" % self.getCurrentUserNowString() ) if audit: auditType = getDisplayType(self) auditKind = 'Setting' if auditType == 'DataRoot' else auditType auditFn(['UI', auditKind, 'Edit'], data_=REQUEST.form, skipFields_=('redirect', 'zenScreenName', 'zmanage_editProperties'), maskFields_=('smtpPass')) return self.callZenScreen(REQUEST, redirect=redirect)
def setInfo(self, **data): """ Set attributes on an object. This method accepts any keyword argument for the property that you wish to set. The only required property is "uid". @type uid: string @keyword uid: Unique identifier of an object @rtype: DirectResponse @return: B{Properties}: - data: (dictionary) The modified object """ uid = data['uid'] del data['uid'] obj = self._getFacade()._getObject(uid) oldData = self._getInfoData(obj, data) info = self._getFacade().setInfo(uid, data) newData = self._getInfoData(obj, data) # Trac #29376: Consistently show thresholdType with threshold operations. thresholdType = obj.getTypeName() if isinstance( obj, ThresholdClass) else None audit(['UI', getDisplayType(obj), 'Edit'], obj, thresholdType=thresholdType, data_=newData, oldData_=oldData, skipFields_=( 'newId', )) # special case in TemplateFacade.setInfo() return DirectResponse.succeed(data=Zuul.marshal(info))
def manage_editAdministrativeRoles(self, ids=(), role=(), REQUEST=None): """ Edit list of admin roles. """ if isinstance(ids, basestring): ids = [ids] role = [role] editedRoles = [] for i, id in enumerate(ids): roleEdit = (id, role[i]) editedRoles.append(roleEdit) ar = self.adminRoles._getOb(roleEdit[0]) ar.update(roleEdit[1]) self.setAdminLocalRoles() self.index_object() notify(IndexingEvent(self)) if REQUEST: for roleEdit in editedRoles: audit(['UI', getDisplayType(self), 'EditAdministrativeRole'], self, id=roleEdit[0], role=roleEdit[1]) messaging.IMessageSender(self).sendToBrowser( 'Admin Roles Updated', ('The following administrative roles have been updated: ' '%s' % ", ".join(ids)) ) return self.callZenScreen(REQUEST)
def manage_addMultiGraphReport(context, id, REQUEST = None): """ Create a new MultiGraphReport """ gr = MultiGraphReport(id) context._setObject(gr.id, gr) if REQUEST is not None: audit('UI.Report.Add', gr.id, reportType=getDisplayType(gr), organizer=context) REQUEST['RESPONSE'].redirect(context.absolute_url_path()+'/manage_main')
def moveOrganizer(self, moveTarget, organizerPaths=None, REQUEST=None): """ Move organizers under this organizer to another organizer @param moveTarget: Name of the destination organizer @type moveTarget: string @param organizerPaths: Paths of organizers to be moved @type organizerPaths: list >>> dmd.Events.Status.moveOrganizer('/Events/Ignore', ... ['Ping', 'Snmp']) """ if not moveTarget or not organizerPaths: return self() target = self.getDmdRoot(self.dmdRootName).getOrganizer(moveTarget) movedStuff = False for organizerName in organizerPaths: if moveTarget.find(organizerName) > -1: continue obj = self._getOb(organizerName, None) if obj is None: continue obj._operation = 1 #move object self._delObject(organizerName) target._setObject(organizerName, obj) movedStuff = True if REQUEST: if movedStuff: plural = '' if len(organizerPaths) > 1: plural = 's' for organizerName in organizerPaths: audit(('UI', getDisplayType(self), 'Move'), organizerName, data_={ 'from': getDisplayName(self), 'to': getDisplayName(target) }) messaging.IMessageSender(self).sendToBrowser( 'Organizers Moved', '%s%s %s were moved to %s.' % (getDisplayType(self), plural, ', '.join(organizerPaths), moveTarget)) else: messaging.IMessageSender(self).sendToBrowser( 'Error', 'No %s were moved.' % getDisplayType(self), priority=messaging.WARNING) return target.callZenScreen(REQUEST)
def saveCustProperties(self, REQUEST): """ Save custom properties from REQUEST.form. @permission: ZEN_MANAGE_DMD """ redirect = self.saveZenProperties(iscustprop, REQUEST) auditFn(['UI', getDisplayType(self), 'Edit'], self, data_=REQUEST.form, skipFields_=('zenScreenName', 'saveCustProperties')) return redirect
def manage_addMultiGraphReport(self, id, REQUEST=None): """Add a MultiGraph report to this object. """ fr = MultiGraphReport(id) self._setObject(id, fr) if REQUEST: audit('UI.Report.Add', fr.id, reportType=getDisplayType(fr)) url = '%s/%s/editMultiGraphReport' % (self.getPrimaryUrlPath(), id) return REQUEST['RESPONSE'].redirect(url) return self._getOb(id)
def manage_addMultiGraphReport(self, id, REQUEST=None): """Add a MultiGraph report to this object. """ fr = MultiGraphReport(id) self._setObject(id, fr) if REQUEST: audit("UI.Report.Add", fr.id, reportType=getDisplayType(fr)) url = "%s/%s/editMultiGraphReport" % (self.getPrimaryUrlPath(), id) return REQUEST["RESPONSE"].redirect(url) return self._getOb(id)
def manage_addGraphReport(self, id, REQUEST=None): """Add a graph report to this object. """ fr = GraphReport(id) self._setObject(id, fr) fr = self._getOb(id) if REQUEST: audit('UI.Report.Add', fr.id, reportType=getDisplayType(fr)) url = '%s/%s/editGraphReport' % (self.getPrimaryUrlPath(),id) return REQUEST['RESPONSE'].redirect(url) return fr
def manage_addDeviceReport(self, id, REQUEST=None): """Add a custom device report to this object. """ rpt = DeviceReport(id) self._setObject(rpt.id, rpt) rpt = self._getOb(rpt.id) if REQUEST: audit('UI.Report.Add', rpt.id, reportType=getDisplayType(rpt)) url = '%s/%s/editDeviceReport' % (self.getPrimaryUrlPath(), id) return REQUEST['RESPONSE'].redirect(url) return rpt
def manage_addMultiGraphReport(context, id, REQUEST=None): """ Create a new MultiGraphReport """ gr = MultiGraphReport(id) context._setObject(gr.id, gr) if REQUEST is not None: audit('UI.Report.Add', gr.id, reportType=getDisplayType(gr), organizer=context) REQUEST['RESPONSE'].redirect(context.absolute_url() + '/manage_main')
def moveOrganizer(self, moveTarget, organizerPaths=None, REQUEST=None): """ Move organizers under this organizer to another organizer @param moveTarget: Name of the destination organizer @type moveTarget: string @param organizerPaths: Paths of organizers to be moved @type organizerPaths: list >>> dmd.Events.Status.moveOrganizer('/Events/Ignore', ... ['Ping', 'Snmp']) """ if not moveTarget or not organizerPaths: return self() target = self.getDmdRoot(self.dmdRootName).getOrganizer(moveTarget) movedStuff = False for organizerName in organizerPaths: if moveTarget.find(organizerName) > -1: continue obj = self._getOb(organizerName, None) if obj is None: continue obj._operation = 1 #move object self._delObject(organizerName) target._setObject(organizerName, obj) movedStuff = True if REQUEST: if movedStuff: plural = '' if len(organizerPaths) > 1: plural = 's' for organizerName in organizerPaths: audit(('UI', getDisplayType(self), 'Move'), organizerName, data_={'from':getDisplayName(self), 'to':getDisplayName(target)}) messaging.IMessageSender(self).sendToBrowser( 'Organizers Moved', '%s%s %s were moved to %s.' % (getDisplayType(self), plural, ', '.join(organizerPaths), moveTarget) ) else: messaging.IMessageSender(self).sendToBrowser( 'Error', 'No %s were moved.' % getDisplayType(self), priority=messaging.WARNING ) return target.callZenScreen(REQUEST)
def manage_addGraphReport(self, id, REQUEST=None): """Add an graph report to this object. """ if id: from Products.ZenModel.GraphReport import GraphReport gr = GraphReport(id) self._setObject(id, gr) if REQUEST: audit('UI.Report.Add', gr.id, reportType=getDisplayType(gr)) messaging.IMessageSender(self).sendToBrowser( 'Report Created', 'Graph report %s was created.' % id) return self.callZenScreen(REQUEST)
def manage_addDeviceReport(context, id, title = None, REQUEST = None): """Add a DeviceReport """ dc = DeviceReport(id, title) context._setObject(id, dc) if REQUEST is not None: audit('UI.Report.Add', dc.id, title=title, reportType=getDisplayType(dc), organizer=context) messaging.IMessageSender(context).sendToBrowser( 'Report Created', 'Device report %s was created.' % id ) return REQUEST['RESPONSE'].redirect(context.absolute_url() + '/manage_main')
def manage_addDeviceReport(context, id, title = None, REQUEST = None): """Add a DeviceReport """ dc = DeviceReport(id, title) context._setObject(id, dc) if REQUEST is not None: audit('UI.Report.Add', dc.id, title=title, reportType=getDisplayType(dc), organizer=context) messaging.IMessageSender(context).sendToBrowser( 'Report Created', 'Device report %s was created.' % id ) return REQUEST['RESPONSE'].redirect(context.absolute_url_path() + '/manage_main')
def manage_addDeviceReport(self, id, REQUEST=None): """Add a report to this object. """ from Products.ZenModel.DeviceReport import DeviceReport fr = DeviceReport(id) self._setObject(id, fr) fr = self._getOb(id) if REQUEST: audit('UI.Report.Add', fr.id, reportType=getDisplayType(fr)) url = '%s/%s/editDeviceReport' % (self.getPrimaryUrlPath(), id) return REQUEST['RESPONSE'].redirect(url) return fr
def setInfo(self, **data): """ Main method for setting attributes on a network or network organizer. This method accepts any keyword argument for the property that you wish to set. The only required property is "uid". @type uid: string @keyword uid: Unique identifier of an object @rtype: DirectResponse """ network = self.api.getInfo(data['uid']) Zuul.unmarshal(data, network) audit(['UI', getDisplayType(network), 'Edit'], network, data_=data) return DirectResponse.succeed()
def manage_addGraphReport(self, id, REQUEST=None): """Add an graph report to this object. """ if id: from Products.ZenModel.GraphReport import GraphReport gr = GraphReport(id) self._setObject(id, gr) if REQUEST: audit('UI.Report.Add', gr.id, reportType=getDisplayType(gr)) messaging.IMessageSender(self).sendToBrowser( 'Report Created', 'Graph report %s was created.' % id ) return self.callZenScreen(REQUEST)
def manage_addAdministrativeRole(self, newId=None, REQUEST=None): "Add a Admin Role to this device" us = self.ZenUsers.getUserSettings(newId) AdministrativeRole(us, self) self.setAdminLocalRoles() self.index_object() notify(IndexingEvent(self)) if REQUEST: if us: audit(['UI', getDisplayType(self), 'AddAdministrativeRole'], self, newId=newId) messaging.IMessageSender(self).sendToBrowser( 'Admin Role Added', 'The %s administrative role has been added.' % newId ) return self.callZenScreen(REQUEST)
def moveOrganizer(self, targetUid, organizerUid): """ Move the organizer uid to be underneath the organizer specified by the targetUid. @type targetUid: string @param targetUid: New parent of the organizer @type organizerUid: string @param organizerUid: The organizer to move @rtype: DirectResponse @return: B{Properties}: - data: (dictionary) Moved organizer """ facade = self._getFacade() display_type = getDisplayType(facade._getObject(organizerUid)) audit(['UI', display_type, 'Move'], organizerUid, to=targetUid) data = facade.moveOrganizer(targetUid, organizerUid) return DirectResponse.succeed(data=Zuul.marshal(data))
def deleteZenProperty(self, propname=None, REQUEST=None): """ Delete device tree properties from the this DeviceClass object. """ if propname: try: self._delProperty(propname) except AttributeError: #occasional object corruption where the propName is in #_properties but not set as an attribute. filter out the prop #and create a new _properties tuple newProps = [x for x in self._properties if x['id'] != propname] self._properties=tuple(newProps) except ValueError: raise ZenPropertyDoesNotExist() if REQUEST: if propname: audit(('UI',getDisplayType(self),'DeleteZProperty'), self, property=propname) return self.callZenScreen(REQUEST)
def removeDevices(self, deviceNames=None, deleteStatus=False, deleteHistory=False, deletePerf=False,REQUEST=None): """see IManageDevice""" from Products.ZenUtils.Utils import unused unused(deleteHistory, deletePerf, deleteStatus) if not deviceNames: return self() if isinstance(deviceNames, basestring): deviceNames = (deviceNames,) for devname in deviceNames: self.devices._delObject(devname) if REQUEST: if self.meta_type == 'PerformanceConf': actionName = 'RemoveFromCollector' objId = self.id else: actionName = 'Remove' objId = self.getPrimaryId() objType = getDisplayType(self) audit(['UI.Device', actionName], devname, data_={objType:objId}) if REQUEST: return self()
def manage_deleteAdministrativeRole(self, delids=(), REQUEST=None): "Delete a admin role to this device" if isinstance(delids, basestring): delids = [delids] for userid in delids: ar = self.adminRoles._getOb(userid, None) if ar is not None: ar.delete() self.manage_delLocalRoles((userid,)) self.setAdminLocalRoles() self.index_object() notify(IndexingEvent(self)) if REQUEST: if delids: for userid in delids: audit(['UI', getDisplayType(self), 'DeleteAdministrativeRole'], self, userid=userid) messaging.IMessageSender(self).sendToBrowser( 'Admin Roles Deleted', ('The following administrative roles have been deleted: ' '%s' % ", ".join(delids)) ) return self.callZenScreen(REQUEST)
def manage_addReport(context, id, title=None, text=None, REQUEST=None, submit=None): """make a Report""" id = str(id) if REQUEST is None: context._setObject(id, Report(id, text)) ob = getattr(context, id) if title: ob.pt_setTitle(title) return ob else: file = REQUEST.form.get('file') headers = getattr(file, 'headers', None) if headers is None or not file.filename: zpt = Report(id) else: zpt = Report(id, file, headers.get('content_type')) context._setObject(id, zpt) audit('UI.Report.Add', zpt.id, title=title, text=text, reportType=getDisplayType(zpt), organizer=context) try: u = context.DestinationURL() except AttributeError: u = REQUEST['URL1'] if submit == " Add and Edit ": u = "%s/%s" % (u, quote(id)) REQUEST.RESPONSE.redirect(u + '/manage_main') return ''
def addNode(self, type, contextUid, id, description=None): """ Add a node to the existing tree underneath the node specified by the context UID @type type: string @param type: Either 'class' or 'organizer' @type contextUid: string @param contextUid: Path to the node that will be the new node's parent (ex. /zport/dmd/Devices) @type id: string @param id: Identifier of the new node, must be unique in the parent context @type description: string @param description: (optional) Describes this new node (default: None) @rtype: dictionary @return: Marshaled form of the created node """ result = {} try: facade = self._getFacade() if type.lower() == 'class': uid = facade.addClass(contextUid, id) audit('UI.Class.Add', uid) else: organizer = facade.addOrganizer(contextUid, id, description) uid = organizer.uid audit(['UI', getDisplayType(organizer), 'Add'], organizer) treeNode = facade.getTree(uid) result['nodeConfig'] = Zuul.marshal(treeNode) result['success'] = True except Exception as e: log.exception(e) result['msg'] = str(e) result['success'] = False return result
def addNode(self, type, contextUid, id, description=None): """ Add a node to the existing tree underneath the node specified by the context UID @type type: string @param type: Either 'class' or 'organizer' @type contextUid: string @param contextUid: Path to the node that will be the new node's parent (ex. /zport/dmd/Devices) @type id: string @param id: Identifier of the new node, must be unique in the parent context @type description: string @param description: (optional) Describes this new node (default: None) @rtype: dictionary @return: Marshaled form of the created node """ result = {} try: facade = self._getFacade() if type.lower() == 'class': uid = facade.addClass(contextUid, id) audit('UI.Class.Add', uid) else: organizer = facade.addOrganizer(contextUid, id, description) uid = organizer.uid audit(['UI', getDisplayType(organizer), 'Add'], organizer) treeNode = facade.getTree(uid) result['nodeConfig'] = Zuul.marshal(treeNode) result['success'] = True except Exception, e: log.exception(e) result['msg'] = str(e) result['success'] = False
def test_getDisplayType(self): testObj = None self.assertEqual(getDisplayType(testObj), 'None') testObj = 'string!' self.assertEqual(getDisplayType(testObj), 'Str') testObj = u'string!' self.assertEqual(getDisplayType(testObj), 'Unicode') testObj = 1 self.assertEqual(getDisplayType(testObj), 'Int') testObj = MetaTypeTestObject() self.assertEqual(getDisplayType(testObj), 'MetaTypeTestObject') testObj = SaneMetaType() self.assertEqual(getDisplayType(testObj), 'SaneMetaType') testObj = NoneMetaType() self.assertEqual(getDisplayType(testObj), 'NoneMetaType') testObj = EmptyMetaType() self.assertEqual(getDisplayType(testObj), 'EmptyMetaType') testObj = UnrelatedMetaType() self.assertEqual(getDisplayType(testObj), 'EntirelyUnrelatedMetaType') testObj = IntegerMetaType() self.assertEqual(getDisplayType(testObj), '42') testObj = UnicodeMetaType() self.assertEqual(getDisplayType(testObj), '\xc3\xa4\xc3\xb6\xc3\xbc') testObj = SelfMetaType() self.assertEqual(getDisplayType(testObj), str(testObj))
class Organizer(ZenModelRM, EventView): """ The base for all hierarchical organization classes. It allows Organizers to be addressed and created with file system like paths like /Devices/Servers. Organizers have a containment relation called children. Subclasses must define the attribute: dmdRootName - root in the dmd database for this organizer """ _properties = ( {'id':'description', 'type':'string', 'mode':'w'}, ) _relations = ZenModelRM._relations security = ClassSecurityInfo() security.declareObjectProtected(ZEN_COMMON) def __init__(self, id, description = ''): """ @param id: Name of this organizer @type id: string @param description: A decription of this organizer @type description: string @rtype: Organizer """ ZenModelRM.__init__(self, id) self.description = description @unpublished def urlLink(self, text=None, url=None, attrs={}): """ Override urlLink to return a link with the full path of the organizer. >>> dmd.Devices.Server.urlLink() '<a href="/zport/dmd/Devices/Server">/Server</a>' """ if text is None: text = self.getOrganizerName() return ZenModelRM.urlLink(self, text=text, url=url, attrs=attrs) def childMoveTargets(self): """ Returns a list of all organizer names under the same root excluding ourselves @return: A list of organizers excluding our self. @rtype: list @todo: We should be using either deviceMoveTargets or childMoveTargets >>> dmd.Events.getOrganizerName() in dmd.Events.childMoveTargets() False """ myname = self.getOrganizerName() return filter(lambda x: x != myname, self.getDmdRoot(self.dmdRootName).getOrganizerNames()) def getChildMoveTarget(self, moveTargetName): """ Returns an organizer under the same root. @param moveTargetName: Name of the organizer @type moveTargetName: string @rtype: Organizer >>> dmd.Devices.getChildMoveTarget('Server') <DeviceClass at /zport/dmd/Devices/Server> """ return self.getDmdRoot(self.dmdRootName).getOrganizer(moveTargetName) security.declareProtected(ZEN_COMMON, "children") def children(self, sort=False, checkPerm=True, spec=None): """ Returns the immediate children of an organizer @param sort: If True, sorts the returned children. @type sort: boolean @param checkPerm: If True, checks if the user has the permission to view each child. @type checkPerm: boolean @param spec: If set, returns children of the specified meta_type. @type spec: string @return: A list of children of the organizer @rtype: list @permission: ZEN_COMMON >>> dmd.Devices.Printer.children() [<DeviceClass at /zport/dmd/Devices/Printer/Laser>, <DeviceClass at /zport/dmd/Devices/Printer/InkJet>] """ if spec is None: spec = self.meta_type kids = self.objectValues(spec=spec) if checkPerm: kids = [ kid for kid in kids if self.checkRemotePerm(ZEN_VIEW, kid)] if sort: kids.sort(key=lambda x: x.primarySortKey()) return kids def childIds(self, spec=None): """ Returns the ids of the immediate children of an organizer @param spec: If set, returns children of the specified meta_type. @type spec: string @return: Ids of children within our organizer @rtype: list >>> 'Discovered' in dmd.Devices.childIds() True """ if spec is None: spec = self.meta_type #spec = self.getDefaultSpecForChildren() return self.objectIds(spec=spec) security.declareProtected(ZEN_COMMON, "countChildren") def countChildren(self, spec=None): """ Returns the number of all the children underneath an organizer @param spec: If set, returns children of the specified meta_type. @type spec: string @return: A count of all our contained children. @rtype: integer @permission: ZEN_COMMON """ if spec is None: spec = self.meta_type #spec = self.getDefaultSpecForChildren() count = len(self.objectIds(spec=spec)) for child in self.children(spec=spec): count += child.countChildren(spec=spec) return count security.declareProtected(ZEN_ADD, 'manage_addOrganizer') def manage_addOrganizer(self, newPath, factory=None, REQUEST=None): """ Adds a new organizer under this organizer. if given a fully qualified path it will create an organizer at that path @param newPath: Path of the organizer to be created @type newPath: string @raise: ZentinelException @permission: ZEN_ADD >>> dmd.Devices.manage_addOrganizer('/Devices/DocTest') """ if factory is None: factory = self.__class__ if not newPath: return self.callZenScreen(REQUEST) try: if newPath.startswith("/"): org = self.createOrganizer(newPath) else: # Strip out invalid characters from the newPath name = newPath newPath = self.prepId(newPath) org = factory(newPath) self._setObject(org.id, org) # Set the display name to the original string org = self._getOb(newPath) org.setTitle(name) except ZentinelException, e: if REQUEST: messaging.IMessageSender(self).sendToBrowser( 'Error', e, priority=messaging.WARNING) return self.callZenScreen(REQUEST) if REQUEST: audit(('UI', getDisplayType(org), 'Add'), org) messaging.IMessageSender(self).sendToBrowser( 'Organizer Added', '%s "%s" was created.' % (getDisplayType(self), newPath) ) return self.callZenScreen(REQUEST)