models.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. """Django ORM models for Social Auth"""
  2. import six
  3. from django.db import models
  4. from django.conf import settings
  5. from django.db.utils import IntegrityError
  6. from social_core.utils import setting_name
  7. from .compat import get_rel_model
  8. from .storage import DjangoUserMixin, DjangoAssociationMixin, \
  9. DjangoNonceMixin, DjangoCodeMixin, \
  10. DjangoPartialMixin, BaseDjangoStorage
  11. from .fields import JSONField
  12. from .managers import UserSocialAuthManager
  13. USER_MODEL = getattr(settings, setting_name('USER_MODEL'), None) or \
  14. getattr(settings, 'AUTH_USER_MODEL', None) or \
  15. 'auth.User'
  16. UID_LENGTH = getattr(settings, setting_name('UID_LENGTH'), 255)
  17. EMAIL_LENGTH = getattr(settings, setting_name('EMAIL_LENGTH'), 254)
  18. NONCE_SERVER_URL_LENGTH = getattr(
  19. settings, setting_name('NONCE_SERVER_URL_LENGTH'), 255)
  20. ASSOCIATION_SERVER_URL_LENGTH = getattr(
  21. settings, setting_name('ASSOCIATION_SERVER_URL_LENGTH'), 255)
  22. ASSOCIATION_HANDLE_LENGTH = getattr(
  23. settings, setting_name('ASSOCIATION_HANDLE_LENGTH'), 255)
  24. class AbstractUserSocialAuth(models.Model, DjangoUserMixin):
  25. """Abstract Social Auth association model"""
  26. user = models.ForeignKey(USER_MODEL, related_name='social_auth',
  27. on_delete=models.CASCADE)
  28. provider = models.CharField(max_length=32)
  29. uid = models.CharField(max_length=UID_LENGTH, db_index=True)
  30. extra_data = JSONField()
  31. created = models.DateTimeField(auto_now_add=True)
  32. modified = models.DateTimeField(auto_now=True)
  33. objects = UserSocialAuthManager()
  34. def __str__(self):
  35. return str(self.user)
  36. class Meta:
  37. app_label = "social_django"
  38. abstract = True
  39. @classmethod
  40. def get_social_auth(cls, provider, uid):
  41. try:
  42. return cls.objects.select_related('user').get(provider=provider,
  43. uid=uid)
  44. except cls.DoesNotExist:
  45. return None
  46. @classmethod
  47. def username_max_length(cls):
  48. username_field = cls.username_field()
  49. field = cls.user_model()._meta.get_field(username_field)
  50. return field.max_length
  51. @classmethod
  52. def user_model(cls):
  53. user_model = get_rel_model(field=cls._meta.get_field('user'))
  54. return user_model
  55. class UserSocialAuth(AbstractUserSocialAuth):
  56. """Social Auth association model"""
  57. class Meta:
  58. """Meta data"""
  59. app_label = "social_django"
  60. unique_together = ('provider', 'uid')
  61. db_table = 'social_auth_usersocialauth'
  62. class Nonce(models.Model, DjangoNonceMixin):
  63. """One use numbers"""
  64. server_url = models.CharField(max_length=NONCE_SERVER_URL_LENGTH)
  65. timestamp = models.IntegerField()
  66. salt = models.CharField(max_length=65)
  67. class Meta:
  68. app_label = "social_django"
  69. unique_together = ('server_url', 'timestamp', 'salt')
  70. db_table = 'social_auth_nonce'
  71. class Association(models.Model, DjangoAssociationMixin):
  72. """OpenId account association"""
  73. server_url = models.CharField(max_length=ASSOCIATION_SERVER_URL_LENGTH)
  74. handle = models.CharField(max_length=ASSOCIATION_HANDLE_LENGTH)
  75. secret = models.CharField(max_length=255) # Stored base64 encoded
  76. issued = models.IntegerField()
  77. lifetime = models.IntegerField()
  78. assoc_type = models.CharField(max_length=64)
  79. class Meta:
  80. app_label = "social_django"
  81. db_table = 'social_auth_association'
  82. unique_together = (
  83. ('server_url', 'handle',)
  84. )
  85. class Code(models.Model, DjangoCodeMixin):
  86. email = models.EmailField(max_length=EMAIL_LENGTH)
  87. code = models.CharField(max_length=32, db_index=True)
  88. verified = models.BooleanField(default=False)
  89. timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
  90. class Meta:
  91. app_label = "social_django"
  92. db_table = 'social_auth_code'
  93. unique_together = ('email', 'code')
  94. class Partial(models.Model, DjangoPartialMixin):
  95. token = models.CharField(max_length=32, db_index=True)
  96. next_step = models.PositiveSmallIntegerField(default=0)
  97. backend = models.CharField(max_length=32)
  98. data = JSONField()
  99. timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
  100. class Meta:
  101. app_label = "social_django"
  102. db_table = 'social_auth_partial'
  103. class DjangoStorage(BaseDjangoStorage):
  104. user = UserSocialAuth
  105. nonce = Nonce
  106. association = Association
  107. code = Code
  108. partial = Partial
  109. @classmethod
  110. def is_integrity_error(cls, exception):
  111. return exception.__class__ is IntegrityError