# apps/gmail/models.py from django.db import models from django.utils import timezone import uuid from apps.accounts.models import User from apps.knowledge_base.models import KnowledgeBase from apps.chat.models import ChatHistory # 更新导入路径 class GmailCredential(models.Model): """Gmail账号凭证""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='gmail_credentials') gmail_email = models.EmailField(verbose_name='Gmail邮箱', max_length=255, default='your_default_email@example.com') name = models.CharField(verbose_name='名称', max_length=100, default='默认Gmail') credentials = models.TextField(verbose_name='凭证JSON', blank=True, null=True) token_path = models.CharField(verbose_name='令牌路径', max_length=255, blank=True, null=True) is_default = models.BooleanField(verbose_name='是否默认', default=False) last_history_id = models.CharField(verbose_name='最后历史ID', max_length=100, blank=True, null=True) watch_expiration = models.DateTimeField(verbose_name='监听过期时间', blank=True, null=True) is_active = models.BooleanField(verbose_name='是否活跃', default=True) created_at = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) updated_at = models.DateTimeField(verbose_name='更新时间', auto_now=True) gmail_credential_id = models.CharField(verbose_name='Gmail凭证ID', max_length=255, blank=True, null=True) needs_reauth = models.BooleanField(verbose_name='需要重新授权', default=False) def __str__(self): return f"{self.name} ({self.gmail_email})" class Meta: verbose_name = 'Gmail凭证' verbose_name_plural = 'Gmail凭证' unique_together = ('user', 'gmail_email') ordering = ['-is_default', '-updated_at'] class GmailTalentMapping(models.Model): """Gmail达人映射关系模型""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='gmail_talent_mappings') talent_email = models.EmailField(verbose_name='达人邮箱') knowledge_base = models.ForeignKey(KnowledgeBase, on_delete=models.CASCADE, related_name='gmail_mappings') conversation_id = models.CharField(max_length=100, verbose_name='对话ID') is_active = models.BooleanField(default=True, verbose_name='是否激活') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') class Meta: db_table = 'gmail_talent_mappings' unique_together = ['user', 'talent_email'] verbose_name = 'Gmail达人映射' verbose_name_plural = 'Gmail达人映射' def __str__(self): return f"{self.user.username} - {self.talent_email}" class GmailAttachment(models.Model): """Gmail附件模型""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) chat_message = models.ForeignKey(ChatHistory, on_delete=models.CASCADE, related_name='gmail_attachments') gmail_message_id = models.CharField(max_length=100, verbose_name='Gmail消息ID') filename = models.CharField(max_length=255, verbose_name='文件名') filepath = models.CharField(max_length=500, verbose_name='文件路径') mimetype = models.CharField(max_length=100, verbose_name='MIME类型') filesize = models.IntegerField(default=0, verbose_name='文件大小') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: db_table = 'gmail_attachments' verbose_name = 'Gmail附件' verbose_name_plural = 'Gmail附件' def __str__(self): return f"{self.filename} ({self.filesize} bytes)"