Annotation of basket/basket.py, revision 1.5
1.1 dwinter 1: ###objects to store and manage objects in baskets
2:
3: import os
4: import os.path
5: import urllib
6: import cgi
7:
8:
9: from OFS.OrderedFolder import OrderedFolder
10: from OFS.SimpleItem import SimpleItem
11:
12: from AccessControl import ClassSecurityInfo
13: from AccessControl.User import UserFolder
14: from Globals import InitializeClass
15: from Globals import DTMLFile
16: import Globals
17: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
18: from Products.PageTemplates.PageTemplate import PageTemplate
19: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
20: from Globals import Persistent, package_home
21: from Acquisition import Implicit
22: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
23:
1.3 dwinter 24:
25: from groups import manage_addGroupFolder
26:
1.1 dwinter 27: refBasis="http://vlp.mpiwg-berlin.mpg.de/references?id=%s"
1.3 dwinter 28:
29: basketMetatypes=['BasketXRef','BasketInternalLink','BasketExternalLink','BasketText']
30:
1.1 dwinter 31: #basis url for references
32:
1.2 dwinter 33: publicationStatusList=['private','hidden','open_intern','open','group']
1.1 dwinter 34: # private only access for the owner, restricted only for users in accessGroup, open open for everyone, published occurs in basket list
35:
1.2 dwinter 36: class BasketBasis(OrderedFolder):
37: """Basis class for BasketFolder and Baskets"""
1.1 dwinter 38:
39: security=ClassSecurityInfo()
40: def getNewId(self):
41: """createIds"""
42: last=getattr(self,'last',0)
43: last +=1
44: while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
45: last+=1
1.2 dwinter 46:
1.1 dwinter 47: return last
1.2 dwinter 48:
1.1 dwinter 49: def addBasketText(self,REQUEST=None):
50: """add a text"""
51: id=self.getNewId()
52: manage_addBasketText(self,str(id),'','',RESPONSE=None)
53: if REQUEST:
54: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
55:
1.2 dwinter 56: def addBasketExternalLink(self,REQUEST=None):
57: """add an external link"""
58: id=self.getNewId()
59:
60: manage_addBasketExternalLink(self,str(id),"","","","",RESPONSE=None)
61: if REQUEST:
62: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
63:
1.1 dwinter 64: def deleteObject(self,id,REQUEST=None):
65: """delete object"""
66: self.manage_delObjects([id])
67: if REQUEST:
68: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
69:
70: def moveUp(self,id,REQUEST=None):
71: """move id one up"""
72: self.moveObjectsUp([id], 1)
73: if REQUEST:
74: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
75:
76: def moveDown(self,id,REQUEST=None):
77: """move id one up"""
78: self.moveObjectsDown([id], 1)
79: if REQUEST:
80: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
81:
82: def moveTop(self,id,REQUEST=None):
83: """move to top"""
84: self.moveObjectsToTop([id])
85: if REQUEST:
86: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
87:
88: def moveBottom(self,id,REQUEST=None):
89: """move to top"""
90: self.moveObjectsToBottom([id])
91: if REQUEST:
92: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
1.2 dwinter 93:
94: security.declareProtected('View','getOwner')
1.1 dwinter 95:
96: def getOwner(self):
97: """get Owner as string"""
98: return self.owner
99:
1.2 dwinter 100: def isAuthorized(self,role="read"):
101: """check whether actual user is authorized"""
1.3 dwinter 102: #TODO replace occurences with checkPermission
1.2 dwinter 103: return True
104:
105: def getActualUserName(self):
106: """get username of actual user"""
107: return self.REQUEST['AUTHENTICATED_USER'].getUserName()
108:
109: def getObjects(self):
110: """"get objects"""
111: return [getattr(self,x['id']) for x in self._objects]
112:
113: def numberOfObjects(self):
114: """anzahl der elemente im basket"""
115: return len(self._objects)
116:
117: class BasketFolder(BasketBasis):
118: """Folder for Baskets"""
119:
120: meta_type="Basket Folder"
121:
122: #security=ClassSecurityInfo()
123:
124: def getSets(self,mode='open'):
125: """get sets, depending on mode selected"""
126: ret=[]
127:
128: if mode=='open':
129:
130: for object in self.getObjects():
131:
132: if object.publicationStatus=='open':
133: ret.append(object)
134: return ret
135: elif mode=='open_intern':
136: print "open_intern"
137: if self.groupFolder.isMemberOf('user'):
138: print "---public"
139: for object in self.getObjects():
140: print object.getId(),object.publicationStatus
141: if object.publicationStatus=='open_intern':
142: ret.append(object)
143: return ret
144: else:
145: return ret
146: elif mode=='private':
147: for object in self.getObjects():
148: if object.groupFolder.isMemberOf('admin') or object.groupFolder.isMemberOf('editor'):
149: ret.append(object)
150: return ret
151: elif mode=='groups':
152: for object in self.getObjects():
153: if object.groupFolder.isMemberOf('reader') or object.groupFolder.isMemberOf('editor') or object.groupFolder.isMemberOf('admin'):
154: ret.append(object)
155: return ret
156:
157: def getCurrentBasket(self):
158: """select this basket for further work"""
159:
1.4 dwinter 160: id=self.REQUEST.cookies.get('vlp_basket',None)
161: if id:
162: return getattr(self,id,None)
163: else:
1.5 ! dwinter 164: return None
! 165:
! 166:
1.2 dwinter 167: def index_html(self,mode='open'):
168: """generische ansicht"""
169:
170: #check if user has right for other modi
171:
172: if hasattr(self,"BasketFolder_template"):
173: obj=getattr(self,"BaskeFolder_template")
174: return obj()
175: else:
176: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketFolder_template_standard.zpt')).__of__(self)
177: pt.content_type="text/html"
178: return pt(mode=mode)
179:
180: def __init__(self,id,title):
181: """init basket folder"""
182:
183: self.id=id
184: self.title=title
185:
186: def manageBasketFolder(self):
187: """manage the basket"""
188:
189: if hasattr(self,"BasketFolder_manage_template"):
190: obj=getattr(self,"BasketFolder_manage_template")
191: return obj()
192: else:
193: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketFolder_manage_template_standard.zpt')).__of__(self)
194: pt.content_type="text/html"
195: return pt()
196:
197: def addBasket(self,title,RESPONSE=None):
198: """add a new basket"""
199: id=self.getNewId()
200: username=self.getActualUserName()
1.3 dwinter 201: publicationStatus="private"
1.2 dwinter 202: manage_addBasket(self,str(id),title,"",username,publicationStatus,RESPONSE=None)
203: newObj=getattr(self,str(id))
1.3 dwinter 204: #create a groupfolder
205:
206: manage_addGroupFolder(newObj,'groupFolder')
207:
208: #add current user to admin group of the new set
209:
210: newObj.groupFolder.addUserToGroups(str(self.REQUEST['AUTHENTICATED_USER']),['admin'])
1.2 dwinter 211: if RESPONSE:
212: RESPONSE.redirect(newObj.absolute_url()+'/manageBasket')
213:
214:
215: def manage_addBasketFolderForm(self):
216: """form for adding a basket"""
217: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketFolder.zpt')).__of__(self)
218: return pt()
219:
220: def manage_addBasketFolder(self,id,title,RESPONSE=None):
221: """add a basket folder object"""
222:
223:
224: newObj=BasketFolder(id,title)
225:
226: self._setObject(id,newObj)
227:
228: if RESPONSE is not None:
229: RESPONSE.redirect('manage_main')
230:
231: class Basket(BasketBasis):
232: """Basket class"""
233:
234: meta_type="basket"
235:
236: security=ClassSecurityInfo()
237:
1.3 dwinter 238: publicationStatusList=publicationStatusList
239:
1.2 dwinter 240: manage_options=OrderedFolder.manage_options+(
241: {'label':'manage main','action':'changeBasketForm'},
242: )
243:
1.3 dwinter 244: def checkPermission(self,modus):
245: """check permission"""
246: if modus=='open':
247: return True
248: elif modus=='private':
249: return self.groupFolder.isMemberOf('admin')
250: elif modus=='admin':
251: return self.groupFolder.isMemberOf('admin')
252: elif modus=='edit':
253: return self.groupFolder.isMemberOf('edit')
254: elif modus=='publish':
255: return self.groupFolder.isMemberOf('publish')
256:
257: def manageUserRights_html(self):
258: """manage user rights"""
259: if hasattr(self,"Basket_manageUserRights_template"):
260: obj=getattr(self,"Basket_manageUserRights_template")
261: return obj()
262: else:
263: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_Basket_manageUserRights_standard.zpt')).__of__(self)
264: pt.content_type="text/html"
265: return pt()
266:
267:
268: def getBasketObjects(self):
269: """get all basket objects"""
270:
271: objs=self.getObjects()
272: ret=[]
273: for x in objs:
274: if x.meta_type in basketMetatypes:
275: ret.append(x)
276: return ret
277:
1.2 dwinter 278: def checkRef(self,xref):
279: """check if XRef is already in Basket"""
280:
281: founds=self.ZopeFind(self,obj_metatypes=["BasketXRef"])
282: for found in founds:
283: if self.xref==xref:
284: return True
285: return False
286:
287: def __init__(self,id,title,comment,owner,publicationStatus,shortDescription):
288: '''
289: init the basket
290: @param id: id
291: @param title: title of the basket
292: @param comment: description of the basket
293: @param shortDescription: short description of the basket for the overviewList
294: @param owner: user object describing the owner
295: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
296: '''
297:
298: self.id=id
299: self.title=title
300: self.comment=comment
301: self.owner=owner
302: self.publicationStatus=publicationStatus
303: self.shortDescription=shortDescription
304:
305:
306:
307: def getTitle(self):
308: """print name"""
309: return self.title
310:
311: security.declareProtected('Manage','changeBasketForm')
1.1 dwinter 312: def changeBasketForm(self):
313: """form for changing the basket"""
314: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasket.zpt')).__of__(self)
315: return pt()
316:
1.3 dwinter 317:
1.1 dwinter 318: def changeBasket(self,title,comment,shortDescription,publicationStatus=None,username=None,accessGroups=None,RESPONSE=None,target=None):
319: '''
320: init the basket
321: @param title: title of the basket
322: @param comment: description of the basket
323: @param owner: user object describing the owner
324: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
325: @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
326: '''
327: #TODO:what happens in username does not exists
328: #find username
329: owner=username
330:
331: self.title=title
332: self.comment=comment
333: if owner:
334: self.owner=owner
335: if publicationStatus:
336: self.publicationStatus=publicationStatus
337: if accessGroups:
338: self.accessGroups=accessGroups
339: self.shortDescription=shortDescription
340:
341:
342: if RESPONSE is not None:
343: if target:
344: RESPONSE.redirect(target)
345: else:
346: RESPONSE.redirect('manage_main')
347:
348: def index_html(self):
349: """generische ansicht"""
350:
351: if hasattr(self,"BasketMain_template"):
352: obj=getattr(self,"BasketMain_template")
353: return obj()
354: else:
355: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_template_standard.zpt')).__of__(self)
356: pt.content_type="text/html"
357: return pt()
358:
359: def manageBasket(self):
360: """manage the basket"""
361:
362: if hasattr(self,"BasketMain_manage_template"):
363: obj=getattr(self,"BasketMain_manage_template")
364: return obj()
365: else:
366: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_manage_template_standard.zpt')).__of__(self)
367: pt.content_type="text/html"
368: return pt()
369:
1.2 dwinter 370:
1.1 dwinter 371: def changeBasketComments(self,REQUEST):
372: """Change comment of basket elements"""
373: form=REQUEST.form
374:
375: for key in form.keys():
376: splitted=key.split("_")
377: objects=self.ZopeFind(self,obj_ids=[splitted[0]])
378: if len(objects)>0:
1.2 dwinter 379: setattr(objects[0][1],splitted[1],form[key])
380:
1.1 dwinter 381:
382: if REQUEST:
383: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
384:
385:
386: def selectThisBasketAsCurrent(self,REQUEST=None):
387: """select this basket for further work"""
388: REQUEST.RESPONSE.setCookie('vlp_basket',self.getId(),path="/")
389:
390: if REQUEST:
391: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
392:
1.2 dwinter 393:
1.1 dwinter 394: def generateNewObject(self,type,link,title='',comment='',REQUEST=None):
395: """generate a new object in the basket"""
396:
397: if type=="xref":
398:
399: splitted=urllib.unquote(link).split("?")
400: if len(splitted)>1:
401: #assumes references id is contained in the url as parameter id=
402: params=cgi.parse_qs(splitted[1])
403: xref=params.get('id',None)
404: return False
405: else:
406: #addumes link contains only the reference id
407: xref=link
408:
409: id=self.getNewId()
410: title=""
411:
412: if xref is None:
413: #no parameter id
414: return False
415: manage_addBasketXRef(self,str(id),title,comment,xref)
416:
417: if REQUEST:
1.2 dwinter 418: import random
419: rd=random.random()
420: REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER']+'&-dummy='+str(rd))
1.1 dwinter 421: else:
422: return True
423:
424: def manage_addBasketForm(self):
425: """form for adding a basket"""
426: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
427: return pt()
428:
1.2 dwinter 429: def manage_addBasket(self,id,title,comment,username,publicationStatus,shortDescription="",accessGroups=None,RESPONSE=None):
1.1 dwinter 430: """add a basket object"""
431: #TODO:what happens in username does not exists
432: #find username
433: owner=username
1.2 dwinter 434:
1.3 dwinter 435: newObj=Basket(id,title,comment,owner,publicationStatus,shortDescription)
436:
1.1 dwinter 437: self._setObject(id,newObj)
438:
439: if RESPONSE is not None:
440: RESPONSE.redirect('manage_main')
441:
442: class BasketBasis(SimpleItem):
443: """basic class for baskets"""
444:
1.2 dwinter 445: #security=ClassSecurityInfo()
1.1 dwinter 446:
447: manage_options=SimpleItem.manage_options+(
448: {'label':'manage main','action':'changeBasketBasisForm'},
449: )
450:
451: def __init__(self,id,title,comment):
452: '''
453: init basket basis
454: @param id: id
455: @param title: title
456: @param comment commentar:
457: '''
458: self.id=id
459: self.title=title
460: self.comment=comment
461:
462: def changeBasketBasisForm(self):
463: """form for changing the basket"""
464: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketBasis.zpt')).__of__(self)
465: return pt()
466:
467: def changeBasketBasis(self,title,comment,RESPONSE=None):
468: '''
469: init the basket
470: @param title: title of the basket
471: @param comment: description of the basket
472: '''
473:
474: self.title=title
475: self.comment=comment
476:
477: if RESPONSE is not None:
478: RESPONSE.redirect('manage')
479:
480: def linkToObject(self):
481: """generate url to open the resource, has to be implemented in the different objects, generic return None"""
482: return None
483:
484: def content_html(self,type):
485: """generische ausgabe des objectes als html"""
486: if hasattr(self,type+"_template"):
487: obj=getattr(self,type+"_template")
488: return obj()
489: else:
490: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','%s_template_standard.zpt'%type)).__of__(self)
491: pt.content_type="text/html"
492: return pt()
493:
494: class BasketXRef(BasketBasis):
495: """class for internal references based on xrefs"""
496:
1.2 dwinter 497: #security=ClassSecurityInfo()
1.1 dwinter 498: meta_type="BasketXRef"
499:
500: manage_options=BasketBasis.manage_options+(
501: {'label':'manage xref','action':'changeBasketXRefForm'},
502: )
503:
504: def changeBasketXRefForm(self):
505: """form for changing the basket"""
506: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketXRef.zpt')).__of__(self)
507: return pt()
508:
509: def changeBasketXRef(self,xref,RESPONSE=None):
510: '''
511: change the basket
512: @param xref: reference
513: '''
514:
515: self.xref=xref
516:
517: if RESPONSE is not None:
518: RESPONSE.redirect('manage')
519:
520: def linkToObject(self):
521: """generate url to open the resource"""
522: return refBasis%self.xref
523:
524: def content_html(self):
525: """format object as html fragment"""
526:
527: type=self.xref[0:3]
528: return BasketBasis.content_html(self,"BasketXRef_%s"%type)
529:
530: def manage_addBasketXRefForm(self):
531: """form for adding a basket"""
532: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketXRef.zpt')).__of__(self)
533: return pt()
534:
535: def manage_addBasketXRef(self,id,title,comment,xref,RESPONSE=None):
536: """add a basketXRef object"""
537:
538:
539: newObj=BasketXRef(id,title,comment)
540: newObj.xref=xref
541:
542: self._setObject(id,newObj)
543:
544: if RESPONSE is not None:
545: RESPONSE.redirect('manage_main')
546:
547: class BasketInternalLink(BasketBasis):
548: """class for internal referencens based on links"""
549:
1.2 dwinter 550: #security=ClassSecurityInfo()
1.1 dwinter 551: meta_type="BasketInternalLink"
552:
553: manage_options=BasketBasis.manage_options+(
554: {'label':'manage internal link','action':'changeBasketInternalLinkForm'},
555: )
556:
557: def changeBasketInternalLinkForm(self):
558: """form for changing the basket"""
559: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketInternalLink.zpt')).__of__(self)
560: return pt()
561:
562: def changeBasketInternalLink(self,link,linkText,RESPONSE=None):
563: '''
564: change the Internallink
565: @param link: reference
566: @param linkText: reference
567: '''
568:
569: self.link=link
570: self.linkText=linkText
571:
572: if RESPONSE is not None:
573: RESPONSE.redirect('manage')
574:
575: def content_html(self):
576: """format object as html fragment"""
577:
578: return BasketBasis.content_html(self,"BasketInternalLink")
579:
580: def linkToObject(self):
581: """link to the object (internalLink)"""
582: return self.link
583:
584: def manage_addBasketInternalLinkForm(self):
585: """form for adding a basket"""
586: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketInternalLink.zpt')).__of__(self)
587: return pt()
588:
589: def manage_addBasketInternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
590: """add a basketXRef object"""
591:
592:
593: newObj=BasketInternalLink(id,title,comment)
594: newObj.link=link
595: newObj.linkText=linkText
596:
597: self._setObject(id,newObj)
598:
599: if RESPONSE is not None:
600: RESPONSE.redirect('manage_main')
601:
602:
603: class BasketExternalLink(BasketBasis):
604: """class for external links"""
605:
1.2 dwinter 606: #security=ClassSecurityInfo()
1.1 dwinter 607: meta_type="BasketExternalLink"
608:
609: manage_options=BasketBasis.manage_options+(
610: {'label':'manage internal link','action':'changeBasketExternalLinkForm'},
611: )
612:
613: def changeBasketExternalLinkForm(self):
614: """form for changing the basket"""
615: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketExternalLink.zpt')).__of__(self)
616: return pt()
617:
618: def changeBasketExternalLink(self,link,linkText,RESPONSE=None):
619: '''
620: change the Externallink
621: @param link: reference
622: @param linkText: reference
623: '''
624:
625: self.link=link
626: self.linkText=linkText
627:
628: if RESPONSE is not None:
629: RESPONSE.redirect('manage')
630:
631: def content_html(self):
632: """format object as html fragment"""
633:
634: return BasketBasis.content_html(self,"BasketExternalLink")
635:
636: def linkToObject(self):
637: """link to the object (externalLink)"""
638: return self.link
639:
640: def manage_addBasketExternalLinkForm(self):
641: """form for adding a basket"""
642: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketExternalLink.zpt')).__of__(self)
643: return pt()
644:
645: def manage_addBasketExternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
646: """add a basket external link object"""
647:
648: newObj=BasketExternalLink(id,title,comment)
649: newObj.link=link
650: newObj.linkText=linkText
651:
652: self._setObject(id,newObj)
653:
654: if RESPONSE is not None:
655: RESPONSE.redirect('manage_main')
656:
657:
658: class BasketText(BasketBasis):
659: """class for text elements in baskets"""
660:
1.2 dwinter 661: #security=ClassSecurityInfo()
1.1 dwinter 662: meta_type="BasketText"
663:
664: def content_html(self):
665: """format object as html fragment"""
666: return "" # text has no content
667: #return BasketBasis.content_html(self,"BasketText")
668:
669: def manage_addBasketTextForm(self):
670: """form for adding a basket"""
671: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketText.zpt')).__of__(self)
672: return pt()
673:
674: def manage_addBasketText(self,id,title,comment,RESPONSE=None):
675: """add a basketXRef object"""
676:
677:
678: newObj=BasketText(id,title,comment)
679:
680: self._setObject(id,newObj)
681:
682: if RESPONSE is not None:
683: RESPONSE.redirect('manage_main')
684:
685:
686:
687:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>