Annotation of ECHO_content/ECHO_Nav.py, revision 1.18
1.1 dwinter 1: # Objekte zur Erzeugung von Navigationselementen
2:
1.11 dwinter 3: from Globals import DTMLFile
4: from OFS.Image import Image,cookId
1.1 dwinter 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
1.18 ! dwinter 15: from ECHO_helpers import displayTypes,checkOnlyOneInGroup
1.11 dwinter 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:
1.1 dwinter 76:
77: class ECHO_sqlElement(SimpleItem):
78: """Erzeuge navigation aus sql-abfrage"""
79: meta_type="ECHO_sqlElement"
80: baseUrl=""
81:
1.10 dwinter 82: def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
1.1 dwinter 83: """init"""
84: self.id=id
85: self.title=title
86: self.query=query
87: self.field=field
1.7 dwinter 88: if searchField=="":
89: self.searchField=field
90: else:
91: self.searchField=searchField
1.1 dwinter 92: self.baseUrl=baseUrl
1.3 dwinter 93: self.weight=weight
1.10 dwinter 94: self.content=contentType
1.1 dwinter 95:
96: manage_options= SimpleItem.manage_options+(
97: {'label':'Main Config','action':'changeECHO_sqlElementForm'},
98: )
99:
1.7 dwinter 100: def getSearchField(self):
101: try:
102: return self.searchField
103: except:
104: return self.field
105:
1.3 dwinter 106: def getWeight(self):
1.4 dwinter 107: """get weight"""
108: if hasattr(self,'weight'):
109: return self.weight
1.3 dwinter 110: else:
111: return 0
112:
1.10 dwinter 113: def getcontentType(self):
1.6 dwinter 114: """get weight"""
115:
1.10 dwinter 116: if hasattr(self,'contentType'):
117: return self.contentType
1.6 dwinter 118: else:
119: return 0
1.3 dwinter 120:
121:
1.1 dwinter 122: def changeECHO_sqlElementForm(self):
123: """change"""
1.6 dwinter 124:
125: pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_sqlElement.zpt').__of__(self)
1.1 dwinter 126: return pt()
127:
1.10 dwinter 128: def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1 dwinter 129: """change"""
130: self.title=title
131: self.query=query
132: self.field=field
1.7 dwinter 133: self.searchField=searchField
1.1 dwinter 134: self.baseUrl=baseUrl
1.3 dwinter 135: self.weight=weight
1.10 dwinter 136: self.contentType=contentType
1.6 dwinter 137:
1.1 dwinter 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:
1.7 dwinter 152: try:
153: ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
154: except:
155: """notrhing"""
156:
1.1 dwinter 157: return ret
158:
159:
1.6 dwinter 160: def manage_addECHO_sqlElementForm(self):
1.1 dwinter 161: """Form for adding"""
1.6 dwinter 162: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_sqlElement.zpt').__of__(self)
1.1 dwinter 163: return pt()
164:
1.10 dwinter 165: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1 dwinter 166: """Add an ECHO_sqlelement"""
1.10 dwinter 167: self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
1.1 dwinter 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()),
1.6 dwinter 178: 'html/ECHO_pageTemplateDefault.html')
1.1 dwinter 179:
1.3 dwinter 180: manage_options=ZopePageTemplate.manage_options+(
1.6 dwinter 181: {'label':'Weight and Type','action':'changeECHO_pageTemplateWeightForm'},
1.3 dwinter 182: )
183:
184: def changeECHO_pageTemplateWeightForm(self):
1.4 dwinter 185: """change"""
1.6 dwinter 186: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_pageTemplateWeight.zpt').__of__(self)
1.4 dwinter 187: return pt()
188:
1.15 dwinter 189: def changeECHO_pageTemplateWeight(self,weight,contentType,label,RESPONSE=None):
1.4 dwinter 190: """change"""
191: self.weight=weight
1.10 dwinter 192: self.contentType=contentType
1.15 dwinter 193: self.label=label
194:
1.4 dwinter 195: if RESPONSE is not None:
196: RESPONSE.redirect('manage_main')
1.15 dwinter 197:
198: def getLabel(self):
199: if hasattr(self,'label'):
1.16 dwinter 200: return self.label.encode('utf-8')
1.15 dwinter 201: else:
202: return 0
1.4 dwinter 203:
204: def getWeight(self):
205: """get weight"""
206: if hasattr(self,'weight'):
207: return self.weight
208: else:
209: return 0
1.6 dwinter 210:
1.10 dwinter 211: def getcontentType(self):
1.6 dwinter 212: """get weight"""
213: if hasattr(self,'weight'):
214: return self.weight
215: else:
216: return 0
217:
1.3 dwinter 218:
219:
1.1 dwinter 220:
1.10 dwinter 221: ## def __init__(self, id, text=None, contentType=None):
1.1 dwinter 222: ## self.id = str(id)
223: ## self.ZBindings_edit(self._default_bindings)
224: ## if text is None:
225: ## text = open(self._default_cont).read()
1.10 dwinter 226: ## self.pt_edit(text, contentType)
1.1 dwinter 227:
1.6 dwinter 228: def manage_addECHO_pageTemplateForm(self):
1.1 dwinter 229: """Form for adding"""
1.6 dwinter 230: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_pageTemplate.zpt').__of__(self)
1.1 dwinter 231: return pt()
232:
233: from urllib import quote
234:
235:
1.15 dwinter 236: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
1.1 dwinter 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)
1.3 dwinter 245: setattr(ob,'weight',weight)
1.15 dwinter 246: setattr(ob,'label',label)
1.10 dwinter 247: setattr(ob,'contentType',contentType)
1.1 dwinter 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:
1.10 dwinter 257: zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
1.1 dwinter 258:
259: self._setObject(id, zpt)
1.3 dwinter 260: ob = getattr(self, id)
261: setattr(ob,'weight',weight)
1.8 dwinter 262: if title:
263: ob.pt_setTitle(title)
264:
1.1 dwinter 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:
1.18 ! dwinter 280: displayedMetaTypes=displayTypes
1.1 dwinter 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"""
1.6 dwinter 294: pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_navigation.zpt').__of__(self)
1.1 dwinter 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.
1.18 ! dwinter 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)
1.1 dwinter 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"):
1.18 ! dwinter 332:
1.1 dwinter 333: if x.meta_type in self.displayedMetaTypes:
1.5 dwinter 334:
1.1 dwinter 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:
1.5 dwinter 344: def barFromHash(self,hash,start=None,sortField=None):
1.1 dwinter 345: """Erzeuge Navigations Element"""
346: #print "hash",hash
347: listNav=[]
348: if not start:
349: temp=hash
1.5 dwinter 350: sortField="weight"
1.1 dwinter 351: else: # list mit pfad zum hash
352: temp=hash
1.7 dwinter 353: #print "HI",sortField
1.5 dwinter 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:
1.7 dwinter 364: #print "OBJ",start,obj,obj.getId(),x
1.5 dwinter 365:
366: obj=getattr(obj,x)
367:
368: if hasattr(obj,'sortfield'):
369: sortField=obj.sortfield
370: else:
371: sortField='weight'
1.7 dwinter 372: #print "START",start
1.1 dwinter 373: for x in start:
1.7 dwinter 374: #print "N2",x,temp[x]
375: try:
1.5 dwinter 376: temp=temp[x][0]
1.7 dwinter 377: except:
378: """nothing"""
379: return []
380: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13 dwinter 381:
1.5 dwinter 382: for x in self.tempSorted(temp, field=sortField):
1.4 dwinter 383: if not temp[x][1].title == "":
384: if temp[x][1].meta_type=="ECHO_sqlElement":
385: for z in temp[x][1].getNavList():
1.17 dwinter 386: listNav.append((z[0],z[1],None))
1.4 dwinter 387: else:
1.7 dwinter 388: # add label fals existiert und nicht leer
389: if hasattr(temp[x][1],'label'):
390: if not temp[x][1].label=='':
1.16 dwinter 391: label=temp[x][1].label.encode('utf-8')
1.13 dwinter 392:
1.7 dwinter 393: else:
1.16 dwinter 394: label=temp[x][1].title.encode('utf-8')
1.7 dwinter 395: else:
1.16 dwinter 396: label=temp[x][1].title.encode('utf-8')
1.4 dwinter 397:
1.9 dwinter 398: listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
1.7 dwinter 399:
400: #print self.getId(),start
401: #print listNav
1.1 dwinter 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:
1.5 dwinter 410: def tempSorted(self,hash,field="weight"):
1.4 dwinter 411: ls=[]
1.13 dwinter 412:
1.4 dwinter 413: for x in hash.keys():
414: #print hash[x][1]
1.5 dwinter 415: if hasattr(hash[x][1],field):
416: weight=getattr(hash[x][1],field)
1.4 dwinter 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:
1.1 dwinter 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:
1.5 dwinter 468: for key in self.tempSorted(temp):
1.1 dwinter 469:
470: description=temp[x][1].title
1.2 dwinter 471:
1.3 dwinter 472: url=createPath(self.absolute_url(),temp[key][1].absolute_url())
1.2 dwinter 473:
1.1 dwinter 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=""
1.13 dwinter 487:
1.1 dwinter 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=""
1.12 dwinter 498: #print "NAVELEMENT",self.getId()
1.5 dwinter 499: #try:
500:
501: keys=self.barFromHash(self.createNavHash(0))
1.12 dwinter 502:
1.5 dwinter 503: #except:
504: # keys=""
1.1 dwinter 505:
506: return keys
1.12 dwinter 507:
508: def numberOfMainNavElements(self):
509: """number of main elements"""
510:
511: return len(self.barFromHash(self.createNavHash(0)))
512:
1.1 dwinter 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]]
1.7 dwinter 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]
1.1 dwinter 551: #print start
1.5 dwinter 552:
1.1 dwinter 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:
1.6 dwinter 584: def manage_addECHO_navigationForm(self):
1.1 dwinter 585: """Form for adding"""
1.6 dwinter 586: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
1.1 dwinter 587: return pt()
588:
1.6 dwinter 589: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1 dwinter 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:
1.3 dwinter 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,"/")
1.4 dwinter 609:
610: def sortWeight(x,y):
611: #print x[1],y[1]
612: return cmp(x[1],y[1])
1.1 dwinter 613:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>