Package ZenModel :: Module ManufacturerRoot
[hide private]
[frames] | no frames]

Source Code for Module ZenModel.ManufacturerRoot

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 as published by 
  8  # the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 11  # 
 12  ########################################################################### 
 13   
 14  __doc__="""ManufacturerRoot 
 15   
 16  The Manufacturer classification class.  default identifiers and screens, 
 17  live here. 
 18   
 19  $Id: ManufacturerRoot.py,v 1.10 2004/04/22 02:14:12 edahl Exp $""" 
 20   
 21  __version__ = "$Revision: 1.10 $"[11:-2] 
 22   
 23  import logging 
 24  log = logging.getLogger('zen') 
 25   
 26  import transaction 
 27   
 28  from Globals import InitializeClass 
 29  from Acquisition import aq_base 
 30  from AccessControl import Permissions as permissions 
 31  from Products.ZenModel.ZenossSecurity import * 
 32   
 33  from Products.ZenRelations.PrimaryPathObjectManager import \ 
 34      PrimaryPathBTreeFolder2 
 35   
 36  from ZenModelItem import ZenModelItem 
 37  from ZenPacker import ZenPacker 
 38  from Products.ZenUtils.Search import \ 
 39      makeCaseSensitiveKeywordIndex, makeCaseInsensitiveFieldIndex 
 40  from Products.ManagableIndex import FieldIndex 
 41   
42 -def manage_addManufacturerRoot(context, REQUEST=None):
43 """make a Manufacturer class""" 44 m = ManufacturerRoot() 45 context._setObject(m.getId(), m) 46 m = context._getOb(m.dmdRootName) 47 if REQUEST is not None: 48 REQUEST['RESPONSE'].redirect(context.absolute_url() + '/manage_main')
49 50 51 #addManufacturerRoot = DTMLFile('dtml/addManufacturerRoot',globals()) 52 53
54 -class ManufacturerRoot(ZenModelItem, PrimaryPathBTreeFolder2, ZenPacker):
55 """ 56 The root organizer for manufacturers. May become a BtreeFolder2 at 57 some point (to scale better). Has interface to manage Manufacturers 58 and the products that they create. 59 """ 60 dmdRootName = "Manufacturers" 61 meta_type = "ManufacturerRoot" 62 sub_classes = ('Manufacturer',) 63 default_catalog = "productSearch" 64 65 # Screen action bindings (and tab definitions) 66 factory_type_information = ( 67 { 68 'id' : 'Manufacturer', 69 'meta_type' : 'Manufacturer', 70 'description' : """Arbitrary device grouping class""", 71 'icon' : 'Manufacturer_icon.gif', 72 'product' : 'ZenModel', 73 'factory' : 'manage_addManufacturer', 74 'immediate_view' : 'viewManufacturers', 75 'actions' : 76 ( 77 { 'id' : 'overview' 78 , 'name' : 'Overview' 79 , 'action' : 'viewManufacturers' 80 , 'permissions' : ( 81 permissions.view, ) 82 }, 83 { 'id' : 'viewHistory' 84 , 'name' : 'Modifications' 85 , 'action' : 'viewHistory' 86 , 'permissions' : (ZEN_VIEW_MODIFICATIONS,) 87 }, 88 ) 89 }, 90 ) 91 92
93 - def __init__(self, id=None):
94 if not id: id = self.dmdRootName 95 super(ManufacturerRoot, self).__init__(id) 96 PrimaryPathBTreeFolder2.__init__(self, id) 97 self.createCatalog() 98 self.buildzProperties()
99 100
101 - def manage_addManufacturer(self, manufacturerName=None, REQUEST=None):
102 """Add a manufacturer from UI code. 103 """ 104 if manufacturerName: 105 self.createManufacturer(manufacturerName) 106 if REQUEST: return self.callZenScreen(REQUEST)
107 108
109 - def manage_deleteManufacturers(self, ids=None, REQUEST=None):
110 """Delete a list of manufacturers from UI. 111 """ 112 if not ids: return self.callZenScreen(REQUEST) 113 for id in ids: self._delObject(id) 114 if REQUEST: return self.callZenScreen(REQUEST)
115 116
117 - def createManufacturer(self, manufacturerName=None):
118 """Return and create if nessesary manufacturerName. 119 """ 120 from Products.ZenModel.Manufacturer import manage_addManufacturer 121 if manufacturerName and not self.has_key(manufacturerName): 122 logging.info("Creating Manufacturer %s" % manufacturerName) 123 manage_addManufacturer(self, manufacturerName) 124 if manufacturerName: 125 return self._getOb(manufacturerName) 126 return None
127 128
129 - def getManufacturer(self, manufacturerName):
130 """ 131 Return manufacturerName. If it doesn't exist, create it. 132 """ 133 if self.has_key(manufacturerName): 134 man = self._getOb(manufacturerName) 135 else: 136 man = self.createManufacturer(manufacturerName) 137 138 return man
139 140
141 - def getManufacturerNames(self):
142 """return list of all companies""" 143 return self.objectIds(spec=("Manufacturer"))
144 145
146 - def getProductNames(self, mname, type=None):
147 """return a list of all products this Manufacturer makes""" 148 productFilter = dict(getManufacturerName=mname) 149 if type == "OS": 150 productFilter['meta_type'] = "SoftwareClass" 151 productFilter['isOS'] = True 152 elif type: 153 productFilter['meta_type'] = type 154 155 cat = getattr(self, self.default_catalog) 156 return sorted([''] + [ entry.id for entry in cat(productFilter) ])
157 158
159 - def findProduct(self, query):
160 """Find a product by is productKey. 161 """ 162 cat = getattr(self, self.default_catalog) 163 brains = cat({'productKeys': query}) 164 if not brains: return None 165 try: 166 return self.getObjByPath(brains[0].getPrimaryId) 167 except KeyError: 168 log.warn("bad path '%s' index '%s'", 169 brains[0].getPrimaryId, self.default_catalog)
170 171
172 - def createHardwareProduct(self,prodName,manufacturer="Unknown",**kwargs):
173 """Return and create if nessesary a HardwareClass object. 174 """ 175 from Products.ZenModel.HardwareClass import HardwareClass 176 return self._getProduct(prodName, manufacturer, HardwareClass, **kwargs)
177 178
179 - def createSoftwareProduct(self, prodName, manufacturer="Unknown", isOS=False, **kwargs):
180 """Return and create if nesseary a SoftwareClass object. 181 """ 182 from Products.ZenModel.SoftwareClass import SoftwareClass 183 prod = self._getProduct(prodName, manufacturer, SoftwareClass, **kwargs) 184 prod.isOS = isOS 185 return prod
186 187
188 - def _getProduct(self, prodName, manufacturer, factory, **kwargs):
189 prod = self.findProduct(prodName) 190 if prod: 191 # Product already exists. Return it. 192 return prod 193 194 # Product doesn't already exist. Create it. 195 prodid = self.prepId(prodName) 196 manufobj = self.getManufacturer(manufacturer) 197 prod = manufobj._getOb(prodid, None) 198 if prod is None: 199 prod = factory(prodid, prodName=prodName, **kwargs) 200 manufobj.products._setObject(prodid, prod) 201 prod = manufobj.products._getOb(prodid) 202 return prod
203 204
205 - def getProductsGen(self):
206 """Return a generator that gets all products. 207 """ 208 for manuf in self.values(spec="Manufacturer"): 209 for prod in manuf.products.objectValuesGen(): 210 yield prod
211 212
213 - def reIndex(self):
214 """Go through all devices in this tree and reindex them.""" 215 zcat = self._getOb(self.default_catalog) 216 zcat.manage_catalogClear() 217 transaction.savepoint() 218 for i, prod in enumerate(self.getProductsGen()): 219 prod.index_object() 220 if not i % 1000: transaction.savepoint()
221 222
223 - def createCatalog(self):
224 """Create a catalog for EventClassRecord searching""" 225 from Products.ZCatalog.ZCatalog import manage_addZCatalog 226 227 # XXX update to use ManagableIndex 228 manage_addZCatalog(self, self.default_catalog, self.default_catalog) 229 zcat = self._getOb(self.default_catalog) 230 cat = zcat._catalog 231 cat.addIndex('productKeys', 232 makeCaseSensitiveKeywordIndex('productKeys')) 233 cat.addIndex('meta_type', 234 makeCaseInsensitiveFieldIndex('meta_type')) 235 cat.addIndex('getManufacturerName', 236 makeCaseInsensitiveFieldIndex('getManufacturerName')) 237 cat.addIndex('isOS', FieldIndex('isOS')) 238 zcat.addColumn('getPrimaryId') 239 zcat.addColumn('id')
240 241
242 - def exportXml(self, ofile, ignorerels=[], root=False):
243 """Return an xml based representation of a RelationshipManager 244 <object id='/Devices/Servers/Windows/dhcp160.confmon.loc' 245 module='Products.Confmon.IpInterface' class='IpInterface'> 246 <property id='name'>jim</property> 247 <toone></toone> 248 <tomany></tomany> 249 <tomanycont></tomanycont> 250 </object> 251 """ 252 modname = self.__class__.__module__ 253 classname = self.__class__.__name__ 254 id = root and self.getPrimaryId() or self.id 255 stag = "<object id='%s' module='%s' class='%s'>\n" % ( 256 id , modname, classname) 257 ofile.write(stag) 258 for obj in self.objectValues(): 259 if getattr(aq_base(obj), 'exportXml', False): 260 obj.exportXml(ofile, ignorerels) 261 ofile.write("</object>\n")
262 263
264 - def buildzProperties(self):
265 if getattr(aq_base(self), "zDeviceClass", False): return 266 self._setProperty("zDeviceClass", "") 267 self._setProperty("zDeviceGroup", "") 268 self._setProperty("zSystem", "")
269 270 271 InitializeClass(ManufacturerRoot) 272