80 lines
3.3 KiB
Python
80 lines
3.3 KiB
Python
![]() |
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)}"))
|