Annotation of ZSQLExtend/ZSQLExtend.py, revision 1.32
1.1 dwinter 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
1.3 dwinter 8: from pyPgSQL import libpq
1.1 dwinter 9: from AccessControl import getSecurityManager
1.5 dwinter 10: import os.path
1.15 dwinter 11: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
1.1 dwinter 12:
1.28 dwinter 13: from Products.ZSQLMethods.SQL import SQLConnectionIDs
14: import Shared.DC.ZRDB.DA
1.15 dwinter 15:
1.28 dwinter 16: def showSQLConnectionIDs(self):
17: return SQLConnectionIDs(self)
1.15 dwinter 18:
1.28 dwinter 19: class ZSQLExtendFolder(Folder,Persistent, Implicit):
1.1 dwinter 20: """Folder"""
21: meta_type="ZSQLExtendFolder"
1.9 dwinter 22:
1.16 dwinter 23: def content_html(self):
24: """template fuer content"""
25:
26: try:
27: obj=getattr(self,"ZSQLBibliography_template")
28: return obj()
29: except:
1.21 dwinter 30: pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt',content_type='text/htm').__of__(self)
1.16 dwinter 31: pt.content_type="text/html"
1.21 dwinter 32:
1.16 dwinter 33: return pt()
34:
35:
1.17 dwinter 36: def getWeight(self):
37: """getLabe"""
38: try:
39: return self.weight
40: except:
41: return ""
42:
1.16 dwinter 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:
1.28 dwinter 67: def changeZSQLExtend(self,label,description,weight=0,REQUEST=None,connection_id=None):
1.16 dwinter 68: """change it"""
1.28 dwinter 69: self.connection_id=connection_id
1.17 dwinter 70: self.weight=weight
1.16 dwinter 71: self.label=label
72: self.description=description
73:
74: if REQUEST is not None:
75: return self.manage_main(self, REQUEST)
76:
1.14 dwinter 77: def formatAscii(self,str,url=None):
78: """ersetze ascii umbrueche durch <br>"""
79: #url=None
1.17 dwinter 80: if url and str:
1.14 dwinter 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:
1.12 dwinter 95: def getSAttribute(self,obj,atribute,pref=''):
96: """get Attribute or emptystring"""
97:
1.13 dwinter 98: #print "obj",obj
1.12 dwinter 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:
1.9 dwinter 111: def actualPath(self,url=None):
112: """path"""
1.10 dwinter 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']
1.9 dwinter 118: if not url:
1.10 dwinter 119: return "http://"+host+self.REQUEST['PATH_TRANSLATED']
1.9 dwinter 120: else:
121: temp=self.REQUEST[url].split("/")
1.10 dwinter 122: temp[2]=host
1.9 dwinter 123: return string.join(temp,"/")
124:
125: def getRequest(self):
126: """request"""
127: return self.REQUEST
1.5 dwinter 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"""
1.7 dwinter 135: #print "field",field
1.5 dwinter 136: if not field:
137: return 1
138: if field=="":
139: return 1
140: return 0
141:
1.6 dwinter 142: def ZSQLsearchOptions(self,fieldname=""):
1.5 dwinter 143: """return HTML Fragment with search options"""
1.6 dwinter 144:
145: ret="""<select name="-op_%s">
1.5 dwinter 146: <option value="bw">begins with</option> <!-- begins with / beginnt mit, "Wort*" -->
147: <option value="ew">ends with</option>
1.7 dwinter 148: <option value="ct" selected>contains</option> <!-- contains / enthaellt, "Wort" -->
1.5 dwinter 149: <option value="eq">equals</option> <!-- equals / ist, =Wort -->
1.6 dwinter 150: </select>"""%fieldname
1.5 dwinter 151: return ret
1.18 dwinter 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")):
1.20 dwinter 159: ret+="""<input name="%s" type="%s" value="%s" checked>%s"""%(fieldname,boxType,field.encode('utf-8'),field.encode('utf-8'))
1.18 dwinter 160: else:
1.20 dwinter 161: ret+="""<input name="%s" type="%s" value="%s">%s"""%(fieldname,boxType,field.encode('utf-8'),field.encode('utf-8'))
1.18 dwinter 162: return ret
163:
164:
1.30 dwinter 165: def ZSQLOptionsFromCRList(self,fieldname,listField, multiple=''):
1.18 dwinter 166: """generate select oprions form a cr seperated list"""
167: fields=listField.split("\n")
1.30 dwinter 168: ret="""<select name="%s" %s>
169: """%(fieldname,multiple)
1.18 dwinter 170: for field in fields:
1.19 dwinter 171: ret+="""<option value="%s">%s</option>"""%(field.encode('utf-8'),field.encode('utf-8'))
1.18 dwinter 172: ret+="""</select>"""
173: return ret
174:
1.32 ! dwinter 175: def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple='',startValue=None):
! 176: """generate select oprions form a search list seperated list"""
1.21 dwinter 177: if not valueName:
178: valueName=fieldName
179:
1.30 dwinter 180: ret="""<select name="%s" %s>
181: """%(fieldname,multiple)
1.18 dwinter 182: if start:
1.19 dwinter 183: if start==' ':
184: start=''
1.32 ! dwinter 185: if not startValue:
! 186: startValue=start
! 187:
! 188: ret+="""<option value="%s">%s</option>"""%(startValue,start)
1.18 dwinter 189: for result in results:
190: field=getattr(result,fieldName)
1.21 dwinter 191: fieldValue=getattr(result,valueName)
192: ret+="""<option value="%s">%s</option>"""%(field,fieldValue)
1.18 dwinter 193: ret+="""</select>"""
194: return ret
195:
196:
1.27 dwinter 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:
1.5 dwinter 205:
1.27 dwinter 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:
1.5 dwinter 218: def ZSQLInlineSearch(self,storename=None,**argv):
1.1 dwinter 219: """inlinesearch"""
220: qs=[]
1.5 dwinter 221: if storename:
222: """store"""
223: else:
224: storename="foundCount"
225:
1.2 dwinter 226:
227:
1.5 dwinter 228: #print "INLINE:",argv
1.1 dwinter 229: for a in argv.keys():
230: qs.append(a+"="+urllib.quote(str(argv[a])))
1.9 dwinter 231: #return []
1.5 dwinter 232: return self.parseQueryString(string.join(qs,","),"_",storename=storename)
1.1 dwinter 233:
1.5 dwinter 234: def ZSQLInlineSearch2(self,query):
235: """inlinesearch"""
236: qs=[]
237:
238:
239:
240: #print "INLINE:",query
1.29 dwinter 241: return self.ZSQLSimpleSearch(query)
1.5 dwinter 242:
1.28 dwinter 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 []
1.1 dwinter 256:
1.28 dwinter 257:
258:
1.1 dwinter 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+"\"")
1.3 dwinter 279: valueList.append(libpq.PgQuoteString(addList[x]))
1.1 dwinter 280:
281: keyString=string.join(keyList,",")
282: valueString=string.join(valueList,",")
283:
284: queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
1.29 dwinter 285: self.ZSQLSimpleSearch(queryString)
1.1 dwinter 286: return self.REQUEST.RESPONSE.redirect(format)
287:
1.4 dwinter 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)
1.29 dwinter 319: self.ZSQLSimpleSearch(queryString)
1.4 dwinter 320: return self.REQUEST.RESPONSE.redirect(format)
321:
322: def ZSQLChange_old(self):
1.1 dwinter 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)
1.3 dwinter 337: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
1.1 dwinter 338: elif name=="-format":
339: format=urllib.unquote(value)
340: elif (not name[0]=="-") and (not len(value)==0):
1.3 dwinter 341: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
1.1 dwinter 342: changeString=string.join(changeList,",")
343: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
1.29 dwinter 344: self.ZSQLSimpleSearch(queryString)
1.1 dwinter 345: return self.REQUEST.RESPONSE.redirect(format)
1.32 ! dwinter 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)
1.1 dwinter 362:
1.32 ! dwinter 363: def ZSQLFind(self,qs="",select="oid,*",storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None,**argv):
1.1 dwinter 364: """Find"""
365:
1.21 dwinter 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
1.29 dwinter 373:
1.31 dwinter 374: #self.REQUEST.SESSION['come_from_search']="no" # zurücksetzen
1.1 dwinter 375: if qs=="":
1.32 ! dwinter 376: print "HI"
1.1 dwinter 377: if self.REQUEST['QUERY_STRING']:
378: qs=self.REQUEST['QUERY_STRING']
1.32 ! dwinter 379:
1.5 dwinter 380:
1.1 dwinter 381: qs=string.join(qs.split("&"),",")
1.21 dwinter 382:
1.17 dwinter 383: for field in argv.keys():
1.21 dwinter 384:
1.17 dwinter 385: qs+=",-%s=%s"%(field,argv[field])
1.30 dwinter 386:
1.1 dwinter 387: else:
1.5 dwinter 388:
1.29 dwinter 389: qs=self.REQUEST.SESSION.get('query','')
1.32 ! dwinter 390: print "QS:",qs
1.22 dwinter 391: for field in argv.keys():
392: #print field
393: qs+=",-%s=%s"%(field,argv[field])
1.21 dwinter 394:
1.1 dwinter 395: else:
1.13 dwinter 396: self.REQUEST['QUERY_STRING']=qs
1.22 dwinter 397:
1.1 dwinter 398: qs=string.join(qs.split("&"),",")
1.13 dwinter 399:
1.21 dwinter 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.
1.1 dwinter 403:
1.21 dwinter 404: qs=string.join(delEmpty(qs.split(",")),",")
1.13 dwinter 405:
1.5 dwinter 406: if storename:
407: """store"""
408: else:
409: storename="foundCount"
1.21 dwinter 410:
411:
1.32 ! dwinter 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)
1.5 dwinter 414: #print self.REQUEST.SESSION["foundCount"]
415:
1.32 ! dwinter 416: print "called query"
1.5 dwinter 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:
1.18 dwinter 452: return int(self.REQUEST.SESSION[storename]['rangeStart'])+1
1.5 dwinter 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']
1.1 dwinter 462:
1.5 dwinter 463: def ZSQLRangeEnd(self,storename=None):
464:
465: if storename:
466: """store"""
467: else:
468: storename="foundCount"
469:
1.23 dwinter 470: return str(min(int(self.REQUEST.SESSION[storename]['rangeEnd']),int(self.REQUEST.SESSION[storename]['count'])))
1.5 dwinter 471:
1.32 ! dwinter 472: def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None,tableExt=None,NoQuery=None,NoLimit=None,restrictField=None,restrictConnect=None):
1.5 dwinter 473: """analysieren den QueryString"""
474: #print "NO",nostore
1.1 dwinter 475: lop="AND" # standardsuche mit and
476: max="ALL" #standard alle auswählen
1.11 dwinter 477: maxstr=""
1.1 dwinter 478: whereList=[]
479: sort=""
480: op="bw"
1.2 dwinter 481: opfields={}
1.30 dwinter 482: lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld
1.5 dwinter 483: skip=""
484: rangeStart=0
1.11 dwinter 485: limit=0
486: searchFields={}
1.31 dwinter 487: searchFieldsOnly={}
1.1 dwinter 488: if not select:
1.10 dwinter 489: select="oid,*"
1.5 dwinter 490: #print "Q",nostore,qs
1.30 dwinter 491: #check for op
1.6 dwinter 492:
493: splitted=qs.split(",")
1.32 ! dwinter 494: if tableExt:
! 495: table=tableExt
! 496:
! 497: if restrictField:
! 498: select=restrictField
1.6 dwinter 499:
500: for q in splitted:
1.5 dwinter 501:
1.2 dwinter 502: name=re.sub("r'+'"," ",q.split("=")[0].lower())
1.14 dwinter 503: try:
504: value=urllib.unquote(q.split("=",1)[1])
505: except:
506: value=""
1.16 dwinter 507: #print "Hi",name[0:3],q
1.2 dwinter 508: if name[0:3]==iCT+"op":
509: op=value
1.14 dwinter 510:
1.2 dwinter 511: field=name[4:]
512: opfields[field]=op
1.30 dwinter 513:
514: if name[0:4]==iCT+"lop":
515: lop=value
516:
517: field=name[5:]
518: lopfields[field]=lop
1.14 dwinter 519: #print "HI",op,field
1.6 dwinter 520: #print opfieldsa
1.2 dwinter 521: #now analyse the querystring
1.1 dwinter 522: for q in qs.split(","):
1.5 dwinter 523:
524:
525: #try:
1.1 dwinter 526:
1.5 dwinter 527: name=re.sub("r'+'"," ",q.split("=")[0].lower())
1.14 dwinter 528: try:
529: value=urllib.unquote(q.split("=",1)[1])
530: except:
531: value=""
532:
1.5 dwinter 533: #value=libpq.PgQuoteString(value)
534:
535:
536: if name==iCT+"lop":
537: lop=value
538: elif name==iCT+"table":
1.32 ! dwinter 539: if not tableExt:
! 540: table=value
1.5 dwinter 541: elif name==iCT+"select":
1.32 ! dwinter 542: if not restrictField:
! 543: select=value
1.5 dwinter 544: elif name==iCT+"max":
1.32 ! dwinter 545: if not NoLimit:
! 546: maxstr="LIMIT "+str(value)
! 547: limit=str(value)
1.5 dwinter 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":
1.30 dwinter 554: sort="ORDER BY "+value.replace(' AND ',',')
1.5 dwinter 555: elif name==iCT+"token":
556: if not nostore=="yes":
1.1 dwinter 557: self.REQUEST.SESSION['token']=value
558:
1.5 dwinter 559: elif name==iCT+"op":
560: op=value
561:
562:
1.1 dwinter 563:
1.5 dwinter 564: elif (not name[0]==iCT) and (not len(value)==0):
1.6 dwinter 565:
566: #print "OP",op,name
1.5 dwinter 567: value=value.lower()
1.30 dwinter 568: tmp=""
1.5 dwinter 569: if opfields.has_key(name):
570: op=opfields[name]
1.30 dwinter 571: else:
572: op="ct"
1.32 ! dwinter 573: namealt=name
1.30 dwinter 574: name="LOWER("+name+")"
1.5 dwinter 575: if op=="ct":
1.30 dwinter 576: tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
1.5 dwinter 577: elif op=="gt":
1.30 dwinter 578: tmp=(name+">"+libpq.PgQuoteString(value))
1.5 dwinter 579: elif op=="lt":
1.30 dwinter 580: tmp=(name+"<"+libpq.PgQuoteString(value))
1.5 dwinter 581: elif op=="eq":
1.30 dwinter 582: tmp=(name+"="+libpq.PgQuoteString(value))
1.5 dwinter 583: elif op=="bw":
1.30 dwinter 584: tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))
1.5 dwinter 585: elif op=="ew":
1.30 dwinter 586: tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value))
1.6 dwinter 587: op="ct"
1.32 ! dwinter 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
1.30 dwinter 596:
1.5 dwinter 597:
1.30 dwinter 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:
1.1 dwinter 625: if len(whereList)>0:
1.32 ! dwinter 626:
1.1 dwinter 627: where="WHERE "+string.join(whereList," "+lop+" ")
628: else:
629: where=""
1.32 ! dwinter 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:
1.1 dwinter 638: #print "QE",table
639:
1.11 dwinter 640: query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
1.13 dwinter 641:
1.5 dwinter 642: if not nostore=="yes":
643:
644: self.REQUEST.SESSION['qs']=opfields
1.7 dwinter 645: #print "IAMHERE again:", query
1.5 dwinter 646:
1.32 ! dwinter 647: if storename and (not NoQuery):
1.7 dwinter 648: query2="SELECT count(*) FROM %s %s"%(table,where)
1.32 ! dwinter 649: print "storing",query2
1.5 dwinter 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'):
1.32 ! dwinter 654: print "HI",storename
1.5 dwinter 655: if not self.REQUEST.SESSION[storename]['queryString2']==query2:
656: #print "HOOOOO",storename
657: self.REQUEST.SESSION[storename]['queryString2']=query2
1.29 dwinter 658: self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
1.32 ! dwinter 659:
1.5 dwinter 660: #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
661:
662: else:
1.32 ! dwinter 663: print "go"
1.5 dwinter 664: self.REQUEST.SESSION[storename]['queryString2']=query2
1.29 dwinter 665: self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
1.5 dwinter 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
1.11 dwinter 675: self.REQUEST.SESSION[storename]['searchFields']=searchFields
1.31 dwinter 676: self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
1.5 dwinter 677:
1.32 ! dwinter 678: if not NoQuery:
! 679: print "noquery",query
! 680: return self.ZSQLQuery(query)
! 681: else:
! 682: print "query"
! 683: return query
! 684:
1.16 dwinter 685: def ZSQLQuery(self,query):
686: """query"""
1.29 dwinter 687: return self.ZSQLSimpleSearch(query)
1.1 dwinter 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"""
1.30 dwinter 702: #print formatfile
703:
1.1 dwinter 704: self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
1.29 dwinter 705: self.REQUEST.SESSION['come_from_search']="yes"
706:
1.1 dwinter 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
1.5 dwinter 716:
1.11 dwinter 717: def getZSQLSearchFieldsList(self,storename="foundCount"):
718: """get searchfieldList"""
1.13 dwinter 719: #print self.REQUEST.SESSION[storename]['searchFields'].keys()
1.31 dwinter 720: return self.REQUEST.SESSION[storename]['searchFieldsOnly'].keys()
1.11 dwinter 721:
1.31 dwinter 722: def getZSQLSearchFields(self,field,storename="foundCount"):
1.11 dwinter 723: """get searchfield"""
1.13 dwinter 724: #print "SF",self.REQUEST.SESSION[storename]['searchFields']
1.31 dwinter 725:
726: return self.REQUEST.SESSION[storename]['searchFieldsOnly'][field]
1.11 dwinter 727:
728:
1.5 dwinter 729: def nextLink(self,html,storename="foundCount"):
730: """nextLink"""
731: try:
732: limit=self.REQUEST.SESSION[storename]['rangeSize']
1.21 dwinter 733: if int(limit)==0 :
734: limit="1"
1.5 dwinter 735: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
736: except:
1.26 dwinter 737: limit=1
1.5 dwinter 738: newRangeStart=0
739:
1.26 dwinter 740: if newRangeStart>=self.REQUEST.SESSION[storename]['count']:
1.23 dwinter 741: #newRangeStart=self.REQUEST.SESSION[storename]['count']-1
742: return ""
1.5 dwinter 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:
1.22 dwinter 763:
1.5 dwinter 764: #print query.split("=")[0]
765: if query[0]=="_" : query[0]="-"
766:
767: if query.split("=")[0].lower()=="-skip":
1.26 dwinter 768:
1.5 dwinter 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,"&")
1.9 dwinter 778:
779: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.5 dwinter 780:
781:
782: def prevLink(self,html,storename="foundCount"):
783: """prev link"""
784: try:
785: limit=self.REQUEST.SESSION[storename]['rangeSize']
1.21 dwinter 786: if int(limit)==0 :
787: limit="1"
1.5 dwinter 788: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
789: except:
1.23 dwinter 790: limit=1
1.5 dwinter 791: newRangeStart=0
1.23 dwinter 792: if newRangeStart <0:
793: return ""
1.5 dwinter 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,"&")
1.9 dwinter 834:
835: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
836:
837:
1.5 dwinter 838:
839: def prevLink_old(self,html):
1.1 dwinter 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,"&")
1.9 dwinter 864: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.1 dwinter 865:
1.5 dwinter 866: def nextLink_old(self,html):
1.1 dwinter 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:
1.9 dwinter 894: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.1 dwinter 895:
1.5 dwinter 896:
1.1 dwinter 897: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
898:
1.16 dwinter 899: def manage_addZSQLExtendFolder(self, id, title='', label='', description='',
1.1 dwinter 900: createPublic=0,
901: createUserF=0,
1.28 dwinter 902: connection_id=None,
1.1 dwinter 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)
1.16 dwinter 917: setattr(ob,'label',label)
918: setattr(ob,'description',description)
1.28 dwinter 919: setattr(ob,'connection_id',connection_id)
1.16 dwinter 920:
1.1 dwinter 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)
1.15 dwinter 940:
941:
942:
1.16 dwinter 943: class ZSQLBibliography(Folder,ZSQLExtendFolder):
1.15 dwinter 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:
1.16 dwinter 984: manage_options=Folder.manage_options+(
985: {'label':'Main Config','action':'changeZSQLBibliographyForm'},
1.15 dwinter 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
1.18 dwinter 1010:
1.21 dwinter 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:
1.25 dwinter 1025: if referenceTypeF[1].getValue(field)[0]==None:
1026: retdata[field]=field
1027: else:
1028: retdata[field]=referenceTypeF[1].getValue(field)[0]
1.21 dwinter 1029:
1030: return retdata,fieldlist
1031:
1.15 dwinter 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:
1.18 dwinter 1040: #print referenceType,referenceTypeF[1].title
1.15 dwinter 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:
1.21 dwinter 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:
1.26 dwinter 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:
1.21 dwinter 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>"""
1.29 dwinter 1078: for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):
1.21 dwinter 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>"
1.26 dwinter 1085:
1.21 dwinter 1086:
1.15 dwinter 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:
1.1 dwinter 1131:
1132:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>