File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.34: download - view: text, annotated - select for diffs - revision graph
Mon Sep 27 18:51:57 2004 UTC (19 years, 8 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
all parameter eingefuehrt / sortorder

    1: from OFS.Folder import Folder
    2: from Globals import Persistent
    3: from Acquisition import Implicit
    4: from Globals import DTMLFile
    5: import urllib
    6: import re
    7: import string
    8: from pyPgSQL import libpq
    9: from AccessControl import getSecurityManager
   10: import os.path
   11: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
   12: 
   13: from Products.ZSQLMethods.SQL import SQLConnectionIDs
   14: import Shared.DC.ZRDB.DA
   15: 
   16: def showSQLConnectionIDs(self):
   17:     return SQLConnectionIDs(self)
   18: 
   19: class ZSQLExtendFolder(Folder,Persistent, Implicit):
   20:     """Folder"""
   21:     meta_type="ZSQLExtendFolder"
   22: 
   23:     def testneu(self):
   24:         """test"""
   25:         relStatement="""period like '%s%%'"""
   26:         statement="select * from cdli_cat"
   27:         wherePart="museum_no like 'VAT%'"
   28:         classes=['Uruk III','Uruk IV']
   29:         return self.searchRel(relStatement,statement,wherePart,classes)
   30:     
   31:     def searchRel(self,relStatement,statement,wherePart,classes):
   32:         """suche relative haufigkeiten"""
   33:         ret={}
   34:         allRecords=len(self.ZSQLSimpleSearch(statement + " where "+wherePart))
   35:         print statement + " where "+wherePart
   36:         for oneclass in classes:
   37:             ret[oneclass]=len(self.ZSQLSimpleSearch(statement + " where ("+wherePart+") and "+ relStatement%oneclass))
   38:             print statement + " where ("+wherePart+") and "+ relStatement%oneclass
   39:         return (ret,allRecords)
   40:                   
   41:     def content_html(self):
   42:         """template fuer content"""
   43:         
   44:         try:
   45:             obj=getattr(self,"ZSQLBibliography_template")
   46:             return obj()
   47:         except:
   48:             pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt',content_type='text/htm').__of__(self)
   49:             pt.content_type="text/html"
   50:             
   51:             return pt()
   52: 
   53:         
   54:     def getWeight(self):
   55:         """getLabe"""
   56:         try:
   57:             return self.weight
   58:         except:
   59:             return ""
   60: 
   61:     def getLabel(self):
   62:         """getLabe"""
   63:         try:
   64:             return self.label
   65:         except:
   66:             return ""
   67: 
   68:     def getDescription(self):
   69:         """getLabe"""
   70:         try:
   71:             return self.description
   72:         except:
   73:             return ""
   74: 
   75:     manage_options=Folder.manage_options+(
   76:         {'label':'Main Config','action':'changeZSQLExtendForm'},
   77:        )
   78: 
   79:     def changeZSQLExtendForm(self):
   80:         """change folder config"""
   81:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLExtendForm.zpt').__of__(self)
   82:         return pt()
   83: 
   84: 
   85:     def changeZSQLExtend(self,label,description,weight=0,REQUEST=None,connection_id=None):
   86:         """change it"""
   87:         self.connection_id=connection_id
   88:         self.weight=weight
   89:         self.label=label
   90:         self.description=description
   91:         
   92:         if REQUEST is not None:
   93:             return self.manage_main(self, REQUEST)
   94: 
   95:     def formatAscii(self,str,url=None):
   96:         """ersetze ascii umbrueche durch <br>"""
   97:         #url=None
   98:         if url and str:
   99:             
  100:             retStr=""
  101:             words=str.split("\n")
  102:             
  103:             for word in words:
  104:                 strUrl=url%word
  105:                 #print "str",strUrl
  106:                 retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
  107:             str=retStr
  108:         if str:
  109:             return re.sub(r"[\n]","<br/>",str)
  110:         else:
  111:             return ""
  112:         
  113:     def getSAttribute(self,obj,atribute,pref=''):
  114:         """get Attribute or emptystring"""
  115:         
  116:         #print "obj",obj
  117:         try:
  118:             return pref+getattr(obj,atribute)
  119:         except:
  120:             return ""
  121:         
  122:     def getS(self,str):
  123:         """make none to empty string"""
  124:         if str:
  125:             return str
  126:         else:
  127:             return ""
  128: 
  129:     def actualPath(self,url=None):
  130: 	"""path"""
  131: 
  132:         if self.REQUEST['HTTP_X_FORWARDED_SERVER']=='':
  133:             host=self.REQUEST['HTTP_HOST']
  134:         else:
  135:             host=self.REQUEST['HTTP_X_FORWARDED_SERVER']
  136: 	if not url:
  137: 		return "http://"+host+self.REQUEST['PATH_TRANSLATED']
  138:     	else:
  139: 		temp=self.REQUEST[url].split("/")
  140: 		temp[2]=host
  141: 		return string.join(temp,"/")
  142: 
  143:     def getRequest(self):
  144: 	"""request"""
  145: 	return self.REQUEST
  146: 
  147:     def lowerEnd(self,path):
  148:         """oinly for demo"""
  149:         return os.path.splitext(path)[0]+".jpg"
  150:         
  151:     def ZSQLisEmpty(self,field):
  152:         """Teste ob Treffer leer"""
  153:         #print "field",field
  154:         if not field:
  155:             return 1
  156:         if field=="":
  157:             return 1
  158:         return 0
  159: 
  160:     def ZSQLsearchOptions(self,fieldname=""):
  161:         """return HTML Fragment with search options"""
  162: 	
  163:         ret="""<select name="-op_%s">
  164: 	<option value="bw">begins with</option>          	<!-- begins with / beginnt mit, "Wort*" -->
  165: 	<option value="ew">ends with</option>
  166:    	<option value="ct" selected>contains</option>          		<!-- contains / enthaellt, "Wort" -->
  167:     <option value="eq">equals</option>          		<!-- equals / ist, =Wort -->
  168: </select>"""%fieldname
  169:         return ret
  170: 
  171:     def ZSQLSelectionFromCRList(self,fieldname,listField,boxType="checkbox",checked=None):
  172:         """generate select oprions form a cr seperated list"""
  173:         fields=listField.split("\n")
  174:         ret=""
  175:         for field in fields:
  176:             if checked and (field in checked.split("\n")):
  177:                 ret+="""<input name="%s" type="%s" value="%s" checked>%s"""%(fieldname,boxType,field.encode('utf-8'),field.encode('utf-8'))
  178:             else:
  179:                 ret+="""<input name="%s" type="%s" value="%s">%s"""%(fieldname,boxType,field.encode('utf-8'),field.encode('utf-8'))
  180:         return ret
  181: 
  182: 
  183:     def ZSQLOptionsFromCRList(self,fieldname,listField, multiple=''):
  184:         """generate select oprions form a cr seperated list"""
  185:         fields=listField.split("\n")
  186:         ret="""<select name="%s" %s>
  187:             """%(fieldname,multiple)
  188:         for field in fields:
  189:             ret+="""<option value="%s">%s</option>"""%(field.encode('utf-8'),field.encode('utf-8'))
  190:         ret+="""</select>"""
  191:         return ret
  192: 
  193:     def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple='',startValue=None):
  194:         """generate select oprions form a search list seperated list"""
  195:         if not valueName:
  196:             valueName=fieldName
  197:             
  198:         ret="""<select name="%s" %s>
  199:             """%(fieldname,multiple)
  200:         if start:
  201: 	    if start==' ':
  202: 		start=''
  203:                 if not startValue:
  204:                     startValue=start
  205:                     
  206:             ret+="""<option value="%s">%s</option>"""%(startValue,start)
  207:         for result in results:
  208:             field=getattr(result,fieldName)
  209:             fieldValue=getattr(result,valueName)
  210:             ret+="""<option value="%s">%s</option>"""%(field,fieldValue)
  211:         ret+="""</select>"""
  212:         return ret
  213: 
  214:             
  215:     def ZSQLInlineSearchU(self,storename=None,**argv):
  216:         """one element if exists"""
  217:         qs=[]
  218:         if storename:
  219:             """store"""
  220:         else:
  221:             storename="foundCount"
  222:             
  223:     
  224: 
  225:         #print "INLINE:",argv
  226:         for a in argv.keys():
  227:             qs.append(a+"="+urllib.quote(str(argv[a])))
  228:         #return []  
  229:         ret = self.parseQueryString(string.join(qs,","),"_",storename=storename)
  230: 
  231:         try:
  232:             return ret[0]
  233:         except:
  234:             return None
  235:         
  236:     def ZSQLInlineSearch(self,storename=None,**argv):
  237:         """inlinesearch"""
  238:         qs=[]
  239:         if storename:
  240:             """store"""
  241:         else:
  242:             storename="foundCount"
  243:             
  244:     
  245: 
  246:         #print "INLINE:",argv
  247:         for a in argv.keys():
  248:             qs.append(a+"="+urllib.quote(str(argv[a])))
  249:         #return []  
  250:         return self.parseQueryString(string.join(qs,","),"_",storename=storename)
  251: 
  252:     def ZSQLInlineSearch2(self,query):
  253:         """inlinesearch"""
  254:         qs=[]
  255:         
  256:     
  257: 
  258:         #print "INLINE:",query
  259:         return self.ZSQLSimpleSearch(query)
  260:         
  261: 
  262:     def ZSQLSimpleSearch(self,query=None):
  263:         """ returrn SQLSearch"""
  264:         if not query:
  265:             query=self.query
  266:            
  267:         if self.search.meta_type=="Z SQL Method":
  268:             return self.search(var=query)
  269:         else:
  270:             if self.aq_parent.aq_parent.search.meta_type=="Z SQL Method":
  271:                 return self.aq_parent.aq_parent.search(var=query)
  272:             else:
  273:                 return []
  274:     
  275:         
  276:         
  277:     def ZSQLAdd(self):
  278:         """Neuer Eintrag"""
  279:         qs=self.REQUEST['QUERY_STRING']
  280:         addList={}
  281:         for q in qs.split("&"):
  282:             name=re.sub("r'+'"," ",q.split("=")[0].lower())
  283:             value=q.split("=")[1]
  284: 	    value=re.sub(r'\+'," ",value)
  285: 	    value=urllib.unquote(value)	
  286:             if name=="-table":
  287:                 table=urllib.unquote(value)
  288:             elif name=="-format":
  289:                 format=urllib.unquote(value)
  290:             elif (not name[0]=="-") and (not len(value)==0):
  291:                 addList[urllib.unquote(name)]=urllib.unquote(value)
  292: 
  293:         keyList=[]
  294:         valueList=[]
  295:         for x in addList.keys():
  296:             keyList.append("\""+x+"\"")
  297:             valueList.append(libpq.PgQuoteString(addList[x]))
  298: 
  299:         keyString=string.join(keyList,",")
  300:         valueString=string.join(valueList,",")
  301:         
  302:         queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
  303:         self.ZSQLSimpleSearch(queryString)
  304:         return self.REQUEST.RESPONSE.redirect(format)
  305:         
  306:     def ZSQLChange(self,**argv):
  307:         """Ändern von Einträgen"""
  308:         #qs=self.REQUEST['QUERY_STRING']
  309:         # very bad hack
  310:         qs_temp=[]
  311:     
  312:         for a in self.REQUEST.form.keys():
  313:             qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
  314: 
  315:         qs=string.join(qs_temp,"&")
  316: 
  317:     
  318:         #print "CHANGE QS",self.REQUEST
  319:         #return self.REQUEST
  320:         changeList=[]
  321:         for q in qs.split("&"):
  322:             name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
  323:             value=q.split("=")[1]
  324:             value=re.sub(r'\+'," ",value)
  325: 	    value=urllib.unquote(value)
  326: 	    if name=="-table":
  327:                 table=urllib.unquote(value)
  328:             elif name=="-identify":
  329:                 identify=urllib.unquote(value)
  330:                 identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
  331:             elif name=="-format":
  332:                 format=urllib.unquote(value)
  333:             elif (not name[0]=="-") and (not len(value)==0):
  334:                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
  335:         changeString=string.join(changeList,",")
  336:         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
  337:         self.ZSQLSimpleSearch(queryString)
  338:         return self.REQUEST.RESPONSE.redirect(format)
  339: 
  340:     def ZSQLChange_old(self):
  341:         """Ändern von Einträgen"""
  342:         qs=self.REQUEST['QUERY_STRING']
  343:         #print "CHANGE QS",self.REQUEST
  344:         #return self.REQUEST
  345:         changeList=[]
  346:         for q in qs.split("&"):
  347:             name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
  348:             value=q.split("=")[1]
  349:             value=re.sub(r'\+'," ",value)
  350: 	    value=urllib.unquote(value)
  351: 	    if name=="-table":
  352:                 table=urllib.unquote(value)
  353:             elif name=="-identify":
  354:                 identify=urllib.unquote(value)
  355:                 identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
  356:             elif name=="-format":
  357:                 format=urllib.unquote(value)
  358:             elif (not name[0]=="-") and (not len(value)==0):
  359:                 changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
  360:         changeString=string.join(changeList,",")
  361:         queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
  362:         self.ZSQLSimpleSearch(queryString)
  363:         return self.REQUEST.RESPONSE.redirect(format)
  364: 
  365: 
  366: 
  367:     def ZSQLFind2(self,qs="",select="oid,*",storename=None,tableList=['cdli_translit','cdli_cat'],**argv):
  368:         """find2"""
  369:         #search1= self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt='cdli_translit',restrictField='id_text',NoQuery='yes',NoLimit='yes',**argv)
  370: 
  371:         
  372:         #search2 = self.ZSQLFind(tableExt='cdli_cat',qs="",select="oid,*",storename=None,restrictConnect=('cdli_cat.id_text',search1),**argv)
  373: 
  374:         search1= self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt='cdli_cat',restrictField='id_text',NoQuery='yes',NoLimit='yes',**argv)
  375: 
  376:         search2 = self.ZSQLFind(tableExt='cdli_translit',qs="",select="oid,*",storename=None,restrictConnect=('cdli_translit.id_text',search1),**argv)
  377:         return search2
  378:     
  379:         #return self.ZSQLFind(qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,**argv)
  380:     
  381:     def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None,**argv):
  382:         """Find"""
  383: 
  384:         def delEmpty(list):
  385:             ret=[]
  386:             for x in list:
  387:                 splitted=x.split("=")
  388:                 if (len(splitted)>1) and not (splitted[1]==' '):
  389:                     ret.append(x)
  390:             return ret
  391:         
  392:         #self.REQUEST.SESSION['come_from_search']="no" # zurücksetzen
  393:         if qs=="":
  394:            
  395:            if self.REQUEST['QUERY_STRING']:
  396:                qs=self.REQUEST['QUERY_STRING']
  397: 
  398:                
  399:                qs=string.join(qs.split("&"),",")
  400:                
  401:                for field in argv.keys():
  402:                    
  403:                    qs+=",-%s=%s"%(field,argv[field])
  404:                    
  405:            else:
  406:                
  407:                qs=self.REQUEST.SESSION.get('query','')
  408:                
  409:                for field in argv.keys():
  410:                    #print field
  411:                    qs+=",-%s=%s"%(field,argv[field])
  412:                
  413:         else:
  414:             self.REQUEST['QUERY_STRING']=qs
  415: 
  416:             qs=string.join(qs.split("&"),",")
  417:             
  418:         
  419:         
  420:         qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular.
  421: 
  422:         qs=string.join(delEmpty(qs.split(",")),",")
  423: 
  424:         if storename:
  425:             """store"""
  426:         else:
  427:             storename="foundCount"
  428: 
  429: 
  430:         #print "calling Query with",repr(NoQuery)
  431:         ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename,tableExt=tableExt,NoQuery=NoQuery,NoLimit=NoLimit,restrictField=restrictField,restrictConnect=restrictConnect,filter=filter)
  432:         #print self.REQUEST.SESSION["foundCount"]
  433:         
  434: 
  435:         return ret
  436: 
  437:     def ZSQLFoundCountLen(self,var):
  438:         return len(var)
  439:             
  440:     def ZSQLFoundCount(self,qs="",select="*",storename=None):
  441:         
  442:        ##  if qs=="":
  443:             
  444: ##             if self.REQUEST['QUERY_STRING']:
  445:             
  446: ##                 qs=self.REQUEST['QUERY_STRING']
  447: ##                 qs=string.join(qs.split("&"),",")
  448: ##             else:
  449:             
  450: ##                 qs=self.REQUEST.SESSION['query']
  451: ##         else:
  452: ##             qs=string.join(qs.split("&"),",")
  453: 
  454: 
  455: ##         temp= self.parseQueryString(qs,"-",select=select,storemax="yes",nostore="yes")
  456:         if storename:
  457:             """store"""
  458:         else:
  459:             storename="foundCount"
  460:         
  461:         return self.REQUEST.SESSION[storename]['count']
  462: 
  463:     def ZSQLRangeStart(self,storename=None):
  464:         
  465:         if storename:
  466:             """store"""
  467:         else:
  468:             storename="foundCount"
  469:         
  470:         return int(self.REQUEST.SESSION[storename]['rangeStart'])+1
  471:     
  472:     def ZSQLRangeSize(self,storename=None):
  473:         
  474:         if storename:
  475:             """store"""
  476:         else:
  477:             storename="foundCount"
  478:             
  479:         return self.REQUEST.SESSION[storename]['rangeSize']
  480: 
  481:     def ZSQLRangeEnd(self,storename=None):
  482:         
  483:         if storename:
  484:             """store"""
  485:         else:
  486:             storename="foundCount"
  487:         
  488:         return str(min(int(self.REQUEST.SESSION[storename]['rangeEnd']),int(self.REQUEST.SESSION[storename]['count'])))
  489:     
  490:     def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,filter=None):
  491:         """analysieren den QueryString"""
  492:         #print "NO",nostore
  493:         lop="AND" # standardsuche mit and
  494:         max="ALL" #standard alle auswählen
  495:         maxstr=""
  496:         whereList=[]
  497:         sort=""
  498:         op="bw"
  499:         opfields={}
  500:         lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld
  501:         sortfields={} #order of sortfields
  502:         skip=""
  503:         rangeStart=0
  504:         limit=0
  505:         searchFields={}
  506:         searchFieldsOnly={}
  507:         if not select:
  508:             select="oid,*"
  509:         #print "Q",nostore,qs
  510:         #check for op 
  511:         
  512: 	splitted=qs.split(",")
  513:         if tableExt:
  514:             table=tableExt
  515: 
  516:         if restrictField:
  517:                     select=restrictField
  518:             
  519:         for q in splitted:
  520:                 
  521:                 name=re.sub("r'+'"," ",q.split("=")[0].lower())
  522:                 try:
  523:                     value=urllib.unquote(q.split("=",1)[1])
  524:                 except:
  525:                     value=""
  526:                 #print "Hi",name[0:3],q
  527:                 if name[0:3]==iCT+"op":
  528:                     op=value
  529: 
  530:                     field=name[4:]
  531:                     opfields[field]=op
  532: 
  533:                 if name[0:4]==iCT+"lop":
  534:                     lop=value
  535: 
  536:                     field=name[5:]
  537:                     lopfields[field]=lop
  538:                     
  539:                 if name[0:10]==iCT+"sortorder":
  540:                     sort=value
  541: 
  542:                     field=name[11:]
  543:                     sortfields[field]=sort
  544:                     
  545:                     #print "HI",op,field
  546: 	#print opfieldsa
  547:         #now analyse the querystring
  548:         for q in qs.split(","):
  549:             
  550:             
  551:             #try:
  552: 
  553:             name=re.sub("r'+'"," ",q.split("=")[0].lower())
  554:             try:
  555:                 value=urllib.unquote(q.split("=",1)[1])
  556:             except:
  557:                 value=""
  558:                 
  559:             #value=libpq.PgQuoteString(value)
  560:             
  561:             
  562:             if name==iCT+"lop":
  563:                 lop=value
  564:             elif name==iCT+"table":
  565:                 if not tableExt: 
  566:                     table=value
  567:             elif name==iCT+"select":
  568:                 if not restrictField:
  569:                     select=value
  570:             elif name==iCT+"max":
  571:                 if not NoLimit:
  572:                     maxstr="LIMIT "+str(value)
  573:                     limit=str(value)
  574:             elif name==iCT+"skip":
  575:                 skip="OFFSET "+str(value)
  576:                 rangeStart=str(value)
  577:             elif name==iCT+"join":
  578:                 whereList.append(value)
  579:             elif name==iCT+"sort":
  580:                 sortstrs=[]
  581:                 for word in value.split(','):
  582:                     wordstr=word.lstrip().rstrip()
  583:                     order=sortfields.get(wordstr,'ASC')
  584:                     sortstrs.append(wordstr+" "+order)
  585:                 if len(sortstrs)>0:
  586:                     sort="ORDER BY "+string.join(sortstrs,',')
  587:                 
  588:             elif name==iCT+"token":
  589:                 if not nostore=="yes":
  590:                     self.REQUEST.SESSION['token']=value
  591: 
  592:             elif name==iCT+"op":
  593:                 op=value
  594: 
  595: 
  596: 
  597:             elif (not name[0]==iCT) and (not len(value)==0):
  598:                 
  599: 		#print "OP",op,name
  600:                 value=value.lower()
  601:                 tmp=""
  602:                 if opfields.has_key(name):
  603:                     op=opfields[name]
  604:                 else:
  605:                     op="ct"
  606:                 namealt=name
  607:                 name="LOWER("+name+")"    
  608:                 if op=="ct":
  609:                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
  610:                 elif op=="gt":
  611:                     tmp=(name+">"+libpq.PgQuoteString(value))
  612:                 elif op=="lt":
  613:                     tmp=(name+"<"+libpq.PgQuoteString(value))
  614:                 elif op=="eq":
  615:                     tmp=(name+"="+libpq.PgQuoteString(value))
  616:                 elif op=="bw":
  617:                     tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))
  618:                 elif op=="ew":
  619:                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value))
  620:                 elif op=="all":
  621:                     tmps=[]
  622:                     for word in value.split(" "):
  623:                         tmps.append(name+" LIKE "+libpq.PgQuoteString("%"+word+"%"))
  624:                         
  625:                     tmp=string.join(tmps,' AND ')
  626:                     
  627:                 op="ct"
  628: 
  629:                 if (not tableExt) or (namealt.split('.')[0]==tableExt):
  630:                     if searchFields.has_key(name):
  631:                         searchFields[name]+=lopfields.get(name,'OR')+" "+tmp
  632:                         searchFieldsOnly[name]+=lopfields.get(name,'OR')+" "+value
  633:                     else: 
  634:                         searchFields[name]=tmp
  635:                         searchFieldsOnly[name]=value
  636: 
  637:             
  638:        ##  for name in searchFields.keys():
  639: ##             value=searchFields[name]
  640:                 
  641: ##             if opfields.has_key(name):
  642: ##                 op=opfields[name]
  643: ##             else:
  644: ##                 op="ct"
  645: ##             name="LOWER("+name+")"    
  646: ##             if op=="ct":
  647: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
  648: ##             elif op=="gt":
  649: ##                 whereList.append(name+">"+libpq.PgQuoteString(value))
  650: ##             elif op=="lt":
  651: ##                 whereList.append(name+"<"+libpq.PgQuoteString(value))
  652: ##             elif op=="eq":
  653: ##                 whereList.append(name+"="+libpq.PgQuoteString(value))
  654: ##             elif op=="bw":
  655: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%"))
  656: ##             elif op=="ew":
  657: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value))
  658: ##             op="ct"
  659:             
  660: ##             #except:
  661: ##             #    print "END",value,name,Exception      
  662: 
  663:         whereList=["("+searchFields[x]+")" for x in searchFields.keys()]
  664: 
  665:         if len(whereList)>0:
  666:             if filter:
  667:                 whereStr="("+string.join(whereList," "+lop+" ")+") AND "+filter
  668:             else:
  669:                 whereStr=string.join(whereList," "+lop+" ")
  670:             where="WHERE "+whereStr
  671:         else:
  672:             if filter:
  673:                 where="WHERE "+filter
  674:             else:
  675:                 where=""
  676: 
  677:         if restrictConnect:
  678:             
  679:             if len(where)==0:
  680:                 where="WHERE "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
  681:             else:
  682:                 where+="and "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
  683:                 
  684:         #print "QE",table
  685:         
  686:         query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
  687:         
  688:         if not nostore=="yes":
  689:             
  690:             self.REQUEST.SESSION['qs']=opfields
  691:         #print "IAMHERE again:", query
  692: 
  693:         if storename and (not NoQuery):
  694:             query2="SELECT count(*) FROM %s %s"%(table,where)
  695: 
  696:             #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
  697:             if not self.REQUEST.SESSION.has_key(storename):
  698:                 self.REQUEST.SESSION[storename]={}
  699:             if self.REQUEST.SESSION[storename].has_key('queryString2'):
  700: 
  701:                 if not self.REQUEST.SESSION[storename]['queryString2']==query2:
  702:                     #print "HOOOOO",storename
  703:                     self.REQUEST.SESSION[storename]['queryString2']=query2
  704:                     self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
  705: 
  706:                     #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
  707:                 
  708:             else:
  709: 
  710:                 self.REQUEST.SESSION[storename]['queryString2']=query2
  711:                 self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
  712:                 #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2']
  713:             
  714:             
  715:             self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
  716:             if limit=="all":
  717:                 self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
  718:             else:
  719:                 self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
  720:             self.REQUEST.SESSION[storename]['rangeSize']=limit
  721:             self.REQUEST.SESSION[storename]['searchFields']=searchFields
  722:             self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
  723:             
  724:         if not NoQuery:
  725: 
  726:             return self.ZSQLQuery(query)
  727:         else:
  728: 
  729:             return query
  730:             
  731:     def ZSQLQuery(self,query):
  732:         """query"""
  733:         return self.ZSQLSimpleSearch(query)
  734:     
  735:     def ZSQLSearch(self):
  736:         """To be done"""
  737:         rq=self.REQUEST['QUERY_STRING']
  738:         querys=rq.split("&")
  739:         
  740: 
  741:         for querytemp in querys:
  742:             query=querytemp.split("=")
  743:             try:
  744:                 if query[0].lower()=="-format":
  745:                     formatfile=query[1]
  746:             except:
  747:                 """nothing"""
  748:         #print formatfile
  749:         
  750:         self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
  751:         self.REQUEST.SESSION['come_from_search']="yes"
  752:         
  753:         return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
  754: 
  755:     
  756:     def ZSQLint(self,string):
  757:         try:
  758: 
  759:             return(int(string))
  760:         except:
  761:             return 0
  762: 
  763:     def getZSQLSearchFieldsList(self,storename="foundCount"):
  764:         """get searchfieldList"""
  765:         #print self.REQUEST.SESSION[storename]['searchFields'].keys()
  766:         return  self.REQUEST.SESSION[storename]['searchFieldsOnly'].keys()
  767: 
  768:     def getZSQLSearchFields(self,field,storename="foundCount"):
  769:         """get searchfield"""
  770:         #print "SF",self.REQUEST.SESSION[storename]['searchFields']
  771:         
  772:         return  self.REQUEST.SESSION[storename]['searchFieldsOnly'][field]
  773: 
  774:                                                 
  775:     def nextLink(self,html,storename="foundCount"):
  776:         """nextLink"""
  777:         try:
  778:             limit=self.REQUEST.SESSION[storename]['rangeSize']
  779:             if int(limit)==0 :
  780:                 limit="1"
  781:             newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
  782:         except:
  783:             limit=1
  784:             newRangeStart=0
  785:             
  786:         if newRangeStart>=self.REQUEST.SESSION[storename]['count']:
  787:             #newRangeStart=self.REQUEST.SESSION[storename]['count']-1
  788:             return ""
  789:         
  790:         #create new query string
  791:         
  792:         if self.REQUEST['QUERY_STRING']=="":
  793:             qs=self.REQUEST.SESSION['query']
  794:             
  795:             queries=string.split(qs,",")
  796:             
  797:             
  798:         else:
  799:             qs=self.REQUEST['QUERY_STRING']
  800:             queries=string.split(qs,"&")
  801:             
  802:             
  803:             
  804:         newquery=[]
  805: 
  806:         skipFound=0
  807:         
  808:         for query in queries:
  809:             
  810:             #print query.split("=")[0]
  811:             if query[0]=="_" : query[0]="-"
  812: 
  813:             if query.split("=")[0].lower()=="-skip":
  814: 
  815:                 skipFound=1
  816:                 query="-skip=%i"%newRangeStart
  817:             newquery.append(query)
  818: 
  819:         if skipFound==0 :
  820:             query="-skip=%i"%newRangeStart
  821:             newquery.append(query)
  822:                 
  823:         newquerystring=string.join(newquery,"&")
  824: 	
  825:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  826:             
  827:         
  828:     def prevLink(self,html,storename="foundCount"):
  829:         """prev link"""
  830:         try:
  831:             limit=self.REQUEST.SESSION[storename]['rangeSize']
  832:             if int(limit)==0 :
  833:                 limit="1"
  834:             newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
  835:         except:
  836:             limit=1
  837:             newRangeStart=0
  838:         if newRangeStart <0:
  839:             return ""
  840: 
  841:         #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart'])
  842:         
  843:         if newRangeStart<0:
  844:                 newRangeStart=0
  845: 
  846:         #create new query string
  847:         
  848:         if self.REQUEST['QUERY_STRING']=="":
  849:             qs=self.REQUEST.SESSION['query']
  850:             #qs=re.sub(r'_','-',qs) #aendern für query
  851:             queries=string.split(qs,",")
  852:             
  853:             
  854:         else:
  855:             qs=self.REQUEST['QUERY_STRING']
  856:             queries=string.split(qs,"&")
  857:             
  858:             
  859:             
  860:         newquery=[]
  861:         
  862:         skipFound=0
  863: 
  864:         for query in queries:
  865:             #print query.split("=")[0]
  866: 
  867:             if query[0]=="_" : query[0]="-"
  868:             
  869:             if query.split("=")[0].lower()=="-skip":
  870:                 #print"HI"
  871:                 query="-skip=%i"%newRangeStart
  872:                 skipFound=1
  873:             newquery.append(query)
  874: 
  875:         if skipFound==0 :
  876:             query="-skip=%i"%newRangeStart
  877:             newquery.append(query)
  878:             
  879:         newquerystring=string.join(newquery,"&")
  880: 
  881:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  882: 
  883: 
  884:     
  885:     def prevLink_old(self,html):
  886:         """prev link"""
  887:         if self.REQUEST['QUERY_STRING']=="":
  888:             qs=self.REQUEST.SESSION['query']
  889:         else:
  890:             qs=self.REQUEST['QUERY_STRING']
  891:         max=re.search(r'max\=(.*)\,',qs.lower())
  892:         offset=re.search(r'offset\=(.*)\,',qs.lower())
  893:         if not offset:
  894:             offsetnew=0
  895:         else:
  896:             offsetnew=int(offset)-max
  897:             if offsetnew<0:
  898:                 offsetnew=0
  899:         queries=string.split(qs,",")
  900:         newquery=[]
  901:         if offset:
  902:             for query in queries:
  903:                 if query.split("=")[0].lower()=="offset":
  904:                     query="-offset=%i"%offsetnew
  905:                 newquery.append(query)
  906:                 newquerystring=string.join(newquery,"&")
  907:         else:
  908:             queries.append("-offset=%i"%offsetnew)
  909:             newquerystring=string.join(queries,"&")
  910:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  911:         
  912:     def nextLink_old(self,html):
  913:         """prev link"""
  914:         if self.REQUEST['QUERY_STRING']=="":
  915:             qs=self.REQUEST.SESSION['query']
  916:         else:
  917:             qs=self.REQUEST['QUERY_STRING']
  918:         max=re.search(r'max\=(.*)\,',qs.lower())
  919:     
  920:         offset=re.search(r'offset\=(.*)\,',qs.lower())
  921:         if not offset:
  922:             offsetnew=1
  923:         else:
  924:             offsetnew=int(offset)+int(max)
  925:             if offsetnew<0:
  926:                 offsetnew=0
  927:         queries=string.split(qs,",")
  928:         newquery=[]
  929:         if offset:
  930:             for query in queries:
  931: 
  932:                 if query.split("=")[0].lower()=="-offset":
  933:                     query="-offset=%i"%offsetnew
  934:                 newquery.append(query)
  935:                 newquerystring=string.join(newquery,"&")
  936:         else:
  937:             queries.append("-offset=%i"%offsetnew)
  938:             newquerystring=string.join(queries,"&")
  939:         
  940:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  941:         
  942:     
  943: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
  944: 
  945: def manage_addZSQLExtendFolder(self, id, title='', label='', description='',
  946:                      createPublic=0,
  947:                      createUserF=0,
  948:                      connection_id=None,
  949:                      REQUEST=None):
  950:     """Add a new Folder object with id *id*.
  951: 
  952:     If the 'createPublic' and 'createUserF' parameters are set to any true
  953:     value, an 'index_html' and a 'UserFolder' objects are created respectively
  954:     in the new folder.
  955:     """
  956:     
  957:     
  958:     ob=ZSQLExtendFolder()
  959:     ob.id=str(id)
  960:     ob.title=title
  961:     self._setObject(id, ob)
  962:     ob=self._getOb(id)
  963:     setattr(ob,'label',label)
  964:     setattr(ob,'description',description)
  965:     setattr(ob,'connection_id',connection_id)
  966:     
  967:     checkPermission=getSecurityManager().checkPermission
  968: 
  969:     if createUserF:
  970:         if not checkPermission('Add User Folders', ob):
  971:             raise Unauthorized, (
  972:                   'You are not authorized to add User Folders.'
  973:                   )
  974:         ob.manage_addUserFolder()
  975: 
  976:     if createPublic:
  977:         if not checkPermission('Add Page Templates', ob):
  978:             raise Unauthorized, (
  979:                   'You are not authorized to add Page Templates.'
  980:                   )
  981:         ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
  982:             id='index_html', title='')
  983: 
  984:     if REQUEST is not None:
  985:         return self.manage_main(self, REQUEST, update_menu=1)
  986: 
  987: 
  988: 
  989: class ZSQLBibliography(Folder,ZSQLExtendFolder):
  990:     """Bibliography"""
  991:     meta_type="ZSQLBibliography"
  992:     def getLabel(self):
  993:         try:
  994:             return self.label
  995:         except:
  996:             return ""
  997: 
  998:     def getDescription(self):
  999:         try:
 1000:             return self.description
 1001:         except:
 1002:             return ""
 1003:             
 1004:     def changeZSQLBibliographyForm(self):
 1005:         """change folder config"""
 1006:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLBibliographyForm.zpt').__of__(self)
 1007:         return pt()
 1008: 
 1009: 
 1010:     def content_html(self):
 1011:         """template fuer content"""
 1012:         
 1013:         try:
 1014:             obj=getattr(self,"ZSQLBibliography_template")
 1015:             return obj()
 1016:         except:
 1017:             pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt').__of__(self)
 1018:             pt.content_type="text/html"
 1019:             return pt()
 1020: 
 1021:     def changeZSQLBibliography(self,tableName,label,description,REQUEST=None):
 1022:         """change it"""
 1023:         self.tableName=tableName
 1024:         self.label=label
 1025:         self.description=description
 1026:         
 1027:         if REQUEST is not None:
 1028:             return self.manage_main(self, REQUEST)
 1029: 
 1030:     manage_options=Folder.manage_options+(
 1031:         {'label':'Main Config','action':'changeZSQLBibliographyForm'},
 1032:        )
 1033: 
 1034: 
 1035:     def getFieldLabel(self,fields,field):
 1036:         """get labels"""
 1037:         try:
 1038:             ret =fields[0][field]
 1039:             if ret == "":
 1040:                 return field
 1041:             else:
 1042:                 return ret
 1043:         except:
 1044:             return field
 1045:         
 1046:     def getFieldValue(self,found,field):
 1047:         """get value"""
 1048:         try:
 1049:             ret=getattr(found,field)
 1050:             if ret == "":
 1051:                 return None
 1052:             else:
 1053:                 return ret
 1054:         except:
 1055:             return None
 1056: 
 1057:     def findTagsFromMapping(self,referenceType):
 1058:         """gib hash mit label -> generic zurueck"""
 1059:         self.referencetypes=self.ZopeFind(self.standardMD)
 1060:         bibdata={}
 1061:         retdata={}
 1062:         fieldlist=self.standardMD.fieldList
 1063:         
 1064: 	for referenceTypeF in self.referencetypes:
 1065: 		#print referenceType,referenceTypeF[1].title
 1066: 		if referenceTypeF[1].title == referenceType: 
 1067: 			bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
 1068: 			bibdata['data']=referenceTypeF[1]
 1069: 			self.fields=bibdata[referenceType]
 1070:                         for field in fieldlist:
 1071: 		            if referenceTypeF[1].getValue(field)[0]==None:
 1072: 				retdata[field]=field
 1073: 			    else:
 1074:                                 retdata[field]=referenceTypeF[1].getValue(field)[0]
 1075: 
 1076:         return retdata,fieldlist
 1077:         
 1078:     def findLabelsFromMapping(self,referenceType):
 1079:         """gib hash mit label -> generic zurueck"""
 1080:         self.referencetypes=self.ZopeFind(self.standardMD)
 1081:         bibdata={}
 1082:         retdata={}
 1083:         fieldlist=self.standardMD.fieldList
 1084:         
 1085: 	for referenceTypeF in self.referencetypes:
 1086: 		#print referenceType,referenceTypeF[1].title
 1087: 		if referenceTypeF[1].title == referenceType: 
 1088: 			bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
 1089: 			bibdata['data']=referenceTypeF[1]
 1090: 			self.fields=bibdata[referenceType]
 1091:                         for field in fieldlist:
 1092:                             retdata[field]=referenceTypeF[1].getValue(field)[1]
 1093: 
 1094:         return retdata,fieldlist
 1095: 
 1096:     def createIndexTag(self,tag,content):
 1097:         """creste tag"""
 1098:         if content:
 1099:             ret="""<%s>%s</%s>"""%(tag,content,tag)
 1100:             return ret
 1101:         else:
 1102:             return ""
 1103:     
 1104:     def getMetaDataXML2(self):
 1105:         """crate index meta"""
 1106: 
 1107:         fn=os.path.splitext(self.REQUEST['fn'])[0]+"."
 1108:         self.REQUEST['fn']=fn
 1109: 
 1110:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/record2.xml').__of__(self)
 1111:         pt.content_type="text/xml"
 1112:         return pt()
 1113: 
 1114:     def getMetaDataXML(self):
 1115:         """crate index meta"""
 1116:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/record.xml').__of__(self)
 1117:         pt.content_type="text/xml"
 1118:         return pt()
 1119: 
 1120:     def getMetaDatasXML(self):
 1121:         """index"""
 1122:         ret="""<?xml version="1.0" ?>
 1123: 	             <index>"""
 1124:         for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):
 1125:             link=self.absolute_url()+"/"+"record.html?oid=%i"%found.oid
 1126:             metalink=self.absolute_url()+"/"+"getMetaDataXML?oid=%i"%found.oid
 1127:             
 1128:             ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)
 1129:             
 1130:         return ret+"\n</index>"
 1131: 
 1132:     
 1133: manage_addZSQLBibliographyForm=DTMLFile('ZSQLBibliographyAdd', globals())
 1134: 
 1135: def manage_addZSQLBibliography(self, id, tableName,label,description,title='',
 1136:                      createPublic=0,
 1137:                      createUserF=0,
 1138:                      REQUEST=None):
 1139:     """Add a new Folder object with id *id*.
 1140: 
 1141:     If the 'createPublic' and 'createUserF' parameters are set to any true
 1142:     value, an 'index_html' and a 'UserFolder' objects are created respectively
 1143:     in the new folder.
 1144:     """
 1145:     
 1146:     
 1147:     ob=ZSQLBibliography()
 1148:     ob.id=str(id)
 1149:     ob.title=title
 1150:     self._setObject(id, ob)
 1151:     ob=self._getOb(id)
 1152:     setattr(ob,'tableName',tableName)
 1153:     setattr(ob,'label',label)
 1154:     setattr(ob,'description',description)
 1155:     
 1156:     checkPermission=getSecurityManager().checkPermission
 1157: 
 1158:     if createUserF:
 1159:         if not checkPermission('Add User Folders', ob):
 1160:             raise Unauthorized, (
 1161:                   'You are not authorized to add User Folders.'
 1162:                   )
 1163:         ob.manage_addUserFolder()
 1164: 
 1165:     if createPublic:
 1166:         if not checkPermission('Add Page Templates', ob):
 1167:             raise Unauthorized, (
 1168:                   'You are not authorized to add Page Templates.'
 1169:                   )
 1170:         ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
 1171:             id='index_html', title='')
 1172: 
 1173:     if REQUEST is not None:
 1174:         return self.manage_main(self, REQUEST, update_menu=1)
 1175: 
 1176:     
 1177: 
 1178:     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>