1: # Objekte zur Erzeugung von Navigationselementen
2:
3: from Globals import DTMLFile
4: from OFS.Image import Image,cookId
5: from OFS.Folder import Folder
6: from OFS.SimpleItem import SimpleItem
7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from Products.PageTemplates.PageTemplate import PageTemplate
9: import re
10: import string
11: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
12: import os.path
13: from Globals import package_home
14: import urllib
15: from ECHO_helpers import displayTypes,checkOnlyOneInGroup
16:
17: class ECHO_contentType(Image):
18: """ContentType Object"""
19:
20: meta_type="ECHO_contentType"
21:
22:
23: manage_options=Image.manage_options+(
24: {'label':'Change Description','action':'changeECHO_contentTypeForm'},
25: )
26:
27: def changeECHO_contentTypeForm(self):
28: """Change the description text"""
29: pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_contentType.zpt').__of__(self)
30: return pt()
31:
32: def changeECHO_contentType(self,description,RESPONSE=None):
33: """Change the Content"""
34: self.description=description
35: if RESPONSE is not None:
36: RESPONSE.redirect('manage_main')
37:
38: manage_addECHO_contentTypeForm=DTMLFile('dtml/ECHO_contentTypeAdd',globals(),
39: Kind='ECHO_contentType',kind='ECHO_contentType')
40:
41: def manage_addECHO_contentType(self, id, file=None, title='', precondition='', content_type='', description='',
42: REQUEST=None):
43: """
44: Add a new Image object.
45:
46: Creates a new Image object 'id' with the contents of 'file'.
47: """
48:
49: id=str(id)
50: title=str(title)
51: content_type=str(content_type)
52: precondition=str(precondition)
53:
54: id, title = cookId(id, title, file)
55:
56: self=self.this()
57:
58: # First, we create the image without data:
59: self._setObject(id, ECHO_contentType(id,title,'',content_type, precondition))
60:
61: self._getOb(id).description=description
62:
63: # Now we "upload" the data. By doing this in two steps, we
64: # can use a database trick to make the upload more efficient.
65: if file:
66: self._getOb(id).manage_upload(file)
67: if content_type:
68: self._getOb(id).content_type=content_type
69:
70: if REQUEST is not None:
71: try: url=self.DestinationURL()
72: except: url=REQUEST['URL1']
73: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
74: return id
75:
76:
77: class ECHO_sqlElement(SimpleItem):
78: """Erzeuge navigation aus sql-abfrage"""
79: meta_type="ECHO_sqlElement"
80: baseUrl=""
81:
82: def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
83: """init"""
84: self.id=id
85: self.title=title
86: self.query=query
87: self.field=field
88: if searchField=="":
89: self.searchField=field
90: else:
91: self.searchField=searchField
92: self.baseUrl=baseUrl
93: self.weight=weight
94: self.content=contentType
95:
96: manage_options= SimpleItem.manage_options+(
97: {'label':'Main Config','action':'changeECHO_sqlElementForm'},
98: )
99:
100: def getSearchField(self):
101: try:
102: return self.searchField
103: except:
104: return self.field
105:
106: def getWeight(self):
107: """get weight"""
108: if hasattr(self,'weight'):
109: return self.weight
110: else:
111: return 0
112:
113: def getcontentType(self):
114: """get weight"""
115:
116: if hasattr(self,'contentType'):
117: return self.contentType
118: else:
119: return 0
120:
121:
122: def changeECHO_sqlElementForm(self):
123: """change"""
124:
125: pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_sqlElement.zpt').__of__(self)
126: return pt()
127:
128: def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
129: """change"""
130: self.title=title
131: self.query=query
132: self.field=field
133: self.searchField=searchField
134: self.baseUrl=baseUrl
135: self.weight=weight
136: self.contentType=contentType
137:
138: if RESPONSE is not None:
139: RESPONSE.redirect('manage_main')
140:
141: def searchQuery(self):
142: return self.search(var=self.query)
143:
144: def getNavList(self):
145: """ausgabe der treffer list für navigation"""
146: records=self.searchQuery()
147: if not records:
148: return []
149: else:
150: ret=[]
151: for record in records:
152: try:
153: ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
154: except:
155: """notrhing"""
156:
157: return ret
158:
159:
160: def manage_addECHO_sqlElementForm(self):
161: """Form for adding"""
162: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_sqlElement.zpt').__of__(self)
163: return pt()
164:
165: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
166: """Add an ECHO_sqlelement"""
167: self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
168:
169: if RESPONSE is not None:
170: RESPONSE.redirect('manage_main')
171:
172:
173: class ECHO_pageTemplate(ZopePageTemplate):
174: """pageTemplate Objekt"""
175: meta_type="ECHO_pageTemplate"
176:
177: _default_content_fn = os.path.join(package_home(globals()),
178: 'html/ECHO_pageTemplateDefault.html')
179:
180: manage_options=ZopePageTemplate.manage_options+(
181: {'label':'Weight and Type','action':'changeECHO_pageTemplateWeightForm'},
182: )
183:
184: def changeECHO_pageTemplateWeightForm(self):
185: """change"""
186: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_pageTemplateWeight.zpt').__of__(self)
187: return pt()
188:
189: def changeECHO_pageTemplateWeight(self,weight,contentType,label,RESPONSE=None):
190: """change"""
191: self.weight=weight
192: self.contentType=contentType
193: self.label=label
194:
195: if RESPONSE is not None:
196: RESPONSE.redirect('manage_main')
197:
198: def getLabel(self):
199: if hasattr(self,'label'):
200: return self.label.encode('utf-8')
201: else:
202: return 0
203:
204: def getWeight(self):
205: """get weight"""
206: if hasattr(self,'weight'):
207: return self.weight
208: else:
209: return 0
210:
211: def getcontentType(self):
212: """get weight"""
213: if hasattr(self,'weight'):
214: return self.weight
215: else:
216: return 0
217:
218:
219:
220:
221: ## def __init__(self, id, text=None, contentType=None):
222: ## self.id = str(id)
223: ## self.ZBindings_edit(self._default_bindings)
224: ## if text is None:
225: ## text = open(self._default_cont).read()
226: ## self.pt_edit(text, contentType)
227:
228: def manage_addECHO_pageTemplateForm(self):
229: """Form for adding"""
230: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_pageTemplate.zpt').__of__(self)
231: return pt()
232:
233: from urllib import quote
234:
235:
236: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
237: REQUEST=None, submit=None):
238: "Add a Page Template with optional file content."
239:
240:
241: id = str(id)
242: if REQUEST is None:
243: self._setObject(id, ECHO_pageTemplate(id, text))
244: ob = getattr(self, id)
245: setattr(ob,'weight',weight)
246: setattr(ob,'label',label)
247: setattr(ob,'contentType',contentType)
248: if title:
249: ob.pt_setTitle(title)
250: return ob
251: else:
252: file = REQUEST.form.get('file')
253: headers = getattr(file, 'headers', None)
254: if headers is None or not file.filename:
255: zpt = ECHO_pageTemplate(id)
256: else:
257: zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
258:
259: self._setObject(id, zpt)
260: ob = getattr(self, id)
261: setattr(ob,'weight',weight)
262: if title:
263: ob.pt_setTitle(title)
264:
265: try:
266: u = self.DestinationURL()
267: except AttributeError:
268: u = REQUEST['URL1']
269:
270: if submit == " Add and Edit ":
271: u = "%s/%s" % (u, quote(id))
272: REQUEST.RESPONSE.redirect(u+'/manage_main')
273: return ''
274:
275:
276: class ECHO_navigation(Folder):
277: """Navigations Element"""
278: meta_type="ECHO_Navigation"
279:
280: displayedMetaTypes=displayTypes
281:
282: def __init__(self,id,title,pathToHierarchy):
283: """init"""
284: self.id=id
285: self.title=title
286: self.pathToHierarchy=pathToHierarchy
287:
288: manage_options = Folder.manage_options+(
289: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
290: )
291:
292: def ECHO_navigationConfigForm(self):
293: """configForm"""
294: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_navigation.zpt').__of__(self)
295: return pt()
296:
297: def ECHO_navigationConfig(self,title,pathToHierarchy,RESPONSE=None):
298: """config"""
299: self.title=title
300: self.pathToHierarchy=pathToHierarchy
301:
302: if RESPONSE is not None:
303: RESPONSE.redirect('manage_main')
304:
305:
306: def getColls(self,obj,depth):
307: nav={}
308: #print "HERE",obj.
309: for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
310: x=x_objs[1]
311: x = checkOnlyOneInGroup(x)
312: if depth>1:
313: nav[x.getId()]=(self.getColls(x,depth-1),x)
314: else:
315: nav[x.getId()]=(None,x)
316: return nav
317:
318: def createNavHash(self,depth):
319: """Auslesen des Hierarchiebuames"""
320: temp=self.pathToHierarchy[0:]
321: temp=re.sub("/",".",temp)
322: temp="self.aq_parent"+temp
323:
324: objtemp=eval(temp)
325: nav={}
326: obj=objtemp
327:
328:
329: for keys in obj.__dict__.keys():
330: x=getattr(obj,keys)
331: if hasattr(x,"meta_type"):
332:
333: if x.meta_type in self.displayedMetaTypes:
334:
335: if depth>1:
336: nav[x.getId()]=(self.getColls(x,int(depth)-1),x)
337: else:
338: nav[x.getId()]=(None,x)
339:
340:
341: #print nav
342: return nav
343:
344: def barFromHash(self,hash,start=None,sortField=None):
345: """Erzeuge Navigations Element"""
346: #print "hash",hash
347: listNav=[]
348: if not start:
349: temp=hash
350: sortField="weight"
351: else: # list mit pfad zum hash
352: temp=hash
353: #print "HI",sortField
354: if not sortField:
355: tempObj=self.pathToHierarchy[0:]
356: tempObj=re.sub("/",".",tempObj)
357: tempObj="self.aq_parent"+tempObj
358:
359: objtemp=eval(tempObj)
360:
361: obj=objtemp
362:
363: for x in start:
364: #print "OBJ",start,obj,obj.getId(),x
365:
366: obj=getattr(obj,x)
367:
368: if hasattr(obj,'sortfield'):
369: sortField=obj.sortfield
370: else:
371: sortField='weight'
372: #print "START",start
373: for x in start:
374: #print "N2",x,temp[x]
375: try:
376: temp=temp[x][0]
377: except:
378: """nothing"""
379: return []
380: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
381:
382: for x in self.tempSorted(temp, field=sortField):
383: if not temp[x][1].title == "":
384: if temp[x][1].meta_type=="ECHO_sqlElement":
385: for z in temp[x][1].getNavList():
386: listNav.append((z[0],z[1],None))
387: else:
388: # add label fals existiert und nicht leer
389: if hasattr(temp[x][1],'label'):
390: if not temp[x][1].label=='':
391: label=temp[x][1].label.encode('utf-8')
392:
393: else:
394: label=temp[x][1].title.encode('utf-8')
395: else:
396: label=temp[x][1].title.encode('utf-8')
397:
398: listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
399:
400: #print self.getId(),start
401: #print listNav
402:
403: #html=""
404: #for k in listNav:
405: # print k
406: # html=html+"<a href='%s'>%s</a> "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
407:
408: return listNav
409:
410: def tempSorted(self,hash,field="weight"):
411: ls=[]
412:
413: for x in hash.keys():
414: #print hash[x][1]
415: if hasattr(hash[x][1],field):
416: weight=getattr(hash[x][1],field)
417: #print weight
418: else:
419: weight=0
420:
421: ls.append((x,weight))
422:
423: ls.sort(sortWeight)
424:
425: return [x[0] for x in ls]
426:
427:
428:
429:
430: def isSelectedPath(self,item):
431: """test is path is already selected"""
432: found=re.search("\?(.*)",item[1])
433: if found:
434: temp=re.sub(" ","%20",found.group(0))
435: #print temp+"::"+self.REQUEST['QUERY_STRING']
436: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
437: return 1
438:
439: if re.search(item[1],self.REQUEST['URL']):
440: return 1
441: else:
442: return 0
443:
444:
445: def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
446:
447: """Generate Buttons"""
448: if orientation=="horizontal":
449: html="<table><tr>"
450: startTag="<td>"
451: endTag="</td>"
452: endHtml="</tr></table>"
453:
454: else:
455: html="<table>"
456: startTag="<tr><td>"
457: endTag="</td></tr>"
458: endHtml="</table>"
459:
460: if not start:
461: temp=hash
462: else:
463: temp=hash
464: for x in start:
465: temp=temp[x][0]
466: #print temp
467:
468: for key in self.tempSorted(temp):
469:
470: description=temp[x][1].title
471:
472: url=createPath(self.absolute_url(),temp[key][1].absolute_url())
473:
474: if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
475: html=html+startTag+"[%s]" % description+endTag
476: else:
477: html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
478:
479:
480: html=html+endHtml
481:
482: return html
483:
484: def mainNavBar(self):
485: """print main navigation bar"""
486: keys=""
487:
488: try:
489: keys=self.buttonsFromHash(self.createNavHash(0))
490: except:
491: keys=""
492:
493: return keys
494:
495: def mainNavElements(self):
496: """print main navigation bar"""
497: keys=""
498: #print "NAVELEMENT",self.getId()
499: #try:
500:
501: keys=self.barFromHash(self.createNavHash(0))
502:
503: #except:
504: # keys=""
505:
506: return keys
507:
508: def numberOfMainNavElements(self):
509: """number of main elements"""
510:
511: return len(self.barFromHash(self.createNavHash(0)))
512:
513: def secondNavElements(self):
514: """Zweite Ordnung"""
515:
516: hash=self.createNavHash(2)
517: actual_url=self.REQUEST['URL']
518:
519: ult_temp=re.sub(self.absolute_url(),"",actual_url)
520: #print ult_temp
521:
522: splitted=ult_temp.split("/")
523:
524:
525: start=[splitted[2]]
526: #print start
527:
528: keys=self.barFromHash(hash,start=start)
529:
530:
531: return keys
532:
533: def navElements(self,order):
534: """n-te Ordnung"""
535:
536: hash=self.createNavHash(order)
537: actual_url=self.REQUEST['URL']
538:
539: ult_temp=re.sub(self.absolute_url(),"",actual_url)
540: #print ult_temp
541:
542: splitted=ult_temp.split("/")
543:
544:
545: ## if splitted[len(splitted)-1]=="index_html":
546: ## start=[splitted[len(splitted)-2]]
547: ## else:
548: ## start=[splitted[len(splitted)-1]]
549:
550: start=splitted[2:order+1]
551: #print start
552:
553: keys=self.barFromHash(hash,start=start)
554:
555:
556: return keys
557:
558:
559: def secondNavBar(self):
560: """Zweite Ordnung"""
561:
562: hash=self.createNavHash(2)
563: actual_url=self.REQUEST['URL']
564:
565: ult_temp=re.sub(self.absolute_url(),"",actual_url)
566: #print ult_temp
567:
568: splitted=ult_temp.split("/")
569:
570:
571: ## if splitted[len(splitted)-1]=="index_html":
572: ## start=[splitted[len(splitted)-2]]
573: ## else:
574: ## start=[splitted[len(splitted)-1]]
575:
576: start=[splitted[2]]
577: #print start
578:
579: keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
580:
581:
582: return keys
583:
584: def manage_addECHO_navigationForm(self):
585: """Form for adding"""
586: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
587: return pt()
588:
589: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
590: """Add an ECHO_root"""
591: self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
592:
593: if RESPONSE is not None:
594: RESPONSE.redirect('manage_main')
595:
596:
597: #helpers
598:
599:
600:
601: def createPath(url1,url2):
602: temp1=url1.split("/")
603: temp2=url2.split("/")
604: for test in temp1:
605: if temp2[0]==test:
606: del temp2[0]
607:
608: return url1+"/"+string.join(temp2,"/")
609:
610: def sortWeight(x,y):
611: #print x[1],y[1]
612: return cmp(x[1],y[1])
613:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>