schema.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import uuid
  2. from datetime import datetime
  3. from typing import Optional
  4. from ninja import Field, ModelSchema
  5. from pydantic import RootModel
  6. from apps.organizations_ext.schema import OrganizationSchema
  7. from glitchtip.schema import CamelSchema
  8. from .models import Project, ProjectKey
  9. class NameSlugProjectSchema(CamelSchema, ModelSchema):
  10. class Meta:
  11. model = Project
  12. fields = [
  13. "name",
  14. "slug",
  15. ]
  16. class ProjectIn(NameSlugProjectSchema):
  17. platform: Optional[str] = None # This shouldn't be needed, but is.
  18. class Meta(NameSlugProjectSchema.Meta):
  19. model = Project
  20. fields = [
  21. "name",
  22. "slug",
  23. "platform",
  24. # "default_rules",
  25. ]
  26. class ProjectSchema(NameSlugProjectSchema, ModelSchema):
  27. """
  28. A project is an organizational unit for GlitchTip events. It may contain
  29. DSN keys, be connected to exactly one organization, and provide user permissions
  30. through teams.
  31. """
  32. avatar: dict[str, Optional[str]] = {"avatarType": "", "avatarUuid": None}
  33. color: str = ""
  34. features: list = []
  35. has_access: bool = True
  36. is_bookmarked: bool = False
  37. is_internal: bool = False
  38. is_member: bool
  39. is_public: bool = False
  40. scrub_ip_addresses: bool = Field(serialization_alias="scrubIPAddresses")
  41. created: datetime = Field(serialization_alias="dateCreated")
  42. platform: Optional[str] = None
  43. class Meta(NameSlugProjectSchema.Meta):
  44. fields = [
  45. "first_event",
  46. "id",
  47. "name",
  48. "scrub_ip_addresses",
  49. "slug",
  50. "created",
  51. "platform",
  52. "event_throttle_rate", # Not in Sentry OSS
  53. ]
  54. class Config(CamelSchema.Config):
  55. pass
  56. class KeyRateLimit(CamelSchema):
  57. window: int
  58. count: int
  59. class ProjectKeyIn(CamelSchema, ModelSchema):
  60. name: Optional[str] = None
  61. rate_limit: Optional[KeyRateLimit] = None
  62. class Meta:
  63. model = ProjectKey
  64. fields = ["name"]
  65. class ProjectKeyUpdate(ProjectKeyIn):
  66. rate_limit: Optional[KeyRateLimit] = None
  67. class Meta(ProjectKeyIn.Meta):
  68. fields = ["name", "is_active"]
  69. class ProjectKeySchema(ProjectKeyUpdate):
  70. """
  71. A project key (DSN) provides a public authentication string used for event
  72. ingestion.
  73. """
  74. date_created: datetime = Field(validation_alias="created")
  75. id: uuid.UUID = Field(validation_alias="public_key")
  76. dsn: dict[str, str]
  77. label: Optional[str] = Field(validation_alias="name")
  78. public: uuid.UUID = Field(validation_alias="public_key")
  79. project_id: int = Field(validation_alias="project_id")
  80. class Meta(ProjectKeyUpdate.Meta):
  81. pass
  82. @staticmethod
  83. def resolve_dsn(obj):
  84. return {
  85. "public": obj.get_dsn(),
  86. "secret": obj.get_dsn(), # Deprecated but required for @sentry/wizard
  87. "security": obj.get_dsn_security(),
  88. }
  89. @staticmethod
  90. def resolve_rate_limit(obj):
  91. if count := obj.rate_limit_count:
  92. return {"window": obj.rate_limit_window, "count": count}
  93. class ProjectOrganizationSchema(ProjectSchema):
  94. organization: OrganizationSchema
  95. class Meta(ProjectSchema.Meta):
  96. pass
  97. class ProjectWithKeysSchema(ProjectOrganizationSchema):
  98. keys: list[ProjectKeySchema] = Field(validation_alias="projectkey_set")
  99. class StrKeyIntValue(RootModel):
  100. root: dict[str, int]