File:  [Repository] / basket / basket.py
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Thu Jan 19 16:25:49 2006 UTC (18 years, 4 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

###objects to store and manage objects in baskets

import os
import os.path
import urllib
import cgi


from OFS.OrderedFolder import OrderedFolder
from OFS.SimpleItem import SimpleItem

from AccessControl import ClassSecurityInfo
from AccessControl.User import UserFolder
from Globals import InitializeClass
from Globals import DTMLFile
import Globals
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.PageTemplate import PageTemplate
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
from Globals import Persistent, package_home
from Acquisition import Implicit
from Products.ZCatalog.CatalogPathAwareness import CatalogAware

refBasis="http://vlp.mpiwg-berlin.mpg.de/references?id=%s" 
#basis url for references

publicationStatus=['private','restricted','open','published'] 
# private only access for the owner, restricted only for users in accessGroup, open open for everyone, published occurs in basket list

class Basket(OrderedFolder):
    """Basket class"""
    
    meta_type="basket"
    
    security=ClassSecurityInfo()
    
    manage_options=OrderedFolder.manage_options+(
        {'label':'manage main','action':'changeBasketForm'},
        )
    
    def __init__(self,id,title,comment,owner,publicationStatus,shortDescription,accessGroups=None):
        '''
        init the basket
        @param id: id
        @param title: title of the basket
        @param comment: description of the basket
        @param shortDescription: short description of the basket for the overviewList
        @param owner: user object describing the owner
        @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
        @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
        '''
        
        self.id=id
        self.title=title
        self.comment=comment
        self.owner=owner
        self.publicationStatus=publicationStatus
        self.accessGroups=accessGroups
        self.shortDecription=shortDescription
        
    security.declareProtected('View','getOwner')
    
    def getNewId(self):
        """createIds"""
        last=getattr(self,'last',0)
        last +=1
        while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
            last+=1
        return last
        
    def addBasketText(self,REQUEST=None):
        """add a text"""
        id=self.getNewId()
        manage_addBasketText(self,str(id),'','',RESPONSE=None)
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
    
    def deleteObject(self,id,REQUEST=None):
        """delete object"""
        self.manage_delObjects([id])
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
    
    def moveUp(self,id,REQUEST=None):
        """move id one up"""
        self.moveObjectsUp([id], 1)
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
    
    def moveDown(self,id,REQUEST=None):
        """move id one up"""
        self.moveObjectsDown([id], 1)
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
            
    def moveTop(self,id,REQUEST=None):
        """move to top"""
        self.moveObjectsToTop([id])
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
  
    def moveBottom(self,id,REQUEST=None):
        """move to top"""
        self.moveObjectsToBottom([id])
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
          
    def getOwner(self):
        """get Owner as string"""
        return self.owner
    
    def changeBasketForm(self):
        """form for changing the basket"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasket.zpt')).__of__(self)
        return pt()

    def changeBasket(self,title,comment,shortDescription,publicationStatus=None,username=None,accessGroups=None,RESPONSE=None,target=None):
        '''
        init the basket
        @param title: title of the basket
        @param comment: description of the basket
        @param owner: user object describing the owner
        @param publication_status: one of publicationStatus if restricted, optional parameter accessGroups has to be set
        @param aaccessGroups: default value is none, contains list of groups which are allowed to access this basket
        '''
         #TODO:what happens in username does not exists
        #find username
        owner=username
    
        self.title=title
        self.comment=comment
        if owner:
            self.owner=owner
        if publicationStatus:
            self.publicationStatus=publicationStatus
        if accessGroups:
            self.accessGroups=accessGroups
        self.shortDescription=shortDescription
    
        
        if RESPONSE is not None:
            if target:
                RESPONSE.redirect(target)
            else:
                RESPONSE.redirect('manage_main')
                
    def index_html(self):
        """generische ansicht"""

        if hasattr(self,"BasketMain_template"):
            obj=getattr(self,"BasketMain_template")
            return obj()
        else:
            pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_template_standard.zpt')).__of__(self)
            pt.content_type="text/html"
            return pt()
    
    def manageBasket(self):
        """manage the basket"""
        
        if hasattr(self,"BasketMain_manage_template"):
            obj=getattr(self,"BasketMain_manage_template")
            return obj()
        else:
            pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketMain_manage_template_standard.zpt')).__of__(self)
            pt.content_type="text/html"
            return pt()
    
    def isAuthorized(self,role="read"):
        """check whether actual user is authorized"""
        #TODO implement isAuthorized to do type, read or edit
        return True
      
    def getActualUserName(self):
        """get username of actual user"""
        return self.REQUEST['AUTHENTICATED_USER'].getUserName()
        
    def getObjects(self):
        """"get objects"""
        return [getattr(self,x['id']) for x in self._objects]
   
    def numberOfObjects(self):
        """anzahl der elemente im basket"""
        return len(self._objects)
    
    def changeBasketComments(self,REQUEST):
        """Change comment of basket elements"""
        form=REQUEST.form
        
        for key in form.keys():
            splitted=key.split("_")
            objects=self.ZopeFind(self,obj_ids=[splitted[0]])
            if len(objects)>0:
                objects[0][1].comment=form[key]
   
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")  
              

    def selectThisBasketAsCurrent(self,REQUEST=None):
        """select this basket for further work"""
        REQUEST.RESPONSE.setCookie('vlp_basket',self.getId(),path="/")
        
        if REQUEST:
            REQUEST.RESPONSE.redirect(self.absolute_url()+"/manageBasket")
        
    def getCurrentBasket(self):
        """select this basket for further work"""
        return self.REQUEST.cookies.get('vlp_basket',None)
    
    def generateNewObject(self,type,link,title='',comment='',REQUEST=None):
        """generate a new object in the basket"""
        
        if type=="xref":

            splitted=urllib.unquote(link).split("?")
            if len(splitted)>1:
                #assumes references id is contained in the url as parameter id=
                params=cgi.parse_qs(splitted[1])
                xref=params.get('id',None)
                return False
            else:
                #addumes link contains only the reference id
                xref=link

            id=self.getNewId()
            title=""

            if xref is None:
                #no parameter id
                return False
            manage_addBasketXRef(self,str(id),title,comment,xref)
        
        if REQUEST:
            REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER'])
        else:
            return True

def manage_addBasketForm(self):
    """form for adding a basket"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
    return pt()

def manage_addBasket(self,id,title,comment,username,publicationStatus,accessGroups=None,RESPONSE=None):
    """add a basket object"""
    #TODO:what happens in username does not exists
    #find username
    owner=username
    
    newObj=Basket(id,title,comment,owner,publicationStatus,accessGroups=None)
    
    self._setObject(id,newObj)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')
     
class BasketBasis(SimpleItem):
    """basic class for baskets"""
    
    security=ClassSecurityInfo()
    
    manage_options=SimpleItem.manage_options+(
        {'label':'manage main','action':'changeBasketBasisForm'},
        )
    
    def __init__(self,id,title,comment):
        '''
        init basket basis
        @param id: id
        @param title: title
        @param comment commentar:
        '''
        self.id=id
        self.title=title
        self.comment=comment
        
    def changeBasketBasisForm(self):
        """form for changing the basket"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketBasis.zpt')).__of__(self)
        return pt()
    
    def changeBasketBasis(self,title,comment,RESPONSE=None):
        '''
        init the basket
        @param title: title of the basket
        @param comment: description of the basket
        '''
        
        self.title=title
        self.comment=comment
        
        if RESPONSE is not None:
            RESPONSE.redirect('manage')
    
    def linkToObject(self):
        """generate url to open the resource, has to be implemented in the different objects, generic return None"""
        return None
    
    def content_html(self,type):
        """generische ausgabe des objectes als html"""
        if hasattr(self,type+"_template"):
            obj=getattr(self,type+"_template")
            return obj()
        else:
            pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','%s_template_standard.zpt'%type)).__of__(self)
            pt.content_type="text/html"
            return pt()
    
class BasketXRef(BasketBasis):
    """class for internal references based on xrefs"""
    
    security=ClassSecurityInfo()
    meta_type="BasketXRef"

    manage_options=BasketBasis.manage_options+(
        {'label':'manage xref','action':'changeBasketXRefForm'},
        )
    
    def changeBasketXRefForm(self):
        """form for changing the basket"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketXRef.zpt')).__of__(self)
        return pt()
    
    def changeBasketXRef(self,xref,RESPONSE=None):
        '''
        change the basket
        @param xref: reference
        '''
        
        self.xref=xref
        
        if RESPONSE is not None:
            RESPONSE.redirect('manage')
      
    def linkToObject(self):
        """generate url to open the resource"""
        return refBasis%self.xref
    
    def content_html(self):
        """format object as html fragment"""
        
        type=self.xref[0:3]
        return BasketBasis.content_html(self,"BasketXRef_%s"%type)
    
def manage_addBasketXRefForm(self):
    """form for adding a basket"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketXRef.zpt')).__of__(self)
    return pt()

def manage_addBasketXRef(self,id,title,comment,xref,RESPONSE=None):
    """add a basketXRef object"""
    
    
    newObj=BasketXRef(id,title,comment)
    newObj.xref=xref
    
    self._setObject(id,newObj)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')
       
class BasketInternalLink(BasketBasis):
    """class for internal referencens based on links"""
    
    security=ClassSecurityInfo()
    meta_type="BasketInternalLink"
    
    manage_options=BasketBasis.manage_options+(
        {'label':'manage internal link','action':'changeBasketInternalLinkForm'},
        )
 
    def changeBasketInternalLinkForm(self):
        """form for changing the basket"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketInternalLink.zpt')).__of__(self)
        return pt()
    
    def changeBasketInternalLink(self,link,linkText,RESPONSE=None):
        '''
        change the Internallink
        @param link: reference
        @param linkText: reference
        '''
        
        self.link=link
        self.linkText=linkText
        
        if RESPONSE is not None:
            RESPONSE.redirect('manage')
    
    def content_html(self):
        """format object as html fragment"""
        
        return BasketBasis.content_html(self,"BasketInternalLink")
    
    def linkToObject(self):
        """link to the object (internalLink)"""
        return self.link
    
def manage_addBasketInternalLinkForm(self):
    """form for adding a basket"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketInternalLink.zpt')).__of__(self)
    return pt()

def manage_addBasketInternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
    """add a basketXRef object"""
    
    
    newObj=BasketInternalLink(id,title,comment)
    newObj.link=link
    newObj.linkText=linkText
    
    self._setObject(id,newObj)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')
       
    
class BasketExternalLink(BasketBasis):
    """class for external links"""
    
    security=ClassSecurityInfo()
    meta_type="BasketExternalLink"
    
    manage_options=BasketBasis.manage_options+(
        {'label':'manage internal link','action':'changeBasketExternalLinkForm'},
        )
 
    def changeBasketExternalLinkForm(self):
        """form for changing the basket"""
        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeBasketExternalLink.zpt')).__of__(self)
        return pt()
    
    def changeBasketExternalLink(self,link,linkText,RESPONSE=None):
        '''
        change the Externallink
        @param link: reference
        @param linkText: reference
        '''
        
        self.link=link
        self.linkText=linkText
        
        if RESPONSE is not None:
            RESPONSE.redirect('manage')
    
    def content_html(self):
        """format object as html fragment"""
        
        return BasketBasis.content_html(self,"BasketExternalLink")
    
    def linkToObject(self):
        """link to the object (externalLink)"""
        return self.link

def manage_addBasketExternalLinkForm(self):
    """form for adding a basket"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketExternalLink.zpt')).__of__(self)
    return pt()

def manage_addBasketExternalLink(self,id,title,comment,link,linkText,RESPONSE=None):
    """add a basket external link object"""
    
    newObj=BasketExternalLink(id,title,comment)
    newObj.link=link
    newObj.linkText=linkText
    
    self._setObject(id,newObj)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')
       
    
class BasketText(BasketBasis):
    """class for text elements in baskets"""
    
    security=ClassSecurityInfo()
    meta_type="BasketText"

    def content_html(self):
        """format object as html fragment"""
        return "" # text has no content
        #return BasketBasis.content_html(self,"BasketText")
    
def manage_addBasketTextForm(self):
    """form for adding a basket"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasketText.zpt')).__of__(self)
    return pt()

def manage_addBasketText(self,id,title,comment,RESPONSE=None):
    """add a basketXRef object"""
    
    
    newObj=BasketText(id,title,comment)
    
    self._setObject(id,newObj)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')
       
    
    
     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>