1: from OFS.Folder import Folder
2: from Globals import Persistent
3: from Acquisition import Implicit
4: from Globals import DTMLFile
5: import urllib
6: import re
7: import string
8: from pyPgSQL import libpq
9: from AccessControl import getSecurityManager
10: import os.path
11: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
12:
13: def quoteString(name):
14: #return re.sub(r'([\(\)\?])',"\\\1",name)
15: #return "Euklid"
16: return name
17:
18:
19:
20: class ZSQLExtendFolder(Persistent, Implicit, Folder):
21: """Folder"""
22: meta_type="ZSQLExtendFolder"
23:
24:
25: def formatAscii(self,str,url=None):
26: """ersetze ascii umbrueche durch <br>"""
27: #url=None
28: if url:
29:
30: retStr=""
31: words=str.split("\n")
32:
33: for word in words:
34: strUrl=url%word
35: #print "str",strUrl
36: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
37: str=retStr
38: if str:
39: return re.sub(r"[\n]","<br/>",str)
40: else:
41: return ""
42:
43: def getSAttribute(self,obj,atribute,pref=''):
44: """get Attribute or emptystring"""
45:
46: #print "obj",obj
47: try:
48: return pref+getattr(obj,atribute)
49: except:
50: return ""
51:
52: def getS(self,str):
53: """make none to empty string"""
54: if str:
55: return str
56: else:
57: return ""
58:
59: def actualPath(self,url=None):
60: """path"""
61:
62: if self.REQUEST['HTTP_X_FORWARDED_SERVER']=='':
63: host=self.REQUEST['HTTP_HOST']
64: else:
65: host=self.REQUEST['HTTP_X_FORWARDED_SERVER']
66: if not url:
67: return "http://"+host+self.REQUEST['PATH_TRANSLATED']
68: else:
69: temp=self.REQUEST[url].split("/")
70: temp[2]=host
71: return string.join(temp,"/")
72:
73: def getRequest(self):
74: """request"""
75: return self.REQUEST
76:
77: def lowerEnd(self,path):
78: """oinly for demo"""
79: return os.path.splitext(path)[0]+".jpg"
80:
81: def ZSQLisEmpty(self,field):
82: """Teste ob Treffer leer"""
83: #print "field",field
84: if not field:
85: return 1
86: if field=="":
87: return 1
88: return 0
89:
90: def ZSQLsearchOptions(self,fieldname=""):
91: """return HTML Fragment with search options"""
92:
93: ret="""<select name="-op_%s">
94: <option value="bw">begins with</option> <!-- begins with / beginnt mit, "Wort*" -->
95: <option value="ew">ends with</option>
96: <option value="ct" selected>contains</option> <!-- contains / enthaellt, "Wort" -->
97: <option value="eq">equals</option> <!-- equals / ist, =Wort -->
98: </select>"""%fieldname
99: return ret
100:
101: def ZSQLInlineSearch(self,storename=None,**argv):
102: """inlinesearch"""
103: qs=[]
104: if storename:
105: """store"""
106: else:
107: storename="foundCount"
108:
109:
110:
111: #print "INLINE:",argv
112: for a in argv.keys():
113: qs.append(a+"="+urllib.quote(str(argv[a])))
114: #return []
115: return self.parseQueryString(string.join(qs,","),"_",storename=storename)
116:
117: def ZSQLInlineSearch2(self,query):
118: """inlinesearch"""
119: qs=[]
120:
121:
122:
123: #print "INLINE:",query
124:
125: return self.search(var=query)
126:
127: def ZSQLAdd(self):
128: """Neuer Eintrag"""
129: qs=self.REQUEST['QUERY_STRING']
130: addList={}
131: for q in qs.split("&"):
132: name=re.sub("r'+'"," ",q.split("=")[0].lower())
133: value=q.split("=")[1]
134: value=re.sub(r'\+'," ",value)
135: value=urllib.unquote(value)
136: if name=="-table":
137: table=urllib.unquote(value)
138: elif name=="-format":
139: format=urllib.unquote(value)
140: elif (not name[0]=="-") and (not len(value)==0):
141: addList[urllib.unquote(name)]=urllib.unquote(value)
142:
143: keyList=[]
144: valueList=[]
145: for x in addList.keys():
146: keyList.append("\""+x+"\"")
147: valueList.append(libpq.PgQuoteString(addList[x]))
148:
149: keyString=string.join(keyList,",")
150: valueString=string.join(valueList,",")
151:
152: queryString="INSERT INTO %s (%s) VALUES (%s)"%(table,keyString,valueString)
153: self.search(var=queryString)
154: return self.REQUEST.RESPONSE.redirect(format)
155:
156: def ZSQLChange(self,**argv):
157: """Ändern von Einträgen"""
158: #qs=self.REQUEST['QUERY_STRING']
159: # very bad hack
160: qs_temp=[]
161:
162: for a in self.REQUEST.form.keys():
163: qs_temp.append(a+"="+urllib.quote(str(self.REQUEST.form[a])))
164:
165: qs=string.join(qs_temp,"&")
166:
167:
168: #print "CHANGE QS",self.REQUEST
169: #return self.REQUEST
170: changeList=[]
171: for q in qs.split("&"):
172: name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
173: value=q.split("=")[1]
174: value=re.sub(r'\+'," ",value)
175: value=urllib.unquote(value)
176: if name=="-table":
177: table=urllib.unquote(value)
178: elif name=="-identify":
179: identify=urllib.unquote(value)
180: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
181: elif name=="-format":
182: format=urllib.unquote(value)
183: elif (not name[0]=="-") and (not len(value)==0):
184: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
185: changeString=string.join(changeList,",")
186: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
187: self.search(var=queryString)
188: return self.REQUEST.RESPONSE.redirect(format)
189:
190: def ZSQLChange_old(self):
191: """Ändern von Einträgen"""
192: qs=self.REQUEST['QUERY_STRING']
193: #print "CHANGE QS",self.REQUEST
194: #return self.REQUEST
195: changeList=[]
196: for q in qs.split("&"):
197: name=urllib.unquote(re.sub("r'+'"," ",q.split("=")[0].lower()))
198: value=q.split("=")[1]
199: value=re.sub(r'\+'," ",value)
200: value=urllib.unquote(value)
201: if name=="-table":
202: table=urllib.unquote(value)
203: elif name=="-identify":
204: identify=urllib.unquote(value)
205: identify=identify.split("=")[0]+"="+libpq.PgQuoteString(identify.split("=")[1])
206: elif name=="-format":
207: format=urllib.unquote(value)
208: elif (not name[0]=="-") and (not len(value)==0):
209: changeList.append("\""+name+"\"="+libpq.PgQuoteString(urllib.unquote(value)))
210: changeString=string.join(changeList,",")
211: queryString="UPDATE %s SET %s WHERE %s"%(table,changeString,identify)
212: self.search(var=queryString)
213: return self.REQUEST.RESPONSE.redirect(format)
214:
215: def ZSQLFind(self,qs="",select="oid,*",storename=None):
216: """Find"""
217:
218:
219: if qs=="":
220: if self.REQUEST['QUERY_STRING']:
221: qs=self.REQUEST['QUERY_STRING']
222:
223:
224: qs=string.join(qs.split("&"),",")
225: else:
226:
227: qs=self.REQUEST.SESSION['query']
228: else:
229: self.REQUEST['QUERY_STRING']=qs
230: qs=string.join(qs.split("&"),",")
231:
232:
233: qs=re.sub("\\+"," ",qs)# Austauschen da Leerzeichen bei http-get durch + ersetzt wird, generell sollte alles auf post umgeschrieben werden. vom search formular.
234:
235: if storename:
236: """store"""
237: else:
238: storename="foundCount"
239: #print "QS",qs
240: ret=self.parseQueryString(qs,"-",select=select,storemax="yes",storename=storename)
241: #print self.REQUEST.SESSION["foundCount"]
242:
243: return ret
244:
245: def ZSQLFoundCountLen(self,var):
246: return len(var)
247:
248: def ZSQLFoundCount(self,qs="",select="*",storename=None):
249:
250: ## if qs=="":
251:
252: ## if self.REQUEST['QUERY_STRING']:
253:
254: ## qs=self.REQUEST['QUERY_STRING']
255: ## qs=string.join(qs.split("&"),",")
256: ## else:
257:
258: ## qs=self.REQUEST.SESSION['query']
259: ## else:
260: ## qs=string.join(qs.split("&"),",")
261:
262:
263: ## temp= self.parseQueryString(qs,"-",select=select,storemax="yes",nostore="yes")
264: if storename:
265: """store"""
266: else:
267: storename="foundCount"
268:
269: return self.REQUEST.SESSION[storename]['count']
270:
271: def ZSQLRangeStart(self,storename=None):
272:
273: if storename:
274: """store"""
275: else:
276: storename="foundCount"
277:
278: return self.REQUEST.SESSION[storename]['rangeStart']+1
279:
280: def ZSQLRangeSize(self,storename=None):
281:
282: if storename:
283: """store"""
284: else:
285: storename="foundCount"
286:
287: return self.REQUEST.SESSION[storename]['rangeSize']
288:
289: def ZSQLRangeEnd(self,storename=None):
290:
291: if storename:
292: """store"""
293: else:
294: storename="foundCount"
295:
296: return self.REQUEST.SESSION[storename]['rangeEnd']
297:
298: def parseQueryString(self,qs,iCT,storemax="no",select=None,nostore=None,storename=None):
299: """analysieren den QueryString"""
300: #print "NO",nostore
301: lop="AND" # standardsuche mit and
302: max="ALL" #standard alle auswählen
303: maxstr=""
304: whereList=[]
305: sort=""
306: op="bw"
307: opfields={}
308: skip=""
309: rangeStart=0
310: limit=0
311: searchFields={}
312:
313: if not select:
314: select="oid,*"
315: #print "Q",nostore,qs
316: #check for op in the case of inline search
317:
318: splitted=qs.split(",")
319:
320:
321: for q in splitted:
322:
323: name=re.sub("r'+'"," ",q.split("=")[0].lower())
324: try:
325: value=urllib.unquote(q.split("=",1)[1])
326: except:
327: value=""
328: if name[0:3]==iCT+"op":
329: op=value
330:
331: field=name[4:]
332: opfields[field]=op
333: #print "HI",op,field
334: #print opfieldsa
335: #now analyse the querystring
336: for q in qs.split(","):
337:
338:
339: #try:
340:
341: name=re.sub("r'+'"," ",q.split("=")[0].lower())
342: try:
343: value=urllib.unquote(q.split("=",1)[1])
344: except:
345: value=""
346:
347: #value=libpq.PgQuoteString(value)
348:
349:
350: if name==iCT+"lop":
351: lop=value
352: elif name==iCT+"table":
353: table=value
354: elif name==iCT+"select":
355: select=value
356: elif name==iCT+"max":
357: maxstr="LIMIT "+str(value)
358: limit=str(value)
359: elif name==iCT+"skip":
360: skip="OFFSET "+str(value)
361: rangeStart=str(value)
362: elif name==iCT+"join":
363: whereList.append(value)
364: elif name==iCT+"sort":
365: sort="ORDER BY "+value
366: elif name==iCT+"token":
367: if not nostore=="yes":
368: self.REQUEST.SESSION['token']=value
369:
370: elif name==iCT+"op":
371: op=value
372:
373:
374:
375: elif (not name[0]==iCT) and (not len(value)==0):
376:
377: #print "OP",op,name
378: value=value.lower()
379:
380: searchFields[name]=value
381:
382: if opfields.has_key(name):
383: op=opfields[name]
384: else:
385: op="ct"
386: name="LOWER("+name+")"
387: if op=="ct":
388: whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value+"%"))
389: elif op=="gt":
390: whereList.append(name+">"+libpq.PgQuoteString(value))
391: elif op=="lt":
392: whereList.append(name+"<"+libpq.PgQuoteString(value))
393: elif op=="eq":
394: whereList.append(name+"="+libpq.PgQuoteString(value))
395: elif op=="bw":
396: whereList.append(name+" LIKE "+libpq.PgQuoteString(value+"%"))
397: elif op=="ew":
398: whereList.append(name+" LIKE "+libpq.PgQuoteString("%"+value))
399: op="ct"
400:
401: #except:
402: # print "END",value,name,Exception
403: if len(whereList)>0:
404: where="WHERE "+string.join(whereList," "+lop+" ")
405: else:
406: where=""
407: #print "QE",table
408:
409: query="SELECT %s FROM %s %s %s %s %s"%(select,table,where,sort,maxstr,skip)
410:
411: if not nostore=="yes":
412:
413: self.REQUEST.SESSION['qs']=opfields
414: #print "IAMHERE again:", query
415:
416: if storename:
417: query2="SELECT count(*) FROM %s %s"%(table,where)
418: #print "storing",query2
419: #print "QUERYSTRING:",self.REQUEST.SESSION[storename]['queryString2']
420: if not self.REQUEST.SESSION.has_key(storename):
421: self.REQUEST.SESSION[storename]={}
422: if self.REQUEST.SESSION[storename].has_key('queryString2'):
423: #print "HI",storename
424: if not self.REQUEST.SESSION[storename]['queryString2']==query2:
425: #print "HOOOOO",storename
426: self.REQUEST.SESSION[storename]['queryString2']=query2
427: self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count
428: #print "QUERY",query2,"::::",self.REQUEST.SESSION[storename]['queryString2']
429:
430: else:
431: self.REQUEST.SESSION[storename]['queryString2']=query2
432: self.REQUEST.SESSION[storename]['count']=self.search(var=query2)[0].count
433: #print "QUERYNEW",self.REQUEST.SESSION[storename]['queryString2']
434:
435:
436: self.REQUEST.SESSION[storename]['rangeStart']=rangeStart
437: if limit=="all":
438: self.REQUEST.SESSION[storename]['rangeEnd']=self.REQUEST.SESSION[storename]['count']
439: else:
440: self.REQUEST.SESSION[storename]['rangeEnd']=int(rangeStart)+int(limit)
441: self.REQUEST.SESSION[storename]['rangeSize']=limit
442: self.REQUEST.SESSION[storename]['searchFields']=searchFields
443:
444: #print "Q",query
445: return self.search(var=query)
446:
447:
448: def ZSQLSearch(self):
449: """To be done"""
450: rq=self.REQUEST['QUERY_STRING']
451: querys=rq.split("&")
452:
453:
454: for querytemp in querys:
455: query=querytemp.split("=")
456: try:
457: if query[0].lower()=="-format":
458: formatfile=query[1]
459: except:
460: """nothing"""
461: #print formatfile
462: self.REQUEST.SESSION['query']=string.join(self.REQUEST['QUERY_STRING'].split("&"),",")
463: return self.REQUEST.RESPONSE.redirect(urllib.unquote(formatfile))
464:
465:
466: def ZSQLint(self,string):
467: try:
468:
469: return(int(string))
470: except:
471: return 0
472:
473: def getZSQLSearchFieldsList(self,storename="foundCount"):
474: """get searchfieldList"""
475: #print self.REQUEST.SESSION[storename]['searchFields'].keys()
476: return self.REQUEST.SESSION[storename]['searchFields'].keys()
477:
478: def getZSQLSearchFields(self,storename="foundCount"):
479: """get searchfield"""
480: #print "SF",self.REQUEST.SESSION[storename]['searchFields']
481: return self.REQUEST.SESSION[storename]['searchFields']
482:
483:
484: def nextLink(self,html,storename="foundCount"):
485: """nextLink"""
486: try:
487: limit=self.REQUEST.SESSION[storename]['rangeSize']
488: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])+int(limit)
489: except:
490: limit=0
491: newRangeStart=0
492:
493: if newRangeStart>self.REQUEST.SESSION[storename]['count']:
494: newRangeStart=self.REQUEST.SESSION[storename]['count']-10
495:
496:
497: #create new query string
498:
499: if self.REQUEST['QUERY_STRING']=="":
500: qs=self.REQUEST.SESSION['query']
501:
502: queries=string.split(qs,",")
503:
504:
505: else:
506: qs=self.REQUEST['QUERY_STRING']
507: queries=string.split(qs,"&")
508:
509:
510:
511: newquery=[]
512:
513: skipFound=0
514:
515: for query in queries:
516: #print query.split("=")[0]
517: if query[0]=="_" : query[0]="-"
518:
519: if query.split("=")[0].lower()=="-skip":
520: skipFound=1
521: query="-skip=%i"%newRangeStart
522: newquery.append(query)
523:
524: if skipFound==0 :
525: query="-skip=%i"%newRangeStart
526: newquery.append(query)
527:
528: newquerystring=string.join(newquery,"&")
529:
530: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
531:
532:
533: def prevLink(self,html,storename="foundCount"):
534: """prev link"""
535: try:
536: limit=self.REQUEST.SESSION[storename]['rangeSize']
537: newRangeStart=int(self.REQUEST.SESSION[storename]['rangeStart'])-int(limit)
538: except:
539: limit=0
540: newRangeStart=0
541:
542: #print "limit",limit,newRangeStart,int(self.REQUEST.SESSION[storename]['rangeStart'])
543:
544: if newRangeStart<0:
545: newRangeStart=0
546:
547: #create new query string
548:
549: if self.REQUEST['QUERY_STRING']=="":
550: qs=self.REQUEST.SESSION['query']
551: #qs=re.sub(r'_','-',qs) #aendern für query
552: queries=string.split(qs,",")
553:
554:
555: else:
556: qs=self.REQUEST['QUERY_STRING']
557: queries=string.split(qs,"&")
558:
559:
560:
561: newquery=[]
562:
563: skipFound=0
564:
565: for query in queries:
566: #print query.split("=")[0]
567:
568: if query[0]=="_" : query[0]="-"
569:
570: if query.split("=")[0].lower()=="-skip":
571: #print"HI"
572: query="-skip=%i"%newRangeStart
573: skipFound=1
574: newquery.append(query)
575:
576: if skipFound==0 :
577: query="-skip=%i"%newRangeStart
578: newquery.append(query)
579:
580: newquerystring=string.join(newquery,"&")
581:
582: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
583:
584:
585:
586: def prevLink_old(self,html):
587: """prev link"""
588: if self.REQUEST['QUERY_STRING']=="":
589: qs=self.REQUEST.SESSION['query']
590: else:
591: qs=self.REQUEST['QUERY_STRING']
592: max=re.search(r'max\=(.*)\,',qs.lower())
593: offset=re.search(r'offset\=(.*)\,',qs.lower())
594: if not offset:
595: offsetnew=0
596: else:
597: offsetnew=int(offset)-max
598: if offsetnew<0:
599: offsetnew=0
600: queries=string.split(qs,",")
601: newquery=[]
602: if offset:
603: for query in queries:
604: if query.split("=")[0].lower()=="offset":
605: query="-offset=%i"%offsetnew
606: newquery.append(query)
607: newquerystring=string.join(newquery,"&")
608: else:
609: queries.append("-offset=%i"%offsetnew)
610: newquerystring=string.join(queries,"&")
611: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
612:
613: def nextLink_old(self,html):
614: """prev link"""
615: if self.REQUEST['QUERY_STRING']=="":
616: qs=self.REQUEST.SESSION['query']
617: else:
618: qs=self.REQUEST['QUERY_STRING']
619: max=re.search(r'max\=(.*)\,',qs.lower())
620:
621: offset=re.search(r'offset\=(.*)\,',qs.lower())
622: if not offset:
623: offsetnew=1
624: else:
625: offsetnew=int(offset)+int(max)
626: if offsetnew<0:
627: offsetnew=0
628: queries=string.split(qs,",")
629: newquery=[]
630: if offset:
631: for query in queries:
632:
633: if query.split("=")[0].lower()=="-offset":
634: query="-offset=%i"%offsetnew
635: newquery.append(query)
636: newquerystring=string.join(newquery,"&")
637: else:
638: queries.append("-offset=%i"%offsetnew)
639: newquerystring=string.join(queries,"&")
640:
641: return "<a href='%s'>%s</a>"%(self.actualPath()+"?"+newquerystring,html)
642:
643:
644: manage_addZSQLExtendFolderForm=DTMLFile('ZSQLExtendFolderAdd', globals())
645:
646: def manage_addZSQLExtendFolder(self, id, title='',
647: createPublic=0,
648: createUserF=0,
649: REQUEST=None):
650: """Add a new Folder object with id *id*.
651:
652: If the 'createPublic' and 'createUserF' parameters are set to any true
653: value, an 'index_html' and a 'UserFolder' objects are created respectively
654: in the new folder.
655: """
656:
657:
658: ob=ZSQLExtendFolder()
659: ob.id=str(id)
660: ob.title=title
661: self._setObject(id, ob)
662: ob=self._getOb(id)
663:
664: checkPermission=getSecurityManager().checkPermission
665:
666: if createUserF:
667: if not checkPermission('Add User Folders', ob):
668: raise Unauthorized, (
669: 'You are not authorized to add User Folders.'
670: )
671: ob.manage_addUserFolder()
672:
673: if createPublic:
674: if not checkPermission('Add Page Templates', ob):
675: raise Unauthorized, (
676: 'You are not authorized to add Page Templates.'
677: )
678: ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
679: id='index_html', title='')
680:
681: if REQUEST is not None:
682: return self.manage_main(self, REQUEST, update_menu=1)
683:
684:
685:
686: class ZSQLBibliography(ZSQLExtendFolder):
687: """Bibliography"""
688: meta_type="ZSQLBibliography"
689: def getLabel(self):
690: try:
691: return self.label
692: except:
693: return ""
694:
695: def getDescription(self):
696: try:
697: return self.description
698: except:
699: return ""
700:
701: def changeZSQLBibliographyForm(self):
702: """change folder config"""
703: pt=PageTemplateFile('Products/ZSQLExtend/zpt/changeZSQLBibliographyForm.zpt').__of__(self)
704: return pt()
705:
706:
707: def content_html(self):
708: """template fuer content"""
709:
710: try:
711: obj=getattr(self,"ZSQLBibliography_template")
712: return obj()
713: except:
714: pt=PageTemplateFile('Products/ZSQLExtend/zpt/ZSQLBibliography_template_standard.zpt').__of__(self)
715: pt.content_type="text/html"
716: return pt()
717:
718: def changeZSQLBibliography(self,tableName,label,description,REQUEST=None):
719: """change it"""
720: self.tableName=tableName
721: self.label=label
722: self.description=description
723:
724: if REQUEST is not None:
725: return self.manage_main(self, REQUEST)
726:
727: manage_options=ZSQLExtendFolder.manage_options+(
728: {'label':'Edit Biblio','action':'changeZSQLBibliographyForm'},
729: )
730:
731:
732: def getFieldLabel(self,fields,field):
733: """get labels"""
734: try:
735: ret =fields[0][field]
736: if ret == "":
737: return field
738: else:
739: return ret
740: except:
741: return field
742:
743: def getFieldValue(self,found,field):
744: """get value"""
745: try:
746: ret=getattr(found,field)
747: if ret == "":
748: return None
749: else:
750: return ret
751: except:
752: return None
753: def findLabelsFromMapping(self,referenceType):
754: """gib hash mit label -> generic zurueck"""
755: self.referencetypes=self.ZopeFind(self.standardMD)
756: bibdata={}
757: retdata={}
758: fieldlist=self.standardMD.fieldList
759:
760: for referenceTypeF in self.referencetypes:
761: print referenceType,referenceTypeF[1].title
762: if referenceTypeF[1].title == referenceType:
763: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
764: bibdata['data']=referenceTypeF[1]
765: self.fields=bibdata[referenceType]
766: for field in fieldlist:
767: retdata[field]=referenceTypeF[1].getValue(field)[1]
768:
769: return retdata,fieldlist
770:
771:
772:
773: manage_addZSQLBibliographyForm=DTMLFile('ZSQLBibliographyAdd', globals())
774:
775: def manage_addZSQLBibliography(self, id, tableName,label,description,title='',
776: createPublic=0,
777: createUserF=0,
778: REQUEST=None):
779: """Add a new Folder object with id *id*.
780:
781: If the 'createPublic' and 'createUserF' parameters are set to any true
782: value, an 'index_html' and a 'UserFolder' objects are created respectively
783: in the new folder.
784: """
785:
786:
787: ob=ZSQLBibliography()
788: ob.id=str(id)
789: ob.title=title
790: self._setObject(id, ob)
791: ob=self._getOb(id)
792: setattr(ob,'tableName',tableName)
793: setattr(ob,'label',label)
794: setattr(ob,'description',description)
795:
796: checkPermission=getSecurityManager().checkPermission
797:
798: if createUserF:
799: if not checkPermission('Add User Folders', ob):
800: raise Unauthorized, (
801: 'You are not authorized to add User Folders.'
802: )
803: ob.manage_addUserFolder()
804:
805: if createPublic:
806: if not checkPermission('Add Page Templates', ob):
807: raise Unauthorized, (
808: 'You are not authorized to add Page Templates.'
809: )
810: ob.manage_addProduct['PageTemplates'].manage_addPageTemplate(
811: id='index_html', title='')
812:
813: if REQUEST is not None:
814: return self.manage_main(self, REQUEST, update_menu=1)
815:
816:
817:
818:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>