def getUser(self, userId, isUser=-1): if isUser == 1: userHelper = ClassHelper("UserInfo") obj = userHelper.find_one({'user': userId}) or {} else: obj = ClassHelper("BackupUser").get(userId) or {} if not obj: userHelper = ClassHelper("UserInfo") obj = userHelper.find_one({'user': userId}) or {} return self.filter_field(obj)
def getId(self, className, query): classHelper = ClassHelper(className) result = classHelper.find_one(query,keys={"_id":1,"acl":1}) acl = MeACL(result['acl']) if not acl.readAccess(self.user): return None return result['_id']
def follow(user, followee, is_user=True): if not user or not followee: log.err( "FollowHelper-->follow userId:%s, followeeId %s", user, followee) return if is_user: fieldname = "followee" else: fieldname = "backupFollowee" # 查找followee是否关注user, 如果关注则需要添加双向关注关系 followHelper = ClassHelper(FollowHelper.classame) effect=1 if is_user: result = followHelper.find_one({'user': followee, fieldname: user, 'effect': {'$gte': 1}}) if not result: effect = 1 else: effect = 2 # 添加feed记录,第一次关注才添加 # followRecord = followHelper.find_one({'user': user, fieldname: followee, 'effect': {'$ne': 0}}) # if not followRecord: # addFeedRecord(user, 'follow', followRecord['_id']) #TODO: 这里事务的管理不太严格,应该关注和粉丝统一起来 # 添加我的关注 followee_action = {'destClass':'StatCount', 'query': {'name': 'followees_'+user}, 'action':{'@inc':{'count':1}}} follower_action = {'destClass':'StatCount', 'query': {'name': 'followers_'+followee}, 'action':{'@inc':{'count': 1}} } actions = [follower_action, followee_action] followHelper.updateOne({'user': user, fieldname: followee}, {'$set': {'effect': effect}}, transactions=actions, upsert=True) # 添加followee也是user的粉丝,则需要处理followee的双向关注,否则只添加粉丝数量 if effect==2: followHelper.updateOne({'user': followee, fieldname: user}, {"$set": {'effect': effect,'updateAt':result['updateAt']}})
def delete(self, className, objectId): if not objectId: self.write(ERR_PARA.message) return if BaseConfig.deleteClass.count(className) <= 0: self.write(ERR_USER_PERMISSION.message) return try: ObjectId(objectId) except Exception: self.write(ERR_OBJECTID_MIS.message) return classHelper = ClassHelper(className) obj = classHelper.find_one({"_id": objectId}) if not obj: self.write(ERR_OBJECTID_MIS.message) return mo = MeObject(className, obj, False) mo.overLoadGet = False acl = MeACL(mo['acl']) if not acl.deleteAccess(self.user): self.write(ERR_USER_PERMISSION.message) return else: classHelper.delete(objectId) self.write(ERR_SUCCESS.message)
def deleteMediaFace(self, mediaId): mediaHelper = ClassHelper("Media") media = mediaHelper.find_one(query={"_id": mediaId}, keys={"faces": 1}) tran = [] if media: for face in media['faces']: tran.append({ 'destClass': 'Face', 'query': { '_id': face }, 'action': { '@set': { 'status': 0 } } }) result = mediaHelper.update(mediaId, {"$set": { 'status': 0 }}, transaction=tran) if result: self.write(ERR_SUCCESS.message) else: self.write(ERR_INVALID.message) else: self.write(ERR_PATH_PERMISSION.message)
def getJson(self, className, query): classHelper = ClassHelper(className) result = classHelper.find_one(query) mo = MeObject(className, result, False) mo.overLoadGet = False acl = MeACL(mo['acl']) if not acl.readAccess(self.user): return None return mo
def filterAuTH(self, userId, obj): for auth in self.blacklistAuth: if self.classname == auth['classname']: classHelper = ClassHelper("Blacklist") item = classHelper.find_one({ 'user': obj[auth['foreign']], "blacker": userId }) if item: log.warn("user %s black blacker %s", obj[auth['foreign']], userId) return None return obj
def orderCallback(oId, userId, status, order): ''' 根据支付结果更新订单的状态 :param oId:RechargeFlow Id :param userId:用户Id :param status: 支付是否成功,1为成功,3为等待验证 :param order:第三方平台返回订单信息,包括错误码 :return: ''' log.debug('oId:%s, userId:%s, status:%d, order:%s', oId, userId, status, order) ###更新充值流水记录 orderHelper = ClassHelper("RechargeFlow") rechargeFlow = orderHelper.get(oId) walletHelper = ClassHelper("Wallet") walletInfo = walletHelper.find_one({"user": userId}) if status == 1: # 充值成功,更新钱包 rechargeFlow_action = { 'destClass': 'RechargeFlow', 'query': { "_id": oId }, 'action': { "@set": { "status": status, "order": order } } } if not walletInfo: # 未找到钱包直接创建 wallet = {"user": userId, 'balance': rechargeFlow['amount']} walletInfo = walletHelper.create(wallet, transaction=[rechargeFlow_action]) else: wallet = {"$inc": {'balance': rechargeFlow['amount']}} walletInfo = walletHelper.update(walletInfo['_id'], wallet, transaction=[rechargeFlow_action]) return walletInfo else: rechargeFlow = orderHelper.update( oId, {"$set": { "status": status, "order": order }}) return rechargeFlow
def sentMessage(self, obj): item = self.autoMessage.get((self.className, self.method), None) if not item: return userClassHelper = ClassHelper("UserInfo") userInfo = userClassHelper.find_one({"user": self.userId}, {'nickName': 1}) if not userInfo: return obj.update(userInfo) title = item['title'].format(**obj) template = item['template'].format(**obj) # TODO pushData = {"userid": obj['to'], "title": title, "text": template} log.info("Push Data:%s", json.dumps(pushData)) try: res = requests.post(self.pushUrl, data=json.dumps(pushData), headers={'X-MeCloud-Debug': '1'}) print res.text except Exception, ex: log.err("Push Err:%s", ex)
def unfollow(user, followee, is_user=True): if not user or not followee: log.err( "FollowHelper-->unfollow userId:%s, followeeId %s", user, followee) return; if is_user: fieldname = "followee" else: fieldname = "backupFollowee" followHelper = ClassHelper(FollowHelper.classame) result = followHelper.find_one({'user': followee, 'followee': user, 'effect': {'$gte': 2}}) if result: #双向关注,需要处理followee的双向关注effect和粉丝数量 followHelper.updateOne( {'user': followee, fieldname: user}, {"$set": {'effect': 1,'updateAt':result['updateAt']}} ) # 取消我的关注 followee_action = {'destClass': 'StatCount', 'query': {'name': 'followees_' + user}, 'action': {'@inc': {'count': -1}}} follower_action = {'destClass': 'StatCount', 'query': {'name': 'followers_' + followee}, 'action': {'@inc': {'count': -1}}} actions = [follower_action, followee_action] followHelper.updateOne( {'user': user, fieldname: followee}, {"$set": {'effect': 0}}, transactions=actions, upsert=True )
def getFace(self, faceId): faceHelper = ClassHelper("Face") obj = faceHelper.find_one(query={"_id": faceId}, keys={ "rect": 1, "possible.score": 1, "file": 1 }) or {} item = {} item['faceId'] = faceId item['rect'] = obj['rect'] item['file'] = obj['file'] item['score'] = obj['possible'][0]['score'] # user = {} # if obj: # if "uploader" in obj: # user = self.getUser(obj['uploader'],1) # elif "backupUser" in obj: # user = self.getUser(obj['backupUser'], 0) # else: # pass # user = self.filter_field(user) # obj = self.filter_field(obj) return item
def profile(userId, isUser=1): # isUser:1真实用户,0backupUser obj = { 'followees': 0, 'relationStatus': 0, 'blackStatus': 0, 'isUser': isUser # 1为user,0为backupUser } try: followeeHelper = ClassHelper('Followee') faceHelper = ClassHelper('Face') if isUser: userInfoHelper = ClassHelper('UserInfo') item = userInfoHelper.find_one({"user": userId}) obj['user'] = item['user'] # 关注数 followeesCount = followeeHelper.query_count({ 'user': userId, "effect": { "$gt": 0 } }) or 0 obj['followees'] = followeesCount # 照片数 mediasCount = faceHelper.query_count({ 'assign.user': userId, 'assign.status': 1 }) or 0 obj['medias'] = mediasCount # 粉丝数 followersCount = followeeHelper.query_count({ 'followee': userId, "effect": { "$gt": 0 } }) or 0 obj['followers'] = followersCount else: backupUserHelper = ClassHelper('BackupUser') item = backupUserHelper.find_one({"_id": userId}) # 照片数 mediaHelper = ClassHelper('Media') mediasCount = mediaHelper.query_count({'backupUser': userId}) # 粉丝数 followersCount = followeeHelper.query_count({ 'backupFollowee': userId, "effect": { "$gt": 0 } }) or 0 obj['followers'] = followersCount obj['medias'] = mediasCount obj['user'] = item['_id'] if item: obj["nickname"] = item.get("nickName", None) obj["avatar"] = item.get("editAvatar", None) or item.get( "avatar", None) obj["age"] = item.get("age", 0) obj["address"] = item.get("address", None) obj["gender"] = item.get("gender", None) rect = item.get("editRect", None) or item.get("rect", None) if rect: rect = [int(i) for i in rect] obj['rect'] = rect obj["_id"] = item['_id'] # 贡献者数 assignersCount = faceHelper.distinct( { 'assign.user': userId, 'assign.status': 1 }, "assign.assigner") or [] obj['assigners'] = len(assignersCount.cursor) except Exception, ex: log.err(ex.message) return ERR_INVALID.message
def get(self, action=None): ''' # where 条件格式:[{ "condition": { "user": "******" }, "key": "xxx", "method": "count/id/list/jsonObject", "classname": "xxx" }, { "condition": { "user": "******" }, "key": "xxx", "method": "count/id/list/jsonObject", "classname": "xxx", "distinct":"" }] #返回数据格式:{"a":11,"b":10} ''' # if action == "albumConfig": # if self.request.arguments.has_key('where'): # query = eval(self.get_argument('where')) # query['settingId'] = 7 # classHelper = ClassHelper("VersionControl") # objs = classHelper.find_one(query,keys={'albumConfig':1}) # albumConfig = objs.get('albumConfig',None) # if albumConfig: # albumConfig.sort(key=lambda k: (k['weight']), reverse=False) # items = [] # classHelper = ClassHelper("StatCount") # for i,cfig in enumerate(albumConfig): # count = classHelper.find_one({'name':cfig['type']+ "_" +self.user['_id']}) or {} # count = count.get('count',0) # item = { # 'title':cfig['title'], # 'authorize':cfig['authorize'], # 'type':cfig['type'], # 'count':count # } # items.append(item) # if i >= 5: # break # data = copy.deepcopy(ERR_SUCCESS) # data.message['data'] = items # self.write(json.dumps(data.message,cls=MeEncoder)) # else: # self.write(ERR_PATH_PERMISSION.message) # # else: # self.write(ERR_PATH_PERMISSION.message) if action == "albumConfig": if self.request.arguments.has_key('where'): query = eval(self.get_argument('where')) query['settingId'] = 7 classHelper = ClassHelper("VersionControl") objs = classHelper.find_one(query, keys={'albumConfig': 1}) albumConfig = objs.get('albumConfig', None) if albumConfig: albumConfig.sort(key=lambda k: (k['weight']), reverse=False) items = [] classHelper = ClassHelper("StatCount") for i, cfig in enumerate(albumConfig): count = classHelper.find_one({'name': cfig['type'] + "_" + self.user['_id']}) or {} count = count.get('count', 0) item = { 'title': cfig['title'], 'authorize': cfig['authorize'], 'type': cfig['type'], 'count': count } items.append(item) if i >= 5: break data = copy.deepcopy(ERR_SUCCESS) data.message['data'] = items self.write(json.dumps(data.message, cls=MeEncoder)) else: self.write(ERR_PATH_PERMISSION.message) else: self.write(ERR_PATH_PERMISSION.message) elif self.request.arguments.has_key('where'): where = eval(self.get_argument('where')) result = {} for item in where: className = item['classname'] if className == 'User': continue query = item["condition"] try: if query.has_key('_id'): ObjectId(query['_id']) # if query.has_key('$or'): # for item in query['$or']: # if "_id" in item: # item["_id"] = ObjectId(item["_id"]) except Exception: self.write(ERR_OBJECTID_MIS.message) return try: if item['method'] == 1: result[item['key']] = self.getCount(className, query) elif item['method'] == 2: result[item['key']] = self.getId(className, query) elif item['method'] == 3: result[item['key']] = self.getList(className, query) elif item['method'] == 4: result[item['key']] = self.getJson(className, query) elif item['method'] == 5: result[item['key']] = self.getDistinct(className, query, item['distinct']) except Exception,e: log.err("%s param error", item['key']) self.write(json.dumps(result,cls=MeEncoder))
def userCountTwo(self, userId, isUser=1): #isUser:1真实用户,0backupUser obj = { 'followeesCount': 0, 'followeeStatus': 0, 'blackStatus': 0, 'isUser': isUser #1为user,0为backupUser } try: followeeHelper = ClassHelper('Followee') faceHelper = ClassHelper('Face') if isUser: userInfoHelper = ClassHelper('UserInfo') item = userInfoHelper.find_one({"user": userId}) obj['user'] = item['user'] # obj["nickName"] = item.get("nickName",None) # obj["avatar"] = item.get("avatar", None) # 关注数 followeesCount = followeeHelper.query_count({ 'user': userId, "effect": { "$gt": 0 } }) or 0 obj['followeesCount'] = followeesCount else: backupUserHelper = ClassHelper('BackupUser') item = backupUserHelper.find_one({"_id": userId}) obj['user'] = item['_id'] if item: obj["nickName"] = item.get("nickName", None) obj["avatar"] = item.get("avatar", None) obj["age"] = item.get("age", 0) obj["address"] = item.get("address", None) obj['rect'] = item.get("rect", None) obj["_id"] = item['_id'] #粉丝数 followersCount = followeeHelper.query_count({ 'followee': userId, "effect": { "$gt": 0 } }) or 0 obj['followersCount'] = followersCount #贡献者数 assignersCount = faceHelper.distinct({'assign.user': userId}, "assign.assigner") or [] obj['assignersCount'] = len(assignersCount.cursor) #照片数 mediasCount = faceHelper.query_count({'assign.user': userId}) or 0 obj['mediasCount'] = mediasCount if self.user["_id"] != userId: #关注状态 item = followeeHelper.find_one({ "user": self.user['_id'], "followee": userId, "effect": { "$gt": 0 } }) if item: #0 没有关系 1 关注 2 相互关注 3 粉丝关系 obj['followeeStatus'] = item['effect'] else: item = followeeHelper.find_one({ "followee": self.user['_id'], "user": userId }) if item: obj['followeeStatus'] = 3 #拉黑状态 blackHelper = ClassHelper('Blacklist') item = blackHelper.find_one({ "user": self.user['_id'], "blacker": userId, "effect": { "$gt": 0 } }) if item: obj['blackStatus'] = 1 except Exception, ex: log.err(ex.message) return ERR_INVALID.message
def userCount(self, userId, isUser=1): #isUser:1真实用户,0backupUser obj = { 'followeesCount': 0, 'followeeStatus': 0, 'blackStatus': 0, 'isUser': isUser #1为user,0为backupUser } try: classHelper = ClassHelper('StatCount') if isUser: userInfoHelper = ClassHelper('UserInfo') item = userInfoHelper.find_one({"user": userId}) obj['user'] = item['user'] # obj["nickName"] = item.get("nickName",None) # obj["avatar"] = item.get("avatar", None) # 关注数 followeesCount = classHelper.find_one( {'name': "followees_" + userId}) or {} obj['followeesCount'] = followeesCount.get('count', 0) else: backupUserHelper = ClassHelper('BackupUser') item = backupUserHelper.find_one({"_id": userId}) obj['user'] = item['_id'] if item: obj["nickName"] = item.get("nickName", None) obj["avatar"] = item.get("avatar", None) obj["age"] = item.get("age", 0) obj["address"] = item.get("address", None) obj['rect'] = item.get("rect", None) obj["_id"] = item['_id'] #粉丝数 followersCount = classHelper.find_one( {'name': "followers_" + userId}) or {} obj['followersCount'] = followersCount.get('count', 0) #贡献者数 assignersCount = classHelper.find_one( {'name': "assigners_" + userId}) or {} obj['assignersCount'] = assignersCount.get('count', 0) #照片数 mediasCount = classHelper.find_one({'name': "medias_" + userId }) or {} obj['mediasCount'] = mediasCount.get('count', 0) if self.user["_id"] != userId: #关注状态 followHelper = ClassHelper('Followee') item = followHelper.find_one({ "user": self.user['_id'], "followee": userId, "effect": { "$gt": 0 } }) if item: #0 没有关系 1 关注 2 相互关注 3 粉丝关系 obj['followeeStatus'] = item['effect'] else: item = followHelper.find_one({ "followee": self.user['_id'], "user": userId }) if item: obj['followeeStatus'] = 3 #拉黑状态 blackHelper = ClassHelper('Blacklist') item = blackHelper.find_one({ "user": self.user['_id'], "blacker": userId, "effect": { "$gt": 0 } }) if item: obj['blackStatus'] = 1 except Exception, ex: log.err(ex.message) return ERR_INVALID.message
def post(self, action=None, followee=None, isuser=1): userId = self.get_current_user() if not userId: log.err("follow error,user not exist!") self.write(ERR_USER_NOTFOUND.message) return if not followee: log.err("request param error") self.write(ERR_NOPARA.message) return is_user = True if int(isuser) == 0: is_user = False # 查找用户是否存在 if is_user == True: userHelper = ClassHelper( "User" ) else: userHelper = ClassHelper( "BackupUser" ) findUser = userHelper.find_one( {'_sid': followee} ) if not findUser: log.err( "%s error,followee not exist!",action) self.write( ERR_USER_NOTFOUND.message ) return blackHelper = ClassHelper( "Blacklist" ) if action == 'follow': blacked = blackHelper.find_one( {'user': userId, 'blacker': followee} ) isblacked = blackHelper.find_one( {'user': followee, 'blacker': userId} ) if blacked: self.write( ERR_BLACKED_PERMISSION.message ) return if isblacked: self.write( ERR_BEBLACKED_PERMISSION.message ) return if is_user: fieldname = "followee" else: fieldname = "backupFollowee" followHelper = ClassHelper("Followee") try: if action == 'follow': # 关注 # 判断是否已经关注过 followed = followHelper.find_one( {'user': userId, fieldname: followee, 'effect': {'$gte': 0}} ) if followed and followed['effect']>=1: self.write( ERR_SUCCESS.message ) return FollowHelper.follow(userId, followee, is_user) fr = followHelper.find_one( {'user': userId, fieldname: followee, 'effect': {'$gte': 1}}, {'acl': 0, 'createAt': 0, '_sid': 0} ) fr['relationStatus']=fr['effect'] del fr['effect'] del fr['_id'] if fr.has_key('backupFollowee'): del fr['backupFollowee'] fr['isUser'] = 0 else: del fr['followee'] fr['isUser'] = 1 successInfo = deepcopy( ERR_SUCCESS ) successInfo.message["data"] = fr self.write( json.dumps( successInfo.message, cls=MeEncoder ) ) elif action == 'unfollow': # 取消关注 # 之前未关注过或者已经取消关注,直接返回 unfollowed = followHelper.find_one( {'user': userId, fieldname: followee, 'effect': {'$gte': 1}} ) if not unfollowed: self.write( ERR_SUCCESS.message ) return FollowHelper.unfollow(userId, followee, is_user) fr = followHelper.find_one( {'user': userId, fieldname: followee, 'effect': {'$gte': 0}}, {'acl': 0, 'createAt': 0, '_sid': 0} ) fr['relationStatus'] = fr['effect'] del fr['effect'] del fr['_id'] if fr.has_key( 'backupFollowee' ): del fr['backupFollowee'] fr['isUser'] = 0 else: del fr['followee'] fr['isUser'] = 1 successInfo = deepcopy( ERR_SUCCESS ) successInfo.message["data"] = fr self.write( json.dumps( successInfo.message, cls=MeEncoder ) ) else: print "action error: " + action self.write( ERR_PATH_PERMISSION.message ) return except Exception, e: log.err("FollowerHandler-->action:%s in post() error, %s", action, e) self.write(ERR_DB_OPERATION.message) return
self.write(result) # 消费,付费购买 def charge(self): ''' obj = {'id':Goods_id:True,'chargeFlowId':ChargeFlow_id:False} chargeFlowId是在重新发起支付时需要传递 :return: ''' try: obj = json.loads(self.request.body) except Exception, e: log.err("JSON Error:[%d/%s] , error:%s", len(self.request.body), self.request.body, str(e)) self.write(ERR_INVALID.message) return goodHelper = ClassHelper('Goods') good = goodHelper.find_one({'_id': obj['id']}) walletHelper = ClassHelper('Wallet') wallet = walletHelper.find_one({'user': self.user['_id']}) if not wallet: self.write(ERR_ACCOUNT_BALANCE.message) return if good and wallet: # 添加消费记录,状态未支付 chargeFlowHelper = ClassHelper('ChargeFlow') if 'chargeFlowId' not in obj: chargeFlow = { 'user': self.user['_id'].decode(), 'amount': good['price'], 'goods': good['_id'].decode(), 'status': 0 }
meobj.save() self.filter_field(meobj) self.write(json.dumps(meobj, cls=MeEncoder)) self.finish() # self.pushMessage(className, meobj) else: self.write(ERR_BLACK_PERMISSION.message) except Exception, e: log.err(json.dumps(e.message)) if isinstance(e.message, dict) and e.message["errCode"] == 137: field = re.search(r"index: ([0-9a-zA-Z]+)_-?\d{1} dup key", e.message['info']) if field: field = field.group(1) classHelper = ClassHelper(className) item = classHelper.find_one({field: obj[field]}) item = self.filter_field(item) e.message['data'] = item self.write(e.message) # except Exception, e: # log.err("ClassHandler-->put error, %s", e) # self.write(ERR_DB_OPERATION.message) ### 更新对象 @tornado.web.authenticated def put(self, className, objectId=None): if not objectId and not self.request.arguments.has_key('where'): self.write(ERR_OBJECTID_MIS.message) return try: