django-telegram-framework


Namedjango-telegram-framework JSON
Version 0.1.0 PyPI version JSON
download
home_pagehttps://github.com/quillcraftsman/django-telegram-framework
SummaryPython Django package repository template
upload_time2025-01-24 16:43:29
maintainerNone
docs_urlNone
authorquillcraftsman
requires_python>=3
licenseHappy Code
keywords django telegram telegram-bot framework testing
VCS
bugtrack_url
requirements wheel Django pyTelegramBotAPI python-dotenv
Travis-CI No Travis.
coveralls test coverage
            # Django Telegram Framework

Библиотека (Framework) для быстрого создания **Telegram** ботов и интеграции с django

[Тут][documentation_path] можно найти **Полную документацию проекта** 

<hr>

#### Workflows
[![Tests](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml)
[![Pylint](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml)

#### Package
[![Version](https://img.shields.io/pypi/v/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)
[![Development Status](https://img.shields.io/pypi/status/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework)
[![Python version](https://img.shields.io/pypi/pyversions/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)
[![License](https://img.shields.io/pypi/l/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework/blob/main/LICENSE)
[![Wheel](https://img.shields.io/pypi/wheel/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)

#### Support
[![Documentation](https://img.shields.io/badge/docs-0094FF.svg)][documentation_path]
[![Discussions](https://img.shields.io/badge/discussions-ff0068.svg)](https://github.com/quillcraftsman/django-telegram-framework/discussions/)
[![Issues](https://img.shields.io/badge/issues-11AE13.svg)](https://github.com/quillcraftsman/django-telegram-framework/issues/)

#### Downloads
[![Day Downloads](https://img.shields.io/pypi/dd/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)
[![Week Downloads](https://img.shields.io/pypi/dw/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)
[![Month Downloads](https://img.shields.io/pypi/dm/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)
[![All Downloads](https://img.shields.io/pepy/dt/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)

#### Languages
[![Languages](https://img.shields.io/github/languages/count/quillcraftsman/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework)
[![Top Language](https://img.shields.io/github/languages/top/quillcraftsman/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework)

#### Development
- [![Release date](https://img.shields.io/github/release-date/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/releases)
[![Last Commit](https://img.shields.io/github/last-commit/quillcraftsman/django-telegram-framework/main
)](https://github.com/quillcraftsman/django-telegram-framework)
- [![Issues](https://img.shields.io/github/issues/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/issues/)
[![Closed Issues](https://img.shields.io/github/issues-closed/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/issues/)
- [![Pull Requests](https://img.shields.io/github/issues-pr/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/pulls)
[![Closed Pull Requests](https://img.shields.io/github/issues-pr-closed-raw/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/pulls)
- [![Discussions](https://img.shields.io/github/discussions/quillcraftsman/django-telegram-framework
)](https://github.com/quillcraftsman/django-telegram-framework/discussions/)

[//]: # (#### Repository Stats)

[//]: # ([![Stars]&#40;https://img.shields.io/github/stars/quillcraftsman/django-telegram-framework)

[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-framework&#41;)

[//]: # ([![Contributors]&#40;https://img.shields.io/github/contributors/quillcraftsman/django-telegram-framework)

[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-frameworkgraphs/contributors&#41;)

[//]: # ([![Forks]&#40;https://img.shields.io/github/forks/quillcraftsman/django-telegram-framework)

[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-framework&#41;)

<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[![Tests](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/run-tests.yml)\n[![Pylint](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/quillcraftsman/django-telegram-framework/actions/workflows/lint.yml)\n\n#### Package\n[![Version](https://img.shields.io/pypi/v/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)\n[![Development Status](https://img.shields.io/pypi/status/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework)\n[![Python version](https://img.shields.io/pypi/pyversions/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)\n[![License](https://img.shields.io/pypi/l/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework/blob/main/LICENSE)\n[![Wheel](https://img.shields.io/pypi/wheel/django-telegram-framework.svg)](https://pypi.python.org/pypi/django-telegram-framework/)\n\n#### Support\n[![Documentation](https://img.shields.io/badge/docs-0094FF.svg)][documentation_path]\n[![Discussions](https://img.shields.io/badge/discussions-ff0068.svg)](https://github.com/quillcraftsman/django-telegram-framework/discussions/)\n[![Issues](https://img.shields.io/badge/issues-11AE13.svg)](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n\n#### Downloads\n[![Day Downloads](https://img.shields.io/pypi/dd/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)\n[![Week Downloads](https://img.shields.io/pypi/dw/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)\n[![Month Downloads](https://img.shields.io/pypi/dm/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)\n[![All Downloads](https://img.shields.io/pepy/dt/django-telegram-framework)](https://pepy.tech/project/django-telegram-framework)\n\n#### Languages\n[![Languages](https://img.shields.io/github/languages/count/quillcraftsman/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework)\n[![Top Language](https://img.shields.io/github/languages/top/quillcraftsman/django-telegram-framework)](https://github.com/quillcraftsman/django-telegram-framework)\n\n#### Development\n- [![Release date](https://img.shields.io/github/release-date/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/releases)\n[![Last Commit](https://img.shields.io/github/last-commit/quillcraftsman/django-telegram-framework/main\n)](https://github.com/quillcraftsman/django-telegram-framework)\n- [![Issues](https://img.shields.io/github/issues/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n[![Closed Issues](https://img.shields.io/github/issues-closed/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/issues/)\n- [![Pull Requests](https://img.shields.io/github/issues-pr/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/pulls)\n[![Closed Pull Requests](https://img.shields.io/github/issues-pr-closed-raw/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/pulls)\n- [![Discussions](https://img.shields.io/github/discussions/quillcraftsman/django-telegram-framework\n)](https://github.com/quillcraftsman/django-telegram-framework/discussions/)\n\n[//]: # (#### Repository Stats)\n\n[//]: # ([![Stars]&#40;https://img.shields.io/github/stars/quillcraftsman/django-telegram-framework)\n\n[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-framework&#41;)\n\n[//]: # ([![Contributors]&#40;https://img.shields.io/github/contributors/quillcraftsman/django-telegram-framework)\n\n[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-frameworkgraphs/contributors&#41;)\n\n[//]: # ([![Forks]&#40;https://img.shields.io/github/forks/quillcraftsman/django-telegram-framework)\n\n[//]: # (&#41;]&#40;https://github.com/quillcraftsman/django-telegram-framework&#41;)\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"
}
        
Elapsed time: 1.14897s