mirror of
https://github.com/deltachat/deltachat-core.git
synced 2025-10-04 10:19:16 +02:00
add contact handling and tests, complete get_contacts() API with flags,query
This commit is contained in:
parent
d24a1b5375
commit
9d22585cea
3 changed files with 35 additions and 8 deletions
|
@ -12,7 +12,7 @@ deltah = joinpath(dirname(dirname(dirname(here))), "src", "deltachat.h")
|
||||||
|
|
||||||
|
|
||||||
def read_event_defines():
|
def read_event_defines():
|
||||||
rex = re.compile(r'#define\s+(?:DC_EVENT_|DC_CONTACT_ID_|DC_CHAT)\S+\s+(\d+).*')
|
rex = re.compile(r'#define\s+(?:DC_EVENT_|DC_CONTACT_ID_|DC_GCL|DC_CHAT)\S+\s+([x\d]+).*')
|
||||||
return filter(rex.match, open(deltah))
|
return filter(rex.match, open(deltah))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -129,8 +129,7 @@ class Chat(object):
|
||||||
def get_messages(self):
|
def get_messages(self):
|
||||||
""" return list of messages in this chat. """
|
""" return list of messages in this chat. """
|
||||||
dc_array_t = lib.dc_get_chat_msgs(self.dc_context, self.id, 0, 0)
|
dc_array_t = lib.dc_get_chat_msgs(self.dc_context, self.id, 0, 0)
|
||||||
return map(lambda x: Message(self.dc_context, x),
|
return list(iter_array_and_unref(dc_array_t, lambda x: Message(self.dc_context, x)))
|
||||||
iter_array_and_unref(dc_array_t))
|
|
||||||
|
|
||||||
|
|
||||||
@attr.s
|
@attr.s
|
||||||
|
@ -198,8 +197,24 @@ class Account(object):
|
||||||
contact_id = capi.lib.dc_create_contact(self.dc_context, name, email)
|
contact_id = capi.lib.dc_create_contact(self.dc_context, name, email)
|
||||||
return Contact(self.dc_context, contact_id)
|
return Contact(self.dc_context, contact_id)
|
||||||
|
|
||||||
|
def get_contacts(self, query=ffi.NULL, with_self=False, only_verified=False):
|
||||||
|
""" return list of :pyclass:`Contact` objects.
|
||||||
|
|
||||||
|
:query: if a string is specified, only return contacts whose name or e-mail matches query.
|
||||||
|
:only_verified: if true only return verified contacts.
|
||||||
|
:with_self: if true the self-contact is also returned.
|
||||||
|
"""
|
||||||
|
flags = 0
|
||||||
|
query = convert_to_bytes_utf8(query)
|
||||||
|
if only_verified:
|
||||||
|
flags |= lib.DC_GCL_VERIFIED_ONLY
|
||||||
|
if with_self:
|
||||||
|
flags |= lib.DC_GCL_ADD_SELF
|
||||||
|
dc_array_t = lib.dc_get_contacts(self.dc_context, flags, query)
|
||||||
|
return list(iter_array_and_unref(dc_array_t, lambda x: Contact(self.dc_context, x)))
|
||||||
|
|
||||||
def create_chat_by_contact(self, contact):
|
def create_chat_by_contact(self, contact):
|
||||||
""" return a Chat object, created from the contact.
|
""" return a Chat object with the specified contact.
|
||||||
|
|
||||||
@param contact: chat_id (int) or contact object.
|
@param contact: chat_id (int) or contact object.
|
||||||
"""
|
"""
|
||||||
|
@ -278,10 +293,10 @@ def convert_to_bytes_utf8(obj):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
def iter_array_and_unref(dc_array_t):
|
def iter_array_and_unref(dc_array_t, constructor):
|
||||||
try:
|
try:
|
||||||
for i in range(0, lib.dc_array_get_cnt(dc_array_t)):
|
for i in range(0, lib.dc_array_get_cnt(dc_array_t)):
|
||||||
yield lib.dc_array_get_id(dc_array_t, i)
|
yield constructor(lib.dc_array_get_id(dc_array_t, i))
|
||||||
finally:
|
finally:
|
||||||
lib.dc_array_unref(dc_array_t)
|
lib.dc_array_unref(dc_array_t)
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ class TestOfflineAccount:
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ac1.get_self_contact()
|
ac1.get_self_contact()
|
||||||
|
|
||||||
def test_contacts(self, acfactory):
|
def test_contact_attr(self, acfactory):
|
||||||
ac1 = acfactory.get_offline_account()
|
ac1 = acfactory.get_offline_account()
|
||||||
contact1 = ac1.create_contact(email="some1@hello.com", name="some1")
|
contact1 = ac1.create_contact(email="some1@hello.com", name="some1")
|
||||||
assert contact1.id
|
assert contact1.id
|
||||||
|
@ -24,6 +24,19 @@ class TestOfflineAccount:
|
||||||
assert not contact1.is_blocked
|
assert not contact1.is_blocked
|
||||||
assert not contact1.is_verified
|
assert not contact1.is_verified
|
||||||
|
|
||||||
|
def test_contact_get_contacts(self, acfactory):
|
||||||
|
ac1 = acfactory.get_offline_account()
|
||||||
|
contact1 = ac1.create_contact(email="some1@hello.com", name="some1")
|
||||||
|
contacts = ac1.get_contacts()
|
||||||
|
assert len(contacts) == 1
|
||||||
|
assert contact1 in contacts
|
||||||
|
|
||||||
|
assert not ac1.get_contacts(query="some2")
|
||||||
|
assert ac1.get_contacts(query="some1")
|
||||||
|
assert not ac1.get_contacts(only_verified=True)
|
||||||
|
contacts = ac1.get_contacts(with_self=True)
|
||||||
|
assert len(contacts) == 2
|
||||||
|
|
||||||
def test_chat(self, acfactory):
|
def test_chat(self, acfactory):
|
||||||
ac1 = acfactory.get_offline_account()
|
ac1 = acfactory.get_offline_account()
|
||||||
contact1 = ac1.create_contact("some1@hello.com", name="some1")
|
contact1 = ac1.create_contact("some1@hello.com", name="some1")
|
||||||
|
@ -100,4 +113,3 @@ class TestOnlineAccount:
|
||||||
assert msg.text == "msg1"
|
assert msg.text == "msg1"
|
||||||
messages = msg.chat.get_messages()
|
messages = msg.chat.get_messages()
|
||||||
assert msg in messages, (msg, messages)
|
assert msg in messages, (msg, messages)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue