1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__="""ZenTableState
15
16 Track the state of a given table.
17
18 $Id: ZenTableState.py,v 1.3 2004/01/17 04:56:13 edahl Exp $"""
19
20 __revision__ = "$Revision: 1.3 $"[11:-2]
21
22 from Globals import InitializeClass
23 from AccessControl import ClassSecurityInfo
24
26
27 changesThatResetStart = [
28 "batchSize",
29 "filter",
30 "sortedHeader",
31 "sortedSence",
32 "onlyMonitored"
33 ]
34
35 requestAtts = [
36 "batchSize",
37 "filter",
38 "filterFields",
39 "sortedHeader",
40 "sortedSence",
41 "sortRule",
42 "start",
43 "URL",
44 "onlyMonitored"
45 ]
46
47 security = ClassSecurityInfo()
48
49 security.setDefaultAccess('allow')
50
51 - def __init__(self, request, tableName, defaultBatchSize, **keys):
52 self.URL = request.URL
53 self.tableName = tableName
54 self.sortedHeader = "primarySortKey"
55 self.sortedSence="asc"
56 self.sortRule = "cmp"
57 self.onlyMonitored = 0
58 self.defaultBatchSize = defaultBatchSize
59 self.batchSize = defaultBatchSize
60 self.start = 0
61 self.lastindex = 0
62 self.filter = ""
63 self.filterFields = []
64 self.totalobjs = 0
65 self.abbrStartLabel = 15
66 self.abbrEndLabel = 5
67 self.abbrPadding = 5
68 self.abbrSeparator = ".."
69 self.abbrThresh = self.abbrStartLabel + \
70 self.abbrEndLabel + self.abbrPadding
71 self.tableClass = "tableheader"
72 self.resetStart = False
73 self.showAll = False
74 self.setTableStateFromKeys(keys)
75
77 """
78 Behave like a REQUEST, for report plugins that use REQUEST to pull
79 objects (for example, the interface plugin)
80 """
81 return self.__dict__.keys()
82
84 """
85 Behave like a REQUEST, for report plugins that use REQUEST to
86 pull objects (for example, the interface plugin).
87 """
88 return self.__dict__.values()
89
95
96
98 """update table state based on request"""
99 if self.URL != request.URL:
100 self.batchSize = self.defaultBatchSize
101 self.start=0
102 self.filter = ''
103 if request.get('tableName', None) != self.tableName:
104 return
105 for attname in self.requestAtts:
106 if request.has_key(attname):
107 self.setTableState(attname, int(request[attname]) if attname == 'start' else request[attname])
108 if not request.has_key('onlyMonitored'):
109 self.setTableState('onlyMonitored', 0)
110 if request.get("first",False):
111 self.resetStart = True
112 elif request.get("last", False):
113 self.start=self.lastindex
114 elif request.get("next", False):
115 np = self.start + self.batchSize
116 if np > self.lastindex: self.start = self.lastindex
117 else: self.start = np
118 elif request.get("prev", False):
119 pp = self.start - self.batchSize
120 if pp < 0: self.start = 0
121 else: self.start = pp
122 elif request.get("showAll", False):
123 self.showAll = True
124 self.start = 0
125 self.batchSize = 0
126
127
128
129 ourl = "/".join((request.URL,request.get("zenScreenName","")))
130 if self.resetStart or (self.URL != request.URL and self.URL != ourl):
131 self.start = 0
132 self.resetStart = False
133
134
137
138
139 - def buildPageNavigation(self, objects):
140 self.pagenav = []
141
142
143
144
145
146 if self.batchSize == 0:
147 return self.pagenav
148 lastindex=0
149 for index in range(0, self.totalobjs, self.batchSize):
150 pg = {}
151 pg['label'] = self._pageLabel(objects, index)
152 pg['index'] = index
153 self.pagenav.append(pg)
154 lastindex=index
155 self.lastindex = lastindex
156
157
158 - def _pageLabel(self, objects, index):
159 """make label for page navigation if field isn't sorted use page #"""
160 pageLabel = ""
161 if self.sortedHeader:
162 pageLabel = self._buildTextLabel(objects[index])
163 elif self.batchSize:
164 pageLabel = str(1+index/self.batchSize)
165 else:
166 pageLabel = '1'
167 return pageLabel
168
169
170 - def _buildTextLabel(self, item):
171 startAbbr = ""
172 endAbbr = ""
173 attr = getattr(item, self.sortedHeader, "")
174 if callable(attr): attr = attr()
175 if isinstance(attr, basestring):
176 label = attr
177 else:
178 label = str(attr)
179 if len(label) > self.abbrThresh:
180 startAbbr = label[:self.abbrStartLabel]
181 if self.abbrEndLabel > 0:
182 endAbbr = label[-self.abbrEndLabel:]
183 label = "".join((startAbbr, self.abbrSeparator, endAbbr))
184 return label
185
186
187 - def setTableState(self, attname, value, default=None, reset=False):
204
205
207 """make sure we only add non-dup filterfields"""
208 if fieldName and fieldName not in self.filterFields:
209 self.filterFields.append(fieldName)
210
211
212 InitializeClass(ZenTableState)
213