# Django Telegram Framework
Библиотека (Framework) для быстрого создания **Telegram** ботов и интеграции с django
[Тут][documentation_path] можно найти **Полную документацию проекта**
<hr>
#### Workflows
[](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml)
[](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml)
#### Package
[](https://pypi.python.org/pypi/django-telegram-framework/)
[](https://pypi.python.org/pypi/django-telegram-framework)
[](https://pypi.python.org/pypi/django-telegram-framework/)
[](https://github.com/quillcraftsman/django-telegram-framework/blob/main/LICENSE)
[](https://pypi.python.org/pypi/django-telegram-framework/)
#### Support
[][documentation_path]
[](https://github.com/quillcraftsman/django-telegram-framework/discussions/)
[](https://github.com/quillcraftsman/django-telegram-framework/issues/)
#### Downloads
[](https://pepy.tech/project/django-telegram-framework)
[](https://pepy.tech/project/django-telegram-framework)
[](https://pepy.tech/project/django-telegram-framework)
[](https://pepy.tech/project/django-telegram-framework)
#### Languages
[](https://github.com/quillcraftsman/django-telegram-framework)
[](https://github.com/quillcraftsman/django-telegram-framework)
#### Development
- [](https://github.com/quillcraftsman/django-telegram-framework/releases)
[](https://github.com/quillcraftsman/django-telegram-framework)
- [](https://github.com/quillcraftsman/django-telegram-framework/issues/)
[](https://github.com/quillcraftsman/django-telegram-framework/issues/)
- [](https://github.com/quillcraftsman/django-telegram-framework/pulls)
[](https://github.com/quillcraftsman/django-telegram-framework/pulls)
- [](https://github.com/quillcraftsman/django-telegram-framework/discussions/)
[//]: # (#### Repository Stats)
[//]: # ([
[//]: # ()](https://github.com/quillcraftsman/django-telegram-framework))
[//]: # ([
[//]: # ()](https://github.com/quillcraftsman/django-telegram-frameworkgraphs/contributors))
[//]: # ([
[//]: # ()](https://github.com/quillcraftsman/django-telegram-framework))
<hr>
## Menu
- [Идея проекта](#идея-проекта)
- [Проект с открытым исходным кодом](#проект-с-открытым-исходным-кодом)
- [Отличие от других Telegram проектов](#отличие-от-других-telegram-проектов)
- [Функции библиотеки](#функции-библиотеки)
- [Зависимости](#зависимости)
- [Статус разработки](#статус-разработки)
- [Установка](#установка)
- [Быстрый старт](#быстрый-старт)
- [Тестирование](#тестирование)
- [Внести свой вклад в проект](#внести-свой-вклад-в-проект)
## Идея проекта
Создать удобный и надежный framework для быстрого и удобного создания telegram ботов который:
- Имеет чёткую структуру модулей
- Может использовать разные библиотеки для взаимодействия с telegram (pyTelegramBotAPI, Telethone, python-telegram-bot, aiogram и другие)
- Позволяет быстро реализовать start-up проект одному разработчику или в небольшой команде
- Имеет интеграцию с django для соднаия web страниц и использования django admin
- Быстро подключается к базе данных с помощью Django ORM
## Проект с открытым исходным кодом
Это проект с открытым исходным кодом с лицензией [Happy Code](LICENSE).
- Свободное использование
- создание Forks
- публикация issues и bugs
- contributions
очень приветствуются
## Отличие от других Telegram проектов
В отличие от библиотек для создания telegram ботов, таких как pyTelegramBotAPI, aiogram, python-telegram-bot и других,
этот проект (Framework) имеет чёткую структуру, похожую на структуру django проектов. Framework содержит следующие элементы:
- models - модели данных связанные с базой данных с помощью Django ORM
- actions - обработчики событий telegram bot-а (аналогия с django views)
- links - связь команд и событий бота с обработчиками (аналогия с django urls)
- settings - настройки для всего проекта - django settings
- tests - тесты логики бота с использованием специального Dummy Bot
Под капотом Framework может использовать разные библиотеки в синхронном и асинхронном исполнении. Можно переключать одни библиотеки на другие.
Без соединения с telegram (например в DEV) режиме, можно использовать Dummy Bot для разработки и тестирования.
Интеграция с django позволяет:
- Добавить web site
- Использовать django админку
- Использовать django ORM
## Функции библиотеки
- Интеграция telegram бота в django проект
- Понятная структура и интерфейсы для разработки бота
- Функции автоматического тестирования бота
- Совместимость с синхронным pyTelegramBotAPI
- Совместимость с асинхронным pyTelegramBotAPI (В разработке)
- DummyBot для тестирования и работы без подключения к telegram
- Функции телеграм бота (Будут добавляться по мере надобности, пожалуйста напишите, если вам нужна новая функция)
- Совместимость с aiogram, python-telegram-bot, Telethone (На этапе планирования)
## Зависимости
- django > 5
- pyTelegramBotAPi (Нужно установить отдельно)
- Подробности в [Полной документации](https://quillcraftsman.github.io/django-telegram-framework/about.html#requirements)
## Статус разработки
Написана и проверена 1-ая сырая версия библиотеки с небольшим набором функций
- Пакет уже доступен в [PyPi](https://pypi.org/project/django-telegram-framework/)
- Подробности в [Полной документации](https://quillcraftsman.github.io/django-telegram-framework/about.html#development-status)
## Установка
### with pip
```commandline
pip install django-telegram-framework
```
Подробности в [Полной документации](https://quillcraftsman.github.io/django-telegram-framework/install.html)
## Быстрый старт
1. Создать django проект
2. Создать django приложение
```commandline
python manage.py startapp quickstart
```
3. В приложении создать файл `bot.py`
4. Пример кода в файле `bot.py`
```python
from telegram_framework import (
messages,
actions,
links,
)
# ОПИШИТЕ ОБРАБОТЧИКИ СОБЫТИЙ БОТА
def send_greetings(bot, message):
# Используйте специальный тип для сообщений
greetings_message = messages.Message('Приветствую тебя. Я Quickstart Telegram Bot', sender=bot)
# Отправьте сообщение в телеграмм
return actions.send_message(message.chat, greetings_message)
def reply_to_message(bot, message):
# Используйте специальную функцию для создания ответа
reply = messages.create_reply(message, 'Тебе отвечает Bot', sender=bot)
# Отправьте ответ в телеграмм
return actions.send_reply(reply)
# СВЯЖИТЕ ОБРАБОТЧИКИ С ДЕЙСТВИЯМИ ПОЛЬЗОВАТЕЛЯ В TELEGRAM
bot_links = [
links.on_command(send_greetings, 'start'),
links.on_command(send_greetings, 'help'),
links.on_message(reply_to_message),
]
```
5. В `settings.py` проекта добавить следующие настройки:
```python
TELEGRAM_BOT_TOKEN = '7777777777:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
TELEGRAM_BOT_TYPE = 'pyTelegramBotAPI'
ROOT_BOT_LINKS = 'quickstart.bot'
```
6. Установить `pyTelegramBotAPI`
```commandline
pip install pyTelegramBotAPI
```
7. Запустить Бота
```commandline
python manage.py run_bot
```
### Больше примеров в [Полной документации][documentation_path]
## Тестирование
Django Telegram Framework позволяет удобно тестировать код бота без подключения к telegram.
Для этого используется специальный `DummyBot`
1. В `settings.py` проекта внесите следующие изменения:
```python
TELEGRAM_BOT_TOKEN = '0'
TELEGRAM_BOT_TYPE = 'Dummy'
```
2. Пример написания тестов для бота из `quickstart` приложения
```python
from django.test import SimpleTestCase
from telegram_framework import get_bot, actions, messages
from telegram_framework.chat import Chat, add_bot, get_last_message
from telegram_framework.links import add_links
from quickstart.bot import bot_links
class TestCommands(SimpleTestCase):
def setUp(self):
# Создайте чат для тестовых сообщений
chat = Chat()
# Создайте тестового пользователя
self.client = get_bot('client')
# Добавьте его в чат
chat = add_bot(chat, self.client)
# Создайте пользователя - бота
bot = get_bot('bot')
# Свяжите бота с его обработчиками
bot = add_links(bot, bot_links)
# Добавьте его в чат
self.chat = add_bot(chat, bot)
# В чате пока нет сообщений
self.assertEqual(0, len(self.chat.messages))
def test_start(self):
"""
Test /start: success
"""
command_text = '/start'
# Для создания сообщения используйте специальный тип
# Его будет отправлять клиент sender=self.client
message = messages.Message(command_text, sender=self.client)
# Отправьте его в чат
chat = actions.send_message(self.chat, message)
# Бот должен реагировать на сообщения
# Поэтому в чате будет 2 сообщения
self.assertEqual(2, len(chat.messages))
# Получите последнее сообщение для проверки
last_message = get_last_message(chat)
expected_text = 'Приветствую тебя. Я Quickstart Telegram Bot'
# Оно должно содержать приветствие
self.assertEqual(expected_text, last_message.text)
def test_any_text_message(self):
"""
Test send any text message: success
"""
# Используйте специальный тип для создания сообщения
# Его отправит client (sender=self.client)
message = messages.Message('quickstart message', sender=self.client)
# Отправляем сообщение
chat = actions.send_message(self.chat, message)
# Бот должен реагировать на сообщение,
# Поэтому в чате будет 2 сообщения
self.assertEqual(2, len(chat.messages))
# Получаем последнее сообщение
last_message = get_last_message(chat)
expected_text = 'Тебе отвечает Bot'
# Оно должно содержать ответ бота
self.assertEqual(expected_text, last_message.text)
```
3. Запустить django тесты
```commandline
python manage.py test
```
## Внести свой вклад в проект
Без проблем! Для быстрого старта можно ознакомиться с:
- [Полной документацией][documentation_path]
- [Как внести свой вклад](CONTRIBUTING.md)
- [Документацией для разработчиков](https://quillcraftsman.github.io/django-telegram-framework/dev_documentation.html)
- [Нормами поведения](CODE_OF_CONDUCT.md)
- [Политикой безопасности](SECURITY.md)
- [Структурой управления проектом](GOVERNANCE.md)
- [Файлом поддержки](SUPPORT.md)
[documentation_path]: https://quillcraftsman.github.io/django-telegram-framework
Raw data
{
"_id": null,
"home_page": "https://github.com/quillcraftsman/django-telegram-framework",
"name": "django-telegram-framework",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3",
"maintainer_email": null,
"keywords": "django, telegram, telegram-bot, framework, testing",
"author": "quillcraftsman",
"author_email": "quill@craftsman.lol",
"download_url": "https://files.pythonhosted.org/packages/12/a0/357be230983ac99bbdb7efdec5844f70a02264eca8681b7b36f2e5a784d9/django_telegram_framework-0.1.0.tar.gz",
"platform": null,
"description": "# Django Telegram Framework\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 (Framework) \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f **Telegram** \u0431\u043e\u0442\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 django\n\n[\u0422\u0443\u0442][documentation_path] \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 **\u041f\u043e\u043b\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430** \n\n<hr>\n\n#### Workflows\n[](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml)\n[](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml)\n\n#### Package\n[](https://pypi.python.org/pypi/django-telegram-framework/)\n[](https://pypi.python.org/pypi/django-telegram-framework)\n[](https://pypi.python.org/pypi/django-telegram-framework/)\n[](https://github.com/quillcraftsman/django-telegram-framework/blob/main/LICENSE)\n[](https://pypi.python.org/pypi/django-telegram-framework/)\n\n#### Support\n[][documentation_path]\n[](https://github.com/quillcraftsman/django-telegram-framework/discussions/)\n[](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n\n#### Downloads\n[](https://pepy.tech/project/django-telegram-framework)\n[](https://pepy.tech/project/django-telegram-framework)\n[](https://pepy.tech/project/django-telegram-framework)\n[](https://pepy.tech/project/django-telegram-framework)\n\n#### Languages\n[](https://github.com/quillcraftsman/django-telegram-framework)\n[](https://github.com/quillcraftsman/django-telegram-framework)\n\n#### Development\n- [](https://github.com/quillcraftsman/django-telegram-framework/releases)\n[](https://github.com/quillcraftsman/django-telegram-framework)\n- [](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n[](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n- [](https://github.com/quillcraftsman/django-telegram-framework/pulls)\n[](https://github.com/quillcraftsman/django-telegram-framework/pulls)\n- [](https://github.com/quillcraftsman/django-telegram-framework/discussions/)\n\n[//]: # (#### Repository Stats)\n\n[//]: # ([\n\n[//]: # ()](https://github.com/quillcraftsman/django-telegram-framework))\n\n[//]: # ([\n\n[//]: # ()](https://github.com/quillcraftsman/django-telegram-frameworkgraphs/contributors))\n\n[//]: # ([\n\n[//]: # ()](https://github.com/quillcraftsman/django-telegram-framework))\n\n<hr>\n\n## Menu\n\n- [\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430](#\u0438\u0434\u0435\u044f-\u043f\u0440\u043e\u0435\u043a\u0442\u0430)\n- [\u041f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c](#\u043f\u0440\u043e\u0435\u043a\u0442-\u0441-\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c-\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c-\u043a\u043e\u0434\u043e\u043c)\n- [\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 Telegram \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432](#\u043e\u0442\u043b\u0438\u0447\u0438\u0435-\u043e\u0442-\u0434\u0440\u0443\u0433\u0438\u0445-telegram-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432)\n- [\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438](#\u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438)\n- [\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438](#\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438)\n- [\u0421\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438](#\u0441\u0442\u0430\u0442\u0443\u0441-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438)\n- [\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430](#\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430)\n- [\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442](#\u0431\u044b\u0441\u0442\u0440\u044b\u0439-\u0441\u0442\u0430\u0440\u0442)\n- [\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435](#\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435)\n- [\u0412\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442](#\u0432\u043d\u0435\u0441\u0442\u0438-\u0441\u0432\u043e\u0439-\u0432\u043a\u043b\u0430\u0434-\u0432-\u043f\u0440\u043e\u0435\u043a\u0442)\n\n## \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\n\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 framework \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f telegram \u0431\u043e\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439:\n\n- \u0418\u043c\u0435\u0435\u0442 \u0447\u0451\u0442\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u0439\n- \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 telegram (pyTelegramBotAPI, Telethone, python-telegram-bot, aiogram \u0438 \u0434\u0440\u0443\u0433\u0438\u0435)\n- \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c start-up \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0438\u043b\u0438 \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435\n- \u0418\u043c\u0435\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 django \u0434\u043b\u044f \u0441\u043e\u0434\u043d\u0430\u0438\u044f web \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f django admin\n- \u0411\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Django ORM\n\n## \u041f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c\n\n\u042d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 [Happy Code](LICENSE). \n\n- \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n- \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Forks\n- \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f issues \u0438 bugs\n- contributions\n\n\u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f\n\n## \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 Telegram \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432\n\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f telegram \u0431\u043e\u0442\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a pyTelegramBotAPI, aiogram, python-telegram-bot \u0438 \u0434\u0440\u0443\u0433\u0438\u0445,\n\u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 (Framework) \u0438\u043c\u0435\u0435\u0442 \u0447\u0451\u0442\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 django \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. Framework \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:\n\n- models - \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Django ORM\n- actions - \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 telegram bot-\u0430 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044f \u0441 django views)\n- links - \u0441\u0432\u044f\u0437\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0431\u043e\u0442\u0430 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044f \u0441 django urls)\n- settings - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 - django settings\n- tests - \u0442\u0435\u0441\u0442\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u0431\u043e\u0442\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Dummy Bot\n\n\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c Framework \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435.\n\u0411\u0435\u0437 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 telegram (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 DEV) \u0440\u0435\u0436\u0438\u043c\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Dummy Bot \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 django \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:\n- \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c web site\n- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c django \u0430\u0434\u043c\u0438\u043d\u043a\u0443\n- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c django ORM\n\n## \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\n\n- \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f telegram \u0431\u043e\u0442\u0430 \u0432 django \u043f\u0440\u043e\u0435\u043a\u0442\n- \u041f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u0442\u0430\n- \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u0442\u0430\n- \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c pyTelegramBotAPI\n- \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c pyTelegramBotAPI (\u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435)\n- DummyBot \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0435\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a telegram\n- \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442\u0430 (\u0411\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f)\n- \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 aiogram, python-telegram-bot, Telethone (\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)\n\n## \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n\n- django > 5\n- pyTelegramBotAPi (\u041d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e)\n- \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 [\u041f\u043e\u043b\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://quillcraftsman.github.io/django-telegram-framework/about.html#requirements)\n\n## \u0421\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n\n\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 1-\u0430\u044f \u0441\u044b\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439\n\n- \u041f\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 [PyPi](https://pypi.org/project/django-telegram-framework/)\n- \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 [\u041f\u043e\u043b\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://quillcraftsman.github.io/django-telegram-framework/about.html#development-status)\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n### with pip\n\n```commandline\npip install django-telegram-framework\n```\n\n\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 [\u041f\u043e\u043b\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://quillcraftsman.github.io/django-telegram-framework/install.html)\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n1. \u0421\u043e\u0437\u0434\u0430\u0442\u044c django \u043f\u0440\u043e\u0435\u043a\u0442\n2. \u0421\u043e\u0437\u0434\u0430\u0442\u044c django \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\n\n```commandline\npython manage.py startapp quickstart\n```\n\n3. \u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b `bot.py`\n4. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 `bot.py`\n\n```python\nfrom telegram_framework import (\n messages,\n actions,\n links,\n)\n# \u041e\u041f\u0418\u0428\u0418\u0422\u0415 \u041e\u0411\u0420\u0410\u0411\u041e\u0422\u0427\u0418\u041a\u0418 \u0421\u041e\u0411\u042b\u0422\u0418\u0419 \u0411\u041e\u0422\u0410\n\ndef send_greetings(bot, message):\n # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n greetings_message = messages.Message('\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0442\u0435\u0431\u044f. \u042f Quickstart Telegram Bot', sender=bot)\n # \u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\n return actions.send_message(message.chat, greetings_message)\n\ndef reply_to_message(bot, message):\n # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430\n reply = messages.create_reply(message, '\u0422\u0435\u0431\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 Bot', sender=bot)\n # \u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\n return actions.send_reply(reply)\n\n\n# \u0421\u0412\u042f\u0416\u0418\u0422\u0415 \u041e\u0411\u0420\u0410\u0411\u041e\u0422\u0427\u0418\u041a\u0418 \u0421 \u0414\u0415\u0419\u0421\u0422\u0412\u0418\u042f\u041c\u0418 \u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u0422\u0415\u041b\u042f \u0412 TELEGRAM\n\nbot_links = [\n links.on_command(send_greetings, 'start'),\n links.on_command(send_greetings, 'help'),\n links.on_message(reply_to_message),\n]\n\n```\n\n5. \u0412 `settings.py` \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:\n\n```python\nTELEGRAM_BOT_TOKEN = '7777777777:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\nTELEGRAM_BOT_TYPE = 'pyTelegramBotAPI'\nROOT_BOT_LINKS = 'quickstart.bot'\n```\n\n6. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c `pyTelegramBotAPI`\n\n```commandline\npip install pyTelegramBotAPI\n```\n\n7. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0411\u043e\u0442\u0430\n\n```commandline\npython manage.py run_bot\n```\n\n### \u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 [\u041f\u043e\u043b\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438][documentation_path]\n\n## \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n\nDjango Telegram Framework \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u043e\u0442\u0430 \u0431\u0435\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a telegram.\n\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 `DummyBot`\n\n1. \u0412 `settings.py` \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043d\u0435\u0441\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:\n\n```python\nTELEGRAM_BOT_TOKEN = '0'\nTELEGRAM_BOT_TYPE = 'Dummy'\n```\n\n2. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u043e\u0442\u0430 \u0438\u0437 `quickstart` \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n\n```python\nfrom django.test import SimpleTestCase\nfrom telegram_framework import get_bot, actions, messages\nfrom telegram_framework.chat import Chat, add_bot, get_last_message\nfrom telegram_framework.links import add_links\nfrom quickstart.bot import bot_links\n\n\nclass TestCommands(SimpleTestCase):\n\n def setUp(self):\n # \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0447\u0430\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n chat = Chat()\n # \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n self.client = get_bot('client')\n # \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 \u0447\u0430\u0442\n chat = add_bot(chat, self.client)\n # \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - \u0431\u043e\u0442\u0430\n bot = get_bot('bot')\n # \u0421\u0432\u044f\u0436\u0438\u0442\u0435 \u0431\u043e\u0442\u0430 \u0441 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438\n bot = add_links(bot, bot_links)\n # \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 \u0447\u0430\u0442\n self.chat = add_bot(chat, bot)\n # \u0412 \u0447\u0430\u0442\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439\n self.assertEqual(0, len(self.chat.messages))\n\n def test_start(self):\n \"\"\"\n Test /start: success\n \"\"\"\n command_text = '/start'\n # \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f\n # \u0415\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 sender=self.client\n message = messages.Message(command_text, sender=self.client)\n # \u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 \u0447\u0430\u0442\n chat = actions.send_message(self.chat, message)\n # \u0411\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n # \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0447\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 2 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n self.assertEqual(2, len(chat.messages))\n # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n last_message = get_last_message(chat)\n expected_text = '\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0442\u0435\u0431\u044f. \u042f Quickstart Telegram Bot'\n # \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\n self.assertEqual(expected_text, last_message.text)\n\n\n def test_any_text_message(self):\n \"\"\"\n Test send any text message: success\n \"\"\"\n # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n # \u0415\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 client (sender=self.client)\n message = messages.Message('quickstart message', sender=self.client)\n # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n chat = actions.send_message(self.chat, message)\n # \u0411\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435,\n # \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0447\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 2 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n self.assertEqual(2, len(chat.messages))\n # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n last_message = get_last_message(chat)\n expected_text = '\u0422\u0435\u0431\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 Bot'\n # \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0431\u043e\u0442\u0430\n self.assertEqual(expected_text, last_message.text)\n\n```\n\n3. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c django \u0442\u0435\u0441\u0442\u044b\n\n```commandline\npython manage.py test\n```\n\n## \u0412\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\n\n\u0411\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c! \u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441:\n- [\u041f\u043e\u043b\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439][documentation_path]\n- [\u041a\u0430\u043a \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434](CONTRIBUTING.md)\n- [\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432](https://quillcraftsman.github.io/django-telegram-framework/dev_documentation.html)\n- [\u041d\u043e\u0440\u043c\u0430\u043c\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f](CODE_OF_CONDUCT.md)\n- [\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438](SECURITY.md)\n- [\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c](GOVERNANCE.md)\n- [\u0424\u0430\u0439\u043b\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438](SUPPORT.md)\n\n[documentation_path]: https://quillcraftsman.github.io/django-telegram-framework\n",
"bugtrack_url": null,
"license": "Happy Code",
"summary": "Python Django package repository template",
"version": "0.1.0",
"project_urls": {
"Changelog": "https://github.com/quillcraftsman/django-telegram-framework/releases",
"Documentation": "https://quillcraftsman.github.io/django-telegram-framework",
"Download": "https://pypi.org/project/django-telegram-framework/",
"Homepage": "https://github.com/quillcraftsman/django-telegram-framework",
"Release notes": "https://github.com/quillcraftsman/django-telegram-framework/releases",
"Source": "https://github.com/quillcraftsman/django-telegram-framework",
"Tracker": "https://github.com/quillcraftsman/django-telegram-framework/issues"
},
"split_keywords": [
"django",
" telegram",
" telegram-bot",
" framework",
" testing"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "cefc9e89f900f66cb7a52aaf14b12d8d9c184f77f3c4c8723922466c4308f13a",
"md5": "34ca6e491b69feaae6c8b8aa0ba5f68a",
"sha256": "22e28c5da533b3fbf95e58a951cf14bf5792f6ebd6e8991b26b72954ff03cc42"
},
"downloads": -1,
"filename": "django_telegram_framework-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "34ca6e491b69feaae6c8b8aa0ba5f68a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3",
"size": 22004,
"upload_time": "2025-01-24T16:43:25",
"upload_time_iso_8601": "2025-01-24T16:43:25.654860Z",
"url": "https://files.pythonhosted.org/packages/ce/fc/9e89f900f66cb7a52aaf14b12d8d9c184f77f3c4c8723922466c4308f13a/django_telegram_framework-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "12a0357be230983ac99bbdb7efdec5844f70a02264eca8681b7b36f2e5a784d9",
"md5": "29154cbd206d004f6f6b9b4516fc52a7",
"sha256": "ac0324c63427ada22e2b66290b64441da697f65f4f44295412fb0d10beceedcb"
},
"downloads": -1,
"filename": "django_telegram_framework-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "29154cbd206d004f6f6b9b4516fc52a7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3",
"size": 14820,
"upload_time": "2025-01-24T16:43:29",
"upload_time_iso_8601": "2025-01-24T16:43:29.881128Z",
"url": "https://files.pythonhosted.org/packages/12/a0/357be230983ac99bbdb7efdec5844f70a02264eca8681b7b36f2e5a784d9/django_telegram_framework-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-24 16:43:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "quillcraftsman",
"github_project": "django-telegram-framework",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [
{
"name": "wheel",
"specs": []
},
{
"name": "Django",
"specs": [
[
">=",
"5"
]
]
},
{
"name": "pyTelegramBotAPI",
"specs": [
[
"==",
"4.26.0"
]
]
},
{
"name": "python-dotenv",
"specs": [
[
"==",
"1.0.1"
]
]
}
],
"lcname": "django-telegram-framework"
}