def _sanitize(text, maxlen=0): unitext = text if type(text) == unicode or not text\ else text.decode('utf-8', 'replace') if maxlen and len(unitext) > maxlen: return utils.toSnippet(unitext, maxlen) else: return unitext.encode('utf-8')
def like(itemId, item, myId, orgId, me=None): try: cols = yield db.get(itemId, "itemLikes", myId) defer.returnValue(None) # Ignore the request if we already liked it. except ttypes.NotFoundException: pass if not me: me = base.Entity(myId) yield me.fetchData() itemOwnerId = item["meta"]["owner"] extraEntities = [itemOwnerId] convId = item["meta"].get("parent", itemId) if convId != itemId: #get parent's meta data conv = yield db.get(convId, "items", super_column="meta") conv = utils.supercolumnsToDict([conv]) commentText = item["meta"]["comment"] richText = item["meta"].get("richText", "False") == "True" commentSnippet = utils.toSnippet(commentText, 35, richText) else: conv = item commentSnippet = "" convOwnerId = conv["meta"]["owner"] convType = conv["meta"]["type"] convACL = conv["meta"]["acl"] # Update the likes count likesCount = int(item["meta"].get("likesCount", "0")) if likesCount % 5 == 3: likesCount = yield db.get_count(itemId, "itemLikes") item["meta"]["likesCount"] = str(likesCount + 1) yield db.insert(itemId, "items", item['meta']['likesCount'], "likesCount", "meta") timeUUID = uuid.uuid1().bytes # 1. add user to Likes list yield db.insert(itemId, "itemLikes", timeUUID, me.id) # Ignore adding to other's feeds if I am owner of the item if me.id != item["meta"]["owner"]: responseType = "L" # 2. add user to the followers list of parent item yield db.insert(convId, "items", "", me.id, "followers") # 3. update user's feed, feedItems, feed_* userItemValue = ":".join([responseType, itemId, convId, convType, convOwnerId, commentSnippet]) yield db.insert(me.id, "userItems", userItemValue, timeUUID) if convType in plugins and plugins[convType].hasIndex: yield db.insert(me.id, "userItems_" + convType, userItemValue, timeUUID) # 4. update feeds feedItemVal = "%s:%s:%s:%s" % (responseType, myId, itemId, ','.join(extraEntities)) yield Feed.push(myId, orgId, convId, conv, timeUUID, feedItemVal) if itemId != convId: if me.id != itemOwnerId: yield _notify("LC", convId, timeUUID, convType=convType, convOwnerId=convOwnerId, myId=me.id, itemOwnerId=itemOwnerId, me=me) else: if me.id != convOwnerId: yield _notify("L", convId, timeUUID, convType=convType, convOwnerId=convOwnerId, myId=me.id, me=me) defer.returnValue(item)
def _comment(convId, conv, comment, snippet, myId, orgId, richText, reviewed, fids=None): convType = conv["meta"].get("type", "status") # 1. Create the new item timeUUID = uuid.uuid1().bytes meta = {"owner": myId, "parent": convId, "comment": comment, "timestamp": str(int(time.time())), "org": orgId, "uuid": timeUUID, "richText": str(richText)} item = {'meta':meta} followers = {myId: ''} itemId = utils.getUniqueKey() if snippet: meta['snippet'] = snippet # 1.5. Check if the comment matches any of the keywords entities = base.EntitySet([myId, orgId]) yield entities.fetchData(['basic', 'admins']) orgAdmins = entities[orgId].admins.keys() if orgAdmins: matchedKeywords = yield utils.watchForKeywords(orgId, comment) if matchedKeywords: if reviewed: # Add item to list of items that matched this keyword # and notify the administrators about it. for keyword in matchedKeywords: yield db.insert(orgId + ":" + keyword, "keywordItems", itemId + ":" + convId, timeUUID) yield notifications.notify(orgAdmins, ':KW:' + keyword, myId, entities=entities) else: # This item contains a few keywords that are being monitored # by the admin and cannot be posted unless reviewOK is set. defer.returnValue((None, convId, {convId: conv}, matchedKeywords)) # 1.9. Actually store the item if fids: attachments = yield utils._upload_files(myId, fids) if attachments: item['attachments'] = {} for attachmentId in attachments: fileId, name, size, ftype = attachments[attachmentId] item["attachments"][attachmentId] = "%s:%s:%s" % (name, size, ftype) yield db.batch_insert(itemId, "items", item) yield files.pushfileinfo(myId, orgId, itemId, item, conv) # 2. Update response count and add myself to the followers of conv convOwnerId = conv["meta"]["owner"] convType = conv["meta"]["type"] responseCount = int(conv["meta"].get("responseCount", "0")) if responseCount % 5 == 3: responseCount = yield db.get_count(convId, "itemResponses") responseCount += 1 conv['meta']['responseCount'] = responseCount convUpdates = {"responseCount": str(responseCount)} yield db.batch_insert(convId, "items", {"meta": convUpdates, "followers": followers}) # 3. Add item as response to parent yield db.insert(convId, "itemResponses", "%s:%s" % (myId, itemId), timeUUID) # 4. Update userItems and userItems_* responseType = "Q" if convType == "question" else 'C' commentSnippet = utils.toSnippet(comment, 35, richText) userItemValue = ":".join([responseType, itemId, convId, convType, convOwnerId, commentSnippet]) yield db.insert(myId, "userItems", userItemValue, timeUUID) if convType in plugins and plugins[convType].hasIndex: yield db.insert(myId, "userItems_" + convType, userItemValue, timeUUID) # 5. Update my feed. feedItemVal = "%s:%s:%s" % (responseType, myId, itemId) yield Feed.push(myId, orgId, convId, conv, timeUUID, feedItemVal) yield _notify("C", convId, timeUUID, convType=convType, convOwnerId=convOwnerId, myId=myId, me=entities[myId], comment=comment, richText=richText) search.solr.updateItemIndex(itemId, {'meta': meta}, orgId, conv=conv) items = {itemId: item, convId: conv} defer.returnValue((itemId, convId, items, None))