| #!/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() |
| |
| |
| |
| |
| |