64 lines
2.6 KiB
Python
64 lines
2.6 KiB
Python
![]() |
from django.core.management.base import BaseCommand
|
||
|
import logging
|
||
|
import pickle
|
||
|
import json
|
||
|
from user_management.models import GmailCredential
|
||
|
from oauth2client import client
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
help = '修复Gmail凭证数据格式问题'
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
self.stdout.write(self.style.SUCCESS('开始修复Gmail凭证...'))
|
||
|
credentials = GmailCredential.objects.all()
|
||
|
|
||
|
fixed_count = 0
|
||
|
error_count = 0
|
||
|
|
||
|
for cred in credentials:
|
||
|
try:
|
||
|
if not cred.credentials:
|
||
|
self.stdout.write(self.style.WARNING(f'ID {cred.id} 的凭证为空,跳过'))
|
||
|
continue
|
||
|
|
||
|
# 检测当前凭证格式
|
||
|
self.stdout.write(f'处理凭证 ID: {cred.id}, 邮箱: {cred.gmail_email}')
|
||
|
|
||
|
# 1. 尝试作为JSON加载
|
||
|
try:
|
||
|
if isinstance(cred.credentials, str):
|
||
|
# 验证是否为有效JSON
|
||
|
json.loads(cred.credentials)
|
||
|
self.stdout.write(self.style.SUCCESS(f'凭证 {cred.id} 已是有效JSON格式'))
|
||
|
fixed_count += 1
|
||
|
continue
|
||
|
except Exception:
|
||
|
pass
|
||
|
|
||
|
# 2. 尝试从二进制pickle加载并转换为JSON
|
||
|
try:
|
||
|
# 处理可能的pickle格式
|
||
|
if isinstance(cred.credentials, str):
|
||
|
oauth_creds = pickle.loads(cred.credentials.encode('latin1'))
|
||
|
else:
|
||
|
oauth_creds = pickle.loads(cred.credentials)
|
||
|
|
||
|
# 转换为JSON并保存
|
||
|
json_creds = oauth_creds.to_json()
|
||
|
cred.credentials = json_creds
|
||
|
cred.save()
|
||
|
|
||
|
self.stdout.write(self.style.SUCCESS(f'凭证 {cred.id} 已从pickle转换为JSON格式'))
|
||
|
fixed_count += 1
|
||
|
continue
|
||
|
except Exception as e:
|
||
|
self.stdout.write(self.style.ERROR(f'无法处理凭证 {cred.id}: {str(e)}'))
|
||
|
error_count += 1
|
||
|
|
||
|
except Exception as e:
|
||
|
self.stdout.write(self.style.ERROR(f'处理凭证 {cred.id} 时出错: {str(e)}'))
|
||
|
error_count += 1
|
||
|
|
||
|
self.stdout.write(self.style.SUCCESS(f'处理完成! 成功: {fixed_count}, 失败: {error_count}'))
|