chatlabs-django-support


Namechatlabs-django-support JSON
Version 1.0.5 PyPI version JSON
download
home_pagehttps://github.com/RostHarcha/chatlabs-django-support
SummaryNone
upload_time2025-02-10 13:52:42
maintainerNone
docs_urlNone
authorRostislaww
requires_python<4.0,>=3.11
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.49244s