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")
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
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
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
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
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
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
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
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
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
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
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
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