예제 #1
0
def view(_user):
    """
    Show the logged-in user their own feed.
    """
    from pyaspora.diaspora.models import MessageQueue
    if MessageQueue.has_pending_items(_user):
        return redirect(url_for('diaspora.run_queue', _external=True))

    limit = int(request.args.get('limit', 99))
    friend_ids = [f.id for f in _user.contact.friends()]
    clauses = [Post.Queries.shared_with_contact(_user.contact)]
    if friend_ids:
        clauses.append(
            Post.Queries.authored_by_contacts_and_public(friend_ids))
    tag_ids = [t.id for t in _user.contact.interests]
    if tag_ids:
        clauses.append(Tag.Queries.public_posts_for_tags(tag_ids))
    feed_query = or_(*clauses)
    feed = db.session.query(Share).join(Post). \
        outerjoin(PostTag).outerjoin(Tag). \
        filter(feed_query). \
        order_by(desc(Post.thread_modified_at)). \
        group_by(Post.id). \
        options(contains_eager(Share.post)). \
        limit(limit)

    data = {
        'feed': json_posts([(s.post, s) for s in feed], _user, True)
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('feed.tpl', data)
예제 #2
0
def view(_user):
    """
    Show the logged-in user their own feed.
    """
    from pyaspora.diaspora.models import MessageQueue
    if MessageQueue.has_pending_items(_user):
        return redirect(url_for('diaspora.run_queue', _external=True))

    limit = int(request.args.get('limit', 99))
    friend_ids = [f.id for f in _user.contact.friends()]
    clauses = [Post.Queries.shared_with_contact(_user.contact)]
    if friend_ids:
        clauses.append(
            Post.Queries.authored_by_contacts_and_public(friend_ids))
    tag_ids = [t.id for t in _user.contact.interests]
    if tag_ids:
        clauses.append(Tag.Queries.public_posts_for_tags(tag_ids))
    feed_query = or_(*clauses)
    feed = db.session.query(Share).join(Post). \
        outerjoin(PostTag).outerjoin(Tag). \
        filter(feed_query). \
        order_by(desc(Post.thread_modified_at)). \
        group_by(Post.id). \
        options(contains_eager(Share.post)). \
        limit(limit)

    data = {'feed': json_posts([(s.post, s) for s in feed], _user, True)}

    add_logged_in_user_to_data(data, _user)

    return render_response('feed.tpl', data)
예제 #3
0
def receive(guid):
    """
    Receive a Salmon Slap and save it for when the user logs in.
    """
    diasp = DiasporaContact.get_by_guid(guid)
    if diasp is None or not diasp.contact.user:
        abort(404, 'No such contact')

    queue_item = MessageQueue()
    queue_item.local_user = diasp.contact.user
    queue_item.remote = None
    queue_item.format = MessageQueue.INCOMING
    queue_item.body = request.form['xml'].encode('ascii')
    db.session.add(queue_item)
    db.session.commit()

    diasp.contact.user.notify_event()

    return 'OK'
예제 #4
0
def receive_public():
    """
    Receive a public Salmon Slap and process it now.
    """
    dmp = DiasporaMessageParser(DiasporaContact.get_by_username)
    ret, c_from = dmp.decode(request.form['xml'], None)
    try:
        process_incoming_message(ret, c_from, None)
        return 'OK'
    except Exception as e:
        err = format_exc()
        current_app.logger.error(err)
        db.session.expunge_all()
        queue_item = MessageQueue()
        queue_item.local_user = None
        queue_item.remote = None
        queue_item.format = MessageQueue.PUBLIC_INCOMING
        queue_item.body = request.form['xml'].encode('ascii')
        queue_item.last_attempted_at = datetime.now()
        if not isinstance(e, TryLater):
            queue_item.error = err.encode('utf-8')
        db.session.add(queue_item)
        if isinstance(e, TryLater):
            pass
        else:
            return 'Error', 400
    finally:
        db.session.commit()

    # Sneakily attempt to process one item off the backlog
    try:
        queue_items = db.session.query(MessageQueue).filter(
            MessageQueue.Queries.pending_public_items()
        ).order_by(MessageQueue.created_at)
        MessageQueue.process_queue(queue_items, None, max_items=1)
    except:
        pass

    return 'OK'
예제 #5
0
def run_queue(_user):
    start = datetime.now()
    retry = True
    processed = int(request.args.get('processed', 0))
    while datetime.now() < start + timedelta(seconds=3):
        if not MessageQueue.has_pending_items(_user):
            retry = False
            break
        MessageQueue.process_incoming_queue(_user, max_items=1)
        processed += 1

    data = {
        'count': processed,
        'next': url_for('.run_queue', processed=processed, _external=True)
    }
    add_logged_in_user_to_data(data, _user)

    if retry:
        resp = make_response(render_response('diaspora_queue.tpl', data))
        resp.headers['Refresh'] = '1;{0}'.format(data['next'])
        return resp
    else:
        return redirect(url_for('feed.view'))
예제 #6
0
def run_queue(_user):
    start = datetime.now()
    retry = True
    processed = int(request.args.get('processed', 0))
    while datetime.now() < start + timedelta(seconds=3):
        if not MessageQueue.has_pending_items(_user):
            retry = False
            break
        MessageQueue.process_incoming_queue(_user, max_items=1)
        processed += 1

    data = {
        'count': processed,
        'next': url_for('.run_queue', processed=processed, _external=True)
    }
    add_logged_in_user_to_data(data, _user)

    if retry:
        resp = make_response(render_response('diaspora_queue.tpl', data))
        resp.headers['Refresh'] = '1;{0}'.format(data['next'])
        return resp
    else:
        return redirect(url_for('feed.view'))
예제 #7
0
파일: views.py 프로젝트: ktalik/pyaspora
def view(_user):
    """
    Show the logged-in user their own feed.
    """
    from pyaspora.diaspora.models import MessageQueue
    if MessageQueue.has_pending_items(_user):
        return redirect(url_for('diaspora.run_queue', _external=True))

    limit = int(request.args.get('limit', 10))
    friend_ids = [f.id for f in _user.contact.friends()]
    clauses = [Post.Queries.shared_with_contact(_user.contact)]
    if friend_ids:
        clauses.append(
            Post.Queries.authored_by_contacts_and_public(friend_ids))
    tag_ids = [t.id for t in _user.contact.interests]
    if tag_ids:
        clauses.append(Tag.Queries.public_posts_for_tags(tag_ids))
    feed_query = or_(*clauses)
    my_share = aliased(Share)
    feed = db.session.query(Share).join(Post). \
        outerjoin(  # Stuff user hasn't hidden
            my_share,
            and_(
                Post.id == my_share.post_id,
                my_share.contact == _user.contact
            )
        ). \
        outerjoin(PostTag).outerjoin(Tag). \
        filter(feed_query). \
        filter(or_(my_share.hidden == None, not_(my_share.hidden))). \
        filter(Post.parent == None). \
        order_by(desc(Post.thread_modified_at)). \
        group_by(Post.id). \
        options(contains_eager(Share.post)). \
        options(joinedload(Share.post, Post.diasp)). \
        limit(limit)

    data = {
        'feed': json_posts([(s.post, s) for s in feed], _user, True),
        'limit': limit,
        'actions': {},
    }

    if len(data['feed']) >= limit:
        data['actions']['more'] = url_for('feed.view', limit=limit + 10, _external=True)

    add_logged_in_user_to_data(data, _user)

    return render_response('feed.tpl', data)
예제 #8
0
파일: views.py 프로젝트: meZee/pyaspora
def view(_user):
    """
    Show the logged-in user their own feed.
    """
    from pyaspora.diaspora.models import MessageQueue
    if MessageQueue.has_pending_items(_user):
        return redirect(url_for('diaspora.run_queue', _external=True))

    limit = int(request.args.get('limit', 10))
    friend_ids = [f.id for f in _user.contact.friends()]
    clauses = [Post.Queries.shared_with_contact(_user.contact)]
    if friend_ids:
        clauses.append(
            Post.Queries.authored_by_contacts_and_public(friend_ids))
    tag_ids = [t.id for t in _user.contact.interests]
    if tag_ids:
        clauses.append(Tag.Queries.public_posts_for_tags(tag_ids))
    feed_query = or_(*clauses)
    my_share = aliased(Share)
    feed = db.session.query(Share).join(Post). \
        outerjoin(  # Stuff user hasn't hidden
            my_share,
            and_(
                Post.id == my_share.post_id,
                my_share.contact == _user.contact
            )
        ). \
        outerjoin(PostTag).outerjoin(Tag). \
        filter(feed_query). \
        filter(or_(my_share.hidden == None, not_(my_share.hidden))). \
        filter(Post.parent == None). \
        order_by(desc(Post.thread_modified_at)). \
        group_by(Post.id). \
        options(contains_eager(Share.post)). \
        options(joinedload(Share.post, Post.diasp)). \
        limit(limit)

    data = {
        'feed': json_posts([(s.post, s) for s in feed], _user, True),
        'limit': limit,
    }
    if len(data['feed']) >= limit:
        data['actions'] = {
            'more': url_for('feed.view', limit=limit + 10, _external=True)
        }

    add_logged_in_user_to_data(data, _user)

    return render_response('feed.tpl', data)
예제 #9
0
def receive(guid):
    """
    Receive a Salmon Slap and save it for when the user logs in.
    """
    diasp = DiasporaContact.get_by_guid(guid)
    if diasp is None or not diasp.contact.user:
        abort(404, 'No such contact')

    queue_item = MessageQueue()
    queue_item.local_user = diasp.contact.user
    queue_item.remote = None
    queue_item.format = MessageQueue.INCOMING
    queue_item.body = request.form['xml'].encode('ascii')
    db.session.add(queue_item)
    db.session.commit()

    diasp.contact.user.notify_event()

    return 'OK'
예제 #10
0
def receive_public():
    """
    Receive a public Salmon Slap and process it now.
    """
    dmp = DiasporaMessageParser(DiasporaContact.get_by_username)
    ret, c_from = dmp.decode(request.form['xml'], None)
    try:
        process_incoming_message(ret, c_from, None)
        return 'OK'
    except Exception:
        err = format_exc()
        current_app.logger.error(err)
        db.session.expunge_all()
        queue_item = MessageQueue()
        queue_item.local_user = None
        queue_item.remote = None
        queue_item.format = MessageQueue.PUBLIC_INCOMING
        queue_item.body = request.form['xml'].encode('ascii')
        queue_item.error = err.encode('utf-8')
        db.session.add(queue_item)
        return 'Error', 400
    finally:
        db.session.commit()
예제 #11
0
def receive_public():
    """
    Receive a public Salmon Slap and process it now.
    """
    dmp = DiasporaMessageParser(DiasporaContact.get_by_username)
    ret, c_from = dmp.decode(request.form['xml'], None)
    try:
        process_incoming_message(ret, c_from, None)
        return 'OK'
    except Exception:
        err = format_exc()
        current_app.logger.error(err)
        db.session.expunge_all()
        queue_item = MessageQueue()
        queue_item.local_user = None
        queue_item.remote = None
        queue_item.format = MessageQueue.PUBLIC_INCOMING
        queue_item.body = request.form['xml'].encode('ascii')
        queue_item.error = err.encode('utf-8')
        db.session.add(queue_item)
        return 'Error', 400
    finally:
        db.session.commit()
예제 #12
0
def run_public_queue(_user):
    queue_items = db.session.query(MessageQueue).filter(
        MessageQueue.Queries.pending_public_items()
    ).order_by(MessageQueue.created_at)
    MessageQueue.process_queue(queue_items, None)
    return redirect(url_for('feed.view'))