You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Django/doc/oauth/models.py

99 lines
4.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Create your models here.
# 导入Django配置、模型相关模块及工具类
from django.conf import settings
from django.core.exceptions import ValidationError # 用于数据验证抛出异常
from django.db import models
from django.utils.timezone import now # 用于获取当前时间
from django.utils.translation import gettext_lazy as _ # 用于国际化翻译
class OAuthUser(models.Model):
"""
OAuthUser模型存储通过第三方OAuth登录的用户信息
关联本地用户模型,记录第三方平台的用户标识、昵称、头像等核心信息
"""
# 关联本地用户模型AUTH_USER_MODEL可为空级联删除
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
verbose_name=_('author'), # 国际化字段名:作者/用户
blank=True, # 表单提交时可空
null=True, # 数据库中可空
on_delete=models.CASCADE) # 关联用户删除时,该记录同步删除
# 第三方平台用户唯一标识如微博、GitHub的openid
openid = models.CharField(max_length=50)
# 用户昵称,支持国际化显示
nickname = models.CharField(max_length=50, verbose_name=_('nick name'))
# 第三方平台访问令牌,可为空
token = models.CharField(max_length=150, null=True, blank=True)
# 用户头像图片URL可为空
picture = models.CharField(max_length=350, blank=True, null=True)
# OAuth登录平台类型如weibo、github非空
type = models.CharField(blank=False, null=False, max_length=50)
# 用户邮箱,可为空
email = models.CharField(max_length=50, null=True, blank=True)
# 额外元数据(存储第三方返回的其他信息),文本类型,可为空
metadata = models.TextField(null=True, blank=True)
# 创建时间,默认当前时间,支持国际化
creation_time = models.DateTimeField(_('creation time'), default=now)
# 最后修改时间,默认当前时间,支持国际化
last_modify_time = models.DateTimeField(_('last modify time'), default=now)
def __str__(self):
"""模型实例的字符串表示:返回用户昵称"""
return self.nickname
class Meta:
verbose_name = _('oauth user') # 模型单数显示名(国际化)
verbose_name_plural = verbose_name # 模型复数显示名(与单数一致)
ordering = ['-creation_time'] # 排序规则:按创建时间倒序
class OAuthConfig(models.Model):
"""
OAuthConfig模型存储第三方OAuth登录的平台配置信息
记录各平台的AppKey、AppSecret、回调地址等核心配置
"""
# 第三方平台类型选项元组形式用于choices参数
TYPE = (
('weibo', _('weibo')), # 微博(支持国际化)
('google', _('google')), # 谷歌(支持国际化)
('github', 'GitHub'), # GitHub固定显示
('facebook', 'FaceBook'), # FaceBook固定显示
('qq', 'QQ'), # QQ固定显示
)
# 平台类型关联TYPE选项默认值为'a',支持国际化
type = models.CharField(_('type'), max_length=10, choices=TYPE, default='a')
# 应用AppKey第三方平台分配的客户端ID
appkey = models.CharField(max_length=200, verbose_name='AppKey')
# 应用AppSecret第三方平台分配的客户端密钥
appsecret = models.CharField(max_length=200, verbose_name='AppSecret')
# 回调地址OAuth授权成功后的跳转地址非空默认空字符串支持国际化
callback_url = models.CharField(
max_length=200,
verbose_name=_('callback url'),
blank=False, # 表单提交时不可空
default='')
# 是否启用该配置,默认启用,非空
is_enable = models.BooleanField(
_('is enable'), default=True, blank=False, null=False)
# 创建时间,默认当前时间,支持国际化
creation_time = models.DateTimeField(_('creation time'), default=now)
# 最后修改时间,默认当前时间,支持国际化
last_modify_time = models.DateTimeField(_('last modify time'), default=now)
def clean(self):
"""数据验证方法:确保同一平台类型的配置不重复"""
# 排除当前记录(编辑时),查询是否已存在同类型的配置
if OAuthConfig.objects.filter(
type=self.type).exclude(id=self.id).count():
# 抛出验证异常,提示该平台配置已存在
raise ValidationError(_(self.type + _('already exists')))
def __str__(self):
"""模型实例的字符串表示:返回平台类型"""
return self.type
class Meta:
verbose_name = 'oauth配置' # 模型单数显示名(中文)
verbose_name_plural = verbose_name # 模型复数显示名(与单数一致)
ordering = ['-creation_time'] # 排序规则:按创建时间倒序