def delete_members(id: int, user_ids: List[int]):
    conv = PrivateConversation.from_pk(id,
                                       _404=True,
                                       asrt=MessagePermissions.VIEW_OTHERS)
    not_members = [
        str(uid) for uid in user_ids
        if uid not in {u.id
                       for u in conv.members}
    ]
    if not_members:
        raise APIException(
            'The following user_ids are not in the conversation: '  # type: ignore
            f'{", ".join(not_members)}.')

    states = []
    og_members = []
    for uid in list(set(user_ids)):
        st = PrivateConversationState.from_attrs(conv_id=id, user_id=uid)
        states.append(st)
        if st.original_member:
            og_members.append(User.from_pk(st.user_id).username)
    if og_members:
        raise APIException(
            'The following original members cannot be removed from the conversation: '
            f'{", ".join(og_members)}.')
    for st in states:
        st.deleted = True
    db.session.commit()
    conv.del_property_cache('members')
    cache.delete(
        PrivateConversationState.__cache_key_members__.format(conv_id=conv.id))
    return flask.jsonify(conv.members)
Exemple #2
0
def test_conversation_set_state(client):
    pm = PrivateConversation.from_pk(2)
    pm.set_state(2)
    assert pm.read is False
    assert pm.sticky is False
    pm.set_state(1)
    assert pm.read is True
    assert pm.sticky is True
Exemple #3
0
def view_conversation(id: int, page: int = 1, limit: int = 50):
    conv = PrivateConversation.from_pk(id,
                                       _404=True,
                                       asrt=MessagePermissions.VIEW_OTHERS)
    conv.set_state(flask.g.user.id)
    conv.set_messages(page, limit)
    if page * limit > conv.messages_count:
        conv.mark_read()
    return flask.jsonify(conv)
Exemple #4
0
def test_make_message(client):
    pm = PrivateConversation.from_pk(1)
    pm.set_state(1)
    pm_state = PrivateConversationState.from_attrs(conv_id=1, user_id=1)
    assert (datetime.utcnow().replace(tzinfo=pytz.utc) -
            pm.last_response_time).total_seconds() > 60 * 60
    assert cache.has(pm_state.cache_key)
    PrivateMessage.new(conv_id=1, user_id=2, contents='hi')
    assert not cache.has(pm_state.cache_key)
    pm.set_state(1)
    assert (datetime.utcnow().replace(tzinfo=pytz.utc) -
            pm.last_response_time).total_seconds() < 15
def add_members(id: int, user_ids: List[int]):
    conv = PrivateConversation.from_pk(id,
                                       _404=True,
                                       asrt=MessagePermissions.VIEW_OTHERS)
    already_members = [
        u.username for u in conv.members if u.id in set(user_ids)
    ]
    if already_members:
        raise APIException(
            'The following members are already in the conversation: '
            f'{", ".join(already_members)}.')
    for uid in list(set(user_ids)):
        PrivateConversationState.new(conv_id=id, user_id=uid)
    conv.del_property_cache('members')
    return flask.jsonify(conv.members)
Exemple #6
0
def create_reply(conv_id: int, message: str):
    conv = PrivateConversation.from_pk(conv_id, _404=True)
    return flask.jsonify(
        PrivateMessage.new(conv_id=conv.id,
                           user_id=flask.g.user.id,
                           contents=message))
Exemple #7
0
def test_get_conversation_multiple_members(client):
    pm = PrivateConversation.from_pk(2)
    assert len(pm.members) == 3
    assert all(m.id in {1, 2, 3} for m in pm.members)
    assert len(pm.messages) == 2
Exemple #8
0
def test_serialize_view_others(app, authed_client):
    add_permissions(app, MessagePermissions.VIEW_OTHERS)
    pm = PrivateConversation.from_pk(4)
    pm.set_state(2)
    data = NewJSONEncoder().default(pm)
    check_dictionary(data, {'id': 4, 'topic': 'detingstings'})
Exemple #9
0
def test_get_conversation(client):
    pm = PrivateConversation.from_pk(1)
    assert pm.id == 1
    assert pm.topic == 'New Private Message!'
    assert len(pm.members) == 3
    assert all(m.id in {1, 2, 3} for m in pm.members)
Exemple #10
0
def test_serialize_basic_perms(authed_client):
    pm = PrivateConversation.from_pk(1)
    pm.set_state(1)
    data = NewJSONEncoder().default(pm)
    check_dictionary(data, {'id': 1, 'topic': 'New Private Message!'})
Exemple #11
0
def test_serialize_view_fail(authed_client):
    pm = PrivateConversation.from_pk(4)
    data = NewJSONEncoder().default(pm)
    assert data is None
Exemple #12
0
def test_set_messages_pagination(client):
    pm = PrivateConversation.from_pk(2)
    pm.set_messages(page=2, limit=1)
    assert len(pm.messages) == 1
Exemple #13
0
def test_set_messages_limit(client):
    pm = PrivateConversation.from_pk(2)
    pm.set_messages(page=1, limit=1)
    assert len(pm.messages) == 1
    assert pm.messages[0].id == 55
Exemple #14
0
def test_not_belongs_to_user(authed_client):
    assert not PrivateConversation.from_pk(4).belongs_to_user()
Exemple #15
0
def test_belongs_to_user(authed_client):
    assert PrivateConversation.from_pk(1).belongs_to_user()
    assert PrivateConversation.from_pk(2).belongs_to_user()
Exemple #16
0
def test_conversation_set_state_nonexistent(client):
    pm = PrivateConversation.from_pk(1)
    with pytest.raises(PMStateNotFound):
        pm.set_state(5)