# ChatLabs Django Support
## Зависимости
- Python 3.11+
- [Django](https://pypi.org/project/Django/) 5.0.1
- [Channels](https://pypi.org/project/channels/) >=4.2.0,<5.0.0
- [Daphne](https://pypi.org/project/daphne/) >=4.1.2,<5.0.0
- [Django REST framework](https://pypi.org/project/djangorestframework/) >=3.15.2,<4.0.0
- [Django-filter](https://pypi.org/project/django-filter/) >=24.3,<25.0
## Установка
Установите пакет через `pip`:
```bash
pip install chatlabs-django-support
```
...или через `Poetry`:
```bash
poetry add chatlabs-django-support
```
## Быстрый старт
1. Добавьте модель Telegram пользователя в любое ваше приложение:
```python
# my_users/models.py
class MyTelegramUser(models.Model):
telegram_id = models.BigIntegerField(
primary_key=True,
unique=True,
)
```
2. Добавьте `daphne`, `channels`, `support` и приложение с вашей моделью Telegram пользователя в `INSTALLED_APPS`:
```python
# settings.py
INSTALLED_APPS = [
'daphne',
'channels',
...,
'my_users',
'support',
]
```
3. Укажите модель Telegram пользователя в настройках:
```python
# settings.py
SUPPORT_TELEGRAM_USER_MODEL = 'my_users.MyTelegramUser'
```
4. Также необходимо настроить слои для `channels`:
```python
# settings.py
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels.layers.InMemoryChannelLayer',
},
}
```
5. Настройте ASGI-приложение:
```python
# asgi.py
import os
from support import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings')
application = get_asgi_application()
```
```python
# settings.py
ASGI_APPLICATION = 'example.asgi.application'
```
6. Обновите `urls.py`:
```python
from django.urls import path, include
urlpatterns = [
...
path('support/', include('support.urls')),
]
```
7. Создайте и выполните миграции:
```bash
python manage.py makemigrations
```
```bash
python manage.py migrate
```
### API
---
GET "/support/tickets/"
Получить список тикетов
**Query params**:
- `user_id` (number) - ID Пользователя (создателя тикета)
- `resolved` (bool) - `true` - тикет решен, `false` - тикет не решен
- `manager` (number) - ID менеджера, на которого назначены тикеты
- `manager__isnull` (bool) - `true` - менеджер не назначен, `false` - менеджер назначен
**Response**:
```json
[
{
"id": 2,
"user": {
"telegram_id": 123
},
"support_manager": null,
"created_at": "2025-01-31T12:24:25.716425Z",
"title": "I've founded some bug",
"resolved": false
}
]
```
---
GET "/support/tickets/`ticket_id`/"
Получить тикет
**Response**:
```json
{
"id": 1,
"user": {
"telegram_id": 123
},
"support_manager": {
"id": 1,
"first_name": "",
"last_name": ""
} || null,
"created_at": "2025-01-22T12:11:40.273325Z",
"title": "I've founded some bug",
"resolved": true
}
```
---
GET "/support/tickets/`ticket_id`/messages/"
Получить список сообщений в тикете
**Response**:
```json
[
{
"id": 3,
"created_at": "2025-01-31T12:18:03.929086Z",
"sender": "user" || "supp",
"text": "some text of message",
"viewed": false,
"ticket": 1
}
]
```
---
### WebSocket API - Отправляемые сообщения
---
Принять тикет в работу:
```json
{
"type": "ticket.assign",
"ticket_id": 16 // ID тикета
}
```
---
Отправить сообщение:
```json
{
"type": "ticket.message.new",
"ticket_id": 16, // ID тикета
"text": "The is some text" // текст сообщения
}
```
---
### WebSocket API - Получаемые сообщения
---
Создан новый тикет:
```json
{
"type": "ticket.created",
"ticket": {
"id": 21, // ID тикета
"user": { // Информация о пользователе
"telegram_id": 4 // telegram_id пользователя
},
"support_manager": null, // назначенный менеджер
"created_at": "2024-12-29T16:10:38.620768Z", // дата создания
"title": "have a prob" // заголовок тикета
}
}
```
---
Тикет назначен:
```json
{
"type": "ticket.assigned",
"id": 16, // ID тикета
"support_manager": 1, // ID менеджера
}
```
---
Новое сообщение:
```json
{
"type": "ticket.message.new",
"message": {
"id": 31, // ID сообщения
"created_at": "2024-12-29T16:08:04.267002Z", // дата создания
"sender": "supp", // отправитель, "user" - пользователь, "supp" - менеджер
"text": "some_text", // текст сообщения
"viewed": true, // сообщение просмотрено
"ticket": 16 // ID тикета
}
}
```
---
Raw data
{
"_id": null,
"home_page": "https://github.com/RostHarcha/chatlabs-django-support",
"name": "chatlabs-django-support",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.11",
"maintainer_email": null,
"keywords": null,
"author": "Rostislaww",
"author_email": "rostiki.com@mail.ru",
"download_url": "https://files.pythonhosted.org/packages/2d/9b/607a9792bd19465776674028f33e39a8de17e452d906744696ad4a544771/chatlabs_django_support-1.0.5.tar.gz",
"platform": null,
"description": "# ChatLabs Django Support\n\n## \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n\n- Python 3.11+\n- [Django](https://pypi.org/project/Django/) 5.0.1\n- [Channels](https://pypi.org/project/channels/) >=4.2.0,<5.0.0\n- [Daphne](https://pypi.org/project/daphne/) >=4.1.2,<5.0.0\n- [Django REST framework](https://pypi.org/project/djangorestframework/) >=3.15.2,<4.0.0\n- [Django-filter](https://pypi.org/project/django-filter/) >=24.3,<25.0\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043f\u0430\u043a\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 `pip`:\n```bash\npip install chatlabs-django-support\n```\n\n...\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 `Poetry`:\n```bash\npoetry add chatlabs-django-support\n```\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n1. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c Telegram \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:\n ```python\n # my_users/models.py\n\n class MyTelegramUser(models.Model):\n telegram_id = models.BigIntegerField(\n primary_key=True,\n unique=True,\n )\n ```\n\n2. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 `daphne`, `channels`, `support` \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0432\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e Telegram \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 `INSTALLED_APPS`:\n ```python\n # settings.py\n\n INSTALLED_APPS = [\n 'daphne',\n 'channels',\n ...,\n 'my_users',\n 'support',\n ]\n ```\n\n3. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c Telegram \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445:\n ```python\n # settings.py\n\n SUPPORT_TELEGRAM_USER_MODEL = 'my_users.MyTelegramUser'\n ```\n\n4. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043b\u043e\u0438 \u0434\u043b\u044f `channels`:\n ```python\n # settings.py\n\n CHANNEL_LAYERS = {\n 'default': {\n 'BACKEND': 'channels.layers.InMemoryChannelLayer',\n },\n }\n ```\n\n5. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 ASGI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:\n ```python\n # asgi.py\n\n import os\n\n from support import get_asgi_application\n\n os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings')\n\n application = get_asgi_application()\n ```\n\n ```python\n # settings.py\n\n ASGI_APPLICATION = 'example.asgi.application'\n ```\n\n6. \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 `urls.py`:\n ```python\n from django.urls import path, include\n\n urlpatterns = [\n ...\n path('support/', include('support.urls')),\n ]\n ```\n\n7. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:\n ```bash\n python manage.py makemigrations\n ```\n\n ```bash\n python manage.py migrate\n ```\n\n### API\n\n---\n\nGET \"/support/tickets/\"\n\n\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043a\u0435\u0442\u043e\u0432\n\n**Query params**:\n- `user_id` (number) - ID \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0442\u0438\u043a\u0435\u0442\u0430)\n- `resolved` (bool) - `true` - \u0442\u0438\u043a\u0435\u0442 \u0440\u0435\u0448\u0435\u043d, `false` - \u0442\u0438\u043a\u0435\u0442 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\n- `manager` (number) - ID \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0442\u0438\u043a\u0435\u0442\u044b\n- `manager__isnull` (bool) - `true` - \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d, `false` - \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\n\n**Response**:\n```json\n[\n {\n \"id\": 2,\n \"user\": {\n \"telegram_id\": 123\n },\n \"support_manager\": null,\n \"created_at\": \"2025-01-31T12:24:25.716425Z\",\n \"title\": \"I've founded some bug\",\n \"resolved\": false\n }\n]\n```\n\n---\n\nGET \"/support/tickets/`ticket_id`/\"\n\n\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0438\u043a\u0435\u0442\n\n**Response**:\n```json\n{\n \"id\": 1,\n \"user\": {\n \"telegram_id\": 123\n },\n \"support_manager\": {\n \"id\": 1,\n \"first_name\": \"\",\n \"last_name\": \"\"\n } || null,\n \"created_at\": \"2025-01-22T12:11:40.273325Z\",\n \"title\": \"I've founded some bug\",\n \"resolved\": true\n}\n```\n\n---\n\nGET \"/support/tickets/`ticket_id`/messages/\"\n\n\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0442\u0438\u043a\u0435\u0442\u0435\n\n**Response**:\n```json\n[\n {\n \"id\": 3,\n \"created_at\": \"2025-01-31T12:18:03.929086Z\",\n \"sender\": \"user\" || \"supp\",\n \"text\": \"some text of message\",\n \"viewed\": false,\n \"ticket\": 1\n }\n]\n```\n\n---\n\n### WebSocket API - \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n\n---\n\n\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u0442\u0438\u043a\u0435\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443:\n```json\n{\n \"type\": \"ticket.assign\",\n \"ticket_id\": 16 // ID \u0442\u0438\u043a\u0435\u0442\u0430\n}\n```\n\n---\n\n\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:\n```json\n{\n \"type\": \"ticket.message.new\",\n \"ticket_id\": 16, // ID \u0442\u0438\u043a\u0435\u0442\u0430\n \"text\": \"The is some text\" // \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n}\n```\n\n---\n\n### WebSocket API - \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n\n---\n\n\u0421\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043a\u0435\u0442:\n```json\n{\n \"type\": \"ticket.created\",\n \"ticket\": {\n \"id\": 21, // ID \u0442\u0438\u043a\u0435\u0442\u0430\n \"user\": { // \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\n \"telegram_id\": 4 // telegram_id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n },\n \"support_manager\": null, // \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\n \"created_at\": \"2024-12-29T16:10:38.620768Z\", // \u0434\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\n \"title\": \"have a prob\" // \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0438\u043a\u0435\u0442\u0430\n }\n}\n```\n\n---\n\n\u0422\u0438\u043a\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d:\n```json\n{\n \"type\": \"ticket.assigned\",\n \"id\": 16, // ID \u0442\u0438\u043a\u0435\u0442\u0430\n \"support_manager\": 1, // ID \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\n}\n```\n\n---\n\n\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:\n```json\n{\n \"type\": \"ticket.message.new\",\n \"message\": {\n \"id\": 31, // ID \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n \"created_at\": \"2024-12-29T16:08:04.267002Z\", // \u0434\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\n \"sender\": \"supp\", // \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c, \"user\" - \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \"supp\" - \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\n \"text\": \"some_text\", // \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n \"viewed\": true, // \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e\n \"ticket\": 16 // ID \u0442\u0438\u043a\u0435\u0442\u0430\n }\n}\n```\n\n---\n",
"bugtrack_url": null,
"license": null,
"summary": null,
"version": "1.0.5",
"project_urls": {
"Homepage": "https://github.com/RostHarcha/chatlabs-django-support"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "73ccb9541fceb3a7fef64f7031d827a3b8ed7fdbefa79ccdb6a82967590f3b7f",
"md5": "a1d1b4cb5ffb0f2c29aadf8596fac21a",
"sha256": "37c3d483608625142b1169a881291d17364e4b006447e28b034ad60b23ac9247"
},
"downloads": -1,
"filename": "chatlabs_django_support-1.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a1d1b4cb5ffb0f2c29aadf8596fac21a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.11",
"size": 22243,
"upload_time": "2025-02-10T13:52:40",
"upload_time_iso_8601": "2025-02-10T13:52:40.573976Z",
"url": "https://files.pythonhosted.org/packages/73/cc/b9541fceb3a7fef64f7031d827a3b8ed7fdbefa79ccdb6a82967590f3b7f/chatlabs_django_support-1.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2d9b607a9792bd19465776674028f33e39a8de17e452d906744696ad4a544771",
"md5": "7bcd2574ea8ae105235e517f5819535d",
"sha256": "c396ba506507903e78966444aae547c5e498821492a9e85c16e119b660033574"
},
"downloads": -1,
"filename": "chatlabs_django_support-1.0.5.tar.gz",
"has_sig": false,
"md5_digest": "7bcd2574ea8ae105235e517f5819535d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.11",
"size": 13954,
"upload_time": "2025-02-10T13:52:42",
"upload_time_iso_8601": "2025-02-10T13:52:42.069380Z",
"url": "https://files.pythonhosted.org/packages/2d/9b/607a9792bd19465776674028f33e39a8de17e452d906744696ad4a544771/chatlabs_django_support-1.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-10 13:52:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "RostHarcha",
"github_project": "chatlabs-django-support",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "chatlabs-django-support"
}