File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.33: download - view: text, annotated - select for diffs - revision graph
Sun Sep 12 11:05:43 2004 UTC (19 years, 8 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
first version of searchRel

    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:         skip=""
  502:         rangeStart=0
  503:         limit=0
  504:         searchFields={}
  505:         searchFieldsOnly={}
  506:         if not select:
  507:             select="oid,*"
  508:         #print "Q",nostore,qs
  509:         #check for op 
  510:         
  511: 	splitted=qs.split(",")
  512:         if tableExt:
  513:             table=tableExt
  514: 
  515:         if restrictField:
  516:                     select=restrictField
  517:             
  518:         for q in splitted:
  519:                 
  520:                 name=re.sub("r'+'"," ",q.split("=")[0].lower())
  521:                 try:
  522:                     value=urllib.unquote(q.split("=",1)[1])
  523:                 except:
  524:                     value=""
  525:                 #print "Hi",name[0:3],q
  526:                 if name[0:3]==iCT+"op":
  527:                     op=value
  528: 
  529:                     field=name[4:]
  530:                     opfields[field]=op
  531: 
  532:                 if name[0:4]==iCT+"lop":
  533:                     lop=value
  534: 
  535:                     field=name[5:]
  536:                     lopfields[field]=lop
  537:                     #print "HI",op,field
  538: 	#print opfieldsa
  539:         #now analyse the querystring
  540:         for q in qs.split(","):
  541:             
  542:             
  543:             #try:
  544: 
  545:             name=re.sub("r'+'"," ",q.split("=")[0].lower())
  546:             try:
  547:                 value=urllib.unquote(q.split("=",1)[1])
  548:             except:
  549:                 value=""
  550:                 
  551:             #value=libpq.PgQuoteString(value)
  552:             
  553:             
  554:             if name==iCT+"lop":
  555:                 lop=value
  556:             elif name==iCT+"table":
  557:                 if not tableExt: 
  558:                     table=value
  559:             elif name==iCT+"select":
  560:                 if not restrictField:
  561:                     select=value
  562:             elif name==iCT+"max":
  563:                 if not NoLimit:
  564:                     maxstr="LIMIT "+str(value)
  565:                     limit=str(value)
  566:             elif name==iCT+"skip":
  567:                 skip="OFFSET "+str(value)
  568:                 rangeStart=str(value)
  569:             elif name==iCT+"join":
  570:                 whereList.append(value)
  571:             elif name==iCT+"sort":
  572:                 sort="ORDER BY "+value.replace(' AND ',',')
  573:             elif name==iCT+"token":
  574:                 if not nostore=="yes":
  575:                     self.REQUEST.SESSION['token']=value
  576: 
  577:             elif name==iCT+"op":
  578:                 op=value
  579: 
  580: 
  581: 
  582:             elif (not name[0]==iCT) and (not len(value)==0):
  583:                 
  584: 		#print "OP",op,name
  585:                 value=value.lower()
  586:                 tmp=""
  587:                 if opfields.has_key(name):
  588:                     op=opfields[name]
  589:                 else:
  590:                     op="ct"
  591:                 namealt=name
  592:                 name="LOWER("+name+")"    
  593:                 if op=="ct":
  594:                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
  595:                 elif op=="gt":
  596:                     tmp=(name+">"+libpq.PgQuoteString(value))
  597:                 elif op=="lt":
  598:                     tmp=(name+"<"+libpq.PgQuoteString(value))
  599:                 elif op=="eq":
  600:                     tmp=(name+"="+libpq.PgQuoteString(value))
  601:                 elif op=="bw":
  602:                     tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))
  603:                 elif op=="ew":
  604:                     tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value))
  605:                 op="ct"
  606: 
  607:                 if (not tableExt) or (namealt.split('.')[0]==tableExt):
  608:                     if searchFields.has_key(name):
  609:                         searchFields[name]+=lopfields.get(name,'OR')+" "+tmp
  610:                         searchFieldsOnly[name]+=lopfields.get(name,'OR')+" "+value
  611:                     else: 
  612:                         searchFields[name]=tmp
  613:                         searchFieldsOnly[name]=value
  614: 
  615:             
  616:        ##  for name in searchFields.keys():
  617: ##             value=searchFields[name]
  618:                 
  619: ##             if opfields.has_key(name):
  620: ##                 op=opfields[name]
  621: ##             else:
  622: ##                 op="ct"
  623: ##             name="LOWER("+name+")"    
  624: ##             if op=="ct":
  625: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
  626: ##             elif op=="gt":
  627: ##                 whereList.append(name+">"+libpq.PgQuoteString(value))
  628: ##             elif op=="lt":
  629: ##                 whereList.append(name+"<"+libpq.PgQuoteString(value))
  630: ##             elif op=="eq":
  631: ##                 whereList.append(name+"="+libpq.PgQuoteString(value))
  632: ##             elif op=="bw":
  633: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%"))
  634: ##             elif op=="ew":
  635: ##                 whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value))
  636: ##             op="ct"
  637:             
  638: ##             #except:
  639: ##             #    print "END",value,name,Exception      
  640: 
  641:         whereList=["("+searchFields[x]+")" for x in searchFields.keys()]
  642: 
  643:         if len(whereList)>0:
  644:             if filter:
  645:                 whereStr="("+string.join(whereList," "+lop+" ")+") AND "+filter
  646:             else:
  647:                 whereStr=string.join(whereList," "+lop+" ")
  648:             where="WHERE "+whereStr
  649:         else:
  650:             if filter:
  651:                 where="WHERE "+filter
  652:             else:
  653:                 where=""
  654: 
  655:         if restrictConnect:
  656:             
  657:             if len(where)==0:
  658:                 where="WHERE "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
  659:             else:
  660:                 where+="and "+restrictConnect[0]+" in ("+restrictConnect[1]+")"
  661:                 
  662:         #print "QE",table
  663:         
  664:         query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
  665:         
  666:         if not nostore=="yes":
  667:             
  668:             self.REQUEST.SESSION['qs']=opfields
  669:         #print "IAMHERE again:", query
  670: 
  671:         if storename and (not NoQuery):
  672:             query2="SELECT count(*) FROM %s %s"%(table,where)
  673: 
  674:             #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
  675:             if not self.REQUEST.SESSION.has_key(storename):
  676:                 self.REQUEST.SESSION[storename]={}
  677:             if self.REQUEST.SESSION[storename].has_key('queryString2'):
  678: 
  679:                 if not self.REQUEST.SESSION[storename]['queryString2']==query2:
  680:                     #print "HOOOOO",storename
  681:                     self.REQUEST.SESSION[storename]['queryString2']=query2
  682:                     self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
  683: 
  684:                     #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
  685:                 
  686:             else:
  687: 
  688:                 self.REQUEST.SESSION[storename]['queryString2']=query2
  689:                 self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
  690:                 #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2']
  691:             
  692:             
  693:             self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
  694:             if limit=="all":
  695:                 self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
  696:             else:
  697:                 self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
  698:             self.REQUEST.SESSION[storename]['rangeSize']=limit
  699:             self.REQUEST.SESSION[storename]['searchFields']=searchFields
  700:             self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
  701:             
  702:         if not NoQuery:
  703: 
  704:             return self.ZSQLQuery(query)
  705:         else:
  706: 
  707:             return query
  708:             
  709:     def ZSQLQuery(self,query):
  710:         """query"""
  711:         return self.ZSQLSimpleSearch(query)
  712:     
  713:     def ZSQLSearch(self):
  714:         """To be done"""
  715:         rq=self.REQUEST['QUERY_STRING']
  716:         querys=rq.split("&")
  717:         
  718: 
  719:         for querytemp in querys:
  720:             query=querytemp.split("=")
  721:             try:
  722:                 if query[0].lower()=="-format":
  723:                     formatfile=query[1]
  724:             except:
  725:                 """nothing"""
  726:         #print formatfile
  727:         
  728:         self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
  729:         self.REQUEST.SESSION['come_from_search']="yes"
  730:         
  731:         return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
  732: 
  733:     
  734:     def ZSQLint(self,string):
  735:         try:
  736: 
  737:             return(int(string))
  738:         except:
  739:             return 0
  740: 
  741:     def getZSQLSearchFieldsList(self,storename="foundCount"):
  742:         """get searchfieldList"""
  743:         #print self.REQUEST.SESSION[storename]['searchFields'].keys()
  744:         return  self.REQUEST.SESSION[storename]['searchFieldsOnly'].keys()
  745: 
  746:     def getZSQLSearchFields(self,field,storename="foundCount"):
  747:         """get searchfield"""
  748:         #print "SF",self.REQUEST.SESSION[storename]['searchFields']
  749:         
  750:         return  self.REQUEST.SESSION[storename]['searchFieldsOnly'][field]
  751: 
  752:                                                 
  753:     def nextLink(self,html,storename="foundCount"):
  754:         """nextLink"""
  755:         try:
  756:             limit=self.REQUEST.SESSION[storename]['rangeSize']
  757:             if int(limit)==0 :
  758:                 limit="1"
  759:             newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
  760:         except:
  761:             limit=1
  762:             newRangeStart=0
  763:             
  764:         if newRangeStart>=self.REQUEST.SESSION[storename]['count']:
  765:             #newRangeStart=self.REQUEST.SESSION[storename]['count']-1
  766:             return ""
  767:         
  768:         #create new query string
  769:         
  770:         if self.REQUEST['QUERY_STRING']=="":
  771:             qs=self.REQUEST.SESSION['query']
  772:             
  773:             queries=string.split(qs,",")
  774:             
  775:             
  776:         else:
  777:             qs=self.REQUEST['QUERY_STRING']
  778:             queries=string.split(qs,"&")
  779:             
  780:             
  781:             
  782:         newquery=[]
  783: 
  784:         skipFound=0
  785:         
  786:         for query in queries:
  787:             
  788:             #print query.split("=")[0]
  789:             if query[0]=="_" : query[0]="-"
  790: 
  791:             if query.split("=")[0].lower()=="-skip":
  792: 
  793:                 skipFound=1
  794:                 query="-skip=%i"%newRangeStart
  795:             newquery.append(query)
  796: 
  797:         if skipFound==0 :
  798:             query="-skip=%i"%newRangeStart
  799:             newquery.append(query)
  800:                 
  801:         newquerystring=string.join(newquery,"&")
  802: 	
  803:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  804:             
  805:         
  806:     def prevLink(self,html,storename="foundCount"):
  807:         """prev link"""
  808:         try:
  809:             limit=self.REQUEST.SESSION[storename]['rangeSize']
  810:             if int(limit)==0 :
  811:                 limit="1"
  812:             newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
  813:         except:
  814:             limit=1
  815:             newRangeStart=0
  816:         if newRangeStart <0:
  817:             return ""
  818: 
  819:         #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart'])
  820:         
  821:         if newRangeStart<0:
  822:                 newRangeStart=0
  823: 
  824:         #create new query string
  825:         
  826:         if self.REQUEST['QUERY_STRING']=="":
  827:             qs=self.REQUEST.SESSION['query']
  828:             #qs=re.sub(r'_','-',qs) #aendern für query
  829:             queries=string.split(qs,",")
  830:             
  831:             
  832:         else:
  833:             qs=self.REQUEST['QUERY_STRING']
  834:             queries=string.split(qs,"&")
  835:             
  836:             
  837:             
  838:         newquery=[]
  839:         
  840:         skipFound=0
  841: 
  842:         for query in queries:
  843:             #print query.split("=")[0]
  844: 
  845:             if query[0]=="_" : query[0]="-"
  846:             
  847:             if query.split("=")[0].lower()=="-skip":
  848:                 #print"HI"
  849:                 query="-skip=%i"%newRangeStart
  850:                 skipFound=1
  851:             newquery.append(query)
  852: 
  853:         if skipFound==0 :
  854:             query="-skip=%i"%newRangeStart
  855:             newquery.append(query)
  856:             
  857:         newquerystring=string.join(newquery,"&")
  858: 
  859:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  860: 
  861: 
  862:     
  863:     def prevLink_old(self,html):
  864:         """prev link"""
  865:         if self.REQUEST['QUERY_STRING']=="":
  866:             qs=self.REQUEST.SESSION['query']
  867:         else:
  868:             qs=self.REQUEST['QUERY_STRING']
  869:         max=re.search(r'max\=(.*)\,',qs.lower())
  870:         offset=re.search(r'offset\=(.*)\,',qs.lower())
  871:         if not offset:
  872:             offsetnew=0
  873:         else:
  874:             offsetnew=int(offset)-max
  875:             if offsetnew<0:
  876:                 offsetnew=0
  877:         queries=string.split(qs,",")
  878:         newquery=[]
  879:         if offset:
  880:             for query in queries:
  881:                 if query.split("=")[0].lower()=="offset":
  882:                     query="-offset=%i"%offsetnew
  883:                 newquery.append(query)
  884:                 newquerystring=string.join(newquery,"&")
  885:         else:
  886:             queries.append("-offset=%i"%offsetnew)
  887:             newquerystring=string.join(queries,"&")
  888:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  889:         
  890:     def nextLink_old(self,html):
  891:         """prev link"""
  892:         if self.REQUEST['QUERY_STRING']=="":
  893:             qs=self.REQUEST.SESSION['query']
  894:         else:
  895:             qs=self.REQUEST['QUERY_STRING']
  896:         max=re.search(r'max\=(.*)\,',qs.lower())
  897:     
  898:         offset=re.search(r'offset\=(.*)\,',qs.lower())
  899:         if not offset:
  900:             offsetnew=1
  901:         else:
  902:             offsetnew=int(offset)+int(max)
  903:             if offsetnew<0:
  904:                 offsetnew=0
  905:         queries=string.split(qs,",")
  906:         newquery=[]
  907:         if offset:
  908:             for query in queries:
  909: 
  910:                 if query.split("=")[0].lower()=="-offset":
  911:                     query="-offset=%i"%offsetnew
  912:                 newquery.append(query)
  913:                 newquerystring=string.join(newquery,"&")
  914:         else:
  915:             queries.append("-offset=%i"%offsetnew)
  916:             newquerystring=string.join(queries,"&")
  917:         
  918:         return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
  919:         
  920:     
  921: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
  922: 
  923: def manage_addZSQLExtendFolder(self, id, title='', label='', description='',
  924:                      createPublic=0,
  925:                      createUserF=0,
  926:                      connection_id=None,
  927:                      REQUEST=None):
  928:     """Add a new Folder object with id *id*.
  929: 
  930:     If the 'createPublic' and 'createUserF' parameters are set to any true
  931:     value, an 'index_html' and a 'UserFolder' objects are created respectively
  932:     in the new folder.
  933:     """
  934:     
  935:     
  936:     ob=ZSQLExtendFolder()
  937:     ob.id=str(id)
  938:     ob.title=title
  939:     self._setObject(id, ob)
  940:     ob=self._getOb(id)
  941:     setattr(ob,'label',label)
  942:     setattr(ob,'description',description)
  943:     setattr(ob,'connection_id',connection_id)
  944:     
  945:     checkPermission=getSecurityManager().checkPermission
  946: 
  947:     if createUserF:
  948:         if not checkPermission('Add User Folders', ob):
  949:             raise Unauthorized, (
  950:                   'You are not authorized to add User Folders.'
  951:                   )
  952:         ob.manage_addUserFolder()
  953: 
  954:     if createPublic:
  955:         if not checkPermission('Add Page Templates', ob):
  956:             raise Unauthorized, (
  957:                   'You are not authorized to add Page Templates.'
  958:                   )
  959:         ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
  960:             id='index_html', title='')
  961: 
  962:     if REQUEST is not None:
  963:         return self.manage_main(self, REQUEST, update_menu=1)
  964: 
  965: 
  966: 
  967: class ZSQLBibliography(Folder,ZSQLExtendFolder):
  968:     """Bibliography"""
  969:     meta_type="ZSQLBibliography"
  970:     def getLabel(self):
  971:         try:
  972:             return self.label
  973:         except:
  974:             return ""
  975: 
  976:     def getDescription(self):
  977:         try:
  978:             return self.description
  979:         except:
  980:             return ""
  981:             
  982:     def changeZSQLBibliographyForm(self):
  983:         """change folder config"""
  984:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLBibliographyForm.zpt').__of__(self)
  985:         return pt()
  986: 
  987: 
  988:     def content_html(self):
  989:         """template fuer content"""
  990:         
  991:         try:
  992:             obj=getattr(self,"ZSQLBibliography_template")
  993:             return obj()
  994:         except:
  995:             pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt').__of__(self)
  996:             pt.content_type="text/html"
  997:             return pt()
  998: 
  999:     def changeZSQLBibliography(self,tableName,label,description,REQUEST=None):
 1000:         """change it"""
 1001:         self.tableName=tableName
 1002:         self.label=label
 1003:         self.description=description
 1004:         
 1005:         if REQUEST is not None:
 1006:             return self.manage_main(self, REQUEST)
 1007: 
 1008:     manage_options=Folder.manage_options+(
 1009:         {'label':'Main Config','action':'changeZSQLBibliographyForm'},
 1010:        )
 1011: 
 1012: 
 1013:     def getFieldLabel(self,fields,field):
 1014:         """get labels"""
 1015:         try:
 1016:             ret =fields[0][field]
 1017:             if ret == "":
 1018:                 return field
 1019:             else:
 1020:                 return ret
 1021:         except:
 1022:             return field
 1023:         
 1024:     def getFieldValue(self,found,field):
 1025:         """get value"""
 1026:         try:
 1027:             ret=getattr(found,field)
 1028:             if ret == "":
 1029:                 return None
 1030:             else:
 1031:                 return ret
 1032:         except:
 1033:             return None
 1034: 
 1035:     def findTagsFromMapping(self,referenceType):
 1036:         """gib hash mit label -> generic zurueck"""
 1037:         self.referencetypes=self.ZopeFind(self.standardMD)
 1038:         bibdata={}
 1039:         retdata={}
 1040:         fieldlist=self.standardMD.fieldList
 1041:         
 1042: 	for referenceTypeF in self.referencetypes:
 1043: 		#print referenceType,referenceTypeF[1].title
 1044: 		if referenceTypeF[1].title == referenceType: 
 1045: 			bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
 1046: 			bibdata['data']=referenceTypeF[1]
 1047: 			self.fields=bibdata[referenceType]
 1048:                         for field in fieldlist:
 1049: 		            if referenceTypeF[1].getValue(field)[0]==None:
 1050: 				retdata[field]=field
 1051: 			    else:
 1052:                                 retdata[field]=referenceTypeF[1].getValue(field)[0]
 1053: 
 1054:         return retdata,fieldlist
 1055:         
 1056:     def findLabelsFromMapping(self,referenceType):
 1057:         """gib hash mit label -> generic zurueck"""
 1058:         self.referencetypes=self.ZopeFind(self.standardMD)
 1059:         bibdata={}
 1060:         retdata={}
 1061:         fieldlist=self.standardMD.fieldList
 1062:         
 1063: 	for referenceTypeF in self.referencetypes:
 1064: 		#print referenceType,referenceTypeF[1].title
 1065: 		if referenceTypeF[1].title == referenceType: 
 1066: 			bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
 1067: 			bibdata['data']=referenceTypeF[1]
 1068: 			self.fields=bibdata[referenceType]
 1069:                         for field in fieldlist:
 1070:                             retdata[field]=referenceTypeF[1].getValue(field)[1]
 1071: 
 1072:         return retdata,fieldlist
 1073: 
 1074:     def createIndexTag(self,tag,content):
 1075:         """creste tag"""
 1076:         if content:
 1077:             ret="""<%s>%s</%s>"""%(tag,content,tag)
 1078:             return ret
 1079:         else:
 1080:             return ""
 1081:     
 1082:     def getMetaDataXML2(self):
 1083:         """crate index meta"""
 1084: 
 1085:         fn=os.path.splitext(self.REQUEST['fn'])[0]+"."
 1086:         self.REQUEST['fn']=fn
 1087: 
 1088:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/record2.xml').__of__(self)
 1089:         pt.content_type="text/xml"
 1090:         return pt()
 1091: 
 1092:     def getMetaDataXML(self):
 1093:         """crate index meta"""
 1094:         pt=PageTemplateFile('Products/ZSQLExtend/zpt/record.xml').__of__(self)
 1095:         pt.content_type="text/xml"
 1096:         return pt()
 1097: 
 1098:     def getMetaDatasXML(self):
 1099:         """index"""
 1100:         ret="""<?xml version="1.0" ?>
 1101: 	             <index>"""
 1102:         for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):
 1103:             link=self.absolute_url()+"/"+"record.html?oid=%i"%found.oid
 1104:             metalink=self.absolute_url()+"/"+"getMetaDataXML?oid=%i"%found.oid
 1105:             
 1106:             ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)
 1107:             
 1108:         return ret+"\n</index>"
 1109: 
 1110:     
 1111: manage_addZSQLBibliographyForm=DTMLFile('ZSQLBibliographyAdd', globals())
 1112: 
 1113: def manage_addZSQLBibliography(self, id, tableName,label,description,title='',
 1114:                      createPublic=0,
 1115:                      createUserF=0,
 1116:                      REQUEST=None):
 1117:     """Add a new Folder object with id *id*.
 1118: 
 1119:     If the 'createPublic' and 'createUserF' parameters are set to any true
 1120:     value, an 'index_html' and a 'UserFolder' objects are created respectively
 1121:     in the new folder.
 1122:     """
 1123:     
 1124:     
 1125:     ob=ZSQLBibliography()
 1126:     ob.id=str(id)
 1127:     ob.title=title
 1128:     self._setObject(id, ob)
 1129:     ob=self._getOb(id)
 1130:     setattr(ob,'tableName',tableName)
 1131:     setattr(ob,'label',label)
 1132:     setattr(ob,'description',description)
 1133:     
 1134:     checkPermission=getSecurityManager().checkPermission
 1135: 
 1136:     if createUserF:
 1137:         if not checkPermission('Add User Folders', ob):
 1138:             raise Unauthorized, (
 1139:                   'You are not authorized to add User Folders.'
 1140:                   )
 1141:         ob.manage_addUserFolder()
 1142: 
 1143:     if createPublic:
 1144:         if not checkPermission('Add Page Templates', ob):
 1145:             raise Unauthorized, (
 1146:                   'You are not authorized to add Page Templates.'
 1147:                   )
 1148:         ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
 1149:             id='index_html', title='')
 1150: 
 1151:     if REQUEST is not None:
 1152:         return self.manage_main(self, REQUEST, update_menu=1)
 1153: 
 1154:     
 1155: 
 1156:     

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