schema.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import hashlib
  2. import hmac
  3. from datetime import datetime
  4. from allauth.account.models import EmailAddress
  5. from allauth.socialaccount.models import SocialAccount
  6. from django.conf import settings
  7. from ninja import Field, ModelSchema
  8. from pydantic import EmailStr
  9. from glitchtip.schema import CamelSchema
  10. from .models import User
  11. class SocialAccountSchema(CamelSchema, ModelSchema):
  12. email: EmailStr | None
  13. username: str | None
  14. class Meta:
  15. model = SocialAccount
  16. fields = (
  17. "id",
  18. "provider",
  19. "uid",
  20. "last_login",
  21. "date_joined",
  22. )
  23. @staticmethod
  24. def resolve_email(obj):
  25. if data := obj.extra_data:
  26. # MS oauth uses both principal name and mail
  27. return (
  28. data.get("email") or data.get("userPrincipalName") or data.get("mail")
  29. )
  30. @staticmethod
  31. def resolve_username(obj):
  32. if data := obj.extra_data:
  33. return data.get("username")
  34. class UserIn(CamelSchema, ModelSchema):
  35. class Meta:
  36. model = User
  37. fields = [
  38. "name",
  39. "options",
  40. ]
  41. class UserSchema(CamelSchema, ModelSchema):
  42. id: str
  43. username: EmailStr = Field(validation_alias="email")
  44. created: datetime = Field(serialization_alias="dateJoined")
  45. email: EmailStr
  46. has_password_auth: bool = Field(validation_alias="has_usable_password")
  47. identities: list[SocialAccountSchema] = Field(validation_alias="socialaccount_set")
  48. class Meta(UserIn.Meta):
  49. fields = [
  50. "last_login",
  51. "is_superuser",
  52. # "emails",
  53. "id",
  54. "is_active",
  55. "name",
  56. "email",
  57. "options",
  58. ]
  59. @staticmethod
  60. def resolve_id(obj):
  61. return str(obj.id)
  62. class UserDetailSchema(UserSchema):
  63. chatwoot_identifier_hash: str | None = None
  64. @staticmethod
  65. def resolve_chatwoot_identifier_hash(obj):
  66. if settings.CHATWOOT_WEBSITE_TOKEN and settings.CHATWOOT_IDENTITY_TOKEN:
  67. secret = bytes(settings.CHATWOOT_IDENTITY_TOKEN, "utf-8")
  68. message = bytes(str(obj.id), "utf-8")
  69. hash = hmac.new(secret, message, hashlib.sha256)
  70. return hash.hexdigest()
  71. class EmailAddressIn(CamelSchema, ModelSchema):
  72. email: EmailStr
  73. class Meta:
  74. model = EmailAddress
  75. fields = ["email"]
  76. class EmailAddressSchema(CamelSchema, ModelSchema):
  77. isPrimary: bool = Field(validation_alias="primary")
  78. isVerified: bool = Field(validation_alias="verified")
  79. class Meta(EmailAddressIn.Meta):
  80. pass
  81. class UserNotificationsSchema(CamelSchema, ModelSchema):
  82. class Meta:
  83. model = User
  84. fields = ("subscribe_by_default",)
  85. class RecoveryCodesSchema(CamelSchema):
  86. codes: list[str]
  87. class RecoveryCodeSchema(CamelSchema):
  88. code: str