#!/neo/opt/bin/python # # Copyright (C) 2001 by Neotonic Software Corporation # All Rights Reserved. # # hdfhelp.py # # This code makes using odb with Clearsilver as "easy as stealing candy # from a baby". - jeske # # How to use: # # rows = tbl.fetchAllRows() # rows.hdfExport("CGI.rows", hdf_dataset) # # row = tbl.fetchRow( ('primary_key', value) ) # row.hdfExport("CGI.row", hdf_dataset) # # How to setup: # # # define table # class AgentsTable(odb.Table): # def _defineRows(self): # self.d_addColumn("agent_id",kInteger,None,primarykey = 1,autoincrement = 1) # self.d_addColumn("login",kVarString,200,notnull=1) # self.d_addColumn("ticket_count",kIncInteger,None) # # # make sure you return a subclass of hdfhelp.HdfRow # # def defaultRowClass(self): # return hdfhelp.HdfRow # def defaultRowListClass(self): # return hdfhelp.HdfItemList # import string, os import neo_cgi import neo_cs import neo_util import odb import time import UserList SECS_IN_MIN = 60 SECS_IN_HOUR = (SECS_IN_MIN * 60) SECS_IN_DAY = (SECS_IN_HOUR * 24) SECS_IN_WEEK = (SECS_IN_DAY * 7) SECS_IN_MONTH = (SECS_IN_DAY * 30) kYearPos = 0 kMonthPos = 1 kDayPos = 2 kHourPos = 3 kMinutePos = 4 kSecondPos = 5 kWeekdayPos = 6 kJulianDayPos = 7 kDSTPos = 8 def renderDate(then_time,day=0): if then_time is None: then_time = 0 then_time = int(then_time) if then_time == 0 or then_time == -1: return "" then_tuple = time.localtime(then_time) now_tuple = time.localtime(time.time()) if day or (then_tuple[kHourPos]==0 and then_tuple[kMinutePos]==0 and then_tuple[kSecondPos]==0): # it's just a date if then_tuple[kYearPos] == now_tuple[kYearPos]: # no year return time.strftime("%m/%d",then_tuple) else: # add year return time.strftime("%m/%d/%Y",then_tuple) else: # it's a full time/date return time.strftime("%m/%d/%Y %I:%M%p",then_tuple) class HdfRow(odb.Row): def hdfExport(self, prefix, hdf_dataset, *extra, **extranamed): skip_fields = extranamed.get("skip_fields", None) translate_dict = extranamed.get("translate_dict", None) tz = extranamed.get("tz", "US/Pacific") for col_name,value in self.items(): if skip_fields and (col_name in skip_fields): continue try: name,col_type,col_options = self._table.getColumnDef(col_name) except: col_type = odb.kVarString col_options = {} if (value is not None): if col_options.get("no_export",0): continue if type(value) in [ type(0), type(0L) ]: hdf_dataset.setValue(prefix + "." + col_name,"%d" % value) elif type(value) == type(1.0): if int(value) == value: hdf_dataset.setValue(prefix + "." + col_name,"%d" % value) else: hdf_dataset.setValue(prefix + "." + col_name,"%0.2f" % value) else: if col_type == odb.kReal: log("why are we here with this value: %s" % value) if translate_dict: for k,v in translate_dict.items(): value = string.replace(value,k,v) hdf_dataset.setValue(prefix + "." + col_name,neo_cgi.htmlEscape(str(value))) if col_options.get("int_date",0): hdf_dataset.setValue(prefix + "." + col_name + ".string",renderDate(value)) hdf_dataset.setValue(prefix + "." + col_name + ".day_string",renderDate(value,day=1)) if value: neo_cgi.exportDate(hdf_dataset, "%s.%s" % (prefix, col_name), tz, value) if col_options.has_key("enum_values"): enum = col_options["enum_values"] hdf_dataset.setValue(prefix + "." + col_name + ".enum", str(enum.get(value,''))) class HdfItemList(UserList.UserList): def hdfExport(self,prefix,hdf_dataset,*extra,**extranamed): export_by = extranamed.get("export_by", None) n = 0 for row in self: if export_by is not None: n = row[export_by] row.hdfExport("%s.%d" % (prefix,n),hdf_dataset,*extra,**extranamed) n = n + 1 def setList(hdf, prefix, lst): hdf.setValue(prefix+".0", str(len(lst))) for n in range(len(lst)): hdf.setValue(prefix+".%d" %(n+1), lst[n]); def getList(hdf, name): lst = [] for n in range(hdf.getIntValue(name,0)): lst.append(hdf.getValue(name+".%d" %(n+1), "")) return lst def eval_cs(hdf,a_cs_string): cs = neo_cs.CS(hdf) try: cs.parseStr(a_cs_string) return cs.render() except: return "Error in CS tags: %s" % neo_cgi.htmlEscape(repr(a_cs_string)) def childloop(hdf): children = [] if hdf: hdf = hdf.child() while hdf: children.append(hdf) hdf = hdf.next() return children # ---------------------------- class HDF_Database(odb.Database): def defaultRowClass(self): return HdfRow def defaultRowListClass(self): return HdfItemList # ---------------------------- def loopHDF(hdf, name=None): results = [] if name: o = hdf.getObj(name) else: o = hdf if o: o = o.child() while o: results.append(o) o = o.next() return results def loopKVHDF(hdf, name=None): results = [] if name: o = hdf.getObj(name) else: o = hdf if o: o = o.child() while o: results.append((o.name(), o.value())) o = o.next() return results class hdf_iterator: def __init__(self, hdf): self.hdf = hdf self.node = None if self.hdf: self.node = self.hdf.child() def __iter__(self): return self def next(self): if not self.node: raise StopIteration ret = self.node self.node = self.node.next() return ret class hdf_kv_iterator(hdf_iterator): def next(self): if not self.node: raise StopIteration ret = (self.node.name(), self.node.value()) self.node = self.node.next() return ret class hdf_key_iterator(hdf_iterator): def next(self): if not self.node: raise StopIteration ret = self.node.name() self.node = self.node.next() return ret class hdf_ko_iterator(hdf_iterator): def next(self): if not self.node: raise StopIteration ret = (self.node.name(), self.node) self.node = self.node.next() return ret # ---------------------------- def test(): import neo_util hdf = neo_util.HDF() hdf.setValue("foo","1") print eval_cs(hdf,"this should say 1 ===> <?cs var:foo ?>") if __name__ == "__main__": test()