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