File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.46: download - view: text, annotated - select for diffs - revision graph
Thu Oct 28 14:16:00 2004 UTC (19 years, 7 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
globals()

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

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