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