Beispiel #1
0
 def UpdateSort(self, objs, user):
     """    update pool_sort values according to list """
     if not objs:
         return False, _(u"List is empty")
     if isinstance(objs, basestring):
         objs = ConvertToNumberList(objs)
     ids = []
     for oi in objs:
         # check if listed objects are objects or ids
         if not IObject.providedBy(oi):
             ids.append(int(oi))
     objs2 = []
     if ids:
         # load remaining objects by id
         objs2 = self.GetObjsBatch(ids)
     pos = 10
     processed = []
     for obj in objs:
         if not IObject.providedBy(obj):
             for o in objs2:
                 if o.id == int(obj):
                     obj = o
                     break
         if not IObject.providedBy(obj):
             continue
         if obj.id in processed:
             continue
         processed.append(obj.id)
         obj.meta.set("pool_sort", pos)
         obj.CommitInternal(user)
         pos += 10
     return True, _(u"OK")
Beispiel #2
0
 def UpdateSort(self, objs, user):
     """    update pool_sort values according to list """
     if not objs:
         return False, _(u"List is empty")
     if isinstance(objs, basestring):
         objs = ConvertToNumberList(objs)
     ids = []
     for oi in objs:
         # check if listed objects are objects or ids
         if not IObject.providedBy(oi):
             ids.append(int(oi))
     objs2 = []
     if ids:
         # load remaining objects by id
         objs2 = self.GetObjsBatch(ids)
     pos = 10
     processed = []
     for obj in objs:
         if not IObject.providedBy(obj):
             for o in objs2:
                 if o.id == int(obj):
                     obj = o
                     break
         if not IObject.providedBy(obj):
             continue
         if obj.id in processed:
             continue
         processed.append(obj.id)
         obj.meta.set("pool_sort", pos)
         obj.CommitInternal(user)
         pos += 10
     return True, _(u"OK")
Beispiel #3
0
    def IsTypeAllowed(self, type, user=None):
        """
        Check if *type* is allowed to be created in this container based on
        configuration.subtypes.::
        
            type = the type to be checked
            user = the currently active user
            returns True/False
        
        *type* can be passed as
        
        - type id string
        - configuration object
        - type object instance
        """
        if type is None:
            return False
        subtypes = self.configuration.subtypes
        if subtypes == AllTypesAllowed:
            return True
        if not subtypes:
            return False

        if isinstance(type, basestring):
            if type in subtypes:
                return True
            # dotted python to obj configuration
            type = self.app.GetObjectConf(type)
            if type is None:
                return False
            # create type from configuration
            type = self._GetVirtualObj(type)
            if type is None:
                return False

        if isinstance(type, baseConf):
            if type.id in subtypes:
                return True
            # create type from configuration
            type = self._GetVirtualObj(type)
            if type is None:
                return False

        if not IObject.providedBy(type) and not IConf.providedBy(type):
            return False
        # loop subtypes
        for iface in subtypes:
            if isinstance(iface, basestring):
                iface = ResolveName(iface, raiseExcp=False)
                if not iface:
                    continue
            try:
                # may not be interface class
                if iface.providedBy(type):
                    return True
            except:
                pass
        return False
Beispiel #4
0
    def IsTypeAllowed(self, type, user=None):
        """
        Check if *type* is allowed to be created in this container based on
        configuration.subtypes.::
        
            type = the type to be checked
            user = the currently active user
            returns True/False
        
        *type* can be passed as
        
        - type id string
        - configuration object
        - type object instance
        """
        if type is None:
            return False
        subtypes = self.configuration.subtypes
        if subtypes == AllTypesAllowed:
            return True
        if not subtypes:
            return False

        if isinstance(type, basestring):
            if type in subtypes:
                return True
            # dotted python to obj configuration
            type = self.app.GetObjectConf(type)
            if type is None:
                return False
            # create type from configuration
            type = self._GetVirtualObj(type)
            if type is None:
                return False

        if isinstance(type, baseConf):
            if type.id in subtypes:
                return True
            # create type from configuration
            type = self._GetVirtualObj(type)
            if type is None:
                return False

        if not IObject.providedBy(type) and not IConf.providedBy(type):
            return False
        # loop subtypes
        for iface in subtypes:
            if isinstance(iface, basestring):
                iface = ResolveName(iface, raiseExcp=False)
                if not iface:
                    continue
            try:
                # may not be interface class
                if iface.providedBy(type):
                    return True
            except:
                pass
        return False
Beispiel #5
0
 def MoveStart(self, id, user, selection=None):
     """ move to top in container """
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id 
     order = [id]
     for obj in objs:
         if oid == obj.id:
             order[1:].insert(0, obj)
         else:
             order.append(obj)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #6
0
 def MoveStart(self, id, user, selection=None):
     """ move to top in container """
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id
     order = [id]
     for obj in objs:
         if oid == obj.id:
             order[1:].insert(0, obj)
         else:
             order.append(obj)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #7
0
    def Delete(self, id, user, obj=None, **kw):
        """
        Delete the subobject referenced by id. ::
        
            id = id of object to be deleted
            user = the currently active user
            obj = the object to be deleted. Will be loaded automatically if None
            **kw = version information
            returns True or False
        
        Events
        
        - delete(user=user) called on object to be deleted
        - afterDelete(id=id, user=user) called on container after object has been deleted

        Workflow action

        - remove (called in context of the container)
        - delete (called in context of the new object)
        """
        app = self.app
        # check if id is object
        if IObject.providedBy(id):
            obj = id
        if not obj:
            obj = self.GetObj(id, queryRestraints=False, **kw)
            if not obj:
                return False
        if obj.parent.id != self.id:
            raise ContainmentError, "Object is not a child (%s)" % (str(id))

        # call workflow
        if not self.WfAllow("remove", user=user):
            raise WorkflowNotAllowed, "Workflow: Not allowed (remove)"
        if not obj.WfAllow("delete", user=user):
            raise WorkflowNotAllowed, "Workflow: Not allowed (delete)"
        obj.Signal("delete", user=user)
        if hasattr(obj, "_RecursiveDelete"):
            obj._RecursiveDelete(user)

        # call workflow
        obj.WfAction("delete", user=user)
        self._DeleteObj(obj)
        if app.configuration.autocommit:
            self.db.Commit()
        self.WfAction("remove", user=user)
        self.Signal("afterDelete", id=id, user=user)

        return True
Beispiel #8
0
    def Delete(self, id, user, obj=None, **kw):
        """
        Delete the subobject referenced by id. ::
        
            id = id of object to be deleted
            user = the currently active user
            obj = the object to be deleted. Will be loaded automatically if None
            **kw = version information
            returns True or False
        
        Events
        
        - delete(user=user) called on object to be deleted
        - afterDelete(id=id, user=user) called on container after object has been deleted

        Workflow action

        - remove (called in context of the container)
        - delete (called in context of the new object)
        """
        app = self.app
        # check if id is object
        if IObject.providedBy(id):
            obj = id
        if not obj:
            obj = self.GetObj(id, queryRestraints=False, **kw)
            if not obj:
                return False
        if obj.parent.id!=self.id:
            raise ContainmentError, "Object is not a child (%s)" % (str(id))

        # call workflow
        if not self.WfAllow("remove", user=user):
            raise WorkflowNotAllowed, "Workflow: Not allowed (remove)"
        if not obj.WfAllow("delete", user=user):
            raise WorkflowNotAllowed, "Workflow: Not allowed (delete)"
        obj.Signal("delete", user=user)
        if hasattr(obj, "_RecursiveDelete"):
            obj._RecursiveDelete(user)

        # call workflow
        obj.WfAction("delete", user=user)
        self._DeleteObj(obj)
        if app.configuration.autocommit:
            self.db.Commit()
        self.WfAction("remove", user=user)
        self.Signal("afterDelete", id=id, user=user)

        return True
Beispiel #9
0
 def MoveUp(self, id, user, selection=None):
     """ move one position up in container """
     objs = self.GetSortElements(selection)
     order = []
     oid = id if not IObject.providedBy(id) else id.id 
     pos = 0
     for obj in objs:
         if obj.id == oid:
             if len(order)==0:
                 return True, []
             order.insert(len(order)-1, obj)
         else:
             order.append(obj)
         
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #10
0
    def MoveUp(self, id, user, selection=None):
        """ move one position up in container """
        objs = self.GetSortElements(selection)
        order = []
        oid = id if not IObject.providedBy(id) else id.id
        pos = 0
        for obj in objs:
            if obj.id == oid:
                if len(order) == 0:
                    return True, []
                order.insert(len(order) - 1, obj)
            else:
                order.append(obj)

        ok, msgs = self.UpdateSort(order, user=user)
        return ok, msgs
Beispiel #11
0
 def MoveEnd(self, id, user, selection=None):
     """ move to bottom in container """
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id
     lastObj = None
     order = []
     for obj in objs:
         if oid == obj.id:
             lastObj = obj
         else:
             order.append(obj)
     if lastObj:
         order.append(lastObj)
     else:
         order.append(id)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #12
0
 def MoveEnd(self, id, user, selection=None):
     """ move to bottom in container """
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id 
     lastObj = None
     order = []
     for obj in objs:
         if oid == obj.id:
             lastObj = obj
         else:
             order.append(obj)
     if lastObj:
         order.append(lastObj)
     else:
         order.append(id)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #13
0
 def MoveDown(self, id, user, selection=None):
     """ move one position down in container """
     objs = self.GetSortElements(selection)
     order = []
     oid = id if not IObject.providedBy(id) else id.id 
     insertID = None
     for obj in objs:
         if obj.id == oid:
             insertID = obj
         else:
             order.append(obj)
             if insertID:
                 order.append(insertID)
                 insertID = None
     if insertID:
         order.append(insertID)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #14
0
 def MoveDown(self, id, user, selection=None):
     """ move one position down in container """
     objs = self.GetSortElements(selection)
     order = []
     oid = id if not IObject.providedBy(id) else id.id
     insertID = None
     for obj in objs:
         if obj.id == oid:
             insertID = obj
         else:
             order.append(obj)
             if insertID:
                 order.append(insertID)
                 insertID = None
     if insertID:
         order.append(insertID)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #15
0
 def InsertBefore(self, id, position, user, selection=None):
     """ insert id before position element id """
     position = int(position)
     order = []
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id
     # if id already included in container, remove it
     delpos = -1
     # make sure id is added even if position does not exist
     added = False
     for current in objs:
         if position == current.id:
             order.append(id)
         order.append(current)
         if current.id == oid:
             delpos = len(order) - 1
     if delpos > -1:
         del order[delpos]
     if not added:
         order.insert(0, id)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #16
0
 def InsertBefore(self, id, position, user, selection=None):
     """ insert id before position element id """
     position=int(position)
     order = []
     objs = self.GetSortElements(selection)
     oid = id if not IObject.providedBy(id) else id.id 
     # if id already included in container, remove it
     delpos = -1
     # make sure id is added even if position does not exist
     added = False
     for current in objs:
         if position == current.id:
             order.append(id)
         order.append(current)
         if current.id == oid:
             delpos = len(order)-1
     if delpos > -1:
         del order[delpos]
     if not added:
         order.insert(0, id)
     ok, msgs = self.UpdateSort(order, user=user)
     return ok, msgs
Beispiel #17
0
    def ResolveUrl(self, url, object=None):
        """
        Resolve a string to url for object or the current context.

        Possible values:
        
        - page_url
        - obj_url
        - obj_folder_url
        - parent_url
        """
        if url == None:
            return u""
        if not object or not IObject.providedBy(object):
            object = self.context
        if url == "page_url":
            url = self.PageUrl(object)
        elif url == "obj_url":
            url = self.Url(object)
        elif url.find("obj_folder_url") != -1:
            url = url.replace("obj_folder_url", self.FolderUrl(object))
        elif url == "parent_url":
            url = self.Url(object.parent)
        return url
Beispiel #18
0
    def ResolveUrl(self, url, object=None):
        """
        Resolve a string to url for object or the current context.

        Possible values:
        
        - page_url
        - obj_url
        - obj_folder_url
        - parent_url
        """
        if url==None:
            return u""
        if not object or not IObject.providedBy(object):
            object = self.context
        if url == "page_url":
            url = self.PageUrl(object)
        elif url == "obj_url":
            url = self.Url(object)
        elif url.find("obj_folder_url")!=-1:
            url = url.replace("obj_folder_url", self.FolderUrl(object))
        elif url == "parent_url":
            url = self.Url(object.parent)
        return url