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

Source Code for Module Products.ZenModel.ManufacturerRoot

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, 2009 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 manufacturerName = self.prepId(manufacturerName) 134 if self.has_key(manufacturerName): 135 return self._getOb(manufacturerName) 136 else: 137 for m in self.objectValues(spec="Manufacturer"): 138 if m.matches(manufacturerName): 139 return m 140 141 return self.createManufacturer(manufacturerName)
142 143
144 - def getManufacturerNames(self):
145 """return list of all companies""" 146 return self.objectIds(spec=("Manufacturer"))
147 148
149 - def getProductNames(self, mname, type=None):
150 """return a list of all products this Manufacturer makes""" 151 productFilter = dict(getManufacturerName=mname) 152 if type == "OS": 153 productFilter['meta_type'] = "SoftwareClass" 154 productFilter['isOS'] = True 155 elif type: 156 productFilter['meta_type'] = type 157 158 cat = getattr(self, self.default_catalog) 159 return sorted([''] + [ entry.id for entry in cat(productFilter) ])
160 161
162 - def findProduct(self, query):
163 """Find a product by is productKey. 164 """ 165 cat = getattr(self, self.default_catalog) 166 brains = cat({'productKeys': query}) 167 if not brains: return None 168 try: 169 return self.getObjByPath(brains[0].getPrimaryId) 170 except KeyError: 171 log.warn("bad path '%s' index '%s'", 172 brains[0].getPrimaryId, self.default_catalog)
173 174
175 - def createHardwareProduct(self,prodName,manufacturer="Unknown",**kwargs):
176 """Return and create if nessesary a HardwareClass object. 177 """ 178 from Products.ZenModel.HardwareClass import HardwareClass 179 return self._getProduct(prodName, manufacturer, HardwareClass, **kwargs)
180 181
182 - def createSoftwareProduct(self, prodName, manufacturer="Unknown", isOS=False, **kwargs):
183 """Return and create if nesseary a SoftwareClass object. 184 """ 185 from Products.ZenModel.SoftwareClass import SoftwareClass 186 prod = self._getProduct(prodName, manufacturer, SoftwareClass, **kwargs) 187 prod.isOS = isOS 188 return prod
189 190
191 - def _getProduct(self, prodName, manufacturer, factory, **kwargs):
192 prod = self.findProduct(prodName) 193 if prod: 194 # Product already exists. Return it. 195 return prod 196 197 # Product doesn't already exist. Create it. 198 prodid = self.prepId(prodName) 199 manufobj = self.getManufacturer(manufacturer) 200 prod = manufobj.products._getOb(prodid, None) 201 if prod is None: 202 prod = factory(prodid, prodName=prodName, **kwargs) 203 manufobj.products._setObject(prodid, prod) 204 prod = manufobj.products._getOb(prodid) 205 return prod
206 207
208 - def getProductsGen(self):
209 """Return a generator that gets all products. 210 """ 211 for manuf in self.values(spec="Manufacturer"): 212 for prod in manuf.products.objectValuesGen(): 213 yield prod
214 215
216 - def reIndex(self):
217 """Go through all devices in this tree and reindex them.""" 218 zcat = self._getOb(self.default_catalog) 219 zcat.manage_catalogClear() 220 transaction.savepoint() 221 for i, prod in enumerate(self.getProductsGen()): 222 prod.index_object() 223 if not i % 1000: transaction.savepoint()
224 225
226 - def createCatalog(self):
227 """Create a catalog for EventClassRecord searching""" 228 from Products.ZCatalog.ZCatalog import manage_addZCatalog 229 230 # XXX update to use ManagableIndex 231 manage_addZCatalog(self, self.default_catalog, self.default_catalog) 232 zcat = self._getOb(self.default_catalog) 233 cat = zcat._catalog 234 cat.addIndex('productKeys', 235 makeCaseSensitiveKeywordIndex('productKeys')) 236 cat.addIndex('meta_type', 237 makeCaseInsensitiveFieldIndex('meta_type')) 238 cat.addIndex('getManufacturerName', 239 makeCaseInsensitiveFieldIndex('getManufacturerName')) 240 cat.addIndex('isOS', FieldIndex('isOS')) 241 zcat.addColumn('getPrimaryId') 242 zcat.addColumn('id')
243 244
245 - def exportXml(self, ofile, ignorerels=[], root=False):
246 """Return an xml based representation of a RelationshipManager 247 <object id='/Devices/Servers/Windows/dhcp160.confmon.loc' 248 module='Products.Confmon.IpInterface' class='IpInterface'> 249 <property id='name'>jim</property> 250 <toone></toone> 251 <tomany></tomany> 252 <tomanycont></tomanycont> 253 </object> 254 """ 255 modname = self.__class__.__module__ 256 classname = self.__class__.__name__ 257 id = root and self.getPrimaryId() or self.id 258 stag = "<object id='%s' module='%s' class='%s'>\n" % ( 259 id , modname, classname) 260 ofile.write(stag) 261 for obj in self.objectValues(): 262 if getattr(aq_base(obj), 'exportXml', False): 263 obj.exportXml(ofile, ignorerels) 264 ofile.write("</object>\n")
265 266
267 - def buildzProperties(self):
268 if getattr(aq_base(self), "zDeviceClass", False): return 269 self._setProperty("zDeviceClass", "") 270 self._setProperty("zDeviceGroup", "") 271 self._setProperty("zSystem", "")
272 273 274 InitializeClass(ManufacturerRoot) 275