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