def serialize_contact(contact):
    from temba.contacts.models import Contact
    from temba.msgs.models import Msg
    from temba.values.models import Value

    org_fields = {
        f.id: f
        for f in contact.org.contactfields.filter(is_active=True)
    }
    values = Value.objects.filter(contact=contact,
                                  contact_field_id__in=org_fields.keys())
    field_values = {}
    for v in values:
        field = org_fields[v.contact_field_id]
        field_values[field.key] = {
            'value': Contact.serialize_field_value(field, v),
            'created_on': v.created_on.isoformat()
        }

    _contact, contact_urn = Msg.resolve_recipient(contact.org, None, contact,
                                                  None)

    serialized = {
        'uuid': contact.uuid,
        'name': contact.name,
        'urns': [urn.urn for urn in contact.urns.all()],
        'group_uuids': [group.uuid for group in contact.user_groups.all()],
        'timezone': "UTC",
        'language': contact.language,
        'fields': field_values
    }

    # only populate channel if this contact can actually be reached (ie, has a URN)
    if contact_urn:
        channel = contact.org.get_send_channel(contact_urn=contact_urn)
        if channel:
            serialized['channel_uuid'] = channel.uuid

    return serialized