Beispiel #1
0
def edit_contact_groups_form(contact_id, _user):
    """
    Form to edit which SubscriptionGroups a contact is in.
    """
    contact = Contact.get(contact_id)
    if not contact:
        abort(404, 'No such contact')
    sub = _user.contact.subscribed_to(contact)
    if not sub:
        abort(404, 'No such contact')

    data = {
        'actions': {
            'save_groups': url_for(
                '.save_contact_groups',
                contact_id=contact.id,
                _external=True
            )
        },
        'subscription': json_contact_with_groups(sub, _user)
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_edit_group.tpl', data)
Beispiel #2
0
def create_form():
    """
    Display the form to create a new user account.
    """
    if not _can_create_account():
        abort(403, 'Disabled by site administrator')
    return render_response('users_create_form.tpl')
Beispiel #3
0
def create_form():
    """
    Display the form to create a new user account.
    """
    if not _can_create_account():
        abort(403, 'Disabled by site administrator')
    return render_response('users_create_form.tpl')
Beispiel #4
0
def feed(tag_name, _user):
    """
    Display recent public posts on a particular topic (Tag).
    """
    from pyaspora.post.models import Post, Share
    from pyaspora.post.views import json_posts

    tag = Tag.get_by_name(tag_name, create=False)
    if not tag:
        abort(404, 'No such tag')

    data = json_tag(tag)

    posts = db.session.query(Post). \
        join(PostTag). \
        join(Tag). \
        join(Share). \
        filter(Tag.Queries.public_posts_for_tags([tag.id])). \
        order_by(desc(Post.thread_modified_at)). \
        group_by(Post.id). \
        limit(100)

    data['feed'] = json_posts([(p, None) for p in posts])

    add_logged_in_user_to_data(data, _user)

    return render_response('tags_feed.tpl', data)
Beispiel #5
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)
Beispiel #6
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)
Beispiel #7
0
def create_form():
    """
    Display the form to create a new user account.
    """
    if not current_app.config.get('ALLOW_CREATION', False):
        abort(403, 'Disabled by site administrator')
    return render_response('users_create_form.tpl')
Beispiel #8
0
def logout():
    """
    End a user session.
    """
    session['key'] = None
    session['user_id'] = None

    data = {}
    add_logged_in_user_to_data(data, None)

    return render_response('users_logged_out.tpl', data)
Beispiel #9
0
def profile(contact_id):
    """
    Display the profile (possibly with feed) for the contact.
    """
    data, contact = _profile_base(contact_id,
                                  request.args.get('public', False))
    if not contact.user and not logged_in_user():
        abort(404, 'No such contact', force_status=True)
    if contact.user and not contact.user.activated:
        abort(404, 'No such contact', force_status=True)
    return render_response('contacts_profile.tpl', data)
Beispiel #10
0
def info(_user):
    """
    Form to view or edit information on the currently logged-in user.
    """
    data = json_user(_user)
    add_logged_in_user_to_data(data, _user)
    data.update({
        'notification_frequency_hours': _user.notification_hours,
        'email': _user.email
    })
    return render_response('users_edit.tpl', data)
Beispiel #11
0
def logout():
    """
    End a user session.
    """
    session['key'] = None
    session['user_id'] = None

    data = {}
    add_logged_in_user_to_data(data, None)

    return render_response('users_logged_out.tpl', data)
Beispiel #12
0
def info(_user):
    """
    Form to view or edit information on the currently logged-in user.
    """
    data = json_user(_user)
    add_logged_in_user_to_data(data, _user)
    data.update({
        'notification_frequency_hours': _user.notification_hours,
        'email': _user.email
    })
    return render_response('users_edit.tpl', data)
Beispiel #13
0
def create_form(_user):
    """
    Start a new Post.
    """
    data = _base_create_form(_user)
    data['use_advanced_form'] = True
    if request.args.get('target_type') and request.args.get('target_id'):
        data['default_target'] = {
            'type': request.args['target_type'],
            'id': request.args['target_id'],
        }
    return render_response('posts_create_form.tpl', data)
Beispiel #14
0
def create_form(_user):
    """
    Start a new Post.
    """
    data = _base_create_form(_user)
    data['use_advanced_form'] = True
    if request.args.get('target_type') and request.args.get('target_id'):
        data['default_target'] = {
            'type': request.args['target_type'],
            'id': int(request.args['target_id']),
        }
    return render_response('posts_create_form.tpl', data)
Beispiel #15
0
def profile(contact_id):
    """
    Display the profile (possibly with feed) for the contact.
    """
    data, contact = _profile_base(
        contact_id,
        request.args.get('public', False)
    )
    if not contact.user and not logged_in_user():
        abort(404, 'No such contact', force_status=True)
    if contact.user and not contact.user.activated:
        abort(404, 'No such contact', force_status=True)
    return render_response('contacts_profile.tpl', data)
Beispiel #16
0
def login():
    """
    Display the user login form.
    """
    user = logged_in_user()
    if user:
        data = {}
        add_logged_in_user_to_data(data, user)
        abort(400, 'Already logged in', data)

    data = {}
    add_logged_in_user_to_data(data, None)

    return render_response('users_login_form.tpl', data)
Beispiel #17
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', 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)
Beispiel #18
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', 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)
Beispiel #19
0
def view(_user):
    """
    View and edit the logged in user's roster.
    """
    subs = db.session.query(Subscription). \
        filter(Subscription.from_contact == _user.contact)
    data = {
        'subscriptions': [json_contact_with_groups(s, _user) for s in subs],
        'actions': {
            'search': url_for('contacts.search', _external=True)
        }
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_view.tpl', data)
Beispiel #20
0
def view(_user):
    """
    View and edit the logged in user's roster.
    """
    subs = db.session.query(Subscription). \
        filter(Subscription.from_contact == _user.contact)
    data = {
        'subscriptions': [json_contact_with_groups(s, _user) for s in subs],
        'actions': {
            'search': url_for('contacts.search', _external=True)
        }
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_view.tpl', data)
Beispiel #21
0
def view_group(group_id, _user):
    """
    Display the info and members of one SubscriptionGroup.
    """
    group = SubscriptionGroup.get(group_id)
    if not (group) or group.user_id != _user.id:
        abort(404, 'No such group')

    data = {
        'subscriptions':
        [json_contact_with_groups(s, _user) for s in group.subscriptions],
        'group':
        json_group(group)
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_view_group.tpl', data)
Beispiel #22
0
def login():
    """
    Display the user login form.
    """
    user = logged_in_user()
    if user:
        data = {}
        add_logged_in_user_to_data(data, user)
        abort(400, 'Already logged in', data)

    data = {}
    add_logged_in_user_to_data(data, None)

    if _can_create_account():
        data['logged_in']['actions']['sign_up'] = url_for('users.create',
                                                          _external=True)

    return render_response('users_login_form.tpl', data)
Beispiel #23
0
def view_group(group_id, _user):
    """
    Display the info and members of one SubscriptionGroup.
    """
    group = SubscriptionGroup.get(group_id)
    if not(group) or group.user_id != _user.id:
        abort(404, 'No such group')

    data = {
        'subscriptions': [
            json_contact_with_groups(s, _user)
            for s in group.subscriptions
        ],
        'group': json_group(group)
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_view_group.tpl', data)
Beispiel #24
0
def activate(user_id, key_hash):
    """
    Activate a user. This is intended to be a clickable link from the sign-up
    email that confirms the email address is valid.
    """
    matched_user = models.User.get(user_id)

    if not matched_user:
        abort(404, 'Not found')

    if matched_user.activated:
        abort(404, 'Not found')

    if key_hash != _hash_for_pk(matched_user):
        abort(404, 'Not found')

    matched_user.activate()
    db.session.commit()
    return render_response('users_activation_success.tpl')
Beispiel #25
0
def subscriptions(contact_id, _user):
    """
    Display the friend list for the contact (who must be local to this server,
    because this server doesn't hold the full friend list for remote users).
    """
    contact = Contact.get(contact_id)
    if not (contact.user and contact.user.activated):
        abort(404, 'No such contact', force_status=True)

    # Looking at our own list? You'll be wanting the edit view.
    if contact.id == _user.contact.id:
        return redirect(url_for('roster.view', _external=True))

    data = json_contact(contact, _user)
    data['subscriptions'] = [json_contact(c, _user) for c in contact.friends()]

    add_logged_in_user_to_data(data, _user)

    return render_response('contacts_friend_list.tpl', data)
Beispiel #26
0
def activate(user_id, key_hash):
    """
    Activate a user. This is intended to be a clickable link from the sign-up
    email that confirms the email address is valid.
    """
    matched_user = models.User.get(user_id)

    if not matched_user:
        abort(404, 'Not found')

    if matched_user.activated:
        abort(404, 'Not found')

    if key_hash != _hash_for_pk(matched_user):
        abort(404, 'Not found')

    matched_user.activate()
    db.session.commit()
    return render_response('users_activation_success.tpl')
Beispiel #27
0
def subscriptions(contact_id, _user):
    """
    Display the friend list for the contact (who must be local to this server,
    because this server doesn't hold the full friend list for remote users).
    """
    contact = Contact.get(contact_id)
    if not(contact.user and contact.user.activated):
        abort(404, 'No such contact', force_status=True)

    # Looking at our own list? You'll be wanting the edit view.
    if contact.id == _user.contact.id:
        return redirect(url_for('roster.view', _external=True))

    data = json_contact(contact, _user)
    data['subscriptions'] = [json_contact(c, _user)
                             for c in contact.friends()]

    add_logged_in_user_to_data(data, _user)

    return render_response('contacts_friend_list.tpl', data)
Beispiel #28
0
def login():
    """
    Display the user login form.
    """
    user = logged_in_user()
    if user:
        data = {}
        add_logged_in_user_to_data(data, user)
        abort(400, 'Already logged in', data)

    data = {}
    add_logged_in_user_to_data(data, None)

    if _can_create_account():
        data['logged_in']['actions']['sign_up'] = url_for(
            'users.create',
            _external=True
        )

    return render_response('users_login_form.tpl', data)
Beispiel #29
0
def search(_user):
    from pyaspora.diaspora.models import DiasporaContact
    term = request.args.get('searchterm', None) or \
        abort(400, 'No search term provided')
    if re_match('[A-Za-z0-9._]+@[A-Za-z0-9.]+$', term):
        try:
            DiasporaContact.get_by_username(term)
        except:
            current_app.logger.debug(format_exc())

    matches = db.session.query(Contact).outerjoin(DiasporaContact).filter(
        or_(DiasporaContact.username.contains(term),
            Contact.realname.contains(term))).order_by(
                Contact.realname).limit(99)

    data = {'contacts': [json_contact(c, _user) for c in matches]}

    add_logged_in_user_to_data(data, _user)

    return render_response('contacts_search_results.tpl', data)
Beispiel #30
0
def comment(post_id, _user):
    """
    Comment on (reply to) an existing Post.
    """
    post = Post.get(post_id)
    if not post:
        abort(404, 'No such post', force_status=True)
    if not post.has_permission_to_view(_user.contact):
        abort(403, 'Forbidden')

    data = _base_create_form(_user, post)

    data.update({
        'relationship': {
            'type': 'comment',
            'object': json_post(post, children=False),
            'description': 'Comment on this item'
        }
    })

    return render_response('posts_create_form.tpl', data)
Beispiel #31
0
def comment(post_id, _user):
    """
    Comment on (reply to) an existing Post.
    """
    post = Post.get(post_id)
    if not post:
        abort(404, 'No such post', force_status=True)
    if not post.has_permission_to_view(_user.contact):
        abort(403, 'Forbidden')

    data = _base_create_form(_user, post)

    data.update({
        'relationship': {
            'type': 'comment',
            'object': json_post(post, children=False),
            'description': 'Comment on this item'
        }
    })

    return render_response('posts_create_form.tpl', data)
Beispiel #32
0
def search(_user):
    from pyaspora.diaspora.models import DiasporaContact
    term = request.args.get('searchterm', None) or \
        abort(400, 'No search term provided')
    if re_match('[A-Za-z0-9._]+@[A-Za-z0-9.]+$', term):
        try:
            DiasporaContact.get_by_username(term)
        except:
            current_app.logger.debug(format_exc())

    matches = db.session.query(Contact).outerjoin(DiasporaContact).filter(or_(
        DiasporaContact.username.contains(term),
        Contact.realname.contains(term)
    )).order_by(Contact.realname).limit(99)

    data = {
        'contacts': [json_contact(c, _user) for c in matches]
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('contacts_search_results.tpl', data)
Beispiel #33
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'))
Beispiel #34
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'))
Beispiel #35
0
def share(post_id, _user):
    """
    Form to share an existing Post with more Contacts.
    """
    post = Post.get(post_id)
    if not post:
        abort(404, 'No such post', force_status=True)
    if not post.has_permission_to_view(_user.contact):
        abort(403, 'Forbidden')

    data = _base_create_form(_user)

    data.update({
        'relationship': {
            'type': 'share',
            'object': json_post(post, children=False),
            'description': 'Share this item'
        },
        'default_target': {
            'type': 'all_friends',
            'id': None
        }
    })
    return render_response('posts_create_form.tpl', data)
Beispiel #36
0
def edit_contact_groups_form(contact_id, _user):
    """
    Form to edit which SubscriptionGroups a contact is in.
    """
    contact = Contact.get(contact_id)
    if not contact:
        abort(404, 'No such contact')
    sub = _user.contact.subscribed_to(contact)
    if not sub:
        abort(404, 'No such contact')

    data = {
        'actions': {
            'save_groups':
            url_for('.save_contact_groups',
                    contact_id=contact.id,
                    _external=True)
        },
        'subscription': json_contact_with_groups(sub, _user)
    }

    add_logged_in_user_to_data(data, _user)

    return render_response('roster_edit_group.tpl', data)
Beispiel #37
0
def share(post_id, _user):
    """
    Form to share an existing Post with more Contacts.
    """
    post = Post.get(post_id)
    if not post:
        abort(404, 'No such post', force_status=True)
    if not post.has_permission_to_view(_user.contact):
        abort(403, 'Forbidden')

    data = _base_create_form(_user)

    data.update({
        'relationship': {
            'type': 'share',
            'object': json_post(post, children=False),
            'description': 'Share this item'
        },
        'default_target': {
            'type': 'all_friends',
            'id': None
        }
    })
    return render_response('posts_create_form.tpl', data)
Beispiel #38
0
def create():
    """
    Create a new User (sign-up).
    """
    if not _can_create_account():
        abort(403, 'Disabled by site administrator')

    user = logged_in_user()
    if user:
        data = {}
        add_logged_in_user_to_data(data, user)
        abort(400, 'Already logged in', data)

    name = post_param('name', template='users_create_form.tpl')
    password = post_param('password', template='users_create_form.tpl')
    email = post_param('email', template='users_create_form.tpl')

    my_user = models.User()
    my_user.email = email
    my_user.contact.realname = name
    my_user.generate_keypair(password)
    db.session.commit()

    send_template(my_user.email, 'user_activate_email.tpl', {
        'link': url_for(
            '.activate',
            user_id=my_user.id,
            key_hash=_hash_for_pk(my_user),
            _external=True
        )
    })

    data = {}
    add_logged_in_user_to_data(data, None)

    return render_response('users_created.tpl', data)
Beispiel #39
0
def create():
    """
    Create a new User (sign-up).
    """
    if not current_app.config.get('ALLOW_CREATION', False):
        abort(403, 'Disabled by site administrator')

    user = logged_in_user()
    if user:
        data = {}
        add_logged_in_user_to_data(data, user)
        abort(400, 'Already logged in', data)

    name = post_param('name', template='users_create_form.tpl')
    password = post_param('password', template='users_create_form.tpl')
    email = post_param('email', template='users_create_form.tpl')

    my_user = models.User()
    my_user.email = email
    my_user.contact.realname = name
    my_user.generate_keypair(password)
    db.session.commit()

    send_template(my_user.email, 'user_activate_email.tpl', {
        'link': url_for(
            '.activate',
            user_id=my_user.id,
            key_hash=_hash_for_pk(my_user),
            _external=True
        )
    })

    data = {}
    add_logged_in_user_to_data(data, None)

    return render_response('users_created.tpl', data)