def removeLikeFromFeeds(result): likes = utils.columnsToDict(result) removeLikeDeferreds = [] for actorId, likeUUID in likes.items(): likeUpdateVal = "L:%s:%s:%s" % (actorId, itemId, itemOwnerId) d1 = feed.deleteUserFeed(actorId, convType, likeUUID) d2 = Feed.unpush(actorId, orgId, convId, conv, likeUpdateVal) removeLikeDeferreds.extend([d1, d2]) return defer.DeferredList(removeLikeDeferreds)
def deleteItem(itemId, userId, orgId, item=None, conv=None,): if not item: item = yield db.get_slice(itemId, "items", ["meta", "tags"]) item = utils.supercolumnsToDict(item) meta = item["meta"] convId = meta.get("parent", itemId) itemUUID = meta["uuid"] itemOwnerId = meta["owner"] timestamp = str(int(time.time())) d = db.insert(itemId, "items", "deleted", "state", "meta") deferreds = [d] if not conv: conv = yield db.get_slice(convId, "items", ['meta', 'tags']) conv = utils.supercolumnsToDict(conv) plugin = plugins[conv['meta']['type']] if convId == itemId: # Delete from tagItems. for tagId in item.get("tags", {}): d = db.remove(tagId, "tagItems", itemUUID) deferreds.append(d) # Actually, delete the conversation. d1 = db.insert(itemOwnerId, 'deletedConvs', timestamp, itemId) d1.addCallback(lambda x: search.solr.delete(itemId)) d1.addCallback(lambda x: files.deleteFileInfo(userId, orgId, itemId, item)) d2 = plugin.delete(userId, convId, conv) deferreds.extend([d1, d2]) itemResponses = yield db.get_slice(convId, "itemResponses") itemResponses = utils.columnsToDict(itemResponses) items = yield db.multiget_slice(itemResponses.values(), "items", ["meta", "attachments"]) items = utils.multiSuperColumnsToDict(items) for responseId in items: deferreds.append(files.deleteFileInfo(userId, orgId, responseId, items[responseId], conv)) else: convType = conv["meta"]["type"] convOwnerId = conv["meta"]["owner"] convACL = conv["meta"]["acl"] d1 = db.insert(convId, 'deletedConvs', timestamp, itemId) d2 = db.remove(convId, 'itemResponses', itemUUID) d2.addCallback(lambda x: db.get_count(convId, "itemResponses")) d2.addCallback(lambda x: db.insert(convId, 'items', \ str(x), 'responseCount', 'meta')) d2.addCallback(lambda x: search.solr.delete(itemId)) d3 = files.deleteFileInfo(userId, orgId, itemId, item, conv) deferreds.extend([d1, d2, d3]) # Rollback changes to feeds caused by this comment d = db.get_slice(itemId, "itemLikes") def removeLikeFromFeeds(result): likes = utils.columnsToDict(result) removeLikeDeferreds = [] for actorId, likeUUID in likes.items(): likeUpdateVal = "L:%s:%s:%s" % (actorId, itemId, itemOwnerId) d1 = feed.deleteUserFeed(actorId, convType, likeUUID) d2 = Feed.unpush(actorId, orgId, convId, conv, likeUpdateVal) removeLikeDeferreds.extend([d1, d2]) return defer.DeferredList(removeLikeDeferreds) d.addCallback(removeLikeFromFeeds) deferreds.append(d) # Delete comment from comment owner's userItems d = feed.deleteUserFeed(itemOwnerId, convType, itemUUID) deferreds.append(d) # Rollback updates done to comment owner's follower's feeds. responseUpdateVal = "Q:%s:%s" if convType == "question" else "C:%s:%s" responseUpdateVal = responseUpdateVal % (itemOwnerId, itemId) d = Feed.unpush(itemOwnerId, orgId, convId, conv, responseUpdateVal) deferreds.append(d) yield defer.DeferredList(deferreds)