def untag(itemId, item, tagId, tag, myId, orgId): if "parent" in item: raise errors.InvalidRequest(_("Tags cannot be applied or removed from comments")) if tagId not in item.get("tags", {}): raise errors.InvalidRequest(_("No such tag on the item")) # No such tag on item d1 = db.remove(itemId, "items", tagId, "tags") d2 = db.remove(tagId, "tagItems", item["meta"]["uuid"]) d3 = db.get_slice(tagId, "tagFollowers") try: itemsCountCol = yield db.get(orgId, "orgTags", "itemsCount", tagId) tagItemsCount = int(itemsCountCol.column.value) - 1 if tagItemsCount % 10 == 7: tagItemsCount = yield db.get_count(tagId, "tagItems") tagItemsCount = tagItemsCount - 1 db.insert(orgId, "orgTags", "%s" % tagItemsCount, "itemsCount", tagId) except ttypes.NotFoundException: pass result = yield defer.DeferredList([d1, d2, d3]) followers = utils.columnsToDict(result[2][1]).keys() feedUpdateVal = "T:%s:%s::%s" % (myId, itemId, tagId) yield Feed.unpush(myId, orgId, itemId, item, feedUpdateVal, followers + [myId])
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 unlike(itemId, item, myId, orgId): # Make sure that I liked this item try: cols = yield db.get(itemId, "itemLikes", myId) likeTimeUUID = cols.column.value except ttypes.NotFoundException: defer.returnValue(None) convId = item["meta"].get("parent", itemId) if convId != itemId: conv = yield db.get(convId, "items", super_column="meta") conv = utils.supercolumnsToDict([conv]) else: conv = item convOwnerId = conv["meta"]["owner"] convType = conv["meta"]["type"] convACL = conv["meta"]["acl"] # 1. remove the user from likes list. yield db.remove(itemId, "itemLikes", myId) # Update the likes count likesCount = int(item["meta"].get("likesCount", "1")) if likesCount % 5 == 0: likesCount = yield db.get_count(itemId, "itemLikes") item['meta']['likesCount'] = likesCount - 1 yield db.insert(itemId, "items", str(likesCount - 1), "likesCount", "meta") responseType = 'L' # 2. Don't remove the user from followers list # (use can also become follower by responding to item, # so user can't be removed from followers list) # Ignore if i am owner of the item if myId != item["meta"]["owner"]: # 3. delete from user's feed, feedItems, feed_* likeUpdateVal = "L:%s:%s:%s" % (myId, itemId, item['meta']['owner']) yield Feed.unpush(myId, orgId, convId, conv, likeUpdateVal) # FIX: if user updates more than one item at exactly same time, # one of the updates will overwrite the other. Fix it. yield db.remove(myId, "userItems", likeTimeUUID) if convType in plugins and plugins[convType].hasIndex: yield db.remove(myId, "userItems_" + convType, likeTimeUUID) defer.returnValue(item)
def _rsvp(self, request): (appchange, script, args, myId) = yield self._getBasicArgs(request) landing = not self._ajax orgId = args['orgId'] response = utils.getRequestArg(request, 'response') deferreds = [] prevResponse = "" if not response or response not in ('yes', 'maybe', 'no'): raise errors.InvalidRequest() convId, conv = yield utils.getValidItemId(request, "id", columns=["invitees"]) if not conv: raise errors.MissingParams([_("Event ID")]) if ("type" in conv["meta"] and conv["meta"]["type"] != "event"): raise errors.InvalidRequest("Not a valid event") #Find out if already stored response is the same as this one. Saves # quite a few queries rsvp_names = ["%s:%s" %(x, myId) for x in ['yes', 'no', 'maybe']] cols = yield db.get_slice(convId, "eventResponses", names=rsvp_names) if cols: prevResponse = cols[0].column.name.split(":", 1)[0] if prevResponse == response: defer.returnValue(0) starttime = int(conv["meta"]["event_startTime"]) endtime = int(conv["meta"]["event_endTime"]) starttimeUUID = utils.uuid1(timestamp=starttime) starttimeUUID = starttimeUUID.bytes endtimeUUID = utils.uuid1(timestamp=endtime) endtimeUUID = endtimeUUID.bytes #Now insert the event in the user's agenda list if the user has # never responded to this event or the user is not in the invited list. #In the second case the agenda was already updated when creating the # event if prevResponse == "" and myId not in conv["invitees"].keys(): d1 = db.insert(myId, "userAgenda", convId, starttimeUUID) d2 = db.insert(myId, "userAgenda", convId, endtimeUUID) d3 = db.insert("%s:%s" %(myId, convId), "userAgendaMap", "", starttimeUUID) d4 = db.insert("%s:%s" %(myId, convId), "userAgendaMap", "", endtimeUUID) deferreds.extend([d1, d3, d2, d4]) #Remove any old responses to this event by this user. yield db.batch_remove({'eventResponses': [convId]}, names=rsvp_names) #Now insert the user's new response. d = db.insert(convId, "eventResponses", "", "%s:%s" %(response, myId)) deferreds.append(d) if script: #Update the inline status of the rsvp status if response == "yes": rsp = _("You are attending") elif response == "no": rsp = _("You are not attending") elif response == "maybe": rsp = _("You may attend") request.write("$('#event-rsvp-status-%s').text('%s');" %(convId, rsp)) request.write("$('#conv-%s .event-join-decline').text('%s');" %(convId, rsp)) if deferreds: res = yield defer.DeferredList(deferreds) if script: args.update({"items":{convId:conv}, "convId":convId}) entityIds = yield event.fetchData(args, convId) entities = base.EntitySet(entityIds) yield entities.fetchData() args["entities"] = entities t.renderScriptBlock(request, "event.mako", "event_meta", landing, "#item-meta", "set", **args) # Push Feed Updates responseType = "E" convMeta = conv["meta"] convType = convMeta["type"] convOwnerId = convMeta["owner"] commentSnippet = convMeta["event_title"] itemId = convId convACL = convMeta["acl"] extraEntities = [convMeta["owner"]] # Importing social.feed at the beginning of the module leads to # a cyclic dependency as feed in turn imports plugins. from social.core import Feed if response == "yes": timeUUID = uuid.uuid1().bytes # Add user to the followers list of parent item yield db.insert(convId, "items", "", myId, "followers") # Update user's feed, feedItems, feed_* userItemValue = ":".join([responseType, itemId, convId, convType, convOwnerId, commentSnippet]) yield db.insert(myId, "userItems", userItemValue, timeUUID) yield db.insert(myId, "userItems_event", userItemValue, timeUUID) # Push to feed feedItemVal = "%s:%s:%s:%s" % (responseType, myId, itemId, ','.join(extraEntities)) yield Feed.push(myId, orgId, convId, conv, timeUUID, feedItemVal) elif prevResponse != "": rsvpTimeUUID = None cols = yield db.get_slice(myId, "userItems") cols = utils.columnsToDict(cols) for k, v in cols.iteritems(): if v.startswith("E"): rsvpTimeUUID = k if rsvpTimeUUID: # Remove update if user changes RSVP to no/maybe from yes. # Do not update if user had RSVPed to this event. feedUpdateVal = "%s:%s:%s:%s" % (responseType, myId, itemId, convOwnerId) yield Feed.unpush(myId, orgId, convId, conv, feedUpdateVal) # FIX: if user updates more than one item at exactly same time, # one of the updates will overwrite the other. Fix it. yield db.remove(myId, "userItems", rsvpTimeUUID) yield db.remove(myId, "userItems_event", rsvpTimeUUID) if myId != convOwnerId and response == "yes": timeUUID = uuid.uuid1().bytes yield _notify("EA", convId, timeUUID, convType=convType, convOwnerId=convOwnerId, myId=myId, me=args["me"])
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)