Исправить и дополнить модели типов API
Многие модели содержат неполные или упрощенные схемы, не охватывающие все параметры, поддерживаемые API.
В таблице указана часть проблем, обнаруженных в моделях. Другие потенциальные несоответствия (отсутствие опциональных полей, устаревшие поля, неправильные типы и значения по умолчанию) могут быть не учтены.
Обнаруженные расхождения:
| Модель | Поле | Проблема | Предложение |
|---|---|---|---|
| Chat | type | Конфликт с встроенным именем type | Использовать type_: str = Field(alias="type")
|
| type | Строка без ограничения значений | Использовать Literal
|
|
| photo |
dict[str, Any], невалидируемо |
Создать модель ChatPhoto
|
|
| permissions |
dict[str, Any], невалидируемо |
Создать модель ChatPermissions
|
|
| - | Модель не полная | ||
| KeyboardButton | request_user | dict[str, Union[int, bool]] |
Создать модель KeyboardButtonRequestUsers
|
| request_chat | dict[str, Union[int, bool, dict[str, bool]]] |
Создать модель KeyboardButtonRequestChat
|
|
| request_poll | dict[str, str] |
Создать модель KeyboardButtonPollType
|
|
| web_app | dict[str, AnyHttpUrl] |
Создать модель WebAppInfo
|
|
| ReplyKeyboardMarkup | input_field_placeholder | Ошибка - тип bool, должно быть str
|
Использовать str с max_length=64
|
| InlineKeyboardButton | callback_data | Нет ограничения на длину | Добавить max_length=64
|
| web_app | dict | Создать модель WebAppInfo
|
|
| login_url | dict | Создать модель LoginUrl
|
|
| switch_inline_query_chosen_chat | dict | Создать модель SwitchInlineQueryChosenChat
|
|
| callback_game | Any |
Создать модель-заглушку CallbackGame
|
|
| - | Модель не полная | ||
| Invoice | currency | Нет валидации по ISO 4217 | Добавить pattern
|
| total_amount | Нет ограничений | Добавить ge=0
|
|
| ShippingAddress | country_code | Нет валидации по ISO 3166-1 alpha-2 | Добавить pattern
|
| SuccessfulPayment | currency | Нет валидации по ISO 4217 | Добавить pattern
|
| total_amount | Нет ограничений | Добавить ge=0
|
|
| telegram_payment_charge_id | str / None, но не является опциональным | Сделать str
|
|
| provider_payment_charge_id | str / None, но не является опциональным | Сделать str
|
|
| - | Модель не полная | ||
| MessageEntity | type | Обычная строка | Заменить на Literal
|
| offset / length | Нет ограничений | Добавить ge=0
|
|
| Message | мн. поля | Отсутствуют в API | Удалить или пересмотреть |
| is_topic_message | Ошибка: dict[str, Any]
|
Заменить на bool
|
|
| мн. поля | dict[str, Any] | Создать свои модели | |
| pinned_message | Optional[Message] |
Использовать MaybeInaccessibleMessage или InaccessibleMessage
|
|
| - | Модель не полная | Добавить отсутствующие поля | |
| MessageReplyMarkup | - | Модель не используется, отсутствует в API | Возможно удалить |
| InputMediaUrlPhoto | type | Конфликт с встроенным именем | Использовать type_: Literal["photo"] = Field(alias="type")
|
| InputMediaBytesPhoto | type | Аналогично выше | |
| InputMediaUrlDocument | type | Аналогично выше | |
| thumbnail_content | Не используется в этом типе | Удалить | |
| CallbackQuery | id | Конфликт с id()
|
Использовать id_: str = Field(alias="id")
|
| chat_instance | Отмечено как обязательное | Сделать обязательным | |
| def answer |
cache_time не передаётся в модель запроса |
Передать в модель запроса | |
| Location | heading | Нет ограничений | Добавить ge=1, le=360
|
| InlineQuery | query | Нет ограничения | Добавить max_length=256
|
| ChosenInlineResult | query | Опционально, но в документации обязательное | Сделать обязательным |
| PreCheckoutQuery | currency | Нет pattern | Добавить ISO 4217 pattern
|
| PollOption | text | Нет ограничений | Добавить max_length=100
|
| - | Модель не полная | Добавить text_entities: list[MessageEntity]
|
|
| Poll | id / type | Конфликт с встроенными | Использовать Field(alias="id") / Field(alias="type")
|
| type | Свободный текст | Использовать Literal["regular", "quiz"]
|
|
| question | Нет ограничений | Добавить min_length=1, max_length=300
|
|
| explanation | Нет ограничений | Добавить max_length=200
|
|
| - | Модель не полная | Добавить question_entities: list[MessageEntity]
|
|
| PollAnswer | user | Обязательное, но в API опциональное | Сделать опциональным |
| - | Модель не полная | Добавить voter_chat
|
|
| ChatInviteLink | member_limit | Нет ограничений | Добавить ge=1, le=99999
|
| - | Модель не полная | Добавить subscription_period, subscription_price
|
|
| ChatJoinRequest | user_chat_id / date | Нет ограничений | Добавить ge=0
|
| ChatMemberOwner | status | Свободный текст | Использовать Literal["creator"]
|
| custom_title | Обязательное, в API — опциональное | Сделать опциональным | |
| ChatMemberAdministrator | status | Свободный текст | Использовать Literal["administrator"]
|
| can_* | Обязательное, в API — опциональное | Сделать опциональными | |
| custom_title | Ошибка — тип bool
|
Сделать опцианальной строкой | |
| - | Модель не полная | Добавить can_post_stories, can_edit_stories, can_delete_stories
|
|
| ChatMemberMember | status | Свободный текст | Literal["member"] |
| - | Модель не полная | Добавить `until_date: int | |
| ChatMemberRestricted | status | Свободный текст | Literal["restricted"] |
| until_date | Ошибка — тип bool
|
Сделать int
|
|
| ChatMemberLeft | status | Свободный текст | Literal["left"] |
| ChatMemberBanned | status | Свободный текст | Literal["kicked"] |
| until_date | Нет ограничений | Добавить ge=0
|
|
| ChatMemberUpdated | date | Нет ограничений | Добавить ge=0
|
| via_chat_folder_invite_link | Обязательное bool, но тип bool = None
|
Добавить опциональность | |
| - | Модель не полная | Добавить via_join_request
|
|
| Update | update_id | Нет ограничений | Добавить ge=0
|
| - | Модель не полная | Добавить business_connection, business_message, deleted_business_messages, message_reaction, и др. |
|
| ResponseParameters | retry_after | Нет ограничений | Добавить ge=0
|
| migrate_to_chat_id | - | Можно добавить ge=0
|
|
| WebhookInfo | url | Можно использовать тип HttpUrl
|
Обсудить |
| ip_address | Можно усилить валидацию типом IPvAnyAddress
|
Обсудить | |
| last_error_date / sync_error_date | Нет ограничений | Добавить ge=0
|
Edited by Павел Колотов