Annotation of basket/basket.py, revision 1.3
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:
160: return self.REQUEST.cookies.get('vlp_basket',None)
161:
162: def index_html(self,mode='open'):
163: """generische ansicht"""
164:
165: #check if user has right for other modi
166:
167: if hasattr(self,"BasketFolder_template"):
168: obj=getattr(self,"BaskeFolder_template")
169: return obj()
170: else:
171: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketFolder_template_standard.zpt')).__of__(self)
172: pt.content_type="text/html"
173: return pt(mode=mode)
174:
175: def __init__(self,id,title):
176: """init basket folder"""
177:
178: self.id=id
179: self.title=title
180:
181: def manageBasketFolder(self):
182: """manage the basket"""
183:
184: if hasattr(self,"BasketFolder_manage_template"):
185: obj=getattr(self,"BasketFolder_manage_template")
186: return obj()
187: else:
188: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketFolder_manage_template_standard.zpt')).__of__(self)
189: pt.content_type="text/html"
190: return pt()
191:
192: def addBasket(self,title,RESPONSE=None):
193: """add a new basket"""
194: id=self.getNewId()
195: username=self.getActualUserName()
1.3 ! dwinter 196: publicationStatus="private"
1.2 dwinter 197: manage_addBasket(self,str(id),title,"",username,publicationStatus,RESPONSE=None)
198: newObj=getattr(self,str(id))
1.3 ! dwinter 199: #create a groupfolder
! 200:
! 201: manage_addGroupFolder(newObj,'groupFolder')
! 202:
! 203: #add current user to admin group of the new set
! 204:
! 205: newObj.groupFolder.addUserToGroups(str(self.REQUEST['AUTHENTICATED_USER']),['admin'])
1.2 dwinter 206: if RESPONSE:
207: RESPONSE.redirect(newObj.absolute_url()+'/manageBasket')
208:
209:
210: def manage_addBasketFolderForm(self):
211: """form for adding a basket"""
212: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketFolder.zpt')).__of__(self)
213: return pt()
214:
215: def manage_addBasketFolder(self,id,title,RESPONSE=None):
216: """add a basket folder object"""
217:
218:
219: newObj=BasketFolder(id,title)
220:
221: self._setObject(id,newObj)
222:
223: if RESPONSE is not None:
224: RESPONSE.redirect('manage_main')
225:
226: class Basket(BasketBasis):
227: """Basket class"""
228:
229: meta_type="basket"
230:
231: security=ClassSecurityInfo()
232:
1.3 ! dwinter 233: publicationStatusList=publicationStatusList
! 234:
1.2 dwinter 235: manage_options=OrderedFolder.manage_options+(
236: {'label':'manage main','action':'changeBasketForm'},
237: )
238:
1.3 ! dwinter 239: def checkPermission(self,modus):
! 240: """check permission"""
! 241: if modus=='open':
! 242: return True
! 243: elif modus=='private':
! 244: return self.groupFolder.isMemberOf('admin')
! 245: elif modus=='admin':
! 246: return self.groupFolder.isMemberOf('admin')
! 247: elif modus=='edit':
! 248: return self.groupFolder.isMemberOf('edit')
! 249: elif modus=='publish':
! 250: return self.groupFolder.isMemberOf('publish')
! 251:
! 252: def manageUserRights_html(self):
! 253: """manage user rights"""
! 254: if hasattr(self,"Basket_manageUserRights_template"):
! 255: obj=getattr(self,"Basket_manageUserRights_template")
! 256: return obj()
! 257: else:
! 258: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_Basket_manageUserRights_standard.zpt')).__of__(self)
! 259: pt.content_type="text/html"
! 260: return pt()
! 261:
! 262:
! 263: def getBasketObjects(self):
! 264: """get all basket objects"""
! 265:
! 266: objs=self.getObjects()
! 267: ret=[]
! 268: for x in objs:
! 269: if x.meta_type in basketMetatypes:
! 270: ret.append(x)
! 271: return ret
! 272:
1.2 dwinter 273: def checkRef(self,xref):
274: """check if XRef is already in Basket"""
275:
276: founds=self.ZopeFind(self,obj_metatypes=["BasketXRef"])
277: for found in founds:
278: if self.xref==xref:
279: return True
280: return False
281:
282: def __init__(self,id,title,comment,owner,publicationStatus,shortDescription):
283: '''
284: init the basket
285: @param id: id
286: @param title: title of the basket
287: @param comment: description of the basket
288: @param shortDescription: short description of the basket for the overviewList
289: @param owner: user object describing the owner
290: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
291: '''
292:
293: self.id=id
294: self.title=title
295: self.comment=comment
296: self.owner=owner
297: self.publicationStatus=publicationStatus
298: self.shortDescription=shortDescription
299:
300:
301:
302: def getTitle(self):
303: """print name"""
304: return self.title
305:
306: security.declareProtected('Manage','changeBasketForm')
1.1 dwinter 307: def changeBasketForm(self):
308: """form for changing the basket"""
309: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasket.zpt')).__of__(self)
310: return pt()
311:
1.3 ! dwinter 312:
1.1 dwinter 313: def changeBasket(self,title,comment,shortDescription,publicationStatus=None,username=None,accessGroups=None,RESPONSE=None,target=None):
314: '''
315: init the basket
316: @param title: title of the basket
317: @param comment: description of the basket
318: @param owner: user object describing the owner
319: @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
320: @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
321: '''
322: #TODO:what happens in username does not exists
323: #find username
324: owner=username
325:
326: self.title=title
327: self.comment=comment
328: if owner:
329: self.owner=owner
330: if publicationStatus:
331: self.publicationStatus=publicationStatus
332: if accessGroups:
333: self.accessGroups=accessGroups
334: self.shortDescription=shortDescription
335:
336:
337: if RESPONSE is not None:
338: if target:
339: RESPONSE.redirect(target)
340: else:
341: RESPONSE.redirect('manage_main')
342:
343: def index_html(self):
344: """generische ansicht"""
345:
346: if hasattr(self,"BasketMain_template"):
347: obj=getattr(self,"BasketMain_template")
348: return obj()
349: else:
350: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_template_standard.zpt')).__of__(self)
351: pt.content_type="text/html"
352: return pt()
353:
354: def manageBasket(self):
355: """manage the basket"""
356:
357: if hasattr(self,"BasketMain_manage_template"):
358: obj=getattr(self,"BasketMain_manage_template")
359: return obj()
360: else:
361: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_manage_template_standard.zpt')).__of__(self)
362: pt.content_type="text/html"
363: return pt()
364:
1.2 dwinter 365:
1.1 dwinter 366: def changeBasketComments(self,REQUEST):
367: """Change comment of basket elements"""
368: form=REQUEST.form
369:
370: for key in form.keys():
371: splitted=key.split("_")
372: objects=self.ZopeFind(self,obj_ids=[splitted[0]])
373: if len(objects)>0:
1.2 dwinter 374: setattr(objects[0][1],splitted[1],form[key])
375:
1.1 dwinter 376:
377: if REQUEST:
378: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
379:
380:
381: def selectThisBasketAsCurrent(self,REQUEST=None):
382: """select this basket for further work"""
383: REQUEST.RESPONSE.setCookie('vlp_basket',self.getId(),path="/")
384:
385: if REQUEST:
386: REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
387:
1.2 dwinter 388:
1.1 dwinter 389: def generateNewObject(self,type,link,title='',comment='',REQUEST=None):
390: """generate a new object in the basket"""
391:
392: if type=="xref":
393:
394: splitted=urllib.unquote(link).split("?")
395: if len(splitted)>1:
396: #assumes references id is contained in the url as parameter id=
397: params=cgi.parse_qs(splitted[1])
398: xref=params.get('id',None)
399: return False
400: else:
401: #addumes link contains only the reference id
402: xref=link
403:
404: id=self.getNewId()
405: title=""
406:
407: if xref is None:
408: #no parameter id
409: return False
410: manage_addBasketXRef(self,str(id),title,comment,xref)
411:
412: if REQUEST:
1.2 dwinter 413: import random
414: rd=random.random()
415: REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER']+'&-dummy='+str(rd))
1.1 dwinter 416: else:
417: return True
418:
419: def manage_addBasketForm(self):
420: """form for adding a basket"""
421: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
422: return pt()
423:
1.2 dwinter 424: def manage_addBasket(self,id,title,comment,username,publicationStatus,shortDescription="",accessGroups=None,RESPONSE=None):
1.1 dwinter 425: """add a basket object"""
426: #TODO:what happens in username does not exists
427: #find username
428: owner=username
1.2 dwinter 429:
1.3 ! dwinter 430: newObj=Basket(id,title,comment,owner,publicationStatus,shortDescription)
! 431:
1.1 dwinter 432: self._setObject(id,newObj)
433:
434: if RESPONSE is not None:
435: RESPONSE.redirect('manage_main')
436:
437: class BasketBasis(SimpleItem):
438: """basic class for baskets"""
439:
1.2 dwinter 440: #security=ClassSecurityInfo()
1.1 dwinter 441:
442: manage_options=SimpleItem.manage_options+(
443: {'label':'manage main','action':'changeBasketBasisForm'},
444: )
445:
446: def __init__(self,id,title,comment):
447: '''
448: init basket basis
449: @param id: id
450: @param title: title
451: @param comment commentar:
452: '''
453: self.id=id
454: self.title=title
455: self.comment=comment
456:
457: def changeBasketBasisForm(self):
458: """form for changing the basket"""
459: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketBasis.zpt')).__of__(self)
460: return pt()
461:
462: def changeBasketBasis(self,title,comment,RESPONSE=None):
463: '''
464: init the basket
465: @param title: title of the basket
466: @param comment: description of the basket
467: '''
468:
469: self.title=title
470: self.comment=comment
471:
472: if RESPONSE is not None:
473: RESPONSE.redirect('manage')
474:
475: def linkToObject(self):
476: """generate url to open the resource, has to be implemented in the different objects, generic return None"""
477: return None
478:
479: def content_html(self,type):
480: """generische ausgabe des objectes als html"""
481: if hasattr(self,type+"_template"):
482: obj=getattr(self,type+"_template")
483: return obj()
484: else:
485: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','%s_template_standard.zpt'%type)).__of__(self)
486: pt.content_type="text/html"
487: return pt()
488:
489: class BasketXRef(BasketBasis):
490: """class for internal references based on xrefs"""
491:
1.2 dwinter 492: #security=ClassSecurityInfo()
1.1 dwinter 493: meta_type="BasketXRef"
494:
495: manage_options=BasketBasis.manage_options+(
496: {'label':'manage xref','action':'changeBasketXRefForm'},
497: )
498:
499: def changeBasketXRefForm(self):
500: """form for changing the basket"""
501: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketXRef.zpt')).__of__(self)
502: return pt()
503:
504: def changeBasketXRef(self,xref,RESPONSE=None):
505: '''
506: change the basket
507: @param xref: reference
508: '''
509:
510: self.xref=xref
511:
512: if RESPONSE is not None:
513: RESPONSE.redirect('manage')
514:
515: def linkToObject(self):
516: """generate url to open the resource"""
517: return refBasis%self.xref
518:
519: def content_html(self):
520: """format object as html fragment"""
521:
522: type=self.xref[0:3]
523: return BasketBasis.content_html(self,"BasketXRef_%s"%type)
524:
525: def manage_addBasketXRefForm(self):
526: """form for adding a basket"""
527: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketXRef.zpt')).__of__(self)
528: return pt()
529:
530: def manage_addBasketXRef(self,id,title,comment,xref,RESPONSE=None):
531: """add a basketXRef object"""
532:
533:
534: newObj=BasketXRef(id,title,comment)
535: newObj.xref=xref
536:
537: self._setObject(id,newObj)
538:
539: if RESPONSE is not None:
540: RESPONSE.redirect('manage_main')
541:
542: class BasketInternalLink(BasketBasis):
543: """class for internal referencens based on links"""
544:
1.2 dwinter 545: #security=ClassSecurityInfo()
1.1 dwinter 546: meta_type="BasketInternalLink"
547:
548: manage_options=BasketBasis.manage_options+(
549: {'label':'manage internal link','action':'changeBasketInternalLinkForm'},
550: )
551:
552: def changeBasketInternalLinkForm(self):
553: """form for changing the basket"""
554: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketInternalLink.zpt')).__of__(self)
555: return pt()
556:
557: def changeBasketInternalLink(self,link,linkText,RESPONSE=None):
558: '''
559: change the Internallink
560: @param link: reference
561: @param linkText: reference
562: '''
563:
564: self.link=link
565: self.linkText=linkText
566:
567: if RESPONSE is not None:
568: RESPONSE.redirect('manage')
569:
570: def content_html(self):
571: """format object as html fragment"""
572:
573: return BasketBasis.content_html(self,"BasketInternalLink")
574:
575: def linkToObject(self):
576: """link to the object (internalLink)"""
577: return self.link
578:
579: def manage_addBasketInternalLinkForm(self):
580: """form for adding a basket"""
581: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketInternalLink.zpt')).__of__(self)
582: return pt()
583:
584: def manage_addBasketInternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
585: """add a basketXRef object"""
586:
587:
588: newObj=BasketInternalLink(id,title,comment)
589: newObj.link=link
590: newObj.linkText=linkText
591:
592: self._setObject(id,newObj)
593:
594: if RESPONSE is not None:
595: RESPONSE.redirect('manage_main')
596:
597:
598: class BasketExternalLink(BasketBasis):
599: """class for external links"""
600:
1.2 dwinter 601: #security=ClassSecurityInfo()
1.1 dwinter 602: meta_type="BasketExternalLink"
603:
604: manage_options=BasketBasis.manage_options+(
605: {'label':'manage internal link','action':'changeBasketExternalLinkForm'},
606: )
607:
608: def changeBasketExternalLinkForm(self):
609: """form for changing the basket"""
610: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketExternalLink.zpt')).__of__(self)
611: return pt()
612:
613: def changeBasketExternalLink(self,link,linkText,RESPONSE=None):
614: '''
615: change the Externallink
616: @param link: reference
617: @param linkText: reference
618: '''
619:
620: self.link=link
621: self.linkText=linkText
622:
623: if RESPONSE is not None:
624: RESPONSE.redirect('manage')
625:
626: def content_html(self):
627: """format object as html fragment"""
628:
629: return BasketBasis.content_html(self,"BasketExternalLink")
630:
631: def linkToObject(self):
632: """link to the object (externalLink)"""
633: return self.link
634:
635: def manage_addBasketExternalLinkForm(self):
636: """form for adding a basket"""
637: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketExternalLink.zpt')).__of__(self)
638: return pt()
639:
640: def manage_addBasketExternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
641: """add a basket external link object"""
642:
643: newObj=BasketExternalLink(id,title,comment)
644: newObj.link=link
645: newObj.linkText=linkText
646:
647: self._setObject(id,newObj)
648:
649: if RESPONSE is not None:
650: RESPONSE.redirect('manage_main')
651:
652:
653: class BasketText(BasketBasis):
654: """class for text elements in baskets"""
655:
1.2 dwinter 656: #security=ClassSecurityInfo()
1.1 dwinter 657: meta_type="BasketText"
658:
659: def content_html(self):
660: """format object as html fragment"""
661: return "" # text has no content
662: #return BasketBasis.content_html(self,"BasketText")
663:
664: def manage_addBasketTextForm(self):
665: """form for adding a basket"""
666: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketText.zpt')).__of__(self)
667: return pt()
668:
669: def manage_addBasketText(self,id,title,comment,RESPONSE=None):
670: """add a basketXRef object"""
671:
672:
673: newObj=BasketText(id,title,comment)
674:
675: self._setObject(id,newObj)
676:
677: if RESPONSE is not None:
678: RESPONSE.redirect('manage_main')
679:
680:
681:
682:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>