--- ZSQLExtend/ZSQLExtend.py 2003/12/23 17:56:01 1.4 +++ ZSQLExtend/ZSQLExtend.py 2004/01/21 16:54:45 1.5 @@ -7,6 +7,7 @@ import re import string from pyPgSQL import libpq from AccessControl import getSecurityManager +import os.path def quoteString(name): #return re.sub(r'([\(\)\?])',"\\\1",name) @@ -17,17 +18,55 @@ class ZSQLExtendFolder(Persistent, Impli """Folder""" meta_type="ZSQLExtendFolder" - def ZSQLInlineSearch(self,**argv): + + def lowerEnd(self,path): + """oinly for demo""" + return os.path.splitext(path)[0]+".jpg" + + def ZSQLisEmpty(self,field): + """Teste ob Treffer leer""" + print "field",field + if not field: + return 1 + if field=="": + return 1 + return 0 + + def ZSQLsearchOptions(self): + """return HTML Fragment with search options""" + ret="""""" + return ret + + def ZSQLInlineSearch(self,storename=None,**argv): """inlinesearch""" qs=[] - + if storename: + """store""" + else: + storename="foundCount" + - + #print "INLINE:",argv for a in argv.keys(): qs.append(a+"="+urllib.quote(str(argv[a]))) + #return [] + return self.parseQueryString(string.join(qs,","),"_",storename=storename) - return self.parseQueryString(string.join(qs,","),"_") + def ZSQLInlineSearch2(self,query): + """inlinesearch""" + qs=[] + + + + #print "INLINE:",query + + return self.search(var=query) def ZSQLAdd(self): """Neuer Eintrag""" @@ -117,41 +156,106 @@ class ZSQLExtendFolder(Persistent, Impli self.search(var=queryString) return self.REQUEST.RESPONSE.redirect(format) - def ZSQLFind(self,qs="",select="*"): + def ZSQLFind(self,qs="",select="*",storename=None): """Find""" if qs=="": if self.REQUEST['QUERY_STRING']: qs=self.REQUEST['QUERY_STRING'] + + qs=string.join(qs.split("&"),",") else: + qs=self.REQUEST.SESSION['query'] else: qs=string.join(qs.split("&"),",") - return self.parseQueryString(qs,"-",select=select,storemax="yes") - def ZSQLFoundCount(self,founds): - try: - return len(founds) - except: - return 0 + qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular. + #print "QS",qs + if storename: + """store""" + else: + storename="foundCount" + + ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename) + #print self.REQUEST.SESSION["foundCount"] + + return ret + + def ZSQLFoundCountLen(self,var): + return len(var) + + def ZSQLFoundCount(self,qs="",select="*",storename=None): + + ## if qs=="": + +## if self.REQUEST['QUERY_STRING']: + +## qs=self.REQUEST['QUERY_STRING'] +## qs=string.join(qs.split("&"),",") +## else: + +## qs=self.REQUEST.SESSION['query'] +## else: +## qs=string.join(qs.split("&"),",") + + +## temp= self.parseQueryString(qs,"-",select=select,storemax="yes",nostore="yes") + if storename: + """store""" + else: + storename="foundCount" + + return self.REQUEST.SESSION[storename]['count'] - def parseQueryString(self,qs,iCT,storemax="no",select=None): - """analysierren den QueryString""" + def ZSQLRangeStart(self,storename=None): + + if storename: + """store""" + else: + storename="foundCount" + + return self.REQUEST.SESSION[storename]['rangeStart'] + + def ZSQLRangeSize(self,storename=None): + + if storename: + """store""" + else: + storename="foundCount" + + return self.REQUEST.SESSION[storename]['rangeSize'] + + def ZSQLRangeEnd(self,storename=None): + + if storename: + """store""" + else: + storename="foundCount" + + return self.REQUEST.SESSION[storename]['rangeEnd'] + + def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None): + """analysieren den QueryString""" + #print "NO",nostore lop="AND" # standardsuche mit and max="ALL" #standard alle auswählen whereList=[] sort="" op="bw" opfields={} + skip="" + rangeStart=0 if not select: select="*" - + #print "Q",nostore,qs #check for op in the case of inline search if iCT=="_": for q in qs.split(","): + name=re.sub("r'+'"," ",q.split("=")[0].lower()) value=urllib.unquote(q.split("=")[1]) @@ -162,59 +266,101 @@ class ZSQLExtendFolder(Persistent, Impli #now analyse the querystring for q in qs.split(","): - try: + + + #try: - name=re.sub("r'+'"," ",q.split("=")[0].lower()) - value=urllib.unquote(q.split("=")[1]) - value=quoteString(value) - if name==iCT+"lop": - lop=value - elif name==iCT+"table": - table=value - elif name==iCT+"select": - select=value - elif name==iCT+"max": - max=str(value) - - elif name==iCT+"join": - whereList.append(value) - elif name==iCT+"sort": - sort="ORDER BY "+value - elif name==iCT+"token": + name=re.sub("r'+'"," ",q.split("=")[0].lower()) + value=urllib.unquote(q.split("=")[1]) + #value=libpq.PgQuoteString(value) + + + if name==iCT+"lop": + lop=value + elif name==iCT+"table": + table=value + elif name==iCT+"select": + select=value + elif name==iCT+"max": + max="LIMIT "+str(value) + limit=str(value) + elif name==iCT+"skip": + skip="OFFSET "+str(value) + rangeStart=str(value) + elif name==iCT+"join": + whereList.append(value) + elif name==iCT+"sort": + sort="ORDER BY "+value + elif name==iCT+"token": + if not nostore=="yes": self.REQUEST.SESSION['token']=value - elif name==iCT+"op": - op=value - - + elif name==iCT+"op": + op=value + - elif (not name[0]==iCT) and (not len(value)==0): - if opfields.has_key(name): - op=opfields[name] - if op=="ct": - whereList.append(name+"~\'.*"+value+".*\'") - elif op=="gt": - whereList.append(name+">\'"+value+"\'") - elif op=="lt": - whereList.append(name+"<\'"+value+"\'") - elif op=="eq": - whereList.append(name+"=\'"+value+"\'") - elif op=="bw": - whereList.append(name+"~\'"+value+".*\'") - elif op=="ew": - whereList.append(name+"~\'.*"+value+"\'") + + elif (not name[0]==iCT) and (not len(value)==0): + name="LOWER("+name+")" + value=value.lower() + if opfields.has_key(name): + op=opfields[name] + if op=="ct": + whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%")) + elif op=="gt": + whereList.append(name+">"+libpq.PgQuoteString(value)) + elif op=="lt": + whereList.append(name+"<"+libpq.PgQuoteString(value)) + elif op=="eq": + whereList.append(name+"="+libpq.PgQuoteString(value)) + elif op=="bw": + whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%")) + elif op=="ew": + whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value)) op="ct" - except: - print "END" + + #except: + # print "END",value,name,Exception if len(whereList)>0: where="WHERE "+string.join(whereList," "+lop+" ") else: where="" #print "QE",table - query="SELECT %s FROM %s %s %s"%(select,table,where,sort) - - self.REQUEST.SESSION['qs']=opfields + query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,max,skip) + if not nostore=="yes": + + self.REQUEST.SESSION['qs']=opfields + print "IAMHERE again:", query + + if storename: + query2="SELECT count(%s) FROM %s %s"%(select,table,where) + #print "storing",query2 + #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2'] + if not self.REQUEST.SESSION.has_key(storename): + self.REQUEST.SESSION[storename]={} + if self.REQUEST.SESSION[storename].has_key('queryString2'): + #print "HI",storename + if not self.REQUEST.SESSION[storename]['queryString2']==query2: + #print "HOOOOO",storename + self.REQUEST.SESSION[storename]['queryString2']=query2 + self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count + #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2'] + + else: + self.REQUEST.SESSION[storename]['queryString2']=query2 + self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count + #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2'] + + + self.REQUEST.SESSION[storename]['rangeStart']=rangeStart + if limit=="all": + self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count'] + else: + self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit) + self.REQUEST.SESSION[storename]['rangeSize']=limit + + return self.search(var=query) def ZSQLSearch(self): @@ -241,7 +387,106 @@ class ZSQLExtendFolder(Persistent, Impli return(int(string)) except: return 0 - def prevLink(self,html): + + def nextLink(self,html,storename="foundCount"): + """nextLink""" + try: + limit=self.REQUEST.SESSION[storename]['rangeSize'] + newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit) + except: + limit=0 + newRangeStart=0 + + if newRangeStart>self.REQUEST.SESSION[storename]['count']: + newRangeStart=self.REQUEST.SESSION[storename]['count']-10 + + + #create new query string + + if self.REQUEST['QUERY_STRING']=="": + qs=self.REQUEST.SESSION['query'] + + queries=string.split(qs,",") + + + else: + qs=self.REQUEST['QUERY_STRING'] + queries=string.split(qs,"&") + + + + newquery=[] + + skipFound=0 + + for query in queries: + #print query.split("=")[0] + if query[0]=="_" : query[0]="-" + + if query.split("=")[0].lower()=="-skip": + skipFound=1 + query="-skip=%i"%newRangeStart + newquery.append(query) + + if skipFound==0 : + query="-skip=%i"%newRangeStart + newquery.append(query) + + newquerystring=string.join(newquery,"&") + return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html) + + + def prevLink(self,html,storename="foundCount"): + """prev link""" + try: + limit=self.REQUEST.SESSION[storename]['rangeSize'] + newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit) + except: + limit=0 + newRangeStart=0 + + #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart']) + + if newRangeStart<0: + newRangeStart=0 + + #create new query string + + if self.REQUEST['QUERY_STRING']=="": + qs=self.REQUEST.SESSION['query'] + #qs=re.sub(r'_','-',qs) #aendern für query + queries=string.split(qs,",") + + + else: + qs=self.REQUEST['QUERY_STRING'] + queries=string.split(qs,"&") + + + + newquery=[] + + skipFound=0 + + for query in queries: + #print query.split("=")[0] + + if query[0]=="_" : query[0]="-" + + if query.split("=")[0].lower()=="-skip": + #print"HI" + query="-skip=%i"%newRangeStart + skipFound=1 + newquery.append(query) + + if skipFound==0 : + query="-skip=%i"%newRangeStart + newquery.append(query) + + newquerystring=string.join(newquery,"&") + return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html) + + def prevLink_old(self,html): """prev link""" if self.REQUEST['QUERY_STRING']=="": qs=self.REQUEST.SESSION['query'] @@ -268,7 +513,7 @@ class ZSQLExtendFolder(Persistent, Impli newquerystring=string.join(queries,"&") return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html) - def nextLink(self,html): + def nextLink_old(self,html): """prev link""" if self.REQUEST['QUERY_STRING']=="": qs=self.REQUEST.SESSION['query'] @@ -298,20 +543,7 @@ class ZSQLExtendFolder(Persistent, Impli return "%s"%(self.REQUEST['URL0']+"?"+newquerystring,html) - def ZSQLrangeStart(self): - if self.REQUEST['QUERY_STRING']=="": - qs=self.REQUEST.SESSION['query'] - else: - qs=self.REQUEST['QUERY_STRING'] - offset=re.search(r'offset\=(.*)\,',qs.lower()) - if not offset: - offset=1 - return offset -# def search(self,**argv): -# """to be done""" - - - + manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals()) def manage_addZSQLExtendFolder(self, id, title='',