1
2
3
4
5
6
7
8
9
10
11 import os
12 import string
13 import warnings
14
15 warnings.filterwarnings('ignore', '.*non-existing path.*',
16 UserWarning,
17 '.*DirectoryView.*')
18
20 """
21 Search upwards for the root of a ZenPack.
22
23 >>> import os, tempfile; root = os.path.realpath(tempfile.mkdtemp())
24 >>> skindir = os.path.join(root, 'ZenPacks/ZenPacks.zenoss.NotAPack-1.2.3-py2.6.egg/ZenPacks/zenoss/NotAPack/skins')
25 >>> os.makedirs(skindir)
26 >>> findZenPackRoot(skindir).replace(root, '/opt/zenoss')
27 '/opt/zenoss/ZenPacks/ZenPacks.zenoss.NotAPack'
28 """
29 p = d = os.path.realpath(base)
30 while d:
31 if os.path.isdir(os.path.join(p, 'ZenPacks')):
32
33 if p.endswith('.egg'):
34 fullpath = p.split(os.sep)
35 name = fullpath.pop().split('-')[0]
36 fullpath.append(name)
37 p = os.sep.join(fullpath)
38 return p
39 p, d = os.path.split(p)
40 return None
41
42
44 layers = []
45 for p, ds, fs in os.walk(os.path.join(base, 'skins')):
46 for d in ds:
47 if not d.startswith('.'):
48 layers.append(d)
49
50 break
51 return layers
52
53
55 """setup the skins in a product"""
56 layers = skinDirs(base)
57 try:
58 from Products.CMFCore.utils import getToolByName
59 from Products.CMFCore.DirectoryView import addDirectoryViews
60 skinstool = getToolByName(self, 'portal_skins')
61 for layer in layers:
62 if layer not in skinstool.objectIds():
63 path = os.path.join(base, 'skins')
64 if not os.path.exists(path): os.mkdir(path, mode=0755)
65 root = findZenPackRoot(path).split('/')[-1]
66 addDirectoryViews(skinstool, path, dict(__name__=root))
67 skins = skinstool.getSkinSelections()
68 for skin in skins:
69 path = skinstool.getSkinPath(skin)
70 path = map(string.strip, string.split(path,','))
71 for layer in layers:
72 if layer not in path:
73 try:
74 path.insert(path.index(positionAfter)+1, layer)
75 except ValueError:
76 path.append(layer)
77 path = ','.join(path)
78 skinstool.addSkinSelection(skin, path)
79 except ImportError, e:
80 if "Products.CMFCore.utils" in e.args: pass
81 else: raise
82 except AttributeError, e:
83 if "portal_skin" in e.args: pass
84 else: raise
85
87 """setup the skins in a product"""
88 from Products.ZenUtils.Utils import unused
89 unused(positionAfter)
90 layers = skinDirs(base)
91 if layers is None: return
92 try:
93 from Products.CMFCore.utils import getToolByName
94 skinstool = getToolByName(self, 'portal_skins')
95 for layer in layers:
96 if layer in skinstool.objectIds():
97 try:
98 skinstool._delOb(layer)
99 except AttributeError:
100 pass
101 obs = skinstool._objects
102 goodlayers = filter(lambda x:getattr(skinstool, x['id'], False), obs)
103 skinstool._objects = tuple(goodlayers)
104 except ImportError, e:
105 if "Products.CMFCore.utils" in e.args: pass
106 else: raise
107 except AttributeError, e:
108 if "portal_skin" in e.args: pass
109 else: raise
110