# django-chelseru Django Package
## Overview
django-chelseru is a Django package developed by Sobhan Bahman Rashnu for real-time chatting via WebSocket, OTP-based SMS verification, and SMS sending with Iranian providers. It also supports payment integrations.
Useful for building applications requiring secure authentication, messaging, real-time chat, and online payments.
## Features
- **Authentication**: OTP and PASSWD methods using rest_framework_simplejwt.
- **SMS Services**: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM.
- **Payment Gateways**: PAYPING_IR, ZARINPAL_COM.
- **Real-time Chat**: WebSocket/Channels for messaging.
- Session management and API endpoints for OTP, authentication, SMS, payments, and chat.
## Requirements
- Python 3.8+
- Django 4.x
- django-rest-framework
- djangorestframework-simplejwt
- django-channels
- user-agents
- requests
- Other dependencies: See `requirements.txt`
## Installation
1. Install the package:
```bash
pip install django-chelseru
```
2. Add to `INSTALLED_APPS` in `settings.py`:
```python
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
'channels',
'drfchelseru',
]
```
3. Configure middleware and ASGI in `settings.py`.
4. Apply migrations:
```bash
python manage.py makemigrations
python manage.py migrate
```
5. Run the server (use ASGI for WebSocket):
```bash
daphne -b 0.0.0.0 -p 8000 project.asgi:application
```
## Project Structure
- **models.py**: Defines models for users, OTP codes, sessions, SMS messages, organizations, chat rooms, chat permissions, messages, wallets, and payments.
- **views.py**: Handles API endpoints for OTP authentication, SMS, payments, and chat.
- **urls.py**: Maps URL patterns to views for API routes.
- **consumers.py**: Implements WebSocket consumer for real-time chat.
- **middlewares.py**: Includes `TakeUserSessionMiddlaware` for session management and `JWTAuthMiddleware` for WebSocket authentication.
## Models
- **User**: Extends Django's User model with mobile number and group.
- **OTPCode**: Stores OTP codes for authentication with expiration logic.
- **Session**: Tracks user sessions with IP, device, and browser info.
- **MessageSMS**: Logs SMS messages sent to users.
- **Organization**: Represents organizations owned by users.
- **ChatRoomPermissions**: Defines access levels for chat room actions.
- **ChatRoom**: Manages chat rooms with users, status, and permissions.
- **MessageChat**: Stores chat messages with sender and timestamp.
- **Wallet**: Tracks user wallet balances for payments.
- **Payment**: Manages payment transactions with gateway integration.
## Configuration
Update your Django `settings.py`:
```python
MIDDLEWARE = [
...
'drfchelseru.middlewares.TakeUserSessionMiddlaware',
]
ASGI_APPLICATION = 'yourproject.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('127.0.0.1', 6379)],
},
},
}
DJANGO_CHELSERU = {
'AUTH': {
'AUTH_METHOD': 'OTP',
'AUTH_SERVICE': 'rest_framework_simplejwt',
'OPTIONS': {
'OTP_LENGTH': 8,
'OTP_EXPIRE_PER_MINUTES': 4,
'OTP_SMS_TEMPLATE_ID': 5,
}
},
'SMS': {
'SMS_SERVICE': 'PARSIAN_WEBCO_IR',
'SETTINGS': {
'PARSIAN_WEBCO_IR_API_KEY': '',
'MELI_PAYAMAK_COM_USERNAME': '',
'MELI_PAYAMAK_COM_PASSWORD': '',
'MELI_PAYAMAK_COM_FROM': '',
'KAVENEGAR_COM_API_KEY': '',
'KAVENEGAR_COM_FROM': '',
},
'TEMPLATES': {
'T1': 1,
'T2': 2,
'T3': 3,
}
},
'BANK': {
'GATEWAY': 'PAYPING_IR',
'SETTINGS': {
'MERCHANT_ID': '',
'CALLBACK_URL': '',
'CURRENCY': 'IRT'
}
}
}
```
## API Endpoints
- **POST /drfchelseru/message/send/**: Send SMS.
- Request: `{ "mobile_number": "09211892425", "message_text": "Hello", "template_id": 1 }`
- Response: `{ "details": "The Message was sent correctly." }` (200 OK)
- **POST /drfchelseru/otp/send/**: Request OTP code.
- Request: `{ "mobile_number": "09211892425" }`
- Response: `{ "details": "The OTP code was sent correctly." }` (200 OK)
- **POST /drfchelseru/authenticate/**: Authenticate with OTP.
- Request: `{ "mobile_number": "09211892425", "code": "652479", "group": 0 }`
- Response: `{ "access": "<access_token>", "refresh": "<refresh_token>" }` (200 OK)
- **GET /drfchelseru/sessions/**: List user sessions (authenticated users only).
- Headers: `Authorization: Bearer <access_token>`
- Response: List of sessions (200 OK)
- **POST /drfchelseru/payment/create/**: Initiate payment.
- Request: `{ "order_id": "123", "amount": 1000.0, "description": "Test payment", "callback_url": "http://example.com/callback", "mobile": "09211892425", "email": "user@example.com", "currency": "IRT" }`
- Response: `{ "details": { "gateway_url": "<url>", ... } }` (200 OK)
- **GET/POST /drfchelseru/payment/verify/**: Verify payment.
- GET Query: `?Authority=<authority>&Status=OK`
- POST Body: `{ "paymentCode": "<code>", "paymentRefId": "<refid>", ... }`
- Response: `{ "details": { "is_pay": 1, ... } }` (200 OK)
- **/drfchelseru/chat/chatrooms/**: CRUD for chat rooms (authenticated users only).
- POST Request: `{ "user": 2 }` (to create room with user ID 2)
- Headers: `Authorization: Bearer <access_token>`
- Response: Chat room details (201 Created)
- **/drfchelseru/chat/messages/**: CRUD for chat messages (authenticated users only).
- POST Request: `{ "chat_room": 1, "text": "Hello" }`
- GET Query: `?chat_room=1`
- Headers: `Authorization: Bearer <access_token>`
- Response: Message details or list (200 OK / 201 Created)
## WebSocket Usage
- Connect to a chat room for real-time messaging:
```bash
wscat -c wss://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>
```
- Example token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYxMDE5NTY3LCJpYXQiOjE3NTU4MzU1NjcsImp0aSI6IjhhYTY1Y2I3ZDhmMjRmMzliYjFmNDFkZmJiYjcyYmVmIiwidXNlcl9pZCI6Mzl9.mHmIjbTl3X1cd3Ky5HFCD6gy4kGxMVcActo9JXtT9JQ`
- Replace `<chat_room_id>` (e.g., 17) with the desired room ID and provide a valid JWT token.
## Middleware
- **TakeUserSessionMiddlaware**: Logs user session data (IP, user agent, device, browser) for HTTP requests.
- **JWTAuthMiddleware**: Authenticates WebSocket connections using JWT tokens.
## Usage
- Access the API at `http://<your-domain>/drfchelseru/`.
- Connect to WebSocket at `ws://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>`.
- Admin panel: Create a superuser with `python manage.py createsuperuser`.
## Contributing
1. Fork the repository.
2. Create a new branch (`git checkout -b feature-branch`).
3. Commit your changes (`git commit -m "Add feature"`).
4. Push to the branch (`git push origin feature-branch`).
5. Open a pull request.
## License
MIT License
_______________________________________________________________________________________________________________________
# django-chelseru پکیج جنگو
## بررسی اجمالی
django-chelseru یک پکیج جنگو است که توسط سبحان بهمن رشنو توسعه یافته برای گفتگوهای همزمان از راه وبسوکت، تایید پیامکی بر پایه OTP، و فرستادن پیامک با فراهمکنندگان ایرانی. همچنین از یکپارچگی پرداخت پشتیبانی میکند.
کاربردی برای ساخت برنامههایی که نیاز به تایید امن، پیامرسانی، گفتگو همزمان، و پرداخت برخط دارند.
## ویژگیها
- **تایید**: روشهای OTP و PASSWD با بهرهگیری از rest_framework_simplejwt.
- **خدمات پیامک**: PARSIAN_WEBCO_IR، MELI_PAYAMAK_COM، KAVENEGAR_COM.
- **درگاههای پرداخت**: PAYPING_IR، ZARINPAL_COM.
- **گفتگو همزمان**: وبسوکت/کانالها برای پیامرسانی.
- مدیریت نشست و نقاط پایانی API برای OTP، تایید، پیامک، پرداختها، و گفتگو.
## نیازمندیها
- Python 3.8+
- Django 4.x
- django-rest-framework
- djangorestframework-simplejwt
- django-channels
- user-agents
- requests
- دیگر وابستگیها: ببینید `requirements.txt`
## نصب
1. پکیج را نصب کنید:
```bash
pip install django-chelseru
```
2. به `INSTALLED_APPS` در `settings.py` بیفزایید:
```python
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
'channels',
'drfchelseru',
]
```
3. میانگیر و ASGI را در `settings.py` پیکربندی کنید.
4. مهاجرتها را اعمال کنید:
```bash
python manage.py makemigrations
python manage.py migrate
```
5. کارساز را اجرا کنید (برای وبسوکت از ASGI بهره ببرید):
```bash
daphne -b 0.0.0.0 -p 8000 project.asgi:application
```
## ساختار پروژه
- **models.py**: مدلها را برای کاربران، کدهای OTP، نشستها، پیامکها، سازمانها، اتاقهای گفتگو، دسترسیهای اتاق گفتگو، پیامها، کیفپولها، و پرداختها تعریف میکند.
- **views.py**: نقاط پایانی API برای تایید OTP، پیامک، پرداختها، و گفتگو را مدیریت میکند.
- **urls.py**: الگوهای URL را به نماها برای مسیرهای API نگاشت میکند.
- **consumers.py**: مصرفکننده وبسوکت را برای گفتگو همزمان پیادهسازی میکند.
- **middlewares.py**: شامل `TakeUserSessionMiddlaware` برای مدیریت نشست و `JWTAuthMiddleware` برای تایید وبسوکت.
## مدلها
- **User**: مدل کاربر جنگو را با شماره همراه و گروه گسترش میدهد.
- **OTPCode**: کدهای OTP را برای تایید با منطق انقضا ذخیره میکند.
- **Session**: نشستهای کاربر را با IP، دستگاه، و دادههای مرورگر پیگیری میکند.
- **MessageSMS**: پیامکهای فرستادهشده به کاربران را ثبت میکند.
- **Organization**: سازمانهایی را که مالک کاربران هستند نشان میدهد.
- **ChatRoomPermissions**: سطوح دسترسی برای کارهای اتاق گفتگو را تعریف میکند.
- **ChatRoom**: اتاقهای گفتگو را با کاربران، وضعیت، و دسترسیها مدیریت میکند.
- **MessageChat**: پیامهای گفتگو را با فرستنده و زماننگار ذخیره میکند.
- **Wallet**: مانده کیفپول کاربران را برای پرداختها پیگیری میکند.
- **Payment**: تراکنشهای پرداخت را با یکپارچگی درگاه مدیریت میکند.
## پیکربندی
`settings.py` جنگو را بهروزرسانی کنید:
```python
MIDDLEWARE = [
...
'drfchelseru.middlewares.TakeUserSessionMiddlaware',
]
ASGI_APPLICATION = 'yourproject.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('127.0.0.1', 6379)],
},
},
}
DJANGO_CHELSERU = {
'AUTH': {
'AUTH_METHOD': 'OTP',
'AUTH_SERVICE': 'rest_framework_simplejwt',
'OPTIONS': {
'OTP_LENGTH': 8,
'OTP_EXPIRE_PER_MINUTES': 4,
'OTP_SMS_TEMPLATE_ID': 5,
}
},
'SMS': {
'SMS_SERVICE': 'PARSIAN_WEBCO_IR',
'SETTINGS': {
'PARSIAN_WEBCO_IR_API_KEY': '',
'MELI_PAYAMAK_COM_USERNAME': '',
'MELI_PAYAMAK_COM_PASSWORD': '',
'MELI_PAYAMAK_COM_FROM': '',
'KAVENEGAR_COM_API_KEY': '',
'KAVENEGAR_COM_FROM': '',
},
'TEMPLATES': {
'T1': 1,
'T2': 2,
'T3': 3,
}
},
'BANK': {
'GATEWAY': 'PAYPING_IR',
'SETTINGS': {
'MERCHANT_ID': '',
'CALLBACK_URL': '',
'CURRENCY': 'IRT'
}
}
}
```
## نقاط پایانی API
- **POST /drfchelseru/message/send/**: فرستادن پیامک.
- درخواست: `{ "mobile_number": "09211892425", "message_text": "Hello", "template_id": 1 }`
- پاسخ: `{ "details": "The Message was sent correctly." }` (200 OK)
- **POST /drfchelseru/otp/send/**: درخواست کد OTP.
- درخواست: `{ "mobile_number": "09211892425" }`
- پاسخ: `{ "details": "The OTP code was sent correctly." }` (200 OK)
- **POST /drfchelseru/authenticate/**: تایید با OTP.
- درخواست: `{ "mobile_number": "09211892425", "code": "652479", "group": 0 }`
- پاسخ: `{ "access": "<access_token>", "refresh": "<refresh_token>" }` (200 OK)
- **GET /drfchelseru/sessions/**: فهرست نشستهای کاربر (فقط کاربران تاییدشده).
- سرآیندها: `Authorization: Bearer <access_token>`
- پاسخ: فهرست نشستها (200 OK)
- **POST /drfchelseru/payment/create/**: آغاز پرداخت.
- درخواست: `{ "order_id": "123", "amount": 1000.0, "description": "Test payment", "callback_url": "http://example.com/callback", "mobile": "09211892425", "email": "user@example.com", "currency": "IRT" }`
- پاسخ: `{ "details": { "gateway_url": "<url>", ... } }` (200 OK)
- **GET/POST /drfchelseru/payment/verify/**: تایید پرداخت.
- جستجوی GET: `?Authority=<authority>&Status=OK`
- بدنه POST: `{ "paymentCode": "<code>", "paymentRefId": "<refid>", ... }`
- پاسخ: `{ "details": { "is_pay": 1, ... } }` (200 OK)
- **/drfchelseru/chat/chatrooms/**: CRUD برای اتاقهای گفتگو (فقط کاربران تاییدشده).
- درخواست POST: `{ "user": 2 }` (برای ساخت اتاق با شناسه کاربر 2)
- سرآیندها: `Authorization: Bearer <access_token>`
- پاسخ: جزئیات اتاق گفتگو (201 Created)
- **/drfchelseru/chat/messages/**: CRUD برای پیامهای گفتگو (فقط کاربران تاییدشده).
- درخواست POST: `{ "chat_room": 1, "text": "Hello" }`
- جستجوی GET: `?chat_room=1`
- سرآیندها: `Authorization: Bearer <access_token>`
- پاسخ: جزئیات پیام یا فهرست (200 OK / 201 Created)
## بهرهگیری از وبسوکت
- پیوستن به اتاق گفتگو برای پیامرسانی همزمان:
```bash
wscat -c wss://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>
```
- نمونه نشانه: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYxMDE5NTY3LCJpYXQiOjE3NTU4MzU1NjcsImp0aSI6IjhhYTY1Y2I3ZDhmMjRmMzliYjFmNDFkZmJiYjcyYmVmIiwidXNlcl9pZCI6Mzl9.mHmIjbTl3X1cd3Ky5HFCD6gy4kGxMVcActo9JXtT9JQ`
- <chat_room_id> (مانند 17) را با شناسه اتاق دلخواه جایگزین کنید و نشانه JWT معتبر فراهم کنید.
## میانگیرها
- **TakeUserSessionMiddlaware**: دادههای نشست کاربر (IP، عامل کاربر، دستگاه، مرورگر) را برای درخواستهای HTTP ثبت میکند.
- **JWTAuthMiddleware**: اتصالهای وبسوکت را با نشانههای JWT تایید میکند.
## بهرهگیری
- به API در `http://<your-domain>/drfchelseru/` دسترسی یابید.
- به وبسوکت در `ws://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>` وصل شوید.
- پنل مدیر: ابرکاربر را با `python manage.py createsuperuser` بسازید.
## همکاری
1. مخزن را فورک کنید.
2. شاخه نو بسازید (`git checkout -b feature-branch`).
3. تغییرات را کامیت کنید (`git commit -m "Add feature"`).
4. به شاخه بفرستید (`git push origin feature-branch`).
5. درخواست کشیدن باز کنید.
## پروانه
MIT License
Raw data
{
"_id": null,
"home_page": "https://pipdjango.chelseru.com",
"name": "django-chelseru",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "djangochelseruchat djangochat drfchat online-chat online real-time chat iran chelseru lor lur bahman rashnu rashno lak lour sms djangoauth auth ywt otpauth otp authentication djangootp djangoiransms iransms djangosms djangokavenegar djangomelipayamak sobhan \u0686\u062a \u0633\u0628\u062d\u0627\u0646 \u0628\u0647\u0645\u0646 \u0631\u0634\u0646\u0648 \u0686\u0644\u0633\u0631\u0648 \u062c\u0646\u06af\u0648 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0644\u0631 \u0644\u0648\u0631 \u0622\u0646\u0644\u0627\u06cc\u0646 \u0631\u06cc\u0644 \u062a\u0627\u06cc\u0645",
"author": "Sobhan Bahman Rashnu",
"author_email": "bahmanrashnu@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c6/19/db4a31f9a9c45b28cc0cf41f38ddb9e756375c5c1549bb354509d1570f87/django_chelseru-2.0.5.tar.gz",
"platform": null,
"description": "# django-chelseru Django Package\n\n## Overview\n\ndjango-chelseru is a Django package developed by Sobhan Bahman Rashnu for real-time chatting via WebSocket, OTP-based SMS verification, and SMS sending with Iranian providers. It also supports payment integrations.\n\nUseful for building applications requiring secure authentication, messaging, real-time chat, and online payments.\n\n## Features\n\n- **Authentication**: OTP and PASSWD methods using rest_framework_simplejwt.\n- **SMS Services**: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM.\n- **Payment Gateways**: PAYPING_IR, ZARINPAL_COM.\n- **Real-time Chat**: WebSocket/Channels for messaging.\n- Session management and API endpoints for OTP, authentication, SMS, payments, and chat.\n\n## Requirements\n\n- Python 3.8+\n- Django 4.x\n- django-rest-framework\n- djangorestframework-simplejwt\n- django-channels\n- user-agents\n- requests\n- Other dependencies: See `requirements.txt`\n\n## Installation\n\n1. Install the package:\n\n ```bash\n pip install django-chelseru\n ```\n2. Add to `INSTALLED_APPS` in `settings.py`:\n\n ```python\n INSTALLED_APPS = [\n ...\n 'rest_framework',\n 'rest_framework_simplejwt',\n 'channels',\n 'drfchelseru',\n ]\n ```\n3. Configure middleware and ASGI in `settings.py`.\n4. Apply migrations:\n\n ```bash\n python manage.py makemigrations\n python manage.py migrate\n ```\n5. Run the server (use ASGI for WebSocket):\n\n ```bash\n daphne -b 0.0.0.0 -p 8000 project.asgi:application\n ```\n\n## Project Structure\n\n- **models.py**: Defines models for users, OTP codes, sessions, SMS messages, organizations, chat rooms, chat permissions, messages, wallets, and payments.\n- **views.py**: Handles API endpoints for OTP authentication, SMS, payments, and chat.\n- **urls.py**: Maps URL patterns to views for API routes.\n- **consumers.py**: Implements WebSocket consumer for real-time chat.\n- **middlewares.py**: Includes `TakeUserSessionMiddlaware` for session management and `JWTAuthMiddleware` for WebSocket authentication.\n\n## Models\n\n- **User**: Extends Django's User model with mobile number and group.\n- **OTPCode**: Stores OTP codes for authentication with expiration logic.\n- **Session**: Tracks user sessions with IP, device, and browser info.\n- **MessageSMS**: Logs SMS messages sent to users.\n- **Organization**: Represents organizations owned by users.\n- **ChatRoomPermissions**: Defines access levels for chat room actions.\n- **ChatRoom**: Manages chat rooms with users, status, and permissions.\n- **MessageChat**: Stores chat messages with sender and timestamp.\n- **Wallet**: Tracks user wallet balances for payments.\n- **Payment**: Manages payment transactions with gateway integration.\n\n## Configuration\n\nUpdate your Django `settings.py`:\n\n```python\nMIDDLEWARE = [\n ...\n 'drfchelseru.middlewares.TakeUserSessionMiddlaware',\n]\n\nASGI_APPLICATION = 'yourproject.asgi.application'\n\nCHANNEL_LAYERS = {\n 'default': {\n 'BACKEND': 'channels_redis.core.RedisChannelLayer',\n 'CONFIG': {\n 'hosts': [('127.0.0.1', 6379)],\n },\n },\n}\n\nDJANGO_CHELSERU = {\n 'AUTH': {\n 'AUTH_METHOD': 'OTP',\n 'AUTH_SERVICE': 'rest_framework_simplejwt',\n 'OPTIONS': {\n 'OTP_LENGTH': 8,\n 'OTP_EXPIRE_PER_MINUTES': 4,\n 'OTP_SMS_TEMPLATE_ID': 5,\n }\n },\n 'SMS': {\n 'SMS_SERVICE': 'PARSIAN_WEBCO_IR',\n 'SETTINGS': {\n 'PARSIAN_WEBCO_IR_API_KEY': '',\n 'MELI_PAYAMAK_COM_USERNAME': '',\n 'MELI_PAYAMAK_COM_PASSWORD': '',\n 'MELI_PAYAMAK_COM_FROM': '',\n 'KAVENEGAR_COM_API_KEY': '',\n 'KAVENEGAR_COM_FROM': '',\n },\n 'TEMPLATES': {\n 'T1': 1,\n 'T2': 2,\n 'T3': 3,\n }\n },\n 'BANK': {\n 'GATEWAY': 'PAYPING_IR',\n 'SETTINGS': {\n 'MERCHANT_ID': '',\n 'CALLBACK_URL': '',\n 'CURRENCY': 'IRT'\n }\n }\n}\n```\n\n## API Endpoints\n\n- **POST /drfchelseru/message/send/**: Send SMS.\n\n - Request: `{ \"mobile_number\": \"09211892425\", \"message_text\": \"Hello\", \"template_id\": 1 }`\n - Response: `{ \"details\": \"The Message was sent correctly.\" }` (200 OK)\n\n- **POST /drfchelseru/otp/send/**: Request OTP code.\n\n - Request: `{ \"mobile_number\": \"09211892425\" }`\n - Response: `{ \"details\": \"The OTP code was sent correctly.\" }` (200 OK)\n\n- **POST /drfchelseru/authenticate/**: Authenticate with OTP.\n\n - Request: `{ \"mobile_number\": \"09211892425\", \"code\": \"652479\", \"group\": 0 }`\n - Response: `{ \"access\": \"<access_token>\", \"refresh\": \"<refresh_token>\" }` (200 OK)\n\n- **GET /drfchelseru/sessions/**: List user sessions (authenticated users only).\n\n - Headers: `Authorization: Bearer <access_token>`\n - Response: List of sessions (200 OK)\n\n- **POST /drfchelseru/payment/create/**: Initiate payment.\n\n - Request: `{ \"order_id\": \"123\", \"amount\": 1000.0, \"description\": \"Test payment\", \"callback_url\": \"http://example.com/callback\", \"mobile\": \"09211892425\", \"email\": \"user@example.com\", \"currency\": \"IRT\" }`\n - Response: `{ \"details\": { \"gateway_url\": \"<url>\", ... } }` (200 OK)\n\n- **GET/POST /drfchelseru/payment/verify/**: Verify payment.\n\n - GET Query: `?Authority=<authority>&Status=OK`\n - POST Body: `{ \"paymentCode\": \"<code>\", \"paymentRefId\": \"<refid>\", ... }`\n - Response: `{ \"details\": { \"is_pay\": 1, ... } }` (200 OK)\n\n- **/drfchelseru/chat/chatrooms/**: CRUD for chat rooms (authenticated users only).\n\n - POST Request: `{ \"user\": 2 }` (to create room with user ID 2)\n - Headers: `Authorization: Bearer <access_token>`\n - Response: Chat room details (201 Created)\n\n- **/drfchelseru/chat/messages/**: CRUD for chat messages (authenticated users only).\n\n - POST Request: `{ \"chat_room\": 1, \"text\": \"Hello\" }`\n - GET Query: `?chat_room=1`\n - Headers: `Authorization: Bearer <access_token>`\n - Response: Message details or list (200 OK / 201 Created)\n\n## WebSocket Usage\n\n- Connect to a chat room for real-time messaging:\n\n ```bash\n wscat -c wss://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>\n ```\n - Example token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYxMDE5NTY3LCJpYXQiOjE3NTU4MzU1NjcsImp0aSI6IjhhYTY1Y2I3ZDhmMjRmMzliYjFmNDFkZmJiYjcyYmVmIiwidXNlcl9pZCI6Mzl9.mHmIjbTl3X1cd3Ky5HFCD6gy4kGxMVcActo9JXtT9JQ`\n - Replace `<chat_room_id>` (e.g., 17) with the desired room ID and provide a valid JWT token.\n\n## Middleware\n\n- **TakeUserSessionMiddlaware**: Logs user session data (IP, user agent, device, browser) for HTTP requests.\n- **JWTAuthMiddleware**: Authenticates WebSocket connections using JWT tokens.\n\n## Usage\n\n- Access the API at `http://<your-domain>/drfchelseru/`.\n- Connect to WebSocket at `ws://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>`.\n- Admin panel: Create a superuser with `python manage.py createsuperuser`.\n\n## Contributing\n\n1. Fork the repository.\n2. Create a new branch (`git checkout -b feature-branch`).\n3. Commit your changes (`git commit -m \"Add feature\"`).\n4. Push to the branch (`git push origin feature-branch`).\n5. Open a pull request.\n\n## License\n\nMIT License\n\n\n\n_______________________________________________________________________________________________________________________\n\n\n# django-chelseru \u067e\u06a9\u06cc\u062c \u062c\u0646\u06af\u0648\n\n## \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc\n\ndjango-chelseru \u06cc\u06a9 \u067e\u06a9\u06cc\u062c \u062c\u0646\u06af\u0648 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0637 \u0633\u0628\u062d\u0627\u0646 \u0628\u0647\u0645\u0646 \u0631\u0634\u0646\u0648 \u062a\u0648\u0633\u0639\u0647 \u06cc\u0627\u0641\u062a\u0647 \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u06af\u0648\u0647\u0627\u06cc \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0632 \u0631\u0627\u0647 \u0648\u0628\u200c\u0633\u0648\u06a9\u062a\u060c \u062a\u0627\u06cc\u06cc\u062f \u067e\u06cc\u0627\u0645\u06a9\u06cc \u0628\u0631 \u067e\u0627\u06cc\u0647 OTP\u060c \u0648 \u0641\u0631\u0633\u062a\u0627\u062f\u0646 \u067e\u06cc\u0627\u0645\u06a9 \u0628\u0627 \u0641\u0631\u0627\u0647\u0645\u200c\u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0627\u06cc\u0631\u0627\u0646\u06cc. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0632 \u06cc\u06a9\u067e\u0627\u0631\u0686\u06af\u06cc \u067e\u0631\u062f\u0627\u062e\u062a \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.\n\n\u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062a\u0627\u06cc\u06cc\u062f \u0627\u0645\u0646\u060c \u067e\u06cc\u0627\u0645\u200c\u0631\u0633\u0627\u0646\u06cc\u060c \u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u0632\u0645\u0627\u0646\u060c \u0648 \u067e\u0631\u062f\u0627\u062e\u062a \u0628\u0631\u062e\u0637 \u062f\u0627\u0631\u0646\u062f.\n\n## \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\n\n- **\u062a\u0627\u06cc\u06cc\u062f**: \u0631\u0648\u0634\u200c\u0647\u0627\u06cc OTP \u0648 PASSWD \u0628\u0627 \u0628\u0647\u0631\u0647\u200c\u06af\u06cc\u0631\u06cc \u0627\u0632 rest_framework_simplejwt.\n- **\u062e\u062f\u0645\u0627\u062a \u067e\u06cc\u0627\u0645\u06a9**: PARSIAN_WEBCO_IR\u060c MELI_PAYAMAK_COM\u060c KAVENEGAR_COM.\n- **\u062f\u0631\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a**: PAYPING_IR\u060c ZARINPAL_COM.\n- **\u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u0632\u0645\u0627\u0646**: \u0648\u0628\u200c\u0633\u0648\u06a9\u062a/\u06a9\u0627\u0646\u0627\u0644\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u0645\u200c\u0631\u0633\u0627\u0646\u06cc.\n- \u0645\u062f\u06cc\u0631\u06cc\u062a \u0646\u0634\u0633\u062a \u0648 \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0628\u0631\u0627\u06cc OTP\u060c \u062a\u0627\u06cc\u06cc\u062f\u060c \u067e\u06cc\u0627\u0645\u06a9\u060c \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0647\u0627\u060c \u0648 \u06af\u0641\u062a\u06af\u0648.\n\n## \u0646\u06cc\u0627\u0632\u0645\u0646\u062f\u06cc\u200c\u0647\u0627\n\n- Python 3.8+\n- Django 4.x\n- django-rest-framework\n- djangorestframework-simplejwt\n- django-channels\n- user-agents\n- requests\n- \u062f\u06cc\u06af\u0631 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627: \u0628\u0628\u06cc\u0646\u06cc\u062f `requirements.txt`\n\n## \u0646\u0635\u0628\n\n1. \u067e\u06a9\u06cc\u062c \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:\n\n ```bash\n pip install django-chelseru\n ```\n2. \u0628\u0647 `INSTALLED_APPS` \u062f\u0631 `settings.py` \u0628\u06cc\u0641\u0632\u0627\u06cc\u06cc\u062f:\n\n ```python\n INSTALLED_APPS = [\n ...\n 'rest_framework',\n 'rest_framework_simplejwt',\n 'channels',\n 'drfchelseru',\n ]\n ```\n3. \u0645\u06cc\u0627\u0646\u200c\u06af\u06cc\u0631 \u0648 ASGI \u0631\u0627 \u062f\u0631 `settings.py` \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f.\n4. \u0645\u0647\u0627\u062c\u0631\u062a\u200c\u0647\u0627 \u0631\u0627 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f:\n\n ```bash\n python manage.py makemigrations\n python manage.py migrate\n ```\n5. \u06a9\u0627\u0631\u0633\u0627\u0632 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f (\u0628\u0631\u0627\u06cc \u0648\u0628\u200c\u0633\u0648\u06a9\u062a \u0627\u0632 ASGI \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06cc\u062f):\n\n ```bash\n daphne -b 0.0.0.0 -p 8000 project.asgi:application\n ```\n\n## \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647\n\n- **models.py**: \u0645\u062f\u0644\u200c\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u06a9\u062f\u0647\u0627\u06cc OTP\u060c \u0646\u0634\u0633\u062a\u200c\u0647\u0627\u060c \u067e\u06cc\u0627\u0645\u06a9\u200c\u0647\u0627\u060c \u0633\u0627\u0632\u0645\u0627\u0646\u200c\u0647\u0627\u060c \u0627\u062a\u0627\u0642\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648\u060c \u062f\u0633\u062a\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc \u0627\u062a\u0627\u0642 \u06af\u0641\u062a\u06af\u0648\u060c \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u060c \u06a9\u06cc\u0641\u200c\u067e\u0648\u0644\u200c\u0647\u0627\u060c \u0648 \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0647\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **views.py**: \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u06cc\u062f OTP\u060c \u067e\u06cc\u0627\u0645\u06a9\u060c \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0647\u0627\u060c \u0648 \u06af\u0641\u062a\u06af\u0648 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **urls.py**: \u0627\u0644\u06af\u0648\u0647\u0627\u06cc URL \u0631\u0627 \u0628\u0647 \u0646\u0645\u0627\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc API \u0646\u06af\u0627\u0634\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **consumers.py**: \u0645\u0635\u0631\u0641\u200c\u06a9\u0646\u0646\u062f\u0647 \u0648\u0628\u200c\u0633\u0648\u06a9\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u06af\u0648 \u0647\u0645\u0632\u0645\u0627\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **middlewares.py**: \u0634\u0627\u0645\u0644 `TakeUserSessionMiddlaware` \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0646\u0634\u0633\u062a \u0648 `JWTAuthMiddleware` \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u06cc\u062f \u0648\u0628\u200c\u0633\u0648\u06a9\u062a.\n\n## \u0645\u062f\u0644\u200c\u0647\u0627\n\n- **User**: \u0645\u062f\u0644 \u06a9\u0627\u0631\u0628\u0631 \u062c\u0646\u06af\u0648 \u0631\u0627 \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0648 \u06af\u0631\u0648\u0647 \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f.\n- **OTPCode**: \u06a9\u062f\u0647\u0627\u06cc OTP \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0645\u0646\u0637\u0642 \u0627\u0646\u0642\u0636\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **Session**: \u0646\u0634\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 IP\u060c \u062f\u0633\u062a\u06af\u0627\u0647\u060c \u0648 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0631\u0648\u0631\u06af\u0631 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **MessageSMS**: \u067e\u06cc\u0627\u0645\u06a9\u200c\u0647\u0627\u06cc \u0641\u0631\u0633\u062a\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **Organization**: \u0633\u0627\u0632\u0645\u0627\u0646\u200c\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u0627\u0644\u06a9 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0647\u0633\u062a\u0646\u062f \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.\n- **ChatRoomPermissions**: \u0633\u0637\u0648\u062d \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u062a\u0627\u0642 \u06af\u0641\u062a\u06af\u0648 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **ChatRoom**: \u0627\u062a\u0627\u0642\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648 \u0631\u0627 \u0628\u0627 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u060c \u0648\u0636\u0639\u06cc\u062a\u060c \u0648 \u062f\u0633\u062a\u0631\u0633\u06cc\u200c\u0647\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **MessageChat**: \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648 \u0631\u0627 \u0628\u0627 \u0641\u0631\u0633\u062a\u0646\u062f\u0647 \u0648 \u0632\u0645\u0627\u0646\u200c\u0646\u06af\u0627\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **Wallet**: \u0645\u0627\u0646\u062f\u0647 \u06a9\u06cc\u0641\u200c\u067e\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a\u200c\u0647\u0627 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **Payment**: \u062a\u0631\u0627\u06a9\u0646\u0634\u200c\u0647\u0627\u06cc \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u0628\u0627 \u06cc\u06a9\u067e\u0627\u0631\u0686\u06af\u06cc \u062f\u0631\u06af\u0627\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n\n## \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc\n\n`settings.py` \u062c\u0646\u06af\u0648 \u0631\u0627 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f:\n\n```python\nMIDDLEWARE = [\n ...\n 'drfchelseru.middlewares.TakeUserSessionMiddlaware',\n]\n\nASGI_APPLICATION = 'yourproject.asgi.application'\n\nCHANNEL_LAYERS = {\n 'default': {\n 'BACKEND': 'channels_redis.core.RedisChannelLayer',\n 'CONFIG': {\n 'hosts': [('127.0.0.1', 6379)],\n },\n },\n}\n\nDJANGO_CHELSERU = {\n 'AUTH': {\n 'AUTH_METHOD': 'OTP',\n 'AUTH_SERVICE': 'rest_framework_simplejwt',\n 'OPTIONS': {\n 'OTP_LENGTH': 8,\n 'OTP_EXPIRE_PER_MINUTES': 4,\n 'OTP_SMS_TEMPLATE_ID': 5,\n }\n },\n 'SMS': {\n 'SMS_SERVICE': 'PARSIAN_WEBCO_IR',\n 'SETTINGS': {\n 'PARSIAN_WEBCO_IR_API_KEY': '',\n 'MELI_PAYAMAK_COM_USERNAME': '',\n 'MELI_PAYAMAK_COM_PASSWORD': '',\n 'MELI_PAYAMAK_COM_FROM': '',\n 'KAVENEGAR_COM_API_KEY': '',\n 'KAVENEGAR_COM_FROM': '',\n },\n 'TEMPLATES': {\n 'T1': 1,\n 'T2': 2,\n 'T3': 3,\n }\n },\n 'BANK': {\n 'GATEWAY': 'PAYPING_IR',\n 'SETTINGS': {\n 'MERCHANT_ID': '',\n 'CALLBACK_URL': '',\n 'CURRENCY': 'IRT'\n }\n }\n}\n```\n\n## \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc API\n\n- **POST /drfchelseru/message/send/**: \u0641\u0631\u0633\u062a\u0627\u062f\u0646 \u067e\u06cc\u0627\u0645\u06a9.\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a: `{ \"mobile_number\": \"09211892425\", \"message_text\": \"Hello\", \"template_id\": 1 }`\n - \u067e\u0627\u0633\u062e: `{ \"details\": \"The Message was sent correctly.\" }` (200 OK)\n\n- **POST /drfchelseru/otp/send/**: \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u062f OTP.\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a: `{ \"mobile_number\": \"09211892425\" }`\n - \u067e\u0627\u0633\u062e: `{ \"details\": \"The OTP code was sent correctly.\" }` (200 OK)\n\n- **POST /drfchelseru/authenticate/**: \u062a\u0627\u06cc\u06cc\u062f \u0628\u0627 OTP.\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a: `{ \"mobile_number\": \"09211892425\", \"code\": \"652479\", \"group\": 0 }`\n - \u067e\u0627\u0633\u062e: `{ \"access\": \"<access_token>\", \"refresh\": \"<refresh_token>\" }` (200 OK)\n\n- **GET /drfchelseru/sessions/**: \u0641\u0647\u0631\u0633\u062a \u0646\u0634\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 (\u0641\u0642\u0637 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0627\u06cc\u06cc\u062f\u0634\u062f\u0647).\n\n - \u0633\u0631\u0622\u06cc\u0646\u062f\u0647\u0627: `Authorization: Bearer <access_token>`\n - \u067e\u0627\u0633\u062e: \u0641\u0647\u0631\u0633\u062a \u0646\u0634\u0633\u062a\u200c\u0647\u0627 (200 OK)\n\n- **POST /drfchelseru/payment/create/**: \u0622\u063a\u0627\u0632 \u067e\u0631\u062f\u0627\u062e\u062a.\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a: `{ \"order_id\": \"123\", \"amount\": 1000.0, \"description\": \"Test payment\", \"callback_url\": \"http://example.com/callback\", \"mobile\": \"09211892425\", \"email\": \"user@example.com\", \"currency\": \"IRT\" }`\n - \u067e\u0627\u0633\u062e: `{ \"details\": { \"gateway_url\": \"<url>\", ... } }` (200 OK)\n\n- **GET/POST /drfchelseru/payment/verify/**: \u062a\u0627\u06cc\u06cc\u062f \u067e\u0631\u062f\u0627\u062e\u062a.\n\n - \u062c\u0633\u062a\u062c\u0648\u06cc GET: `?Authority=<authority>&Status=OK`\n - \u0628\u062f\u0646\u0647 POST: `{ \"paymentCode\": \"<code>\", \"paymentRefId\": \"<refid>\", ... }`\n - \u067e\u0627\u0633\u062e: `{ \"details\": { \"is_pay\": 1, ... } }` (200 OK)\n\n- **/drfchelseru/chat/chatrooms/**: CRUD \u0628\u0631\u0627\u06cc \u0627\u062a\u0627\u0642\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648 (\u0641\u0642\u0637 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0627\u06cc\u06cc\u062f\u0634\u062f\u0647).\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST: `{ \"user\": 2 }` (\u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0627\u062a\u0627\u0642 \u0628\u0627 \u0634\u0646\u0627\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 2)\n - \u0633\u0631\u0622\u06cc\u0646\u062f\u0647\u0627: `Authorization: Bearer <access_token>`\n - \u067e\u0627\u0633\u062e: \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0627\u0642 \u06af\u0641\u062a\u06af\u0648 (201 Created)\n\n- **/drfchelseru/chat/messages/**: CRUD \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648 (\u0641\u0642\u0637 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0627\u06cc\u06cc\u062f\u0634\u062f\u0647).\n\n - \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST: `{ \"chat_room\": 1, \"text\": \"Hello\" }`\n - \u062c\u0633\u062a\u062c\u0648\u06cc GET: `?chat_room=1`\n - \u0633\u0631\u0622\u06cc\u0646\u062f\u0647\u0627: `Authorization: Bearer <access_token>`\n - \u067e\u0627\u0633\u062e: \u062c\u0632\u0626\u06cc\u0627\u062a \u067e\u06cc\u0627\u0645 \u06cc\u0627 \u0641\u0647\u0631\u0633\u062a (200 OK / 201 Created)\n\n## \u0628\u0647\u0631\u0647\u200c\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0648\u0628\u200c\u0633\u0648\u06a9\u062a\n\n- \u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u0627\u062a\u0627\u0642 \u06af\u0641\u062a\u06af\u0648 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u0645\u200c\u0631\u0633\u0627\u0646\u06cc \u0647\u0645\u0632\u0645\u0627\u0646:\n\n ```bash\n wscat -c wss://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>\n ```\n - \u0646\u0645\u0648\u0646\u0647 \u0646\u0634\u0627\u0646\u0647: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYxMDE5NTY3LCJpYXQiOjE3NTU4MzU1NjcsImp0aSI6IjhhYTY1Y2I3ZDhmMjRmMzliYjFmNDFkZmJiYjcyYmVmIiwidXNlcl9pZCI6Mzl9.mHmIjbTl3X1cd3Ky5HFCD6gy4kGxMVcActo9JXtT9JQ`\n - <chat_room_id> (\u0645\u0627\u0646\u0646\u062f 17) \u0631\u0627 \u0628\u0627 \u0634\u0646\u0627\u0633\u0647 \u0627\u062a\u0627\u0642 \u062f\u0644\u062e\u0648\u0627\u0647 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u0648 \u0646\u0634\u0627\u0646\u0647 JWT \u0645\u0639\u062a\u0628\u0631 \u0641\u0631\u0627\u0647\u0645 \u06a9\u0646\u06cc\u062f.\n\n## \u0645\u06cc\u0627\u0646\u200c\u06af\u06cc\u0631\u0647\u0627\n\n- **TakeUserSessionMiddlaware**: \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0646\u0634\u0633\u062a \u06a9\u0627\u0631\u0628\u0631 (IP\u060c \u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631\u060c \u062f\u0633\u062a\u06af\u0627\u0647\u060c \u0645\u0631\u0648\u0631\u06af\u0631) \u0631\u0627 \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc HTTP \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.\n- **JWTAuthMiddleware**: \u0627\u062a\u0635\u0627\u0644\u200c\u0647\u0627\u06cc \u0648\u0628\u200c\u0633\u0648\u06a9\u062a \u0631\u0627 \u0628\u0627 \u0646\u0634\u0627\u0646\u0647\u200c\u0647\u0627\u06cc JWT \u062a\u0627\u06cc\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.\n\n## \u0628\u0647\u0631\u0647\u200c\u06af\u06cc\u0631\u06cc\n\n- \u0628\u0647 API \u062f\u0631 `http://<your-domain>/drfchelseru/` \u062f\u0633\u062a\u0631\u0633\u06cc \u06cc\u0627\u0628\u06cc\u062f.\n- \u0628\u0647 \u0648\u0628\u200c\u0633\u0648\u06a9\u062a \u062f\u0631 `ws://<your-domain>/drfchelseru/chat/<chat_room_id>/?token=<jwt_token>` \u0648\u0635\u0644 \u0634\u0648\u06cc\u062f.\n- \u067e\u0646\u0644 \u0645\u062f\u06cc\u0631: \u0627\u0628\u0631\u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 `python manage.py createsuperuser` \u0628\u0633\u0627\u0632\u06cc\u062f.\n\n## \u0647\u0645\u06a9\u0627\u0631\u06cc\n\n1. \u0645\u062e\u0632\u0646 \u0631\u0627 \u0641\u0648\u0631\u06a9 \u06a9\u0646\u06cc\u062f.\n2. \u0634\u0627\u062e\u0647 \u0646\u0648 \u0628\u0633\u0627\u0632\u06cc\u062f (`git checkout -b feature-branch`).\n3. \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0631\u0627 \u06a9\u0627\u0645\u06cc\u062a \u06a9\u0646\u06cc\u062f (`git commit -m \"Add feature\"`).\n4. \u0628\u0647 \u0634\u0627\u062e\u0647 \u0628\u0641\u0631\u0633\u062a\u06cc\u062f (`git push origin feature-branch`).\n5. \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0634\u06cc\u062f\u0646 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f.\n\n## \u067e\u0631\u0648\u0627\u0646\u0647\n\nMIT License\n",
"bugtrack_url": null,
"license": null,
"summary": "Authentication system, online and real-time chat, SMS & BANK system for Iranian SMS services.",
"version": "2.0.5",
"project_urls": {
"Documentation": "https://github.com/Chelseru/django-chelseru-lour/",
"Homepage": "https://pipdjango.chelseru.com",
"Telegram Channel": "https://t.me/ChelseruCom",
"Telegram Group": "https://t.me/bahmanpy"
},
"split_keywords": [
"djangochelseruchat",
"djangochat",
"drfchat",
"online-chat",
"online",
"real-time",
"chat",
"iran",
"chelseru",
"lor",
"lur",
"bahman",
"rashnu",
"rashno",
"lak",
"lour",
"sms",
"djangoauth",
"auth",
"ywt",
"otpauth",
"otp",
"authentication",
"djangootp",
"djangoiransms",
"iransms",
"djangosms",
"djangokavenegar",
"djangomelipayamak",
"sobhan",
"\u0686\u062a",
"",
"\u0633\u0628\u062d\u0627\u0646",
"\u0628\u0647\u0645\u0646",
"\u0631\u0634\u0646\u0648",
"\u0686\u0644\u0633\u0631\u0648",
"\u062c\u0646\u06af\u0648",
"\u067e\u0627\u06cc\u062a\u0648\u0646",
"\u0644\u0631",
"\u0644\u0648\u0631",
"\u0622\u0646\u0644\u0627\u06cc\u0646",
"\u0631\u06cc\u0644",
"\u062a\u0627\u06cc\u0645"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7739610f6187b22e4c60ebb0c678c7e9983d6d2408c3e16c0d45ad080ecb1b89",
"md5": "acb07155cae14b2967fd3972822ad0a0",
"sha256": "cdf6813cc51a58f8e33b27e9d65da77db0b0eb98c8403830fe7620f8dedbdeba"
},
"downloads": -1,
"filename": "django_chelseru-2.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "acb07155cae14b2967fd3972822ad0a0",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 43329,
"upload_time": "2025-10-25T11:07:21",
"upload_time_iso_8601": "2025-10-25T11:07:21.592741Z",
"url": "https://files.pythonhosted.org/packages/77/39/610f6187b22e4c60ebb0c678c7e9983d6d2408c3e16c0d45ad080ecb1b89/django_chelseru-2.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c619db4a31f9a9c45b28cc0cf41f38ddb9e756375c5c1549bb354509d1570f87",
"md5": "242d5812429c9021fb1dbf8cee898b1e",
"sha256": "fed040a923012e3fc870c799a34dbff4786a88835bb6c6c2a18d72d04ad4401e"
},
"downloads": -1,
"filename": "django_chelseru-2.0.5.tar.gz",
"has_sig": false,
"md5_digest": "242d5812429c9021fb1dbf8cee898b1e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 32636,
"upload_time": "2025-10-25T11:07:26",
"upload_time_iso_8601": "2025-10-25T11:07:26.199802Z",
"url": "https://files.pythonhosted.org/packages/c6/19/db4a31f9a9c45b28cc0cf41f38ddb9e756375c5c1549bb354509d1570f87/django_chelseru-2.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-25 11:07:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Chelseru",
"github_project": "django-chelseru-lour",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "asgiref",
"specs": [
[
"==",
"3.8.1"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "autobahn",
"specs": [
[
"==",
"24.4.2"
]
]
},
{
"name": "Automat",
"specs": [
[
"==",
"24.8.1"
]
]
},
{
"name": "build",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.1.31"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.17.1"
]
]
},
{
"name": "channels",
"specs": [
[
"==",
"4.2.2"
]
]
},
{
"name": "channels_redis",
"specs": [
[
"==",
"4.2.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.1"
]
]
},
{
"name": "constantly",
"specs": [
[
"==",
"23.10.4"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"44.0.2"
]
]
},
{
"name": "daphne",
"specs": [
[
"==",
"4.1.2"
]
]
},
{
"name": "Django",
"specs": [
[
"==",
"5.1.6"
]
]
},
{
"name": "django-cors-headers",
"specs": [
[
"==",
"4.7.0"
]
]
},
{
"name": "django-filter",
"specs": [
[
"==",
"25.1"
]
]
},
{
"name": "django-iran-sms",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "djangoiransms",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "djangorestframework",
"specs": [
[
"==",
"3.15.2"
]
]
},
{
"name": "djangorestframework_simplejwt",
"specs": [
[
"==",
"5.5.0"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.22"
]
]
},
{
"name": "hyperlink",
"specs": [
[
"==",
"21.0.0"
]
]
},
{
"name": "id",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "incremental",
"specs": [
[
"==",
"24.7.2"
]
]
},
{
"name": "isodate",
"specs": [
[
"==",
"0.7.2"
]
]
},
{
"name": "jaraco.classes",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "jaraco.context",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "jaraco.functools",
"specs": [
[
"==",
"4.2.1"
]
]
},
{
"name": "jeepney",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "keyring",
"specs": [
[
"==",
"25.6.0"
]
]
},
{
"name": "lxml",
"specs": [
[
"==",
"5.3.2"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "more-itertools",
"specs": [
[
"==",
"10.7.0"
]
]
},
{
"name": "msgpack",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "nh3",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.7"
]
]
},
{
"name": "pyasn1",
"specs": [
[
"==",
"0.6.1"
]
]
},
{
"name": "pyasn1_modules",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "Pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "PyJWT",
"specs": [
[
"==",
"2.9.0"
]
]
},
{
"name": "pyOpenSSL",
"specs": [
[
"==",
"25.0.0"
]
]
},
{
"name": "pyproject_hooks",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "readme_renderer",
"specs": [
[
"==",
"44.0"
]
]
},
{
"name": "redis",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.3"
]
]
},
{
"name": "requests-file",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "requests-toolbelt",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "rfc3986",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.1.0"
]
]
},
{
"name": "SecretStorage",
"specs": [
[
"==",
"3.3.3"
]
]
},
{
"name": "service-identity",
"specs": [
[
"==",
"24.2.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"78.1.0"
]
]
},
{
"name": "sqlparse",
"specs": [
[
"==",
"0.5.3"
]
]
},
{
"name": "twine",
"specs": [
[
"==",
"6.1.0"
]
]
},
{
"name": "Twisted",
"specs": [
[
"==",
"24.11.0"
]
]
},
{
"name": "txaio",
"specs": [
[
"==",
"23.1.1"
]
]
},
{
"name": "typing_extensions",
"specs": [
[
"==",
"4.13.2"
]
]
},
{
"name": "ua-parser",
"specs": [
[
"==",
"1.0.1"
]
]
},
{
"name": "ua-parser-builtins",
"specs": [
[
"==",
"0.18.0.post1"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.3.0"
]
]
},
{
"name": "user-agents",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "zeep",
"specs": [
[
"==",
"4.3.1"
]
]
},
{
"name": "zope.interface",
"specs": [
[
"==",
"7.2"
]
]
}
],
"lcname": "django-chelseru"
}