File:  [Repository] / basket / basket.py
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Thu Mar 2 19:57:32 2006 UTC (18 years, 3 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
major changes users and groups introduced

    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: 
   27: publicationStatusList=['private','hidden','open_intern','open','group'] 
   28: # private only access for the owner, restricted only for users in accessGroup, open open for everyone, published occurs in basket list
   29: 
   30: class BasketBasis(OrderedFolder):
   31:     """Basis class for BasketFolder and Baskets"""
   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
   40:     
   41:         return last
   42:     
   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:     
   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:         
   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")
   87:     
   88:     security.declareProtected('View','getOwner')
   89:           
   90:     def getOwner(self):
   91:         """get Owner as string"""
   92:         return self.owner
   93:     
   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')
  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:     
  322:  
  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:
  331:                 setattr(objects[0][1],splitted[1],form[key])
  332: 
  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:         
  345:    
  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:
  370:             import random
  371:             rd=random.random()
  372:             REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER']+'&-dummy='+str(rd))
  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: 
  381: def manage_addBasket(self,id,title,comment,username,publicationStatus,shortDescription="",accessGroups=None,RESPONSE=None):
  382:     """add a basket object"""
  383:     #TODO:what happens in username does not exists
  384:     #find username
  385:     owner=username
  386:   
  387:     newObj=Basket(id,title,comment,owner,publicationStatus,shortDescription,accessGroups)
  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:     
  397:     #security=ClassSecurityInfo()
  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:     
  449:     #security=ClassSecurityInfo()
  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:     
  502:     #security=ClassSecurityInfo()
  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:     
  558:     #security=ClassSecurityInfo()
  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:     
  613:     #security=ClassSecurityInfo()
  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>