Example #1
0
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.'))
Example #2
0
File: post.py Project: q587p/bnw
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'])))
Example #3
0
File: post.py Project: stiletto/bnw
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'])))