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