def subscribe(user, target_type, target, fast=False, sfrom=None): """!Подписка пользователя на что-нибудь. @param user Объект-пользователь. @param target_type Тип цели - user,tag,club. @param target Цель подписки. @param fast Если равно true, не проверяем существование подписки.""" sub_rec = {'user': user['name'], 'target': target, 'type': target_type} adddesc = '' if fast or ((yield objs.Subscription.find_one(sub_rec)) is None): sub = objs.Subscription(sub_rec) sub['jid'] = user['jid'] if sfrom: sub['from'] = sfrom if target_type == 'sub_user': tuser = yield objs.User.find_one({'name': target}) if not tuser: defer.returnValue((False, 'No such user.')) else: for bl_item in tuser.get('blacklist', []): if bl_item == ['user', user['name']]: break else: yield tuser.send_plain( '@%s subscribed to your blog. %s/u/%s' % ( user['name'], get_webui_base(tuser), user['name'])) pass elif target_type == 'sub_message': if not fast: msg = yield objs.Message.find_one({'id': target}) if not msg: defer.returnValue((False, 'No such message.')) else: adddesc = ' (%d replies)' % (msg['replycount'],) feedel_val = dict(user=user['name'], message=target) feedel = None if fast else (yield objs.FeedElement.find_one(feedel_val)) if not feedel: feedel_val.update(dict(recommender=None, recocomment=None, date=time.time())) feedel = objs.FeedElement(feedel_val) _ = yield feedel.save() if (yield sub.save()): defer.returnValue((True, 'Subscribed' + adddesc + '.')) else: defer.returnValue((False, 'Error while saving.')) else: defer.returnValue((False, 'Already subscribed.'))
def recommendMessage(user, message, comment="", sfrom=None): """Add message to user's recommendations list and send it to subscribers. @param user User object. @param message Message object. @param comment Recommendation comment (optional). """ if not comment: comment = "" if len(comment) > 256: defer.returnValue( (False, 'Recommendation is too long. %d/256' % len(comment))) # TODO: Message will be queried once more by its id. sub_result = yield subscribe(user, 'sub_message', message['id'], False, sfrom) queries = [{'target': user['name'], 'type': 'sub_user'}] qn, recipients = yield send_to_subscribers(queries, message, user['name'], comment) if user['name'] != message['user']: tuser = yield objs.User.find_one({'name': message['user']}) if not tuser.get('off') and tuser.get('settings', {}).get( 'notify_on_recommendation', True): for bl_item in tuser.get('blacklist', []): if bl_item == ['user', user['name']]: break else: yield tuser.send_plain( '@%s recommended your message #%s, ' 'so %d more users received it. %s/p/%s' % (user['name'], message['id'], recipients, get_webui_base(tuser), message['id'])) recos_count = len(message['recommendations']) if (recos_count < 1024 and user['name'] not in message['recommendations']): yield objs.Message.mupdate( {'id': message['id']}, {'$addToSet': { 'recommendations': user['name'] }}) all_recos = message['recommendations'] + [user['name']] publish('upd_recommendations_count', message['id'], recos_count + 1, all_recos) publish('upd_recommendations_count_in_' + message['id'], message['id'], recos_count + 1, all_recos) defer.returnValue((True, (qn, recipients, message['replycount'])))
def recommendMessage(user, message, comment="", sfrom=None): """Add message to user's recommendations list and send it to subscribers. @param user User object. @param message Message object. @param comment Recommendation comment (optional). """ if not comment: comment = "" if len(comment) > 256: defer.returnValue( (False, 'Recommendation is too long. %d/256' % len(comment))) # TODO: Message will be queried once more by its id. sub_result = yield subscribe( user, 'sub_message', message['id'], False, sfrom) queries = [{'target': user['name'], 'type': 'sub_user'}] qn, recipients = yield send_to_subscribers( queries, message, user['name'], comment) if user['name'] != message['user']: tuser = yield objs.User.find_one({'name': message['user']}) if not tuser.get('off') and tuser.get('settings',{}).get('notify_on_recommendation',True): for bl_item in tuser.get('blacklist', []): if bl_item == ['user', user['name']]: break else: yield tuser.send_plain( '@%s recommended your message #%s, ' 'so %d more users received it. %s/p/%s' % ( user['name'], message['id'], recipients, get_webui_base(tuser), message['id'])) recos_count = len(message['recommendations']) if (recos_count < 1024 and user['name'] not in message['recommendations']): yield objs.Message.mupdate( {'id': message['id']}, {'$addToSet': {'recommendations': user['name']}}) all_recos = message['recommendations'] + [user['name']] publish('upd_recommendations_count', message['id'], recos_count + 1, all_recos) publish('upd_recommendations_count_in_'+message['id'], message['id'], recos_count + 1, all_recos) defer.returnValue((True, (qn, recipients, message['replycount'])))