Skip to main content

Models and Functions for to send messages to contacts.

Project description

📨 Maquinaweb Shared Msg

Biblioteca Django para envio de mensagens (Email, SMS, WhatsApp) compartilhada entre múltiplos sistemas usando um banco de dados centralizado e integração com Twilio.

Python Django License

📋 Índice


🎯 Visão Geral

A Maquinaweb Shared Msg permite que múltiplos sistemas Django enviem mensagens para contatos através de um banco de dados centralizado, com suporte a:

  • 📧 Email - Envio de emails HTML usando Django templates
  • 📱 SMS - Envio de SMS via Twilio
  • 💬 WhatsApp - Envio de mensagens WhatsApp via Twilio com suporte a templates

Problema Resolvido

Ao invés de:

  • ❌ Configurar envio de mensagens em cada sistema separadamente
  • ❌ Duplicar lógica de integração com Twilio
  • ❌ Gerenciar contatos em múltiplos bancos

Você pode:

  • ✅ Centralizar envio de mensagens em uma biblioteca
  • ✅ Compartilhar contatos entre sistemas
  • ✅ Usar templates Django para personalizar mensagens
  • ✅ Executar envios assíncronos com Zappa

✨ Características

Core Features

  • 📧 Email HTML: Envio de emails com templates Django renderizados
  • 📱 SMS via Twilio: Integração completa com Twilio para SMS
  • 💬 WhatsApp Templates: Suporte a Twilio Content Templates para WhatsApp
  • 🔄 Envio Assíncrono: Decorador @task do Zappa para execução em background
  • 🗄️ Banco Centralizado: Models read-only para contatos compartilhados
  • 🧩 Mixins Reutilizáveis: ContactMixin para integração fácil em seus models

Componentes Principais

Componente Descrição
Models Contact, Email, Phone, Message
Services TwilioService para SMS e WhatsApp
Utils Builders para Email, SMS e WhatsApp
Mixins ContactMixin para models com contatos
Router SharedMsgRouter para roteamento de banco

🏗️ Arquitetura

┌─────────────────────────────────────────┐
│     Sistema de Mensagens Centralizado   │
│                                         │
│  ┌──────────┐  ┌────────┐  ┌─────────┐ │
│  │ Contact  │  │ Email  │  │  Phone  │ │
│  └────┬─────┘  └───┬────┘  └────┬────┘ │
│       │            │            │       │
│       └────────────┴────────────┘       │
│                    │                    │
│           ┌────────▼────────┐           │
│           │     Message     │           │
│           │  (status track) │           │
│           └─────────────────┘           │
└──────────────────┬──────────────────────┘
                   │
      ┌────────────┴────────────┐
      │  PostgreSQL/MySQL       │
      │  (auth_db)              │
      └────────────┬────────────┘
                   │
      ┌────────────┼────────────┐
      │            │            │
┌─────▼─────┐ ┌────▼────┐ ┌────▼─────┐
│ Sistema A │ │Sistema B│ │ Sistema C│
│           │ │         │ │          │
│ send_msg()│ │send_msg()││send_msg()│
└───────────┘ └─────────┘ └──────────┘
                   │
      ┌────────────┴────────────┐
      │                         │
      ▼                         ▼
┌──────────┐              ┌──────────┐
│  Twilio  │              │  Django  │
│ SMS/WA   │              │  Email   │
└──────────┘              └──────────┘

Fluxo de Envio:

  1. Sistema cliente chama send_message() ou usa ContactMixin
  2. Mensagem é processada e enviada via canal apropriado (Email/Twilio)
  3. Status da mensagem é atualizado no model Message
  4. Execução pode ser síncrona ou assíncrona (via Zappa)

📦 Instalação

1. Instalar a Biblioteca

# Via pip (quando publicado)
pip install maquinaweb-shared-msg

# Ou modo desenvolvimento
pip install -e /path/to/maquinaweb-shared-msg

2. Adicionar ao requirements.txt

Django>=5.0
djangorestframework>=3.0
maquinaweb-shared-msg>=0.1.9
twilio>=9.8.8
zappa>=0.61.2

⚙️ Configuração

1. Settings do Django

# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'rest_framework',
    
    # Adicionar shared_msg
    'shared_msg',
    
    # Suas apps
    'myapp',
]

2. Configurar Banco de Dados

# settings.py

DATABASES = {
    'default': {
        # Banco do sistema atual
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'meu_sistema_db',
        'USER': 'meu_user',
        'PASSWORD': 'senha',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'auth_db': {
        # Banco centralizado de mensagens
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'sistema_msg_db',
        'USER': 'msg_user',
        'PASSWORD': 'senha',
        'HOST': 'msg-server.example.com',
        'PORT': '5432',
    }
}

# Router para direcionar queries
DATABASE_ROUTERS = ['shared_msg.router.SharedMsgRouter']

3. Configurar Twilio

# settings.py

# Credenciais Twilio
TWILIO_ACCOUNT_SID = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
TWILIO_AUTH_TOKEN = 'seu_auth_token_aqui'

# Números de envio
TWILIO_SMS_FROM = '+5511999999999'
TWILIO_WHATSAPP_FROM = '+5511999999999'

# Content SIDs para templates WhatsApp (opcional)
TWILIO_CONTENT_SIDS = {
    'whatsapp/welcome': {
        'whatsapp': 'HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    },
    'whatsapp/order_confirmation': {
        'whatsapp': 'HXyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
    },
}

4. Configurar Email

# settings.py

# Configuração padrão do Django para email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'seu@email.com'
EMAIL_HOST_PASSWORD = 'sua_senha_app'
DEFAULT_FROM_EMAIL = 'noreply@seudominio.com'

5. Configurar Tabelas (Opcional)

# settings.py

# Customizar nomes das tabelas (se necessário)
SHARED_MSG_MESSAGE_TABLE = 'message_message'
SHARED_MSG_CONTACT_TABLE = 'message_contact'
SHARED_MSG_EMAIL_TABLE = 'message_email'
SHARED_MSG_PHONE_TABLE = 'message_phone'

# Banco de dados a utilizar
SHARED_MSG_DEFAULT_DB = 'auth_db'

🚀 Uso Básico

1. Enviar Mensagem Diretamente

from shared_msg.message.utils.send_message import send_message
from shared_msg.message.utils import MessageTypes

# Enviar Email
send_message(
    contacts_ids=[1, 2, 3],
    type=MessageTypes.EMAIL,
    template='emails/welcome.html',
    context={'name': 'João', 'company': 'XYZ'},
    from_email='noreply@empresa.com',
    subject='Bem-vindo à nossa plataforma!',
)

# Enviar SMS
send_message(
    contacts_ids=1,
    type=MessageTypes.SMS,
    template='sms/verification_code.txt',
    context={'code': '123456'},
)

# Enviar WhatsApp
send_message(
    contacts_ids=[1, 2],
    type=MessageTypes.WHATSAPP,
    template='whatsapp/order_confirmation.html',
    context={
        'order_number': 'PED-001',
        'total': 'R$ 150,00',
        'twilio_variables': {
            '1': 'PED-001',
            '2': 'R$ 150,00',
        }
    },
)

2. Usando ContactMixin em Models

# myapp/models.py
from django.db import models
from shared_msg.mixins.contact import ContactMixin

class Cliente(ContactMixin, models.Model):
    """Model que possui contato vinculado"""
    
    nome = models.CharField(max_length=200)
    empresa = models.CharField(max_length=200)
    
    def __str__(self):
        return self.nome

# Uso
cliente = Cliente.objects.get(id=1)

# Enviar email para o contato do cliente
cliente.send_message(
    type=MessageTypes.EMAIL,
    template='emails/invoice.html',
    context={'cliente': cliente.nome, 'valor': 'R$ 500,00'},
    subject='Sua fatura chegou!',
)

# Enviar SMS
cliente.send_message(
    type=MessageTypes.SMS,
    template='sms/reminder.txt',
    context={'nome': cliente.nome},
)

3. Templates de Mensagem

Email Template (HTML)

<!-- templates/emails/welcome.html -->
<!DOCTYPE html>
<html>
<body>
    <h1>Olá, {{ name }}!</h1>
    <p>Bem-vindo à {{ company }}.</p>
    <p>Estamos felizes em tê-lo conosco!</p>
</body>
</html>

SMS Template (TXT)

{# templates/sms/verification_code.txt #}
Seu código de verificação é: {{ code }}. Válido por 5 minutos.

WhatsApp Template (HTML)

<!-- templates/whatsapp/order_confirmation.html -->
Seu pedido {{ order_number }} foi confirmado! Total: {{ total }}

🔍 API Reference

Models

Contact

from shared_msg.models import Contact

# Campos
contact.id
contact.name

Email

from shared_msg.models import Email

# Campos
email.id
email.email        # Endereço de email
email.contact_id   # FK para Contact

Phone

from shared_msg.models import Phone

# Campos
phone.id
phone.phone_type   # 'whatsapp' ou 'sms'
phone.number       # Número do telefone
phone.contact_id   # FK para Contact

# Choices
Phone.PhoneType.WHATSAPP
Phone.PhoneType.SMS

Message

from shared_msg.models import Message

# Campos
message.id
message.contact_id   # FK para Contact
message.status       # 'pending', 'sent', 'failed'
message.type         # 'email', 'sms', 'whatsapp'
message.template     # Nome do template usado
message.related_to   # ID opcional para vincular a outro objeto

# Choices
Message.Types.EMAIL
Message.Types.SMS
Message.Types.WHATSAPP

Message.Status.PENDING
Message.Status.SENT
Message.Status.FAILED

MessageTypes

from shared_msg.message.utils import MessageTypes

MessageTypes.EMAIL     # 'email'
MessageTypes.SMS       # 'sms'
MessageTypes.WHATSAPP  # 'whatsapp'
MessageTypes.TYPES     # ['email', 'sms', 'whatsapp']

Services

TwilioService

from shared_msg.message.services.twilio_service import TwilioService

service = TwilioService()

# Enviar SMS texto
service.send_sms_text(
    phone='+5511999999999',
    body='Sua mensagem aqui',
)

# Enviar WhatsApp com template
service.send_whatsapp_template(
    phone='+5511999999999',
    content_sid='HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    variables={'1': 'valor1', '2': 'valor2'},
    body='Texto fallback opcional',
)

Utils

build_email_message

from shared_msg.message.utils.build_email_message import build_email_message

email_message = build_email_message(
    emails=['user1@email.com', 'user2@email.com'],
    from_email='noreply@empresa.com',
    subject='Assunto do email',
    context={'name': 'João'},
    template='emails/template.html',
)

email_message.send()  # Envia o email

build_sms_message

from shared_msg.message.utils.build_sms_message import build_sms_message

body = build_sms_message(
    template='sms/verification.txt',
    context={'code': '123456'},
)
# Retorna: "Seu código é: 123456. Válido por 5 minutos."

build_whatsapp_message

from shared_msg.message.utils.build_whatsapp_message import build_whatsapp_message

content_sid, variables, fallback_body = build_whatsapp_message(
    template='whatsapp/welcome.html',
    message_type='whatsapp',
    context={
        'name': 'João',
        'twilio_variables': {'1': 'João'},
    },
)

Mixins

ContactMixin

from shared_msg.mixins.contact import ContactMixin

class MeuModel(ContactMixin, models.Model):
    # Adiciona campo contact_id ao model
    pass

# Uso
obj = MeuModel.objects.get(id=1)
obj.contact      # Acessa o Contact relacionado
obj.send_message(...)  # Envia mensagem para o contato

Router

SharedMsgRouter

# settings.py
DATABASE_ROUTERS = ['shared_msg.router.SharedMsgRouter']

Direciona automaticamente todas as queries dos models shared_msg para o banco configurado em SHARED_MSG_DEFAULT_DB.


🔧 Configurações Disponíveis

Configuração Padrão Descrição
SHARED_MSG_DEFAULT_DB 'auth_db' Nome do banco para models shared_msg
SHARED_MSG_MESSAGE_TABLE 'message_message' Nome da tabela de mensagens
SHARED_MSG_CONTACT_TABLE 'message_contact' Nome da tabela de contatos
SHARED_MSG_EMAIL_TABLE 'message_email' Nome da tabela de emails
SHARED_MSG_PHONE_TABLE 'message_phone' Nome da tabela de telefones
TWILIO_ACCOUNT_SID - Account SID do Twilio
TWILIO_AUTH_TOKEN - Auth Token do Twilio
TWILIO_SMS_FROM - Número de envio SMS
TWILIO_WHATSAPP_FROM - Número de envio WhatsApp
TWILIO_CONTENT_SIDS {} Mapa de templates → Content SIDs
DEFAULT_FROM_EMAIL - Email padrão para envio

📝 Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

maquinaweb_shared_msg-0.1.16.tar.gz (12.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

maquinaweb_shared_msg-0.1.16-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file maquinaweb_shared_msg-0.1.16.tar.gz.

File metadata

  • Download URL: maquinaweb_shared_msg-0.1.16.tar.gz
  • Upload date:
  • Size: 12.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for maquinaweb_shared_msg-0.1.16.tar.gz
Algorithm Hash digest
SHA256 326b812bc1befab4258f0db77cbccb91eb62cf9b3857c27594c894530dfec490
MD5 b6fbc54062fdc20f225dda981007984e
BLAKE2b-256 85b889f8c5edc116c00534330b53ab162e8d620bba42ccdc5e5c883bfdbe1d34

See more details on using hashes here.

File details

Details for the file maquinaweb_shared_msg-0.1.16-py3-none-any.whl.

File metadata

  • Download URL: maquinaweb_shared_msg-0.1.16-py3-none-any.whl
  • Upload date:
  • Size: 16.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for maquinaweb_shared_msg-0.1.16-py3-none-any.whl
Algorithm Hash digest
SHA256 5dc7c1227d064e5cb711a57297f132aa253d8c7a089bec75edaf743a3e902e33
MD5 88600c6fc7face245f8a0c2c305c643b
BLAKE2b-256 4bd09a5035d6183ec7dac063e1cf672a348cb59b36e557d7ed12941ecdb08755

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page