def test_dict_operations(self): # test dict operations and acquisition wrapping # Create a conversation. In this case we doesn't assign it to an # object, as we just want to check the Conversation object API. conversation = IConversation(self.portal.doc1) # Add a comment. Note: in real life, we always create comments via the # factory to allow different factories to be swapped in comment1 = createObject('plone.Comment') comment1.text = 'Comment text' new_id1 = conversation.addComment(comment1) comment2 = createObject('plone.Comment') comment2.text = 'Comment text' new_id2 = conversation.addComment(comment2) # check if get returns a comment object, and None if the key # can not be found self.assertTrue(IComment.providedBy(conversation.get(new_id1))) self.assertTrue(IComment.providedBy(conversation.get(new_id2))) self.assertEqual(conversation.get(123), None) # check if keys return the ids of all comments self.assertEqual(len(conversation.keys()), 2) self.assertTrue(new_id1 in conversation.keys()) self.assertTrue(new_id2 in conversation.keys()) self.assertFalse(123 in conversation.keys()) # check if items returns (key, comment object) pairs self.assertEqual(len(conversation.items()), 2) self.assertTrue((new_id1, comment1) in conversation.items()) self.assertTrue((new_id2, comment2) in conversation.items()) # check if values returns the two comment objects self.assertEqual(len(conversation.values()), 2) self.assertTrue(comment1 in conversation.values()) self.assertTrue(comment2 in conversation.values()) # check if comment ids are in iterkeys self.assertTrue(new_id1 in conversation.iterkeys()) self.assertTrue(new_id2 in conversation.iterkeys()) self.assertFalse(123 in conversation.iterkeys()) # check if comment objects are in itervalues self.assertTrue(comment1 in conversation.itervalues()) self.assertTrue(comment2 in conversation.itervalues()) # check if iteritems returns (key, comment object) pairs self.assertTrue((new_id1, comment1) in conversation.iteritems()) self.assertTrue((new_id2, comment2) in conversation.iteritems())
def test_dict_operations(self): # test dict operations and acquisition wrapping # Create a conversation. In this case we doesn't assign it to an # object, as we just want to check the Conversation object API. conversation = IConversation(self.portal.doc1) # Add a comment. Note: in real life, we always create comments via the # factory to allow different factories to be swapped in comment1 = createObject('plone.Comment') comment1.text = 'Comment text' new_id1 = conversation.addComment(comment1) comment2 = createObject('plone.Comment') comment2.text = 'Comment text' new_id2 = conversation.addComment(comment2) # check if get returns a comment object, and None if the key # can not be found self.assertTrue(IComment.providedBy(conversation.get(new_id1))) self.assertTrue(IComment.providedBy(conversation.get(new_id2))) self.assertEqual(conversation.get(123), None) # check if keys return the ids of all comments self.assertEqual(len(conversation.keys()), 2) self.assertTrue(new_id1 in conversation.keys()) self.assertTrue(new_id2 in conversation.keys()) self.assertFalse(123 in conversation.keys()) # check if items returns (key, comment object) pairs self.assertEqual(len(conversation.items()), 2) self.assertTrue((new_id1, comment1) in conversation.items()) self.assertTrue((new_id2, comment2) in conversation.items()) # check if values returns the two comment objects self.assertEqual(len(conversation.values()), 2) self.assertTrue(comment1 in conversation.values()) self.assertTrue(comment2 in conversation.values()) # check if comment ids are in iterkeys self.assertTrue(new_id1 in conversation.iterkeys()) self.assertTrue(new_id2 in conversation.iterkeys()) self.assertFalse(123 in conversation.iterkeys()) # check if comment objects are in itervalues self.assertTrue(comment1 in conversation.itervalues()) self.assertTrue(comment2 in conversation.itervalues()) # check if iteritems returns (key, comment object) pairs self.assertTrue((new_id1, comment1) in conversation.iteritems()) self.assertTrue((new_id2, comment2) in conversation.iteritems())
def reply(self): # Disable CSRF protection if 'IDisableCSRFProtection' in dir(plone.protect.interfaces): alsoProvides(self.request, plone.protect.interfaces.IDisableCSRFProtection) conversation = IConversation(self.context) if self.comment_id and self.comment_id not in conversation.keys(): self.request.response.setStatus(404) return # Fake request data body = json_body(self.request) for key, value in body.items(): self.request.form['form.widgets.' + key] = value form = CommentForm(self.context, self.request) form.update() action = form.actions['comment'] data, errors = form.extractData() if errors: raise BadRequest({'errors': [err.error for err in errors]}) form.handleComment(form=form, action=action) self.request.response.setStatus(204) fix_location_header(self.context, self.request)
def reply(self): if not self.comment_id: raise BadRequest("Comment id is a required part of the url") conversation = IConversation(self.context) if self.comment_id not in conversation.keys(): self.request.response.setStatus(404) return comment = conversation[self.comment_id] # Permission checks if not (edit_comment_allowed() and can_edit(comment)): raise Unauthorized() # Fake request data body = json_body(self.request) for key, value in body.items(): self.request.form['form.widgets.' + key] = value form = EditCommentForm(comment, self.request) form.__parent__ = form.context.__parent__.__parent__ form.update() action = form.actions['comment'] data, errors = form.extractData() if errors: raise BadRequest({'errors': [err.error for err in errors]}) comment.modification_date = datetime.utcnow() form.handleComment(form=form, action=action) self.request.response.setStatus(204) fix_location_header(self.context, self.request)
def notify_content_object_deleted(obj, event): """Remove all comments of a content object when the content object has been deleted. """ if IAnnotatable.providedBy(obj): conversation = IConversation(obj) while conversation: del conversation[conversation.keys()[0]]
def notify_content_object_deleted(obj, event): """Remove all comments of a content object when the content object has been deleted. """ if IAnnotatable.providedBy(obj): conversation = IConversation(obj) while conversation: del conversation[conversation.keys()[0]]
def clone(obj, new_dataset, reindex=True): """Create a new version of an object This is done by copy&pasting the object, then assigning, as versionId, the one from the original object. Additionally, we rename the object using a number based scheme and then clean it up to avoid various problems. """ obj_id = obj.getId() parent = utils.parent(obj) # Create copy of the object clipb = parent.manage_copyObjects(ids=[obj_id]) res = parent.manage_pasteObjects(clipb) new_id = res[0]['new_id'] new_chart = getattr(parent, new_id) # Set effective date today new_chart.setCreationDate(DateTime()) new_chart.setEffectiveDate(None) # Remove comments if hasNewDiscussion: conversation = IConversation(new_chart) while conversation.keys(): conversation.__delitem__(conversation.keys()[0]) else: if hasattr(aq_base(new_chart), 'talkback'): tb = new_chart.talkback if tb is not None: for obj in tb.objectValues(): obj.__of__(tb).unindexObject() tb._container = PersistentMapping() # Set new related DataSet new_chart.setRelatedItems([new_dataset]) if reindex: new_chart.reindexObject() return new_chart
def create_version(context, reindex=True): """ Create a new version of an object This is done by copy&pasting the object, then assigning, as versionId, the one from the original object. Additionally, we rename the object using a number based scheme and then clean it up to avoid various problems. """ logger.info("Started creating version of %s", context.absolute_url()) obj_id = context.getId() parent = utils.parent(context) # Adapt version parent (if case) if not IVersionEnhanced.providedBy(context): alsoProvides(context, IVersionEnhanced) # _ = IVersionControl(context).getVersionId() # Create version object clipb = parent.manage_copyObjects(ids=[obj_id]) res = parent.manage_pasteObjects(clipb) new_id = res[0]['new_id'] ver = getattr(parent, new_id) # Fixes the generated id: remove copy_of from ID # ZZZ: add -vX sufix to the ids vid = ver.getId() new_id = vid.replace('copy_of_', '') new_id = generateNewId(parent, new_id) parent.manage_renameObject(id=vid, new_id=new_id) ver = parent[new_id] # Set effective date today ver.setCreationDate(DateTime()) ver.setEffectiveDate(None) ver.setExpirationDate(None) mtool = getToolByName(context, 'portal_membership') auth_user = mtool.getAuthenticatedMember() auth_username = auth_user.getUserName() auth_username_list = [auth_username] current_creators = ver.Creators() auth_username_list.extend(current_creators) username_list = [] for name in auth_username_list: if name == auth_username and name in username_list: continue else: username_list.append(name) new_creators = tuple(username_list) ver.setCreators(new_creators) # Remove comments if hasNewDiscussion: conversation = IConversation(ver) while conversation.keys(): conversation.__delitem__(conversation.keys()[0]) else: if hasattr(aq_base(ver), 'talkback'): tb = ver.talkback if tb is not None: for obj in tb.objectValues(): obj.__of__(tb).unindexObject() tb._container = PersistentMapping() notify(VersionCreatedEvent(ver, context)) if reindex: ver.reindexObject() # some catalogued values of the context may depend on versions _reindex(context) logger.info("Created version at %s", ver.absolute_url()) return ver
def create_version(context, reindex=True): """ Create a new version of an object This is done by copy&pasting the object, then assigning, as versionId, the one from the original object. Additionally, we rename the object using a number based scheme and then clean it up to avoid various problems. """ logger.info("Started creating version of %s", context.absolute_url()) obj_id = context.getId() parent = utils.parent(context) # Adapt version parent (if case) if not IVersionEnhanced.providedBy(context): alsoProvides(context, IVersionEnhanced) # _ = IVersionControl(context).getVersionId() # Create version object # 1. copy object clipb = parent.manage_copyObjects(ids=[obj_id]) # 2. pregenerate new id for the copy new_id = generateNewId(parent, obj_id) # 3. alter the clipboard data and inject the desired new id clipb_decoded = _cb_decode(clipb) clipb = _cb_encode((clipb_decoded[0], clipb_decoded[1], [new_id])) # 4. call paste operation manage_pasteObjects_Version(parent, clipb) # 5. get the version object - no need for a rename anymore ver = parent[new_id] # #31440 apply related items from original object to the new version ver.setRelatedItems(context.getRelatedItems()) # Set effective date today ver.setCreationDate(DateTime()) ver.setEffectiveDate(None) ver.setExpirationDate(None) mtool = getToolByName(context, 'portal_membership') auth_user = mtool.getAuthenticatedMember() auth_username = auth_user.getUserName() auth_username_list = [auth_username] current_creators = ver.Creators() auth_username_list.extend(current_creators) username_list = [] for name in auth_username_list: if name == auth_username and name in username_list: continue else: username_list.append(name) new_creators = tuple(username_list) ver.setCreators(new_creators) # Remove comments if hasNewDiscussion: conversation = IConversation(ver) while conversation.keys(): conversation.__delitem__(conversation.keys()[0]) else: if hasattr(aq_base(ver), 'talkback'): tb = ver.talkback if tb is not None: for obj in tb.objectValues(): obj.__of__(tb).unindexObject() tb._container = PersistentMapping() notify(VersionCreatedEvent(ver, context)) if reindex: ver.reindexObject() # some catalogued values of the context may depend on versions _reindex(context) logger.info("Created version at %s", ver.absolute_url()) return ver
def create_version(context, reindex=True): """ Create a new version of an object This is done by copy&pasting the object, then assigning, as versionId, the one from the original object. Additionally, we rename the object using a number based scheme and then clean it up to avoid various problems. """ logger.info("Started creating version of %s", context.absolute_url()) obj_id = context.getId() parent = utils.parent(context) # Adapt version parent (if case) if not IVersionEnhanced.providedBy(context): alsoProvides(context, IVersionEnhanced) # _ = IVersionControl(context).getVersionId() # Create version object # 1. copy object clipb = parent.manage_copyObjects(ids=[obj_id]) # 2. pregenerate new id for the copy new_id = generateNewId(parent, obj_id) # 3. alter the clipboard data and inject the desired new id clipb_decoded = _cb_decode(clipb) clipb = _cb_encode((clipb_decoded[0], clipb_decoded[1], [new_id])) # 4. call paste operation manage_pasteObjects_Version(parent, clipb) # 5. get the version object - no need for a rename anymore ver = parent[new_id] # #31440 apply related items from original object to the new version ver.setRelatedItems(context.getRelatedItems()) # Set effective date today ver.setCreationDate(DateTime()) ver.setEffectiveDate(None) ver.setExpirationDate(None) mtool = getToolByName(context, 'portal_membership') auth_user = mtool.getAuthenticatedMember() auth_username = auth_user.getUserName() auth_username_list = [auth_username] current_creators = ver.Creators() auth_username_list.extend(current_creators) username_list = [] for name in auth_username_list: if name == auth_username and name in username_list: continue else: username_list.append(name) new_creators = tuple(username_list) ver.setCreators(new_creators) # Remove comments if hasNewDiscussion: conversation = IConversation(ver) while conversation.keys(): conversation.__delitem__(conversation.keys()[0]) else: if hasattr(aq_base(ver), 'talkback'): tb = ver.talkback if tb is not None: for obj in tb.objectValues(): obj.__of__(tb).unindexObject() tb._container = PersistentMapping() notify(VersionCreatedEvent(ver, context)) if reindex: ver.reindexObject() # some catalogued values of the context may depend on versions _reindex(context) logger.info("Created version at %s", ver.absolute_url()) return ver