Source code for pydotorg.domains.sponsors.schemas
"""Sponsors domain Pydantic schemas."""
from __future__ import annotations
import datetime
from typing import Annotated
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
from pydotorg.domains.sponsors.models import SponsorshipStatus
[docs]
class SponsorshipLevelBase(BaseModel):
"""Base sponsorship level schema."""
name: Annotated[str, Field(min_length=1, max_length=200)]
slug: Annotated[str, Field(min_length=1, max_length=200)]
order: int = 0
sponsorship_amount: int = 0
logo_dimension: int | None = None
[docs]
class SponsorshipLevelCreate(BaseModel):
"""Schema for creating a new sponsorship level."""
model_config = ConfigDict(
json_schema_extra={
"example": {
"name": "Visionary",
"slug": "visionary",
"order": 1,
"sponsorship_amount": 150000,
"logo_dimension": 200,
}
}
)
name: Annotated[str, Field(min_length=1, max_length=200)]
slug: Annotated[str, Field(min_length=1, max_length=200)] | None = None
order: int = 0
sponsorship_amount: int = 0
logo_dimension: int | None = None
[docs]
class SponsorshipLevelUpdate(BaseModel):
"""Schema for updating a sponsorship level."""
model_config = ConfigDict(
json_schema_extra={
"example": {
"sponsorship_amount": 175000,
"logo_dimension": 250,
}
}
)
name: Annotated[str, Field(min_length=1, max_length=200)] | None = None
slug: Annotated[str, Field(min_length=1, max_length=200)] | None = None
order: int | None = None
sponsorship_amount: int | None = None
logo_dimension: int | None = None
[docs]
class SponsorshipLevelRead(SponsorshipLevelBase):
"""Schema for reading sponsorship level data."""
model_config = ConfigDict(
from_attributes=True,
json_schema_extra={
"example": {
"id": "550e8400-e29b-41d4-a716-446655440001",
"name": "Visionary",
"slug": "visionary",
"order": 1,
"sponsorship_amount": 150000,
"logo_dimension": 200,
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z",
}
},
)
id: UUID
created_at: datetime.datetime
updated_at: datetime.datetime
[docs]
class SponsorBase(BaseModel):
"""Base sponsor schema."""
name: Annotated[str, Field(min_length=1, max_length=200)]
slug: Annotated[str, Field(min_length=1, max_length=200)]
description: str = ""
landing_page_url: Annotated[str, Field(max_length=500)] = ""
twitter_handle: Annotated[str, Field(max_length=100)] = ""
linked_in_page_url: Annotated[str, Field(max_length=500)] = ""
web_logo: Annotated[str, Field(max_length=500)] = ""
print_logo: Annotated[str, Field(max_length=500)] = ""
primary_phone: Annotated[str, Field(max_length=50)] = ""
mailing_address_line_1: Annotated[str, Field(max_length=255)] = ""
mailing_address_line_2: Annotated[str, Field(max_length=255)] = ""
city: Annotated[str, Field(max_length=100)] = ""
state: Annotated[str, Field(max_length=100)] = ""
postal_code: Annotated[str, Field(max_length=20)] = ""
country: Annotated[str, Field(max_length=100)] = ""
country_of_incorporation: Annotated[str, Field(max_length=100)] = ""
state_of_incorporation: Annotated[str, Field(max_length=100)] = ""
[docs]
class SponsorCreate(BaseModel):
"""Schema for creating a new sponsor."""
model_config = ConfigDict(
json_schema_extra={
"example": {
"name": "Microsoft",
"slug": "microsoft",
"description": "Microsoft is a Visionary sponsor of the PSF",
"landing_page_url": "https://microsoft.com",
"twitter_handle": "Microsoft",
"linked_in_page_url": "https://linkedin.com/company/microsoft",
"web_logo": "/media/sponsors/microsoft-logo.png",
"city": "Redmond",
"state": "Washington",
"postal_code": "98052",
"country": "USA",
}
}
)
name: Annotated[str, Field(min_length=1, max_length=200)]
slug: Annotated[str, Field(min_length=1, max_length=200)] | None = None
description: str = ""
landing_page_url: Annotated[str, Field(max_length=500)] = ""
twitter_handle: Annotated[str, Field(max_length=100)] = ""
linked_in_page_url: Annotated[str, Field(max_length=500)] = ""
web_logo: Annotated[str, Field(max_length=500)] = ""
print_logo: Annotated[str, Field(max_length=500)] = ""
primary_phone: Annotated[str, Field(max_length=50)] = ""
mailing_address_line_1: Annotated[str, Field(max_length=255)] = ""
mailing_address_line_2: Annotated[str, Field(max_length=255)] = ""
city: Annotated[str, Field(max_length=100)] = ""
state: Annotated[str, Field(max_length=100)] = ""
postal_code: Annotated[str, Field(max_length=20)] = ""
country: Annotated[str, Field(max_length=100)] = ""
country_of_incorporation: Annotated[str, Field(max_length=100)] = ""
state_of_incorporation: Annotated[str, Field(max_length=100)] = ""
creator_id: UUID | None = None
[docs]
class SponsorUpdate(BaseModel):
"""Schema for updating a sponsor."""
name: Annotated[str, Field(min_length=1, max_length=200)] | None = None
slug: Annotated[str, Field(min_length=1, max_length=200)] | None = None
description: str | None = None
landing_page_url: Annotated[str, Field(max_length=500)] | None = None
twitter_handle: Annotated[str, Field(max_length=100)] | None = None
linked_in_page_url: Annotated[str, Field(max_length=500)] | None = None
web_logo: Annotated[str, Field(max_length=500)] | None = None
print_logo: Annotated[str, Field(max_length=500)] | None = None
primary_phone: Annotated[str, Field(max_length=50)] | None = None
mailing_address_line_1: Annotated[str, Field(max_length=255)] | None = None
mailing_address_line_2: Annotated[str, Field(max_length=255)] | None = None
city: Annotated[str, Field(max_length=100)] | None = None
state: Annotated[str, Field(max_length=100)] | None = None
postal_code: Annotated[str, Field(max_length=20)] | None = None
country: Annotated[str, Field(max_length=100)] | None = None
country_of_incorporation: Annotated[str, Field(max_length=100)] | None = None
state_of_incorporation: Annotated[str, Field(max_length=100)] | None = None
last_modified_by_id: UUID | None = None
[docs]
class SponsorRead(SponsorBase):
"""Schema for reading sponsor data."""
model_config = ConfigDict(
from_attributes=True,
json_schema_extra={
"example": {
"id": "550e8400-e29b-41d4-a716-446655440010",
"name": "Microsoft",
"slug": "microsoft",
"description": "Microsoft is a Visionary sponsor of the PSF",
"landing_page_url": "https://microsoft.com",
"twitter_handle": "Microsoft",
"linked_in_page_url": "https://linkedin.com/company/microsoft",
"web_logo": "/media/sponsors/microsoft-logo.png",
"print_logo": "",
"primary_phone": "",
"mailing_address_line_1": "",
"mailing_address_line_2": "",
"city": "Redmond",
"state": "Washington",
"postal_code": "98052",
"country": "USA",
"country_of_incorporation": "",
"state_of_incorporation": "",
"created": "2025-01-01T00:00:00Z",
"updated": "2025-01-01T00:00:00Z",
"creator_id": "550e8400-e29b-41d4-a716-446655440000",
"last_modified_by_id": None,
}
},
)
id: UUID
created: datetime.datetime
updated: datetime.datetime
creator_id: UUID | None
last_modified_by_id: UUID | None
[docs]
class SponsorPublic(BaseModel):
"""Public sponsor schema."""
id: UUID
name: str
slug: str
description: str
landing_page_url: str
twitter_handle: str
linked_in_page_url: str
web_logo: str
print_logo: str
model_config = ConfigDict(from_attributes=True)
[docs]
class SponsorshipBase(BaseModel):
"""Base sponsorship schema."""
sponsor_id: UUID
level_id: UUID
status: SponsorshipStatus = SponsorshipStatus.APPLIED
locked: bool = False
start_date: datetime.date | None = None
end_date: datetime.date | None = None
applied_on: datetime.date | None = None
approved_on: datetime.date | None = None
rejected_on: datetime.date | None = None
finalized_on: datetime.date | None = None
year: int | None = None
sponsorship_fee: int = 0
for_modified_package: bool = False
renewal: bool = False
[docs]
class SponsorshipCreate(BaseModel):
"""Schema for creating a new sponsorship."""
sponsor_id: UUID
level_id: UUID
status: SponsorshipStatus = SponsorshipStatus.APPLIED
locked: bool = False
start_date: datetime.date | None = None
end_date: datetime.date | None = None
applied_on: datetime.date | None = None
year: int | None = None
sponsorship_fee: int = 0
for_modified_package: bool = False
renewal: bool = False
submitted_by_id: UUID | None = None
creator_id: UUID | None = None
[docs]
class SponsorshipUpdate(BaseModel):
"""Schema for updating a sponsorship."""
sponsor_id: UUID | None = None
level_id: UUID | None = None
status: SponsorshipStatus | None = None
locked: bool | None = None
start_date: datetime.date | None = None
end_date: datetime.date | None = None
applied_on: datetime.date | None = None
approved_on: datetime.date | None = None
rejected_on: datetime.date | None = None
finalized_on: datetime.date | None = None
year: int | None = None
sponsorship_fee: int | None = None
for_modified_package: bool | None = None
renewal: bool | None = None
last_modified_by_id: UUID | None = None
[docs]
class SponsorshipRead(SponsorshipBase):
"""Schema for reading sponsorship data."""
id: UUID
submitted_by_id: UUID | None
created: datetime.datetime
updated: datetime.datetime
creator_id: UUID | None
last_modified_by_id: UUID | None
model_config = ConfigDict(from_attributes=True)
[docs]
class SponsorshipPublic(BaseModel):
"""Public sponsorship schema."""
id: UUID
sponsor_id: UUID
level_id: UUID
status: SponsorshipStatus
start_date: datetime.date | None
end_date: datetime.date | None
year: int | None
model_config = ConfigDict(from_attributes=True)
[docs]
class SponsorApplicationCreate(BaseModel):
"""Schema for sponsor application form submission."""
model_config = ConfigDict(
json_schema_extra={
"example": {
"company_name": "Acme Corp",
"website": "https://acme.com",
"description": "We love Python!",
"contact_name": "Jane Doe",
"contact_email": "jane@acme.com",
"sponsorship_level": "silver",
}
}
)
company_name: Annotated[str, Field(min_length=1, max_length=200)]
website: Annotated[str, Field(max_length=500)]
description: str
contact_name: Annotated[str, Field(min_length=1, max_length=200)]
contact_email: Annotated[str, Field(min_length=1, max_length=255)]
contact_phone: Annotated[str, Field(max_length=50)] = ""
city: Annotated[str, Field(max_length=100)] = ""
state: Annotated[str, Field(max_length=100)] = ""
postal_code: Annotated[str, Field(max_length=20)] = ""
country: Annotated[str, Field(max_length=100)] = ""
mailing_address: Annotated[str, Field(max_length=255)] = ""
sponsorship_level: str = "partner"
goals: list[str] = []
additional_message: str = ""
twitter_handle: Annotated[str, Field(max_length=100)] = ""
linkedin_url: Annotated[str, Field(max_length=500)] = ""