62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
from django.db import models
|
|
from django.contrib.auth.models import User
|
|
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
|
|
class Profile(models.Model):
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
security_pin = models.CharField(max_length=4, blank=True, null=True)
|
|
deadman_pin = models.CharField(max_length=4, blank=True, null=True)
|
|
is_biometric_enabled = models.BooleanField(default=False)
|
|
last_wipe_at = models.DateTimeField(null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"Profile for {self.user.username}"
|
|
|
|
@receiver(post_save, sender=User)
|
|
def create_user_profile(sender, instance, created, **kwargs):
|
|
if created:
|
|
Profile.objects.create(user=instance)
|
|
|
|
@receiver(post_save, sender=User)
|
|
def save_user_profile(sender, instance, **kwargs):
|
|
instance.profile.save()
|
|
|
|
class Channel(models.Model):
|
|
PLATFORM_CHOICES = [
|
|
('whatsapp', 'WhatsApp Business'),
|
|
('messenger', 'Facebook Messenger'),
|
|
('instagram', 'Instagram Messages'),
|
|
('sms', 'SMS (Twilio)'),
|
|
('tiktok', 'TikTok Messages'),
|
|
]
|
|
|
|
name = models.CharField(max_length=50, choices=PLATFORM_CHOICES, unique=True)
|
|
is_active = models.BooleanField(default=False)
|
|
api_key = models.CharField(max_length=255, blank=True, null=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
def __str__(self):
|
|
return self.get_name_display()
|
|
|
|
class Conversation(models.Model):
|
|
channel = models.ForeignKey(Channel, on_delete=models.CASCADE, related_name='conversations')
|
|
external_id = models.CharField(max_length=255) # ID from the platform
|
|
participant_name = models.CharField(max_length=255)
|
|
last_message_at = models.DateTimeField(auto_now=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.participant_name} ({self.channel.get_name_display()})"
|
|
|
|
class Message(models.Model):
|
|
conversation = models.ForeignKey(Conversation, on_delete=models.CASCADE, related_name='messages')
|
|
body = models.TextField()
|
|
is_from_me = models.BooleanField(default=False)
|
|
timestamp = models.DateTimeField(auto_now_add=True)
|
|
external_id = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
class Meta:
|
|
ordering = ['timestamp']
|
|
|
|
def __str__(self):
|
|
return f"{'Me' if self.is_from_me else self.conversation.participant_name}: {self.body[:50]}" |