$search
00001 #! /usr/bin/env python 00002 00003 import os, sys, string, time, getopt 00004 from log import * 00005 00006 import neo_cgi, neo_cs, neo_util 00007 import odb, hdfhelp, CSPage 00008 00009 class Scaffold(CSPage.CSPage): 00010 def setupDetails(self, db, tableName): 00011 self.db = db 00012 self.tableName = tableName 00013 00014 def display(self, hdf): 00015 pathinfo = hdf.getValue("CGI.PathInfo", "") 00016 00017 pathparts = [] 00018 methodName = "list" 00019 if pathinfo: 00020 pathparts = string.split(pathinfo, "/") 00021 00022 if len(pathparts): 00023 methodName = pathparts[0] 00024 00025 self.activate(hdf, methodName) 00026 00027 def activate(self, hdf, methodName): 00028 modpath, f = os.path.split(os.path.abspath(__file__) ) 00029 templatePath = os.path.join(modpath, "templates") 00030 ##self.clearPaths() 00031 #warn(templatePath) 00032 self.setPaths([templatePath]) 00033 00034 method = getattr(self, methodName) 00035 00036 self.pagename = methodName 00037 00038 method(hdf) 00039 00040 def list(self, hdf): 00041 hdf.setValue("CGI.cur.title", "List %s Table" % self.tableName) 00042 00043 self.__listTable(hdf, self.tableName, "CGI.cur.table") 00044 00045 00046 def __listTable(self, hdf, tableName, prefix): 00047 tbl = self.db[tableName] 00048 tableColumnlist = tbl.getColumnList() 00049 00050 columnlist = [] 00051 joins = [] 00052 for col, d, colinfo in tableColumnlist: 00053 if colinfo.has_key("foreign_table"): 00054 foreign_table = colinfo["foreign_table"] 00055 joins.append(col) 00056 columnlist.append(("_" + col + "." + "name", d, colinfo)) 00057 else: 00058 columnlist.append((col, d, colinfo)) 00059 rows = tbl.fetchRows(join2=joins) 00060 # rows = tbl.fetchRows() 00061 self.__exportColumnHeaders(columnlist, hdf, prefix) 00062 primaryKeys = tbl.getPrimaryKeyList() 00063 00064 n = 0 00065 for row in rows: 00066 n = n + 1 00067 aprefix = prefix + ".rows.%s" % n 00068 self.__exportRow(row, columnlist, hdf, aprefix, primaryKeys) 00069 00070 def __exportColumnHeaders(self, columnlist, hdf, prefix): 00071 for col_name,col_type,options in columnlist: 00072 col_name = col_name.replace(".", "_") 00073 if options.get("no_export", 0): continue 00074 aprefix = prefix + ".fields.%s" % col_name 00075 hdf.setValue(aprefix + ".name", col_name) 00076 00077 hdf.setValue(aprefix + ".col_type", col_type.odbType()) 00078 hdfhelp.hdfExportDict(aprefix + ".options", hdf, options) 00079 00080 00081 def __exportRow(self, row, columnlist, hdf, prefix, primaryKeys): 00082 00083 for col_name,col_type,options in columnlist: 00084 if options.get("no_export", 0): continue 00085 00086 a_col_name = col_name.replace(".", "_") 00087 nprefix = prefix + ".values." + a_col_name 00088 try: 00089 value = row.get(col_name, "") 00090 except odb.eNoSuchColumn: 00091 value = "" 00092 if value is not None: 00093 hdf.setValue(nprefix, str(value)) 00094 else: 00095 hdf.setValue(nprefix, "") 00096 00097 ## generate key 00098 key = [] 00099 for k in primaryKeys: 00100 val = row.get(k, "") 00101 if val: 00102 key.append("%s=%s" % (k, str(val))) 00103 hdf.setValue(prefix + ".key", string.join(key, "&")) 00104 00105 def __findKeyFromQuery(self, hdf): 00106 fields = {} 00107 node = hdf.getObj("Query") 00108 if node: 00109 node = node.child() 00110 while node: 00111 if node.name() not in ("debug", ): 00112 fields[node.name()] = node.value() 00113 node = node.next() 00114 fields = fields.items() 00115 return fields 00116 00117 def delete(self, hdf): 00118 fields = self.__findKeyFromQuery(hdf) 00119 tbl = self.db[self.tableName] 00120 row = tbl.fetchRow(fields) 00121 row.delete() 00122 00123 self.redirectUri("list") 00124 00125 def edit(self, hdf): 00126 hdf.setValue("CGI.cur.action", "edit") 00127 00128 self.show(hdf) 00129 00130 tbl = self.db[self.tableName] 00131 columnlist = tbl.getColumnList() 00132 self.__exportColumnHeaders(columnlist, hdf, "CGI.cur.table") 00133 hdf.setValue("CGI.cur.title", "Edit %s" % self.tableName) 00134 00135 def Action_new(self, hdf): 00136 tbl = self.db[self.tableName] 00137 hdf.setValue("CGI.cur.action", "new") 00138 self.pagename = "edit" 00139 00140 row = tbl.newRow() 00141 00142 node = hdf.getObj("Query.values") 00143 if node: 00144 node = node.child() 00145 while node: 00146 row[node.name()] = node.value() 00147 node = node.next() 00148 00149 row.save() 00150 self.redirectUri("list") 00151 00152 def getKeyFromQuery(self, hdf): 00153 key = hdf.getValue("Query.key", "") 00154 if not key: return [] 00155 parts = key.split("&") 00156 keylist = [] 00157 for part in parts: 00158 kvparts = part.split("=", 1) 00159 keylist.append((kvparts[0], kvparts[1])) 00160 return keylist 00161 00162 def Action_edit(self, hdf): 00163 hdf.setValue("CGI.cur.action", "edit") 00164 dict = {} 00165 node = hdf.getObj("Query.values") 00166 if node: 00167 node = node.child() 00168 while node: 00169 dict[node.name()] = node.value() 00170 node = node.next() 00171 00172 tbl = self.db[self.tableName] 00173 00174 keylist = self.getKeyFromQuery(hdf) 00175 row = tbl.fetchRow(keylist) 00176 00177 for k,v in dict.items(): 00178 row[k] = v 00179 row.save() 00180 self.redirectUri("list") 00181 00182 def new(self, hdf): 00183 hdf.setValue("CGI.cur.title", "New %s Row" % self.tableName) 00184 00185 hdf.setValue("CGI.cur.action", "new") 00186 self.pagename = "edit" 00187 00188 tbl = self.db[self.tableName] 00189 prefix = "CGI.cur.row" 00190 columnlist = tbl.getColumnList() 00191 row = {} 00192 primaryKeys = tbl.getPrimaryKeyList() 00193 self.__exportRow(row, columnlist, hdf, "CGI.cur.row", primaryKeys) 00194 00195 self.__exportColumnHeaders(columnlist, hdf, "CGI.cur.table") 00196 00197 00198 def show(self, hdf): 00199 hdf.setValue("CGI.cur.title", "Show %s" % self.tableName) 00200 00201 fields = self.__findKeyFromQuery(hdf) 00202 00203 tbl = self.db[self.tableName] 00204 row = tbl.fetchRow(fields) 00205 00206 columnlist = tbl.getColumnList() 00207 primaryKeys = tbl.getPrimaryKeyList() 00208 self.__exportRow(row, columnlist, hdf, "CGI.cur.row", primaryKeys) 00209 00210 00211 00212 class DBScaffold(Scaffold): 00213 def setupDetails(self, db): 00214 self.db = db 00215 00216 def setup(self, hdf): 00217 pathinfo = hdf.getValue("CGI.PathInfo", "") 00218 00219 pathparts = [] 00220 self.tableName = "__db" 00221 self.methodName = "listTables" 00222 00223 if pathinfo: 00224 pathparts = string.split(pathinfo, "/") 00225 00226 self.methodName = "list" 00227 if len(pathparts) >= 1: 00228 self.tableName = pathparts[0] 00229 if len(pathparts) == 2: 00230 self.methodName = pathparts[1] 00231 if not self.methodName: 00232 self.methodName = "list" 00233 00234 def display(self, hdf): 00235 00236 if self.tableName == "__db": 00237 if self.methodName == "listTables": 00238 #tables = self.db.listTables() 00239 tables = self.db.getTableList() 00240 tables.sort() 00241 hdfhelp.hdfExportList("CGI.cur.tables", hdf, tables) 00242 Scaffold.display(self, hdf) 00243 else: 00244 s = Scaffold(self.context, self.methodName) 00245 s._path_num = self._path_num 00246 s.ncgi = self.ncgi 00247 00248 self.pagename = self.methodName 00249 s.setupDetails(self.db, self.tableName) 00250 s.activate(hdf, self.methodName) 00251 self.pagename = s.pagename 00252 00253 00254 def list(self, hdf): 00255 hdf.setValue("CGI.cur.title", "List DB Tables") 00256 self.pagename = "tables" 00257 00258 00259 00260 00261 def test(): 00262 pass 00263 00264 def usage(progname): 00265 print __doc__ % vars() 00266 00267 def main(argv, stdout, environ): 00268 progname = argv[0] 00269 optlist, args = getopt.getopt(argv[1:], "", ["help", "test", "debug"]) 00270 00271 testflag = 0 00272 if len(args) == 0: 00273 usage(progname) 00274 return 00275 for (field, val) in optlist: 00276 if field == "--help": 00277 usage(progname) 00278 return 00279 elif field == "--debug": 00280 debugfull() 00281 elif field == "--test": 00282 testflag = 1 00283 00284 if testflag: 00285 test() 00286 return 00287 00288 00289 if __name__ == "__main__": 00290 main(sys.argv, sys.stdout, os.environ)