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