File:  [Repository] / ZSQLExtend / ZSQLExtend.py
Revision 1.32: download - view: text, annotated - select for diffs - revision graph
Fri Aug 27 23:03:48 2004 UTC (19 years, 10 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
minors

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

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