1 #!/neo/opt/bin/python 2 # 3 # Copyright (C) 2001 by Neotonic Software Corporation 4 # All Rights Reserved. 5 # 6 # hdfhelp.py 7 # 8 # This code makes using odb with Clearsilver as "easy as stealing candy 9 # from a baby". - jeske 10 # 11 # How to use: 12 # 13 # rows = tbl.fetchAllRows() 14 # rows.hdfExport("CGI.rows", hdf_dataset) 15 # 16 # row = tbl.fetchRow( ('primary_key', value) ) 17 # row.hdfExport("CGI.row", hdf_dataset) 18 # 19 # How to setup: 20 # 21 # # define table 22 # class AgentsTable(odb.Table): 23 # def _defineRows(self): 24 # self.d_addColumn("agent_id",kInteger,None,primarykey = 1,autoincrement = 1) 25 # self.d_addColumn("login",kVarString,200,notnull=1) 26 # self.d_addColumn("ticket_count",kIncInteger,None) 27 # 28 # # make sure you return a subclass of hdfhelp.HdfRow 29 # 30 # def defaultRowClass(self): 31 # return hdfhelp.HdfRow 32 # def defaultRowListClass(self): 33 # return hdfhelp.HdfItemList 34 # 35 36 import string, os 37 import neo_cgi 38 import neo_cs 39 import neo_util 40 import odb 41 import time 42 43 import UserList 44 45 SECS_IN_MIN = 60 46 SECS_IN_HOUR = (SECS_IN_MIN * 60) 47 SECS_IN_DAY = (SECS_IN_HOUR * 24) 48 SECS_IN_WEEK = (SECS_IN_DAY * 7) 49 SECS_IN_MONTH = (SECS_IN_DAY * 30) 50 51 kYearPos = 0 52 kMonthPos = 1 53 kDayPos = 2 54 kHourPos = 3 55 kMinutePos = 4 56 kSecondPos = 5 57 kWeekdayPos = 6 58 kJulianDayPos = 7 59 kDSTPos = 8 60 61 62 def renderDate(then_time,day=0): 63 if then_time is None: 64 then_time = 0 65 then_time = int(then_time) 66 if then_time == 0 or then_time == -1: 67 return "" 68 69 then_tuple = time.localtime(then_time) 70 71 now_tuple = time.localtime(time.time()) 72 73 if day or (then_tuple[kHourPos]==0 and then_tuple[kMinutePos]==0 and then_tuple[kSecondPos]==0): 74 # it's just a date 75 if then_tuple[kYearPos] == now_tuple[kYearPos]: 76 # no year 77 return time.strftime("%m/%d",then_tuple) 78 else: 79 # add year 80 return time.strftime("%m/%d/%Y",then_tuple) 81 82 else: 83 # it's a full time/date 84 85 return time.strftime("%m/%d/%Y %I:%M%p",then_tuple) 86 87 class HdfRow(odb.Row): 88 def hdfExport(self, prefix, hdf_dataset, *extra, **extranamed): 89 skip_fields = extranamed.get("skip_fields", None) 90 translate_dict = extranamed.get("translate_dict", None) 91 tz = extranamed.get("tz", "US/Pacific") 92 93 for col_name,value in self.items(): 94 if skip_fields and (col_name in skip_fields): 95 continue 96 try: 97 name,col_type,col_options = self._table.getColumnDef(col_name) 98 except: 99 col_type = odb.kVarString 100 col_options = {} 101 102 if (value is not None): 103 if col_options.get("no_export",0): continue 104 if type(value) in [ type(0), type(0L) ]: 105 hdf_dataset.setValue(prefix + "." + col_name,"%d" % value) 106 elif type(value) == type(1.0): 107 if int(value) == value: 108 hdf_dataset.setValue(prefix + "." + col_name,"%d" % value) 109 else: 110 hdf_dataset.setValue(prefix + "." + col_name,"%0.2f" % value) 111 else: 112 if col_type == odb.kReal: 113 log("why are we here with this value: %s" % value) 114 if translate_dict: 115 for k,v in translate_dict.items(): 116 value = string.replace(value,k,v) 117 hdf_dataset.setValue(prefix + "." + col_name,neo_cgi.htmlEscape(str(value))) 118 if col_options.get("int_date",0): 119 hdf_dataset.setValue(prefix + "." + col_name + ".string",renderDate(value)) 120 hdf_dataset.setValue(prefix + "." + col_name + ".day_string",renderDate(value,day=1)) 121 if value: neo_cgi.exportDate(hdf_dataset, "%s.%s" % (prefix, col_name), tz, value) 122 123 if col_options.has_key("enum_values"): 124 enum = col_options["enum_values"] 125 hdf_dataset.setValue(prefix + "." + col_name + ".enum", 126 str(enum.get(value,''))) 127 128 class HdfItemList(UserList.UserList): 129 def hdfExport(self,prefix,hdf_dataset,*extra,**extranamed): 130 export_by = extranamed.get("export_by", None) 131 n = 0 132 for row in self: 133 if export_by is not None: 134 n = row[export_by] 135 row.hdfExport("%s.%d" % (prefix,n),hdf_dataset,*extra,**extranamed) 136 n = n + 1 137 138 def setList(hdf, prefix, lst): 139 hdf.setValue(prefix+".0", str(len(lst))) 140 for n in range(len(lst)): 141 hdf.setValue(prefix+".%d" %(n+1), lst[n]); 142 143 def getList(hdf, name): 144 lst = [] 145 for n in range(hdf.getIntValue(name,0)): 146 lst.append(hdf.getValue(name+".%d" %(n+1), "")) 147 148 return lst 149 150 def eval_cs(hdf,a_cs_string): 151 cs = neo_cs.CS(hdf) 152 try: 153 cs.parseStr(a_cs_string) 154 return cs.render() 155 except: 156 return "Error in CS tags: %s" % neo_cgi.htmlEscape(repr(a_cs_string)) 157 158 def childloop(hdf): 159 children = [] 160 if hdf: 161 hdf = hdf.child() 162 while hdf: 163 children.append(hdf) 164 hdf = hdf.next() 165 return children 166 167 # ---------------------------- 168 169 class HDF_Database(odb.Database): 170 def defaultRowClass(self): 171 return HdfRow 172 def defaultRowListClass(self): 173 return HdfItemList 174 175 # ---------------------------- 176 177 178 def loopHDF(hdf, name=None): 179 results = [] 180 if name: o = hdf.getObj(name) 181 else: o = hdf 182 if o: 183 o = o.child() 184 while o: 185 results.append(o) 186 o = o.next() 187 return results 188 189 190 def loopKVHDF(hdf, name=None): 191 results = [] 192 if name: o = hdf.getObj(name) 193 else: o = hdf 194 if o: 195 o = o.child() 196 while o: 197 results.append((o.name(), o.value())) 198 o = o.next() 199 return results 200 201 202 class hdf_iterator: 203 def __init__(self, hdf): 204 self.hdf = hdf 205 self.node = None 206 if self.hdf: 207 self.node = self.hdf.child() 208 209 def __iter__(self): return self 210 211 def next(self): 212 if not self.node: 213 raise StopIteration 214 215 ret = self.node 216 self.node = self.node.next() 217 218 return ret 219 220 class hdf_kv_iterator(hdf_iterator): 221 def next(self): 222 if not self.node: raise StopIteration 223 224 ret = (self.node.name(), self.node.value()) 225 self.node = self.node.next() 226 227 return ret 228 229 class hdf_key_iterator(hdf_iterator): 230 def next(self): 231 if not self.node: raise StopIteration 232 233 ret = self.node.name() 234 self.node = self.node.next() 235 236 return ret 237 238 class hdf_ko_iterator(hdf_iterator): 239 def next(self): 240 if not self.node: raise StopIteration 241 242 ret = (self.node.name(), self.node) 243 self.node = self.node.next() 244 245 return ret 246 247 # ---------------------------- 248 249 def test(): 250 import neo_util 251 hdf = neo_util.HDF() 252 hdf.setValue("foo","1") 253 print eval_cs(hdf,"this should say 1 ===> <?cs var:foo ?>") 254 255 256 if __name__ == "__main__": 257 test() 258 259 260 261 262 263