File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.40: download - view: text, annotated - select for diffs - revision graph
Wed Oct 6 10:51:07 2004 UTC (19 years, 8 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
minorbug fixed

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

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