Annotation of ZSQLExtend/ZSQLExtend.py, revision 1.31
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.30 dwinter 175: def ZSQLOptionsFromSearchList(self,fieldname,results,fieldName,valueName=None,start=None, multiple=''):
1.18 dwinter 176: """generate select oprions form a cr 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.18 dwinter 185: ret+="""<option value="%s">%s</option>"""%(start,start)
186: for result in results:
187: field=getattr(result,fieldName)
1.21 dwinter 188: fieldValue=getattr(result,valueName)
189: ret+="""<option value="%s">%s</option>"""%(field,fieldValue)
1.18 dwinter 190: ret+="""</select>"""
191: return ret
192:
193:
1.27 dwinter 194: def ZSQLInlineSearchU(self,storename=None,**argv):
195: """one element if exists"""
196: qs=[]
197: if storename:
198: """store"""
199: else:
200: storename="foundCount"
201:
1.5 dwinter 202:
1.27 dwinter 203:
204: #print "INLINE:",argv
205: for a in argv.keys():
206: qs.append(a+"="+urllib.quote(str(argv[a])))
207: #return []
208: ret = self.parseQueryString(string.join(qs,","),"_",storename=storename)
209:
210: try:
211: return ret[0]
212: except:
213: return None
214:
1.5 dwinter 215: def ZSQLInlineSearch(self,storename=None,**argv):
1.1 dwinter 216: """inlinesearch"""
217: qs=[]
1.5 dwinter 218: if storename:
219: """store"""
220: else:
221: storename="foundCount"
222:
1.2 dwinter 223:
224:
1.5 dwinter 225: #print "INLINE:",argv
1.1 dwinter 226: for a in argv.keys():
227: qs.append(a+"="+urllib.quote(str(argv[a])))
1.9 dwinter 228: #return []
1.5 dwinter 229: return self.parseQueryString(string.join(qs,","),"_",storename=storename)
1.1 dwinter 230:
1.5 dwinter 231: def ZSQLInlineSearch2(self,query):
232: """inlinesearch"""
233: qs=[]
234:
235:
236:
237: #print "INLINE:",query
1.29 dwinter 238: return self.ZSQLSimpleSearch(query)
1.5 dwinter 239:
1.28 dwinter 240:
241: def ZSQLSimpleSearch(self,query=None):
242: """ returrn SQLSearch"""
243: if not query:
244: query=self.query
245:
246: if self.search.meta_type=="Z SQL Method":
247: return self.search(var=query)
248: else:
249: if self.aq_parent.aq_parent.search.meta_type=="Z SQL Method":
250: return self.aq_parent.aq_parent.search(var=query)
251: else:
252: return []
1.1 dwinter 253:
1.28 dwinter 254:
255:
1.1 dwinter 256: def ZSQLAdd(self):
257: """Neuer Eintrag"""
258: qs=self.REQUEST['QUERY_STRING']
259: addList={}
260: for q in qs.split("&"):
261: name=re.sub("r'+'"," ",q.split("=")[0].lower())
262: value=q.split("=")[1]
263: value=re.sub(r'\+'," ",value)
264: value=urllib.unquote(value)
265: if name=="-table":
266: table=urllib.unquote(value)
267: elif name=="-format":
268: format=urllib.unquote(value)
269: elif (not name[0]=="-") and (not len(value)==0):
270: addList[urllib.unquote(name)]=urllib.unquote(value)
271:
272: keyList=[]
273: valueList=[]
274: for x in addList.keys():
275: keyList.append("\""+x+"\"")
1.3 dwinter 276: valueList.append(libpq.PgQuoteString(addList[x]))
1.1 dwinter 277:
278: keyString=string.join(keyList,",")
279: valueString=string.join(valueList,",")
280:
281: queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
1.29 dwinter 282: self.ZSQLSimpleSearch(queryString)
1.1 dwinter 283: return self.REQUEST.RESPONSE.redirect(format)
284:
1.4 dwinter 285: def ZSQLChange(self,**argv):
286: """Ändern von Einträgen"""
287: #qs=self.REQUEST['QUERY_STRING']
288: # very bad hack
289: qs_temp=[]
290:
291: for a in self.REQUEST.form.keys():
292: qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
293:
294: qs=string.join(qs_temp,"&")
295:
296:
297: #print "CHANGE QS",self.REQUEST
298: #return self.REQUEST
299: changeList=[]
300: for q in qs.split("&"):
301: name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
302: value=q.split("=")[1]
303: value=re.sub(r'\+'," ",value)
304: value=urllib.unquote(value)
305: if name=="-table":
306: table=urllib.unquote(value)
307: elif name=="-identify":
308: identify=urllib.unquote(value)
309: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
310: elif name=="-format":
311: format=urllib.unquote(value)
312: elif (not name[0]=="-") and (not len(value)==0):
313: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
314: changeString=string.join(changeList,",")
315: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
1.29 dwinter 316: self.ZSQLSimpleSearch(queryString)
1.4 dwinter 317: return self.REQUEST.RESPONSE.redirect(format)
318:
319: def ZSQLChange_old(self):
1.1 dwinter 320: """Ändern von Einträgen"""
321: qs=self.REQUEST['QUERY_STRING']
322: #print "CHANGE QS",self.REQUEST
323: #return self.REQUEST
324: changeList=[]
325: for q in qs.split("&"):
326: name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
327: value=q.split("=")[1]
328: value=re.sub(r'\+'," ",value)
329: value=urllib.unquote(value)
330: if name=="-table":
331: table=urllib.unquote(value)
332: elif name=="-identify":
333: identify=urllib.unquote(value)
1.3 dwinter 334: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
1.1 dwinter 335: elif name=="-format":
336: format=urllib.unquote(value)
337: elif (not name[0]=="-") and (not len(value)==0):
1.3 dwinter 338: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
1.1 dwinter 339: changeString=string.join(changeList,",")
340: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
1.29 dwinter 341: self.ZSQLSimpleSearch(queryString)
1.1 dwinter 342: return self.REQUEST.RESPONSE.redirect(format)
343:
1.17 dwinter 344: def ZSQLFind(self,qs="",select="oid,*",storename=None,**argv):
1.1 dwinter 345: """Find"""
346:
1.21 dwinter 347: def delEmpty(list):
348: ret=[]
349: for x in list:
350: splitted=x.split("=")
351: if (len(splitted)>1) and not (splitted[1]==' '):
352: ret.append(x)
353: return ret
1.29 dwinter 354:
1.31 ! dwinter 355: #self.REQUEST.SESSION['come_from_search']="no" # zurücksetzen
1.1 dwinter 356: if qs=="":
357: if self.REQUEST['QUERY_STRING']:
358: qs=self.REQUEST['QUERY_STRING']
1.5 dwinter 359:
360:
1.1 dwinter 361: qs=string.join(qs.split("&"),",")
1.21 dwinter 362:
1.17 dwinter 363: for field in argv.keys():
1.21 dwinter 364:
1.17 dwinter 365: qs+=",-%s=%s"%(field,argv[field])
1.30 dwinter 366:
1.1 dwinter 367: else:
1.5 dwinter 368:
1.29 dwinter 369: qs=self.REQUEST.SESSION.get('query','')
370:
1.22 dwinter 371: for field in argv.keys():
372: #print field
373: qs+=",-%s=%s"%(field,argv[field])
1.21 dwinter 374:
1.1 dwinter 375: else:
1.13 dwinter 376: self.REQUEST['QUERY_STRING']=qs
1.22 dwinter 377:
1.1 dwinter 378: qs=string.join(qs.split("&"),",")
1.13 dwinter 379:
1.21 dwinter 380:
381:
382: 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 383:
1.21 dwinter 384: qs=string.join(delEmpty(qs.split(",")),",")
1.13 dwinter 385:
1.5 dwinter 386: if storename:
387: """store"""
388: else:
389: storename="foundCount"
1.21 dwinter 390:
391:
1.30 dwinter 392:
1.5 dwinter 393: ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename)
394: #print self.REQUEST.SESSION["foundCount"]
395:
1.21 dwinter 396:
1.5 dwinter 397: return ret
398:
399: def ZSQLFoundCountLen(self,var):
400: return len(var)
401:
402: def ZSQLFoundCount(self,qs="",select="*",storename=None):
403:
404: ## if qs=="":
405:
406: ## if self.REQUEST['QUERY_STRING']:
407:
408: ## qs=self.REQUEST['QUERY_STRING']
409: ## qs=string.join(qs.split("&"),",")
410: ## else:
411:
412: ## qs=self.REQUEST.SESSION['query']
413: ## else:
414: ## qs=string.join(qs.split("&"),",")
415:
416:
417: ## temp= self.parseQueryString(qs,"-",select=select,storemax="yes",nostore="yes")
418: if storename:
419: """store"""
420: else:
421: storename="foundCount"
422:
423: return self.REQUEST.SESSION[storename]['count']
424:
425: def ZSQLRangeStart(self,storename=None):
426:
427: if storename:
428: """store"""
429: else:
430: storename="foundCount"
431:
1.18 dwinter 432: return int(self.REQUEST.SESSION[storename]['rangeStart'])+1
1.5 dwinter 433:
434: def ZSQLRangeSize(self,storename=None):
435:
436: if storename:
437: """store"""
438: else:
439: storename="foundCount"
440:
441: return self.REQUEST.SESSION[storename]['rangeSize']
1.1 dwinter 442:
1.5 dwinter 443: def ZSQLRangeEnd(self,storename=None):
444:
445: if storename:
446: """store"""
447: else:
448: storename="foundCount"
449:
1.23 dwinter 450: return str(min(int(self.REQUEST.SESSION[storename]['rangeEnd']),int(self.REQUEST.SESSION[storename]['count'])))
1.5 dwinter 451:
452: def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None):
453: """analysieren den QueryString"""
454: #print "NO",nostore
1.1 dwinter 455: lop="AND" # standardsuche mit and
456: max="ALL" #standard alle auswählen
1.11 dwinter 457: maxstr=""
1.1 dwinter 458: whereList=[]
459: sort=""
460: op="bw"
1.2 dwinter 461: opfields={}
1.30 dwinter 462: lopfields={} #Verknüpfung bei mehrfachauswahl von einem feld
1.5 dwinter 463: skip=""
464: rangeStart=0
1.11 dwinter 465: limit=0
466: searchFields={}
1.31 ! dwinter 467: searchFieldsOnly={}
1.1 dwinter 468: if not select:
1.10 dwinter 469: select="oid,*"
1.5 dwinter 470: #print "Q",nostore,qs
1.30 dwinter 471: #check for op
1.6 dwinter 472:
473: splitted=qs.split(",")
474:
475:
476: for q in splitted:
1.5 dwinter 477:
1.2 dwinter 478: name=re.sub("r'+'"," ",q.split("=")[0].lower())
1.14 dwinter 479: try:
480: value=urllib.unquote(q.split("=",1)[1])
481: except:
482: value=""
1.16 dwinter 483: #print "Hi",name[0:3],q
1.2 dwinter 484: if name[0:3]==iCT+"op":
485: op=value
1.14 dwinter 486:
1.2 dwinter 487: field=name[4:]
488: opfields[field]=op
1.30 dwinter 489:
490: if name[0:4]==iCT+"lop":
491: lop=value
492:
493: field=name[5:]
494: lopfields[field]=lop
1.14 dwinter 495: #print "HI",op,field
1.6 dwinter 496: #print opfieldsa
1.2 dwinter 497: #now analyse the querystring
1.1 dwinter 498: for q in qs.split(","):
1.5 dwinter 499:
500:
501: #try:
1.1 dwinter 502:
1.5 dwinter 503: name=re.sub("r'+'"," ",q.split("=")[0].lower())
1.14 dwinter 504: try:
505: value=urllib.unquote(q.split("=",1)[1])
506: except:
507: value=""
508:
1.5 dwinter 509: #value=libpq.PgQuoteString(value)
510:
511:
512: if name==iCT+"lop":
513: lop=value
514: elif name==iCT+"table":
515: table=value
516: elif name==iCT+"select":
517: select=value
518: elif name==iCT+"max":
1.11 dwinter 519: maxstr="LIMIT "+str(value)
1.5 dwinter 520: limit=str(value)
521: elif name==iCT+"skip":
522: skip="OFFSET "+str(value)
523: rangeStart=str(value)
524: elif name==iCT+"join":
525: whereList.append(value)
526: elif name==iCT+"sort":
1.30 dwinter 527: sort="ORDER BY "+value.replace(' AND ',',')
1.5 dwinter 528: elif name==iCT+"token":
529: if not nostore=="yes":
1.1 dwinter 530: self.REQUEST.SESSION['token']=value
531:
1.5 dwinter 532: elif name==iCT+"op":
533: op=value
534:
535:
1.1 dwinter 536:
1.5 dwinter 537: elif (not name[0]==iCT) and (not len(value)==0):
1.6 dwinter 538:
539: #print "OP",op,name
1.5 dwinter 540: value=value.lower()
1.30 dwinter 541: tmp=""
1.5 dwinter 542: if opfields.has_key(name):
543: op=opfields[name]
1.30 dwinter 544: else:
545: op="ct"
546: name="LOWER("+name+")"
1.5 dwinter 547: if op=="ct":
1.30 dwinter 548: tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
1.5 dwinter 549: elif op=="gt":
1.30 dwinter 550: tmp=(name+">"+libpq.PgQuoteString(value))
1.5 dwinter 551: elif op=="lt":
1.30 dwinter 552: tmp=(name+"<"+libpq.PgQuoteString(value))
1.5 dwinter 553: elif op=="eq":
1.30 dwinter 554: tmp=(name+"="+libpq.PgQuoteString(value))
1.5 dwinter 555: elif op=="bw":
1.30 dwinter 556: tmp=(name+" LIKE "+libpq.PgQuoteString(value+"%"))
1.5 dwinter 557: elif op=="ew":
1.30 dwinter 558: tmp=(name+" LIKE "+libpq.PgQuoteString("%"+value))
1.6 dwinter 559: op="ct"
1.30 dwinter 560:
561: if searchFields.has_key(name):
562: searchFields[name]+=lopfields.get(name,'OR')+" "+tmp
1.31 ! dwinter 563: searchFieldsOnly[name]+=lopfields.get(name,'OR')+" "+value
! 564: else:
1.30 dwinter 565: searchFields[name]=tmp
1.31 ! dwinter 566: searchFieldsOnly[name]=value
1.30 dwinter 567:
1.5 dwinter 568:
1.30 dwinter 569: ## for name in searchFields.keys():
570: ## value=searchFields[name]
571:
572: ## if opfields.has_key(name):
573: ## op=opfields[name]
574: ## else:
575: ## op="ct"
576: ## name="LOWER("+name+")"
577: ## if op=="ct":
578: ## whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
579: ## elif op=="gt":
580: ## whereList.append(name+">"+libpq.PgQuoteString(value))
581: ## elif op=="lt":
582: ## whereList.append(name+"<"+libpq.PgQuoteString(value))
583: ## elif op=="eq":
584: ## whereList.append(name+"="+libpq.PgQuoteString(value))
585: ## elif op=="bw":
586: ## whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%"))
587: ## elif op=="ew":
588: ## whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value))
589: ## op="ct"
590:
591: ## #except:
592: ## # print "END",value,name,Exception
593:
594: whereList=["("+searchFields[x]+")" for x in searchFields.keys()]
595:
1.1 dwinter 596: if len(whereList)>0:
597: where="WHERE "+string.join(whereList," "+lop+" ")
598: else:
599: where=""
600: #print "QE",table
601:
1.11 dwinter 602: query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
1.13 dwinter 603:
1.5 dwinter 604: if not nostore=="yes":
605:
606: self.REQUEST.SESSION['qs']=opfields
1.7 dwinter 607: #print "IAMHERE again:", query
1.5 dwinter 608:
609: if storename:
1.7 dwinter 610: query2="SELECT count(*) FROM %s %s"%(table,where)
1.5 dwinter 611: #print "storing",query2
612: #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
613: if not self.REQUEST.SESSION.has_key(storename):
614: self.REQUEST.SESSION[storename]={}
615: if self.REQUEST.SESSION[storename].has_key('queryString2'):
616: #print "HI",storename
617: if not self.REQUEST.SESSION[storename]['queryString2']==query2:
618: #print "HOOOOO",storename
619: self.REQUEST.SESSION[storename]['queryString2']=query2
1.29 dwinter 620: self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
1.5 dwinter 621: #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
622:
623: else:
624: self.REQUEST.SESSION[storename]['queryString2']=query2
1.29 dwinter 625: self.REQUEST.SESSION[storename]['count']=self.ZSQLSimpleSearch(query2)[0].count
1.5 dwinter 626: #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2']
627:
628:
629: self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
630: if limit=="all":
631: self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
632: else:
633: self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
634: self.REQUEST.SESSION[storename]['rangeSize']=limit
1.11 dwinter 635: self.REQUEST.SESSION[storename]['searchFields']=searchFields
1.31 ! dwinter 636: self.REQUEST.SESSION[storename]['searchFieldsOnly']=searchFieldsOnly
1.5 dwinter 637:
1.30 dwinter 638:
1.16 dwinter 639: return self.ZSQLQuery(query)
640:
641: def ZSQLQuery(self,query):
642: """query"""
1.29 dwinter 643: return self.ZSQLSimpleSearch(query)
1.1 dwinter 644:
645: def ZSQLSearch(self):
646: """To be done"""
647: rq=self.REQUEST['QUERY_STRING']
648: querys=rq.split("&")
649:
650:
651: for querytemp in querys:
652: query=querytemp.split("=")
653: try:
654: if query[0].lower()=="-format":
655: formatfile=query[1]
656: except:
657: """nothing"""
1.30 dwinter 658: #print formatfile
659:
1.1 dwinter 660: self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
1.29 dwinter 661: self.REQUEST.SESSION['come_from_search']="yes"
662:
1.1 dwinter 663: return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
664:
665:
666: def ZSQLint(self,string):
667: try:
668:
669: return(int(string))
670: except:
671: return 0
1.5 dwinter 672:
1.11 dwinter 673: def getZSQLSearchFieldsList(self,storename="foundCount"):
674: """get searchfieldList"""
1.13 dwinter 675: #print self.REQUEST.SESSION[storename]['searchFields'].keys()
1.31 ! dwinter 676: return self.REQUEST.SESSION[storename]['searchFieldsOnly'].keys()
1.11 dwinter 677:
1.31 ! dwinter 678: def getZSQLSearchFields(self,field,storename="foundCount"):
1.11 dwinter 679: """get searchfield"""
1.13 dwinter 680: #print "SF",self.REQUEST.SESSION[storename]['searchFields']
1.31 ! dwinter 681:
! 682: return self.REQUEST.SESSION[storename]['searchFieldsOnly'][field]
1.11 dwinter 683:
684:
1.5 dwinter 685: def nextLink(self,html,storename="foundCount"):
686: """nextLink"""
687: try:
688: limit=self.REQUEST.SESSION[storename]['rangeSize']
1.21 dwinter 689: if int(limit)==0 :
690: limit="1"
1.5 dwinter 691: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
692: except:
1.26 dwinter 693: limit=1
1.5 dwinter 694: newRangeStart=0
695:
1.26 dwinter 696: if newRangeStart>=self.REQUEST.SESSION[storename]['count']:
1.23 dwinter 697: #newRangeStart=self.REQUEST.SESSION[storename]['count']-1
698: return ""
1.5 dwinter 699:
700: #create new query string
701:
702: if self.REQUEST['QUERY_STRING']=="":
703: qs=self.REQUEST.SESSION['query']
704:
705: queries=string.split(qs,",")
706:
707:
708: else:
709: qs=self.REQUEST['QUERY_STRING']
710: queries=string.split(qs,"&")
711:
712:
713:
714: newquery=[]
715:
716: skipFound=0
717:
718: for query in queries:
1.22 dwinter 719:
1.5 dwinter 720: #print query.split("=")[0]
721: if query[0]=="_" : query[0]="-"
722:
723: if query.split("=")[0].lower()=="-skip":
1.26 dwinter 724:
1.5 dwinter 725: skipFound=1
726: query="-skip=%i"%newRangeStart
727: newquery.append(query)
728:
729: if skipFound==0 :
730: query="-skip=%i"%newRangeStart
731: newquery.append(query)
732:
733: newquerystring=string.join(newquery,"&")
1.9 dwinter 734:
735: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.5 dwinter 736:
737:
738: def prevLink(self,html,storename="foundCount"):
739: """prev link"""
740: try:
741: limit=self.REQUEST.SESSION[storename]['rangeSize']
1.21 dwinter 742: if int(limit)==0 :
743: limit="1"
1.5 dwinter 744: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
745: except:
1.23 dwinter 746: limit=1
1.5 dwinter 747: newRangeStart=0
1.23 dwinter 748: if newRangeStart <0:
749: return ""
1.5 dwinter 750:
751: #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart'])
752:
753: if newRangeStart<0:
754: newRangeStart=0
755:
756: #create new query string
757:
758: if self.REQUEST['QUERY_STRING']=="":
759: qs=self.REQUEST.SESSION['query']
760: #qs=re.sub(r'_','-',qs) #aendern für query
761: queries=string.split(qs,",")
762:
763:
764: else:
765: qs=self.REQUEST['QUERY_STRING']
766: queries=string.split(qs,"&")
767:
768:
769:
770: newquery=[]
771:
772: skipFound=0
773:
774: for query in queries:
775: #print query.split("=")[0]
776:
777: if query[0]=="_" : query[0]="-"
778:
779: if query.split("=")[0].lower()=="-skip":
780: #print"HI"
781: query="-skip=%i"%newRangeStart
782: skipFound=1
783: newquery.append(query)
784:
785: if skipFound==0 :
786: query="-skip=%i"%newRangeStart
787: newquery.append(query)
788:
789: newquerystring=string.join(newquery,"&")
1.9 dwinter 790:
791: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
792:
793:
1.5 dwinter 794:
795: def prevLink_old(self,html):
1.1 dwinter 796: """prev link"""
797: if self.REQUEST['QUERY_STRING']=="":
798: qs=self.REQUEST.SESSION['query']
799: else:
800: qs=self.REQUEST['QUERY_STRING']
801: max=re.search(r'max\=(.*)\,',qs.lower())
802: offset=re.search(r'offset\=(.*)\,',qs.lower())
803: if not offset:
804: offsetnew=0
805: else:
806: offsetnew=int(offset)-max
807: if offsetnew<0:
808: offsetnew=0
809: queries=string.split(qs,",")
810: newquery=[]
811: if offset:
812: for query in queries:
813: if query.split("=")[0].lower()=="offset":
814: query="-offset=%i"%offsetnew
815: newquery.append(query)
816: newquerystring=string.join(newquery,"&")
817: else:
818: queries.append("-offset=%i"%offsetnew)
819: newquerystring=string.join(queries,"&")
1.9 dwinter 820: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.1 dwinter 821:
1.5 dwinter 822: def nextLink_old(self,html):
1.1 dwinter 823: """prev link"""
824: if self.REQUEST['QUERY_STRING']=="":
825: qs=self.REQUEST.SESSION['query']
826: else:
827: qs=self.REQUEST['QUERY_STRING']
828: max=re.search(r'max\=(.*)\,',qs.lower())
829:
830: offset=re.search(r'offset\=(.*)\,',qs.lower())
831: if not offset:
832: offsetnew=1
833: else:
834: offsetnew=int(offset)+int(max)
835: if offsetnew<0:
836: offsetnew=0
837: queries=string.split(qs,",")
838: newquery=[]
839: if offset:
840: for query in queries:
841:
842: if query.split("=")[0].lower()=="-offset":
843: query="-offset=%i"%offsetnew
844: newquery.append(query)
845: newquerystring=string.join(newquery,"&")
846: else:
847: queries.append("-offset=%i"%offsetnew)
848: newquerystring=string.join(queries,"&")
849:
1.9 dwinter 850: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
1.1 dwinter 851:
1.5 dwinter 852:
1.1 dwinter 853: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
854:
1.16 dwinter 855: def manage_addZSQLExtendFolder(self, id, title='', label='', description='',
1.1 dwinter 856: createPublic=0,
857: createUserF=0,
1.28 dwinter 858: connection_id=None,
1.1 dwinter 859: REQUEST=None):
860: """Add a new Folder object with id *id*.
861:
862: If the 'createPublic' and 'createUserF' parameters are set to any true
863: value, an 'index_html' and a 'UserFolder' objects are created respectively
864: in the new folder.
865: """
866:
867:
868: ob=ZSQLExtendFolder()
869: ob.id=str(id)
870: ob.title=title
871: self._setObject(id, ob)
872: ob=self._getOb(id)
1.16 dwinter 873: setattr(ob,'label',label)
874: setattr(ob,'description',description)
1.28 dwinter 875: setattr(ob,'connection_id',connection_id)
1.16 dwinter 876:
1.1 dwinter 877: checkPermission=getSecurityManager().checkPermission
878:
879: if createUserF:
880: if not checkPermission('Add User Folders', ob):
881: raise Unauthorized, (
882: 'You are not authorized to add User Folders.'
883: )
884: ob.manage_addUserFolder()
885:
886: if createPublic:
887: if not checkPermission('Add Page Templates', ob):
888: raise Unauthorized, (
889: 'You are not authorized to add Page Templates.'
890: )
891: ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
892: id='index_html', title='')
893:
894: if REQUEST is not None:
895: return self.manage_main(self, REQUEST, update_menu=1)
1.15 dwinter 896:
897:
898:
1.16 dwinter 899: class ZSQLBibliography(Folder,ZSQLExtendFolder):
1.15 dwinter 900: """Bibliography"""
901: meta_type="ZSQLBibliography"
902: def getLabel(self):
903: try:
904: return self.label
905: except:
906: return ""
907:
908: def getDescription(self):
909: try:
910: return self.description
911: except:
912: return ""
913:
914: def changeZSQLBibliographyForm(self):
915: """change folder config"""
916: pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLBibliographyForm.zpt').__of__(self)
917: return pt()
918:
919:
920: def content_html(self):
921: """template fuer content"""
922:
923: try:
924: obj=getattr(self,"ZSQLBibliography_template")
925: return obj()
926: except:
927: pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt').__of__(self)
928: pt.content_type="text/html"
929: return pt()
930:
931: def changeZSQLBibliography(self,tableName,label,description,REQUEST=None):
932: """change it"""
933: self.tableName=tableName
934: self.label=label
935: self.description=description
936:
937: if REQUEST is not None:
938: return self.manage_main(self, REQUEST)
939:
1.16 dwinter 940: manage_options=Folder.manage_options+(
941: {'label':'Main Config','action':'changeZSQLBibliographyForm'},
1.15 dwinter 942: )
943:
944:
945: def getFieldLabel(self,fields,field):
946: """get labels"""
947: try:
948: ret =fields[0][field]
949: if ret == "":
950: return field
951: else:
952: return ret
953: except:
954: return field
955:
956: def getFieldValue(self,found,field):
957: """get value"""
958: try:
959: ret=getattr(found,field)
960: if ret == "":
961: return None
962: else:
963: return ret
964: except:
965: return None
1.18 dwinter 966:
1.21 dwinter 967: def findTagsFromMapping(self,referenceType):
968: """gib hash mit label -> generic zurueck"""
969: self.referencetypes=self.ZopeFind(self.standardMD)
970: bibdata={}
971: retdata={}
972: fieldlist=self.standardMD.fieldList
973:
974: for referenceTypeF in self.referencetypes:
975: #print referenceType,referenceTypeF[1].title
976: if referenceTypeF[1].title == referenceType:
977: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
978: bibdata['data']=referenceTypeF[1]
979: self.fields=bibdata[referenceType]
980: for field in fieldlist:
1.25 dwinter 981: if referenceTypeF[1].getValue(field)[0]==None:
982: retdata[field]=field
983: else:
984: retdata[field]=referenceTypeF[1].getValue(field)[0]
1.21 dwinter 985:
986: return retdata,fieldlist
987:
1.15 dwinter 988: def findLabelsFromMapping(self,referenceType):
989: """gib hash mit label -> generic zurueck"""
990: self.referencetypes=self.ZopeFind(self.standardMD)
991: bibdata={}
992: retdata={}
993: fieldlist=self.standardMD.fieldList
994:
995: for referenceTypeF in self.referencetypes:
1.18 dwinter 996: #print referenceType,referenceTypeF[1].title
1.15 dwinter 997: if referenceTypeF[1].title == referenceType:
998: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
999: bibdata['data']=referenceTypeF[1]
1000: self.fields=bibdata[referenceType]
1001: for field in fieldlist:
1002: retdata[field]=referenceTypeF[1].getValue(field)[1]
1003:
1004: return retdata,fieldlist
1005:
1.21 dwinter 1006: def createIndexTag(self,tag,content):
1007: """creste tag"""
1008: if content:
1009: ret="""<%s>%s</%s>"""%(tag,content,tag)
1010: return ret
1011: else:
1012: return ""
1013:
1.26 dwinter 1014: def getMetaDataXML2(self):
1015: """crate index meta"""
1016:
1017: fn=os.path.splitext(self.REQUEST['fn'])[0]+"."
1018: self.REQUEST['fn']=fn
1019:
1020: pt=PageTemplateFile('Products/ZSQLExtend/zpt/record2.xml').__of__(self)
1021: pt.content_type="text/xml"
1022: return pt()
1023:
1.21 dwinter 1024: def getMetaDataXML(self):
1025: """crate index meta"""
1026: pt=PageTemplateFile('Products/ZSQLExtend/zpt/record.xml').__of__(self)
1027: pt.content_type="text/xml"
1028: return pt()
1029:
1030: def getMetaDatasXML(self):
1031: """index"""
1032: ret="""<?xml version="1.0" ?>
1033: <index>"""
1.29 dwinter 1034: for found in self.ZSQLSimpleSearch("select oid from %s limit ALL"%self.tableName):
1.21 dwinter 1035: link=self.absolute_url()+"/"+"record.html?oid=%i"%found.oid
1036: metalink=self.absolute_url()+"/"+"getMetaDataXML?oid=%i"%found.oid
1037:
1038: ret+="""<resource resourceLink="%s" metaLink="%s"/>\n"""%(link,metalink)
1039:
1040: return ret+"\n</index>"
1.26 dwinter 1041:
1.21 dwinter 1042:
1.15 dwinter 1043: manage_addZSQLBibliographyForm=DTMLFile('ZSQLBibliographyAdd', globals())
1044:
1045: def manage_addZSQLBibliography(self, id, tableName,label,description,title='',
1046: createPublic=0,
1047: createUserF=0,
1048: REQUEST=None):
1049: """Add a new Folder object with id *id*.
1050:
1051: If the 'createPublic' and 'createUserF' parameters are set to any true
1052: value, an 'index_html' and a 'UserFolder' objects are created respectively
1053: in the new folder.
1054: """
1055:
1056:
1057: ob=ZSQLBibliography()
1058: ob.id=str(id)
1059: ob.title=title
1060: self._setObject(id, ob)
1061: ob=self._getOb(id)
1062: setattr(ob,'tableName',tableName)
1063: setattr(ob,'label',label)
1064: setattr(ob,'description',description)
1065:
1066: checkPermission=getSecurityManager().checkPermission
1067:
1068: if createUserF:
1069: if not checkPermission('Add User Folders', ob):
1070: raise Unauthorized, (
1071: 'You are not authorized to add User Folders.'
1072: )
1073: ob.manage_addUserFolder()
1074:
1075: if createPublic:
1076: if not checkPermission('Add Page Templates', ob):
1077: raise Unauthorized, (
1078: 'You are not authorized to add Page Templates.'
1079: )
1080: ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
1081: id='index_html', title='')
1082:
1083: if REQUEST is not None:
1084: return self.manage_main(self, REQUEST, update_menu=1)
1085:
1086:
1.1 dwinter 1087:
1088:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>