from django.core.management.base import BaseCommand, CommandError from user_management.models import GmailCredential, User from user_management.gmail_integration import GmailIntegration import logging import pickle logger = logging.getLogger(__name__) class Command(BaseCommand): help = '更新Gmail凭证中的邮箱信息' def add_arguments(self, parser): parser.add_argument('--email', type=str, help='指定用户邮箱') parser.add_argument('--gmail', type=str, help='指定要设置的Gmail邮箱') parser.add_argument('--all', action='store_true', help='更新所有凭证') def handle(self, *args, **options): email = options.get('email') gmail = options.get('gmail') update_all = options.get('all') if update_all: # 更新所有凭证 credentials = GmailCredential.objects.filter(is_active=True) self.stdout.write(f"找到 {credentials.count()} 个活跃的Gmail凭证") for credential in credentials: self._update_credential(credential, gmail) elif email: # 更新指定用户的凭证 try: user = User.objects.get(email=email) credentials = GmailCredential.objects.filter(user=user, is_active=True) if not credentials.exists(): raise CommandError(f"未找到用户 {email} 的Gmail凭证") for credential in credentials: self._update_credential(credential, gmail) except User.DoesNotExist: raise CommandError(f"未找到用户 {email}") else: self.stdout.write("请提供--email参数或--all参数") def _update_credential(self, credential, gmail=None): """更新单个凭证""" user = credential.user self.stdout.write(f"正在更新用户 {user.email} 的Gmail凭证...") if gmail: # 如果指定了Gmail邮箱,直接使用 credential.gmail_email = gmail credential.save() self.stdout.write(self.style.SUCCESS(f"已手动设置Gmail邮箱为: {gmail}")) return # 尝试使用API获取Gmail邮箱 try: # 从凭证数据中恢复服务 creds = pickle.loads(credential.credentials) if creds and not creds.invalid: # 创建Gmail集成实例 integration = GmailIntegration(user=user) integration.credentials = creds # 尝试调用API获取用户资料 profile = integration.gmail_service.users().getProfile(userId='me').execute() gmail_email = profile.get('emailAddress') if gmail_email: credential.gmail_email = gmail_email credential.save() self.stdout.write(self.style.SUCCESS(f"已更新Gmail邮箱为: {gmail_email}")) else: self.stdout.write(self.style.WARNING("无法从API获取Gmail邮箱")) else: self.stdout.write(self.style.ERROR("凭证无效,请重新授权")) except Exception as e: self.stdout.write(self.style.ERROR(f"更新失败: {str(e)}"))