Annotation of ECHO_content/ECHO_Nav.py, revision 1.21
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:
1.19 dwinter 306: def getColls(self,obj,depth,checkOnly="no"):
1.1 dwinter 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]
1.21 ! dwinter 311: if checkOnly=="no":
1.19 dwinter 312: x = checkOnlyOneInGroup(x)
1.18 dwinter 313: if depth>1:
314: nav[x.getId()]=(self.getColls(x,depth-1),x)
315: else:
316: nav[x.getId()]=(None,x)
1.1 dwinter 317: return nav
318:
1.19 dwinter 319: def createNavHash(self,depth,checkOnly="no"):
1.1 dwinter 320: """Auslesen des Hierarchiebuames"""
321: temp=self.pathToHierarchy[0:]
322: temp=re.sub("/",".",temp)
323: temp="self.aq_parent"+temp
324:
325: objtemp=eval(temp)
326: nav={}
327: obj=objtemp
328:
329:
330: for keys in obj.__dict__.keys():
331: x=getattr(obj,keys)
332: if hasattr(x,"meta_type"):
1.18 dwinter 333:
1.1 dwinter 334: if x.meta_type in self.displayedMetaTypes:
1.5 dwinter 335:
1.1 dwinter 336: if depth>1:
1.19 dwinter 337: nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
1.1 dwinter 338: else:
339: nav[x.getId()]=(None,x)
340:
341:
342: #print nav
343: return nav
344:
1.5 dwinter 345: def barFromHash(self,hash,start=None,sortField=None):
1.1 dwinter 346: """Erzeuge Navigations Element"""
347: #print "hash",hash
348: listNav=[]
349: if not start:
350: temp=hash
1.5 dwinter 351: sortField="weight"
1.1 dwinter 352: else: # list mit pfad zum hash
353: temp=hash
1.7 dwinter 354: #print "HI",sortField
1.5 dwinter 355: if not sortField:
356: tempObj=self.pathToHierarchy[0:]
357: tempObj=re.sub("/",".",tempObj)
358: tempObj="self.aq_parent"+tempObj
359:
360: objtemp=eval(tempObj)
361:
362: obj=objtemp
363:
364: for x in start:
1.7 dwinter 365: #print "OBJ",start,obj,obj.getId(),x
1.5 dwinter 366:
367: obj=getattr(obj,x)
368:
369: if hasattr(obj,'sortfield'):
370: sortField=obj.sortfield
371: else:
372: sortField='weight'
1.7 dwinter 373: #print "START",start
1.1 dwinter 374: for x in start:
1.7 dwinter 375: #print "N2",x,temp[x]
376: try:
1.5 dwinter 377: temp=temp[x][0]
1.7 dwinter 378: except:
379: """nothing"""
380: return []
381: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13 dwinter 382:
1.5 dwinter 383: for x in self.tempSorted(temp, field=sortField):
1.4 dwinter 384: if not temp[x][1].title == "":
385: if temp[x][1].meta_type=="ECHO_sqlElement":
386: for z in temp[x][1].getNavList():
1.17 dwinter 387: listNav.append((z[0],z[1],None))
1.4 dwinter 388: else:
1.7 dwinter 389: # add label fals existiert und nicht leer
390: if hasattr(temp[x][1],'label'):
391: if not temp[x][1].label=='':
1.16 dwinter 392: label=temp[x][1].label.encode('utf-8')
1.13 dwinter 393:
1.7 dwinter 394: else:
1.16 dwinter 395: label=temp[x][1].title.encode('utf-8')
1.7 dwinter 396: else:
1.16 dwinter 397: label=temp[x][1].title.encode('utf-8')
1.4 dwinter 398:
1.9 dwinter 399: listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
1.7 dwinter 400:
401: #print self.getId(),start
402: #print listNav
1.1 dwinter 403:
404: #html=""
405: #for k in listNav:
406: # print k
407: # html=html+"<a href='%s'>%s</a> "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
408:
409: return listNav
410:
1.5 dwinter 411: def tempSorted(self,hash,field="weight"):
1.4 dwinter 412: ls=[]
1.13 dwinter 413:
1.4 dwinter 414: for x in hash.keys():
415: #print hash[x][1]
1.5 dwinter 416: if hasattr(hash[x][1],field):
417: weight=getattr(hash[x][1],field)
1.4 dwinter 418: #print weight
419: else:
420: weight=0
421:
422: ls.append((x,weight))
423:
424: ls.sort(sortWeight)
425:
426: return [x[0] for x in ls]
427:
428:
429:
430:
1.1 dwinter 431: def isSelectedPath(self,item):
432: """test is path is already selected"""
433: found=re.search("\?(.*)",item[1])
434: if found:
435: temp=re.sub(" ","%20",found.group(0))
436: #print temp+"::"+self.REQUEST['QUERY_STRING']
437: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
438: return 1
439:
440: if re.search(item[1],self.REQUEST['URL']):
441: return 1
442: else:
443: return 0
444:
445:
446: def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
447:
448: """Generate Buttons"""
449: if orientation=="horizontal":
450: html="<table><tr>"
451: startTag="<td>"
452: endTag="</td>"
453: endHtml="</tr></table>"
454:
455: else:
456: html="<table>"
457: startTag="<tr><td>"
458: endTag="</td></tr>"
459: endHtml="</table>"
460:
461: if not start:
462: temp=hash
463: else:
464: temp=hash
465: for x in start:
466: temp=temp[x][0]
467: #print temp
468:
1.5 dwinter 469: for key in self.tempSorted(temp):
1.1 dwinter 470:
471: description=temp[x][1].title
1.2 dwinter 472:
1.3 dwinter 473: url=createPath(self.absolute_url(),temp[key][1].absolute_url())
1.2 dwinter 474:
1.1 dwinter 475: if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
476: html=html+startTag+"[%s]" % description+endTag
477: else:
478: html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
479:
480:
481: html=html+endHtml
482:
483: return html
484:
485: def mainNavBar(self):
486: """print main navigation bar"""
487: keys=""
1.13 dwinter 488:
1.1 dwinter 489: try:
490: keys=self.buttonsFromHash(self.createNavHash(0))
491: except:
492: keys=""
493:
494: return keys
495:
496: def mainNavElements(self):
497: """print main navigation bar"""
498: keys=""
1.12 dwinter 499: #print "NAVELEMENT",self.getId()
1.5 dwinter 500: #try:
501:
502: keys=self.barFromHash(self.createNavHash(0))
1.12 dwinter 503:
1.5 dwinter 504: #except:
505: # keys=""
1.1 dwinter 506:
507: return keys
1.12 dwinter 508:
509: def numberOfMainNavElements(self):
510: """number of main elements"""
511:
512: return len(self.barFromHash(self.createNavHash(0)))
513:
1.1 dwinter 514: def secondNavElements(self):
515: """Zweite Ordnung"""
516:
1.19 dwinter 517: hash=self.createNavHash(2,checkOnly="yes")
1.1 dwinter 518: actual_url=self.REQUEST['URL']
519:
520: ult_temp=re.sub(self.absolute_url(),"",actual_url)
521: #print ult_temp
522:
523: splitted=ult_temp.split("/")
524:
525:
526: start=[splitted[2]]
1.7 dwinter 527: #print start
528:
529: keys=self.barFromHash(hash,start=start)
530:
531:
532: return keys
533:
534: def navElements(self,order):
535: """n-te Ordnung"""
536:
537: hash=self.createNavHash(order)
538: actual_url=self.REQUEST['URL']
539:
540: ult_temp=re.sub(self.absolute_url(),"",actual_url)
541: #print ult_temp
542:
543: splitted=ult_temp.split("/")
544:
545:
546: ## if splitted[len(splitted)-1]=="index_html":
547: ## start=[splitted[len(splitted)-2]]
548: ## else:
549: ## start=[splitted[len(splitted)-1]]
550:
551: start=splitted[2:order+1]
1.1 dwinter 552: #print start
1.5 dwinter 553:
1.1 dwinter 554: keys=self.barFromHash(hash,start=start)
555:
556:
557: return keys
558:
559:
560: def secondNavBar(self):
561: """Zweite Ordnung"""
562:
563: hash=self.createNavHash(2)
564: actual_url=self.REQUEST['URL']
565:
566: ult_temp=re.sub(self.absolute_url(),"",actual_url)
567: #print ult_temp
568:
569: splitted=ult_temp.split("/")
570:
571:
572: ## if splitted[len(splitted)-1]=="index_html":
573: ## start=[splitted[len(splitted)-2]]
574: ## else:
575: ## start=[splitted[len(splitted)-1]]
576:
577: start=[splitted[2]]
578: #print start
579:
580: keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
581:
582:
583: return keys
584:
1.6 dwinter 585: def manage_addECHO_navigationForm(self):
1.1 dwinter 586: """Form for adding"""
1.6 dwinter 587: pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
1.1 dwinter 588: return pt()
589:
1.6 dwinter 590: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1 dwinter 591: """Add an ECHO_root"""
592: self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
593:
594: if RESPONSE is not None:
595: RESPONSE.redirect('manage_main')
596:
597:
598: #helpers
599:
1.3 dwinter 600:
601:
602: def createPath(url1,url2):
603: temp1=url1.split("/")
604: temp2=url2.split("/")
605: for test in temp1:
606: if temp2[0]==test:
607: del temp2[0]
608:
609: return url1+"/"+string.join(temp2,"/")
1.4 dwinter 610:
611: def sortWeight(x,y):
612: #print x[1],y[1]
613: return cmp(x[1],y[1])
1.1 dwinter 614:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>