class StockResponseModel(BaseModel):
    activationCodesExpirationDatetime: Optional[datetime]
    hasActivationCodes: bool
    beginningDatetime: Optional[datetime]
    bookingLimitDatetime: Optional[datetime]
    dnBookedQuantity: int = Field(alias="bookingsQuantity")
    dateCreated: datetime
    dateModified: datetime
    id: str
    isEventDeletable: bool
    isEventExpired: bool
    offerId: str
    price: float
    quantity: Optional[int]

    _humanize_id = humanize_field("id")
    _humanize_offer_id = humanize_field("offerId")

    @classmethod
    def from_orm(cls, stock: Stock):  # type: ignore
        activation_code = (ActivationCode.query.filter(
            ActivationCode.stockId == stock.id).first()
                           if stock.canHaveActivationCodes else None)
        stock.hasActivationCodes = bool(activation_code)
        stock.activationCodesExpirationDatetime = activation_code.expirationDate if activation_code else None
        return super().from_orm(stock)

    class Config:
        allow_population_by_field_name = True
        arbitrary_types_allowed = True
        json_encoders = {datetime: format_into_utc_date}
        orm_mode = True
Exemplo n.º 2
0
class GetOffererVenueResponseModel(BaseModel):
    address: Optional[str]
    bic: Optional[str]
    bookingEmail: Optional[str]
    city: Optional[str]
    comment: Optional[str]
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    departementCode: Optional[str]
    iban: Optional[str]
    id: str
    idAtProviders: Optional[str]
    isValidated: bool
    isVirtual: bool
    lastProviderId: Optional[str]
    latitude: Optional[float]
    longitude: Optional[float]
    managingOffererId: str
    name: str
    nOffers: int
    postalCode: Optional[str]
    publicName: Optional[str]
    siret: Optional[str]
    venueLabelId: Optional[str]
    venueTypeId: Optional[str]

    _humanize_id = humanize_field("id")
    _humanize_managing_offerer_id = humanize_field("managingOffererId")
    _humanize_venue_label_id = humanize_field("venueLabelId")
    _humanize_venue_type_id = humanize_field("venueTypeId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class GetOfferProductResponseModel(BaseModel):
    ageMax: Optional[int]
    ageMin: Optional[int]
    conditions: Optional[str]
    dateModifiedAtLastProvider: Optional[datetime]
    description: Optional[str]
    durationMinutes: Optional[int]
    extraData: Any
    fieldsUpdated: list[str]
    id: str
    idAtProviders: Optional[str]
    isGcuCompatible: bool
    isNational: bool
    lastProviderId: Optional[str]
    mediaUrls: list[str]
    name: str
    owningOffererId: Optional[str]
    thumbCount: int
    url: Optional[str]

    _humanize_id = humanize_field("id")
    _humanize_last_provider_id = humanize_field("lastProviderId")
    _humanize_owning_offerer_id = humanize_field("owningOffererId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
Exemplo n.º 4
0
class VenueProviderResponse(BaseModel):
    id: str
    idAtProviders: Optional[str]
    dateModifiedAtLastProvider: Optional[datetime]
    isActive: bool
    isFromAllocineProvider: bool
    lastProviderId: Optional[str]
    lastSyncDate: Optional[datetime]
    nOffers: int
    providerId: str
    venueId: str
    venueIdAtOfferProvider: str
    provider: ProviderResponse
    # TODO(asaunier): Check if this field is necessary
    fieldsUpdated: List[str]
    quantity: Optional[int]
    isDuo: Optional[bool]
    price: Optional[float]

    _humanize_id = humanize_field("id")
    _humanize_venue_id = humanize_field("venueId")
    _humanize_provider_id = humanize_field("providerId")

    class Config:
        orm_mode = True
class GetOffererVenueResponseModel(BaseModel):
    address: Optional[str]
    bookingEmail: Optional[str]
    city: Optional[str]
    comment: Optional[str]
    departementCode: Optional[str]
    id: str
    isValidated: bool
    isVirtual: bool
    managingOffererId: str
    name: str
    postalCode: Optional[str]
    publicName: Optional[str]
    venueLabelId: Optional[str]
    venueTypeId: Optional[str]
    withdrawalDetails: Optional[str]
    audioDisabilityCompliant: Optional[bool]
    mentalDisabilityCompliant: Optional[bool]
    motorDisabilityCompliant: Optional[bool]
    visualDisabilityCompliant: Optional[bool]
    _humanize_id = humanize_field("id")
    _humanize_managing_offerer_id = humanize_field("managingOffererId")
    _humanize_venue_label_id = humanize_field("venueLabelId")
    _humanize_venue_type_id = humanize_field("venueTypeId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
Exemplo n.º 6
0
class GetOffererResponseModel(BaseModel):
    address: Optional[str]
    bic: Optional[str]
    city: str
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    demarchesSimplifieesApplicationId: Optional[str]
    fieldsUpdated: List[str]
    iban: Optional[str]
    id: str
    idAtProviders: Optional[str]
    isValidated: bool
    lastProviderId: Optional[str]
    managedVenues: List[GetOffererVenueResponseModel]
    name: str
    nOffers: int
    postalCode: str
    # FIXME (dbaty, 2020-11-09): optional until we populate the database (PC-5693)
    siren: Optional[str]

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class VenueListItemResponseModel(BaseModel):
    id: str
    managingOffererId: str
    name: str
    offererName: str
    publicName: Optional[str]
    isVirtual: bool
    bookingEmail: Optional[str]
    withdrawalDetails: Optional[str]
    audioDisabilityCompliant: Optional[bool]
    mentalDisabilityCompliant: Optional[bool]
    motorDisabilityCompliant: Optional[bool]
    visualDisabilityCompliant: Optional[bool]

    _humanize_id = humanize_field("id")
    _humanize_managing_offerer_id = humanize_field("managingOffererId")
Exemplo n.º 8
0
class PatchUserResponseModel(BaseModel):
    id: str
    email: EmailStr
    publicName: str
    postalCode: str
    phoneNumber: Optional[str]
    departementCode: str
    activity: Optional[str]
    address: Optional[str]
    isBeneficiary: bool
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    firstName: Optional[str]
    hasOffers: bool
    hasPhysicalVenues: bool
    isAdmin: bool
    lastConnectionDate: Optional[datetime]
    lastName: Optional[str]
    needsToFillCulturalSurvey: bool

    _normalize_id = humanize_field("id")

    class Config:
        json_encoders = {datetime: format_into_utc_date}
        orm_mode = True
        alias_generator = to_camel
        allow_population_by_field_name = True
        arbitrary_types_allowed = True
Exemplo n.º 9
0
class SharedLoginUserResponseModel(BaseModel):
    activity: Optional[str]
    address: Optional[str]
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    departementCode: str
    email: str
    firstName: Optional[str]
    hasAllowedRecommendations: bool
    hasOffers: Optional[bool]
    hasPhysicalVenues: Optional[bool]
    hasSeenProTutorials: Optional[bool]
    id: str
    isAdmin: bool
    isBeneficiary: bool
    isEmailValidated: bool
    lastConnectionDate: Optional[str]
    lastName: Optional[str]
    needsToFillCulturalSurvey: Optional[bool]
    phoneNumber: Optional[str]
    postalCode: Optional[str]
    publicName: Optional[str]

    _normalize_id = humanize_field("id")

    class Config:
        json_encoders = {datetime: format_into_utc_date}
        orm_mode = True
        alias_generator = to_camel
        allow_population_by_field_name = True
        arbitrary_types_allowed = True
class MediationResponseIdModel(BaseModel):
    id: str

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
Exemplo n.º 11
0
class GetOffererNameResponseModel(BaseModel):
    id: str
    name: str

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
Exemplo n.º 12
0
class VenueLabelResponseModel(BaseModel):
    id: str
    label: str

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
Exemplo n.º 13
0
class OfferResponseIdModel(BaseModel):
    id: str

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
        allow_population_by_field_name = True
        arbitrary_types_allowed = True
class GetOfferStockResponseModel(BaseModel):
    beginningDatetime: Optional[datetime]
    bookingLimitDatetime: Optional[datetime]
    dnBookedQuantity: int = Field(alias="bookingsQuantity")
    cancellationLimitDate: Optional[datetime]
    dateCreated: datetime
    dateModified: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    fieldsUpdated: list[str]
    hasActivationCode: bool
    id: str
    idAtProviders: Optional[str]
    isBookable: bool
    isEventDeletable: bool
    isEventExpired: bool
    isSoftDeleted: bool
    lastProviderId: Optional[str]
    offerId: str
    price: float
    quantity: Optional[int]
    remainingQuantity: Optional[Union[int, str]]

    _humanize_id = humanize_field("id")
    _humanize_last_provider_id = humanize_field("lastProviderId")
    _humanize_offer_id = humanize_field("offerId")

    @classmethod
    def from_orm(cls, stock: Stock):  # type: ignore
        # here we have N+1 requests (for each stock we query an activation code)
        # but it should be more efficient than loading all activationCodes of all stocks
        stock.hasActivationCode = (
            stock.canHaveActivationCodes and offers_repository.get_available_activation_code(stock) is not None
        )
        return super().from_orm(stock)

    @validator("cancellationLimitDate", pre=True, always=True)
    def validate_cancellation_limit_date(cls, cancellation_limit_date, values):  # pylint: disable=no-self-argument
        return compute_cancellation_limit_date(values.get("beginningDatetime"), datetime.now())

    class Config:
        allow_population_by_field_name = True
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class GetVenueResponseModel(BaseModel):
    address: Optional[str]
    bic: Optional[str]
    bookingEmail: Optional[str]
    city: Optional[str]
    comment: Optional[str]
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    demarchesSimplifieesApplicationId: Optional[str]
    departementCode: Optional[str]
    fieldsUpdated: list[str]
    iban: Optional[str]
    id: str
    idAtProviders: Optional[str]
    isValidated: bool
    isVirtual: bool
    lastProviderId: Optional[str]
    latitude: Optional[float]
    longitude: Optional[float]
    managingOfferer: GetVenueManagingOffererResponseModel
    managingOffererId: str
    name: str
    postalCode: Optional[str]
    publicName: Optional[str]
    siret: Optional[str]
    venueLabelId: Optional[str]
    venueTypeId: Optional[str]
    withdrawalDetails: Optional[str]
    description: Optional[VenueDescription]  # type: ignore
    audioDisabilityCompliant: Optional[bool]
    mentalDisabilityCompliant: Optional[bool]
    motorDisabilityCompliant: Optional[bool]
    visualDisabilityCompliant: Optional[bool]
    contact: Optional[VenueContactModel]

    _humanize_id = humanize_field("id")
    _humanize_managing_offerer_id = humanize_field("managingOffererId")
    _humanize_venue_label_id = humanize_field("venueLabelId")
    _humanize_venue_type_id = humanize_field("venueTypeId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
Exemplo n.º 16
0
class StockResponseModel(BaseModel):
    beginningDatetime: Optional[datetime]
    bookingLimitDatetime: Optional[datetime]
    bookingsQuantity: int
    dateCreated: datetime
    dateModified: datetime
    id: str
    isEventDeletable: bool
    isEventExpired: bool
    offerId: str
    price: float
    quantity: Optional[int]

    _humanize_id = humanize_field("id")
    _humanize_offer_id = humanize_field("offerId")

    class Config:
        json_encoders = {datetime: format_into_utc_date}
        orm_mode = True
Exemplo n.º 17
0
class ProviderResponse(BaseModel):
    name: str
    enabledForPro: bool
    id: str
    isActive: bool
    localClass: Optional[str]

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
class GetOfferMediationResponseModel(BaseModel):
    authorId: Optional[str]
    credit: Optional[str]
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    fieldsUpdated: list[str]
    id: str
    idAtProviders: Optional[str]
    isActive: bool
    lastProviderId: Optional[str]
    offerId: str
    thumbCount: int
    thumbUrl: Optional[str]

    _humanize_id = humanize_field("id")
    _humanize_offer_id = humanize_field("offerId")
    _humanize_last_provider_id = humanize_field("lastProviderId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class GetOfferVenueResponseModel(BaseModel):
    address: Optional[str]
    bookingEmail: Optional[str]
    city: Optional[str]
    comment: Optional[str]
    dateCreated: Optional[datetime]
    dateModifiedAtLastProvider: Optional[datetime]
    departementCode: Optional[str]
    fieldsUpdated: list[str]
    id: str
    idAtProviders: Optional[str]
    isValidated: bool
    isVirtual: bool
    lastProviderId: Optional[str]
    latitude: Optional[float]
    longitude: Optional[float]
    managingOfferer: GetOfferManagingOffererResponseModel
    managingOffererId: str
    name: str
    postalCode: Optional[str]
    publicName: Optional[str]
    siret: Optional[str]
    thumbCount: int
    venueLabelId: Optional[str]
    venueTypeId: Optional[str]
    audioDisabilityCompliant: Optional[bool]
    mentalDisabilityCompliant: Optional[bool]
    motorDisabilityCompliant: Optional[bool]
    visualDisabilityCompliant: Optional[bool]

    _humanize_id = humanize_field("id")
    _humanize_managing_offerer_id = humanize_field("managingOffererId")
    _humanize_last_provider_id = humanize_field("lastProviderId")
    _humanize_venue_label_id = humanize_field("venueLabelId")
    _humanize_venue_type_id = humanize_field("venueTypeId")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class GetOfferManagingOffererResponseModel(BaseModel):
    address: Optional[str]
    city: str
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    fieldsUpdated: list[str]
    id: str
    idAtProviders: Optional[str]
    isActive: bool
    isValidated: bool
    lastProviderId: Optional[str]
    name: str
    postalCode: str
    # FIXME (dbaty, 2020-11-09): optional until we populate the database (PC-5693)
    siren: Optional[str]
    thumbCount: int

    _humanize_id = humanize_field("id")
    _humanize_last_provider_id = humanize_field("lastProviderId")

    class Config:
        orm_mode = True
class GetOffererResponseModel(BaseModel):
    address: Optional[str]
    apiKey: OffererApiKey
    bic: Optional[str]
    city: str
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    demarchesSimplifieesApplicationId: Optional[str]
    fieldsUpdated: list[str]
    hasDigitalVenueAtLeastOneOffer: bool
    hasMissingBankInformation: bool
    iban: Optional[str]
    id: str
    idAtProviders: Optional[str]
    isValidated: bool
    lastProviderId: Optional[str]
    managedVenues: list[GetOffererVenueResponseModel]
    name: str
    postalCode: str
    # FIXME (dbaty, 2020-11-09): optional until we populate the database (PC-5693)
    siren: Optional[str]

    _humanize_id = humanize_field("id")

    @classmethod
    def from_orm(cls,
                 offerer: Offerer,
                 venue_stats_by_ids: Optional[Dict[
                     int, VenueStatsResponseModel]] = None):  # type: ignore
        offerer.apiKey = {
            "maxAllowed": settings.MAX_API_KEY_PER_OFFERER,
            "prefixes": get_api_key_prefixes(offerer.id),
        }
        if venue_stats_by_ids:
            for managedVenue in offerer.managedVenues:
                managedVenue.stats = venue_stats_by_ids[managedVenue.id]

        offerer.hasDigitalVenueAtLeastOneOffer = has_digital_venue_with_at_least_one_offer(
            offerer.id)
        offerer.hasMissingBankInformation = not offerer.demarchesSimplifieesApplicationId and (
            has_physical_venue_without_draft_or_accepted_bank_information(
                offerer.id) or offerer.hasDigitalVenueAtLeastOneOffer)
        return super().from_orm(offerer)

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
Exemplo n.º 22
0
class BeneficiaryAccountResponse(BaseModel):
    pk: int  # id not humanized
    activity: Optional[str]
    address: Optional[str]
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    departementCode: Optional[str]
    deposit_version: Optional[int]
    domainsCredit: Optional[DomainsCredit]
    email: str
    firstName: Optional[str]
    hasPhysicalVenues: bool
    id: str
    isActive: bool
    isAdmin: bool
    isBeneficiary: bool
    isEmailValidated: bool
    lastName: Optional[str]
    needsToFillCulturalSurvey: bool
    needsToSeeTutorials: bool
    phoneNumber: Optional[str]
    postalCode: Optional[str]
    publicName: str
    suspensionReason: Optional[str]
    wallet_balance: float
    deposit_expiration_date: Optional[datetime]
    wallet_is_activated: bool
    roles: list[UserRole]

    _humanize_id = humanize_field("id")

    @classmethod
    def from_orm(cls, user: User):  # type: ignore
        user.pk = user.id
        user.domainsCredit = get_domains_credit(user)
        result = super().from_orm(user)
        result.isBeneficiary = user.is_beneficiary
        return result

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
        use_enum_values = True
Exemplo n.º 23
0
class SharedCurrentUserResponseModel(BaseModel):

    activity: Optional[str]
    address: Optional[str]
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    departementCode: Optional[str]
    email: str
    externalIds: Optional[typing.Dict]
    firstName: Optional[str]
    hasCompletedIdCheck: Optional[bool]
    hasPhysicalVenues: Optional[bool]
    hasSeenProTutorials: Optional[bool]
    id: str
    idPieceNumber: Optional[str]
    isAdmin: bool
    isBeneficiary: bool
    isEmailValidated: bool
    lastConnectionDate: Optional[datetime]
    lastName: Optional[str]
    needsToFillCulturalSurvey: Optional[bool]
    notificationSubscriptions: Optional[typing.Dict]
    phoneNumber: Optional[str]
    phoneValidationStatus: Optional[user_models.PhoneValidationStatusType]
    postalCode: Optional[str]
    publicName: Optional[str]
    roles: list[user_models.UserRole]

    _normalize_id = humanize_field("id")

    class Config:
        json_encoders = {datetime: format_into_utc_date}
        alias_generator = to_camel
        orm_mode = True

    @classmethod
    def from_orm(cls, user):
        result = super().from_orm(user)
        result.isBeneficiary = user.is_beneficiary
        return result
Exemplo n.º 24
0
class SharedLoginUserResponseModel(BaseModel):
    activity: Optional[str]
    address: Optional[str]
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    departementCode: Optional[str]
    email: str
    firstName: Optional[str]
    hasPhysicalVenues: Optional[bool]
    hasSeenProTutorials: Optional[bool]
    id: str
    isAdmin: bool
    isBeneficiary: bool
    isEmailValidated: bool
    lastConnectionDate: Optional[datetime]
    lastName: Optional[str]
    needsToFillCulturalSurvey: Optional[bool]
    phoneNumber: Optional[str]
    postalCode: Optional[str]
    publicName: Optional[str]
    roles: list[user_models.UserRole]

    _normalize_id = humanize_field("id")

    class Config:
        json_encoders = {datetime: format_into_utc_date}
        orm_mode = True
        alias_generator = to_camel
        allow_population_by_field_name = True
        arbitrary_types_allowed = True
        use_enum_values = True

    @classmethod
    def from_orm(cls, user):
        result = super().from_orm(user)
        result.isBeneficiary = user.is_beneficiary
        return result
Exemplo n.º 25
0
class BeneficiaryAccountResponse(BaseModel):
    activity: Optional[str]
    address: Optional[str]
    city: Optional[str]
    civility: Optional[str]
    dateCreated: datetime
    dateOfBirth: Optional[datetime]
    departementCode: str
    deposit_version: Optional[int]
    email: str
    expenses: List[Expense]
    # @debt api-data "asaunier: Seuls quelques comptes n'ont pas cette information. Elle devrait être rendue obligatoire"
    firstName: Optional[str]
    hasAllowedRecommendations: bool
    hasPhysicalVenues: bool
    id: str
    isActive: bool
    isAdmin: bool
    isBeneficiary: bool
    isEmailValidated: bool
    # @debt api-data "asaunier: Seuls quelques comptes n'ont pas cette information. Elle devrait être rendue obligatoire"
    lastName: Optional[str]
    needsToFillCulturalSurvey: bool
    needsToSeeTutorials: bool
    phoneNumber: Optional[str]
    postalCode: Optional[str]
    publicName: str
    suspensionReason: Optional[str]
    wallet_balance: float
    deposit_expiration_date: Optional[datetime]
    wallet_is_activated: bool

    _humanize_id = humanize_field("id")

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
class GetOfferResponseModel(BaseModel):
    activeMediation: Optional[GetOfferMediationResponseModel]
    ageMax: Optional[int]
    ageMin: Optional[int]
    bookingEmail: Optional[str]
    conditions: Optional[str]
    dateCreated: datetime
    dateModifiedAtLastProvider: Optional[datetime]
    dateRange: list[datetime]
    description: Optional[str]
    durationMinutes: Optional[int]
    extraData: Any
    fieldsUpdated: list[str]
    hasBookingLimitDatetimesPassed: bool
    id: str
    idAtProviders: Optional[str]
    isActive: bool
    isBookable: bool
    isDigital: bool
    isDuo: bool
    isEditable: bool
    isEducational: bool
    isEvent: bool
    isNational: bool
    isThing: bool
    audioDisabilityCompliant: Optional[bool]
    mentalDisabilityCompliant: Optional[bool]
    motorDisabilityCompliant: Optional[bool]
    nonHumanizedId: int
    visualDisabilityCompliant: Optional[bool]
    lastProvider: Optional[GetOfferLastProviderResponseModel]
    lastProviderId: Optional[str]
    mediaUrls: list[str]
    mediations: list[GetOfferMediationResponseModel]
    name: str
    product: GetOfferProductResponseModel
    productId: str
    stocks: list[GetOfferStockResponseModel]
    subcategoryId: SubcategoryIdEnum
    thumbUrl: Optional[str]
    externalTicketOfficeUrl: Optional[str]
    url: Optional[str]
    venue: GetOfferVenueResponseModel
    venueId: str
    withdrawalDetails: Optional[str]
    status: OfferStatus

    _humanize_id = humanize_field("id")
    _humanize_product_id = humanize_field("productId")
    _humanize_venue_id = humanize_field("venueId")
    _humanize_last_provider_id = humanize_field("lastProviderId")

    @validator("dateRange", pre=True)
    def extract_datetime_list_from_DateTimes_type(  # pylint: disable=no-self-argument
        cls, date_range: DateTimes
    ) -> list[datetime]:
        if isinstance(date_range, DateTimes):
            return date_range.datetimes
        return date_range

    @classmethod
    def from_orm(cls, offer):  # type: ignore
        offer.nonHumanizedId = offer.id
        return super().from_orm(offer)

    class Config:
        orm_mode = True
        json_encoders = {datetime: format_into_utc_date}
        use_enum_values = True
class CreateThumbnailResponseModel(BaseModel):
    id: str

    _humanize_id = humanize_field("id")