Home | History | Annotate | Download | only in base
      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