django-chelseru 1.0.5__tar.gz → 1.0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_chelseru-1.0.7/PKG-INFO +312 -0
- django_chelseru-1.0.7/README.md +273 -0
- django_chelseru-1.0.7/django_chelseru.egg-info/PKG-INFO +312 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/models.py +1 -1
- django_chelseru-1.0.7/drfchelseru/routing.py +6 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/setup.py +2 -2
- django_chelseru-1.0.5/PKG-INFO +0 -316
- django_chelseru-1.0.5/README.md +0 -56
- django_chelseru-1.0.5/django_chelseru.egg-info/PKG-INFO +0 -316
- django_chelseru-1.0.5/drfchelseru/routing.py +0 -6
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/LICENSE +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/MANIFEST.in +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/README_PA.md +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/django_chelseru.egg-info/SOURCES.txt +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/django_chelseru.egg-info/dependency_links.txt +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/django_chelseru.egg-info/requires.txt +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/django_chelseru.egg-info/top_level.txt +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/__init__.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/admin.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/apps.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/consumers.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/middlewares.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0001_initial.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0002_otpcode_session_user.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0003_rename_mobile_otpcode_mobile_number.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0004_rename_message_message_sms.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0005_rename_message_sms_messagesms_chatroom_messagechat.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0006_alter_chatroom_user_1_alter_chatroom_user_2_and_more.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0007_chatroom_pinned_for_chatroom_status_chatroom_users_and_more.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0008_alter_chatroompermissions_user.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0009_alter_chatroom_status.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0010_chatroom_banneds_chatroom_descriptions_chatroom_name_and_more.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/0011_alter_chatroom_user_1_alter_chatroom_user_2.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/migrations/__init__.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/serializers.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/services.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/settings.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/signals.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/tests.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/urls.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/validators.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/drfchelseru/views.py +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/pyproject.toml +0 -0
- {django_chelseru-1.0.5 → django_chelseru-1.0.7}/setup.cfg +0 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: django-chelseru
|
|
3
|
+
Version: 1.0.7
|
|
4
|
+
Summary: Authentication system, online and real-time chat, SMS system for Iranian SMS services.
|
|
5
|
+
Home-page: https://pipdjango.chelseru.com
|
|
6
|
+
Author: Sobhan Bahman|Rashnu
|
|
7
|
+
Author-email: bahmanrashnu@gmail.com
|
|
8
|
+
Project-URL: Documentation, https://github.com/Chelseru/django-chelseru-lour/
|
|
9
|
+
Project-URL: Telegram Group, https://t.me/bahmanpy
|
|
10
|
+
Project-URL: Telegram Channel, https://t.me/ChelseruCom
|
|
11
|
+
Keywords: djangochelseruchat djangochat drfchat online-chat online real-time chat iran chelseru lor lur bahman rashnu lour sms djangoauth auth ywt otpauth otp authentication djangootp djangoiransms iransms djangosms djangokavenegar djangomelipayamak sobhan چت سبحان بهمن رشنو چلسرو جنگو پایتون لر لور آنلاین ریل تایم
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Framework :: Django
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Requires-Python: >=3.11
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: Django>=5.1.6
|
|
20
|
+
Requires-Dist: djangorestframework==3.15.2
|
|
21
|
+
Requires-Dist: djangorestframework_simplejwt==5.5.0
|
|
22
|
+
Requires-Dist: channels==4.2.2
|
|
23
|
+
Requires-Dist: channels_redis==4.2.1
|
|
24
|
+
Requires-Dist: daphne==4.1.2
|
|
25
|
+
Requires-Dist: zeep==4.3.1
|
|
26
|
+
Requires-Dist: user-agents==2.2.0
|
|
27
|
+
Dynamic: author
|
|
28
|
+
Dynamic: author-email
|
|
29
|
+
Dynamic: classifier
|
|
30
|
+
Dynamic: description
|
|
31
|
+
Dynamic: description-content-type
|
|
32
|
+
Dynamic: home-page
|
|
33
|
+
Dynamic: keywords
|
|
34
|
+
Dynamic: license-file
|
|
35
|
+
Dynamic: project-url
|
|
36
|
+
Dynamic: requires-dist
|
|
37
|
+
Dynamic: requires-python
|
|
38
|
+
Dynamic: summary
|
|
39
|
+
|
|
40
|
+
# django-chelseru
|
|
41
|
+
|
|
42
|
+
بستهٔ جنگویی برای **گپزنی همزمان (WebSocket)**، **راستیآزمایی پیامکی (OTP)** و **فرستادن پیامک** با یاریدهندههای ایرانی.
|
|
43
|
+
|
|
44
|
+
**نویسنده:** Sobhan Bahman Rashnu
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## فهرست مطالب
|
|
49
|
+
|
|
50
|
+
- [ویژگیها](#ویژگیها)
|
|
51
|
+
- [نصب](#نصب)
|
|
52
|
+
- [پیشنیازها و افزودن به تنظیمات](#پیشنیازها-و-افزودن-به-تنظیمات)
|
|
53
|
+
- [پیکربندی](#پیکربندی)
|
|
54
|
+
- [تعریف آدرسها (URLs)](#تعریف-آدرسها-urls)
|
|
55
|
+
- [نقطههای پایانی API](#نقطههای-پایانی-api)
|
|
56
|
+
- [/api/otp/send/ — فرستادن رمز یکبارمصرف](#apiotpsend--فرستادن-رمز-یکبارمصرف)
|
|
57
|
+
- [/api/authenticate/ — راستیآزمایی با OTP و دریافت JWT](#apiauthenticate--راستیآزمایی-با-otp-و-دریافت-jwt)
|
|
58
|
+
- [/api/message/send/ — فرستادن پیامک](#apimessagesend--فرستادن-پیامک)
|
|
59
|
+
- [/api/sessions/ — فهرست نشستهای فعال](#apisessions--فهرست-نشستهای-فعال)
|
|
60
|
+
- [مدلها](#مدلها)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## ویژگیها
|
|
65
|
+
|
|
66
|
+
- 📱 **راستیآزمایی پیامکی (OTP):** تولید و فرستادن رمز یکبارمصرف و اعتبارسنجی امن.
|
|
67
|
+
- 💬 **گپزنی همزمان:** پیامرسانی همزمان بر پایهٔ **WebSocket/Channels**.
|
|
68
|
+
- ✉️ **فرستادن پیامک:** پشتیبانی از یاریدهندههای نامآشنای ایرانی.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## نصب
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pip install django-chelseru
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## پیشنیازها و افزودن به تنظیمات
|
|
81
|
+
|
|
82
|
+
`INSTALLED_APPS` را در `settings.py` بهروز کنید:
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
INSTALLED_APPS = [
|
|
86
|
+
# ...
|
|
87
|
+
'channels',
|
|
88
|
+
'rest_framework',
|
|
89
|
+
'rest_framework_simplejwt',
|
|
90
|
+
'drfchelseru',
|
|
91
|
+
# ...
|
|
92
|
+
]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
> نکته: برای قابلیتهای همزمان (WebSocket) پروژهٔ شما باید با **ASGI** اجرا شود (مانند `daphne` یا `uvicorn`).
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## پیکربندی
|
|
100
|
+
|
|
101
|
+
واژهنامهٔ `DJANGO_CHELSERU` را در `settings.py` بیفزایید و بر اساس نیاز خود سفارشیسازی کنید:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
DJANGO_CHELSERU = {
|
|
105
|
+
'AUTH': {
|
|
106
|
+
'AUTH_METHOD': 'OTP', # روشهای پشتیبانیشده: OTP, PASSWD
|
|
107
|
+
'AUTH_SERVICE': 'rest_framework_simplejwt', # فعلاً: rest_framework_simplejwt
|
|
108
|
+
'OPTIONS': {
|
|
109
|
+
'OTP_LENGTH': 8, # پیشفرض: 8
|
|
110
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # پیشفرض: 4
|
|
111
|
+
'OTP_SMS_TEMPLATE_ID': 1, # شناسهٔ قالب پیامکی OTP
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
'SMS': {
|
|
115
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
116
|
+
'SETTINGS': {
|
|
117
|
+
'PARSIAN_WEBCO_IR_API_KEY': '',
|
|
118
|
+
'MELI_PAYAMAK_COM_USERNAME': '',
|
|
119
|
+
'MELI_PAYAMAK_COM_PASSWORD': '',
|
|
120
|
+
'MELI_PAYAMAK_COM_FROM': '',
|
|
121
|
+
'KAVENEGAR_COM_API_KEY': 'YOUR_KAVENEGAR_API_KEY',
|
|
122
|
+
'KAVENEGAR_COM_FROM': 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
123
|
+
},
|
|
124
|
+
'TEMPLATES': {
|
|
125
|
+
'T1': 1,
|
|
126
|
+
'T2': 2,
|
|
127
|
+
# ...
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**راهنما:**
|
|
134
|
+
|
|
135
|
+
- `AUTH_METHOD`: روش راستیآزمایی (برای پیامکی از `'OTP'` استفاده کنید).
|
|
136
|
+
- `OTP_LENGTH`: طول رمز یکبارمصرف.
|
|
137
|
+
- `OTP_EXPIRE_PER_MINUTES`: مدت اعتبار رمز (به دقیقه).
|
|
138
|
+
- `OTP_SMS_TEMPLATE_ID`: شناسهٔ قالب پیامکی که برای OTP بهرهگیری میشود.
|
|
139
|
+
- `SMS_SERVICE`: انتخاب یاریدهندهٔ پیامکی.
|
|
140
|
+
- `SETTINGS`: مقادیر دسترسی یاریدهندهٔ انتخابشده.
|
|
141
|
+
- `TEMPLATES`: نگاشت کلیدهای دلخواه به شناسهٔ قالبها.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## تعریف آدرسها (URLs)
|
|
146
|
+
|
|
147
|
+
در `urls.py`:
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
from django.urls import path, include
|
|
151
|
+
|
|
152
|
+
urlpatterns = [
|
|
153
|
+
# ...
|
|
154
|
+
path('api/', include('drfchelseru.urls')),
|
|
155
|
+
# ...
|
|
156
|
+
]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## نقطههای پایانی API
|
|
162
|
+
|
|
163
|
+
| مسیر | شرح | روش |
|
|
164
|
+
| -------------------- | -------------------------------------------------- | ---- |
|
|
165
|
+
| `/api/otp/send/` | فرستادن رمز یکبارمصرف به شمارهٔ همراه | POST |
|
|
166
|
+
| `/api/authenticate/` | راستیآزمایی کاربر با OTP و دریافت توکنهای JWT | POST |
|
|
167
|
+
| `/api/sessions/` | فهرست و مدیریت نشستهای فعال کاربر (نیازمند احراز) | GET |
|
|
168
|
+
| `/api/message/send/` | فرستادن پیامک با یاریدهندهٔ پیکربندیشده | POST |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### `/api/otp/send/` — فرستادن رمز یکبارمصرف
|
|
173
|
+
|
|
174
|
+
**روش:** `POST`\
|
|
175
|
+
**شرح:** یک OTP به شمارهٔ همراه کاربر فرستاده میشود.
|
|
176
|
+
|
|
177
|
+
**بدنهٔ درخواست:**
|
|
178
|
+
|
|
179
|
+
| فیلد | نوع | شرح | نمونه |
|
|
180
|
+
| --------------- | ----- | ------------------ | ------------- |
|
|
181
|
+
| `mobile_number` | `str` | شمارهٔ همراه کاربر | `09121234567` |
|
|
182
|
+
|
|
183
|
+
**نمونهٔ درخواست:**
|
|
184
|
+
|
|
185
|
+
```http
|
|
186
|
+
POST /api/otp/send/ HTTP/1.1
|
|
187
|
+
Content-Type: application/json
|
|
188
|
+
|
|
189
|
+
{
|
|
190
|
+
"mobile_number": "09121234567"
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**پاسخهای ممکن:**
|
|
195
|
+
|
|
196
|
+
- `200 OK`
|
|
197
|
+
```json
|
|
198
|
+
{ "details": "The OTP code was sent correctly." }
|
|
199
|
+
```
|
|
200
|
+
- `400 Bad Request` — ساختار نادرست `mobile_number`
|
|
201
|
+
- `409 Conflict`
|
|
202
|
+
```json
|
|
203
|
+
{ "details": "An OTP code has already been sent. Please wait X seconds before trying again." }
|
|
204
|
+
```
|
|
205
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
### `/api/authenticate/` — راستیآزمایی با OTP و دریافت JWT
|
|
210
|
+
|
|
211
|
+
**روش:** `POST`\
|
|
212
|
+
**شرح:** اعتبارسنجی کاربر با OTP؛ در صورت موفقیت، توکنهای `access` و `refresh` بازگردانده میشود.
|
|
213
|
+
|
|
214
|
+
**بدنهٔ درخواست:**
|
|
215
|
+
|
|
216
|
+
| فیلد | نوع | شرح | نمونه |
|
|
217
|
+
| --------------- | ----- | --------------------------- | ------------- |
|
|
218
|
+
| `mobile_number` | `str` | شمارهٔ همراه کاربر | `09121234567` |
|
|
219
|
+
| `code` | `str` | رمز یکبارمصرف دریافتشده | `12345678` |
|
|
220
|
+
| `group` | `int` | (اختیاری) شناسهٔ گروه کاربر | `1` |
|
|
221
|
+
|
|
222
|
+
**نمونهٔ درخواست:**
|
|
223
|
+
|
|
224
|
+
```http
|
|
225
|
+
POST /api/authenticate/ HTTP/1.1
|
|
226
|
+
Content-Type: application/json
|
|
227
|
+
|
|
228
|
+
{
|
|
229
|
+
"mobile_number": "09121234567",
|
|
230
|
+
"code": "12345678",
|
|
231
|
+
"group": 1
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**پاسخهای ممکن:**
|
|
236
|
+
|
|
237
|
+
- `200 OK`
|
|
238
|
+
```json
|
|
239
|
+
{ "access": "...", "refresh": "..." }
|
|
240
|
+
```
|
|
241
|
+
- `401 Unauthorized`
|
|
242
|
+
```json
|
|
243
|
+
{ "error": "The code sent to this mobile number was not found." }
|
|
244
|
+
```
|
|
245
|
+
- `400 Bad Request` — فیلدهای الزامی ناپیدا/نامعتبر
|
|
246
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### `/api/message/send/` — فرستادن پیامک
|
|
251
|
+
|
|
252
|
+
**روش:** `POST`\
|
|
253
|
+
**شرح:** فرستادن پیامک سفارشی با یاریدهندهٔ پیکربندیشده.
|
|
254
|
+
|
|
255
|
+
**بدنهٔ درخواست:**
|
|
256
|
+
|
|
257
|
+
| فیلد | نوع | شرح | نمونه |
|
|
258
|
+
| --------------- | ----- | ---------------------------------------------- | --------------- |
|
|
259
|
+
| `mobile_number` | `str` | شمارهٔ همراه گیرنده | `09121234567` |
|
|
260
|
+
| `message_text` | `str` | متن پیام (حداکثر ۲۹۰ نویسه) | `Hello, World!` |
|
|
261
|
+
| `template_id` | `int` | (برای برخی یاریدهندهها مانند پارسیان الزامی) | `1` |
|
|
262
|
+
|
|
263
|
+
**نمونهٔ درخواست:**
|
|
264
|
+
|
|
265
|
+
```http
|
|
266
|
+
POST /api/message/send/ HTTP/1.1
|
|
267
|
+
Content-Type: application/json
|
|
268
|
+
|
|
269
|
+
{
|
|
270
|
+
"mobile_number": "09121234567",
|
|
271
|
+
"message_text": "Hello, World!",
|
|
272
|
+
"template_id": 1
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**پاسخهای ممکن:**
|
|
277
|
+
|
|
278
|
+
- `200 OK`
|
|
279
|
+
```json
|
|
280
|
+
{ "details": "The Message was sent correctly." }
|
|
281
|
+
```
|
|
282
|
+
- `400 Bad Request` — خطاهای اعتبارسنجی فیلدها
|
|
283
|
+
- `401 Unauthorized` — احراز انجام نشده
|
|
284
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
285
|
+
- `502 Bad Gateway` — خطای بازگشتی از یاریدهندهٔ پیامکی
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### `/api/sessions/` — فهرست نشستهای فعال
|
|
290
|
+
|
|
291
|
+
**روش:** `GET`\
|
|
292
|
+
**شرح:** همهٔ نشستهای فعال کاربر را برمیگرداند. نیازمند **احراز هویت** (`IsAuthenticated`).
|
|
293
|
+
|
|
294
|
+
**سربرگهای لازم:**
|
|
295
|
+
|
|
296
|
+
| سربرگ | مقدار |
|
|
297
|
+
| --------------- | ---------------------------- |
|
|
298
|
+
| `Authorization` | `Bearer <your_access_token>` |
|
|
299
|
+
|
|
300
|
+
**نمونهٔ درخواست:**
|
|
301
|
+
|
|
302
|
+
```http
|
|
303
|
+
GET /api/sessions/ HTTP/1.1
|
|
304
|
+
Authorization: Bearer <your_access_token>
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## مدلها
|
|
310
|
+
|
|
311
|
+
این بسته یک مدل **Session** برای مدیریت نشستهای فعال کاربران فراهم میکند.\
|
|
312
|
+
از طریق نقطهٔ پایانی `/api/sessions/` میتوانید نشستها را مشاهده/مدیریت کنید.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# django-chelseru
|
|
2
|
+
|
|
3
|
+
بستهٔ جنگویی برای **گپزنی همزمان (WebSocket)**، **راستیآزمایی پیامکی (OTP)** و **فرستادن پیامک** با یاریدهندههای ایرانی.
|
|
4
|
+
|
|
5
|
+
**نویسنده:** Sobhan Bahman Rashnu
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## فهرست مطالب
|
|
10
|
+
|
|
11
|
+
- [ویژگیها](#ویژگیها)
|
|
12
|
+
- [نصب](#نصب)
|
|
13
|
+
- [پیشنیازها و افزودن به تنظیمات](#پیشنیازها-و-افزودن-به-تنظیمات)
|
|
14
|
+
- [پیکربندی](#پیکربندی)
|
|
15
|
+
- [تعریف آدرسها (URLs)](#تعریف-آدرسها-urls)
|
|
16
|
+
- [نقطههای پایانی API](#نقطههای-پایانی-api)
|
|
17
|
+
- [/api/otp/send/ — فرستادن رمز یکبارمصرف](#apiotpsend--فرستادن-رمز-یکبارمصرف)
|
|
18
|
+
- [/api/authenticate/ — راستیآزمایی با OTP و دریافت JWT](#apiauthenticate--راستیآزمایی-با-otp-و-دریافت-jwt)
|
|
19
|
+
- [/api/message/send/ — فرستادن پیامک](#apimessagesend--فرستادن-پیامک)
|
|
20
|
+
- [/api/sessions/ — فهرست نشستهای فعال](#apisessions--فهرست-نشستهای-فعال)
|
|
21
|
+
- [مدلها](#مدلها)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## ویژگیها
|
|
26
|
+
|
|
27
|
+
- 📱 **راستیآزمایی پیامکی (OTP):** تولید و فرستادن رمز یکبارمصرف و اعتبارسنجی امن.
|
|
28
|
+
- 💬 **گپزنی همزمان:** پیامرسانی همزمان بر پایهٔ **WebSocket/Channels**.
|
|
29
|
+
- ✉️ **فرستادن پیامک:** پشتیبانی از یاریدهندههای نامآشنای ایرانی.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## نصب
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install django-chelseru
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## پیشنیازها و افزودن به تنظیمات
|
|
42
|
+
|
|
43
|
+
`INSTALLED_APPS` را در `settings.py` بهروز کنید:
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
INSTALLED_APPS = [
|
|
47
|
+
# ...
|
|
48
|
+
'channels',
|
|
49
|
+
'rest_framework',
|
|
50
|
+
'rest_framework_simplejwt',
|
|
51
|
+
'drfchelseru',
|
|
52
|
+
# ...
|
|
53
|
+
]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> نکته: برای قابلیتهای همزمان (WebSocket) پروژهٔ شما باید با **ASGI** اجرا شود (مانند `daphne` یا `uvicorn`).
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## پیکربندی
|
|
61
|
+
|
|
62
|
+
واژهنامهٔ `DJANGO_CHELSERU` را در `settings.py` بیفزایید و بر اساس نیاز خود سفارشیسازی کنید:
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
DJANGO_CHELSERU = {
|
|
66
|
+
'AUTH': {
|
|
67
|
+
'AUTH_METHOD': 'OTP', # روشهای پشتیبانیشده: OTP, PASSWD
|
|
68
|
+
'AUTH_SERVICE': 'rest_framework_simplejwt', # فعلاً: rest_framework_simplejwt
|
|
69
|
+
'OPTIONS': {
|
|
70
|
+
'OTP_LENGTH': 8, # پیشفرض: 8
|
|
71
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # پیشفرض: 4
|
|
72
|
+
'OTP_SMS_TEMPLATE_ID': 1, # شناسهٔ قالب پیامکی OTP
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
'SMS': {
|
|
76
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
77
|
+
'SETTINGS': {
|
|
78
|
+
'PARSIAN_WEBCO_IR_API_KEY': '',
|
|
79
|
+
'MELI_PAYAMAK_COM_USERNAME': '',
|
|
80
|
+
'MELI_PAYAMAK_COM_PASSWORD': '',
|
|
81
|
+
'MELI_PAYAMAK_COM_FROM': '',
|
|
82
|
+
'KAVENEGAR_COM_API_KEY': 'YOUR_KAVENEGAR_API_KEY',
|
|
83
|
+
'KAVENEGAR_COM_FROM': 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
84
|
+
},
|
|
85
|
+
'TEMPLATES': {
|
|
86
|
+
'T1': 1,
|
|
87
|
+
'T2': 2,
|
|
88
|
+
# ...
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**راهنما:**
|
|
95
|
+
|
|
96
|
+
- `AUTH_METHOD`: روش راستیآزمایی (برای پیامکی از `'OTP'` استفاده کنید).
|
|
97
|
+
- `OTP_LENGTH`: طول رمز یکبارمصرف.
|
|
98
|
+
- `OTP_EXPIRE_PER_MINUTES`: مدت اعتبار رمز (به دقیقه).
|
|
99
|
+
- `OTP_SMS_TEMPLATE_ID`: شناسهٔ قالب پیامکی که برای OTP بهرهگیری میشود.
|
|
100
|
+
- `SMS_SERVICE`: انتخاب یاریدهندهٔ پیامکی.
|
|
101
|
+
- `SETTINGS`: مقادیر دسترسی یاریدهندهٔ انتخابشده.
|
|
102
|
+
- `TEMPLATES`: نگاشت کلیدهای دلخواه به شناسهٔ قالبها.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## تعریف آدرسها (URLs)
|
|
107
|
+
|
|
108
|
+
در `urls.py`:
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
from django.urls import path, include
|
|
112
|
+
|
|
113
|
+
urlpatterns = [
|
|
114
|
+
# ...
|
|
115
|
+
path('api/', include('drfchelseru.urls')),
|
|
116
|
+
# ...
|
|
117
|
+
]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## نقطههای پایانی API
|
|
123
|
+
|
|
124
|
+
| مسیر | شرح | روش |
|
|
125
|
+
| -------------------- | -------------------------------------------------- | ---- |
|
|
126
|
+
| `/api/otp/send/` | فرستادن رمز یکبارمصرف به شمارهٔ همراه | POST |
|
|
127
|
+
| `/api/authenticate/` | راستیآزمایی کاربر با OTP و دریافت توکنهای JWT | POST |
|
|
128
|
+
| `/api/sessions/` | فهرست و مدیریت نشستهای فعال کاربر (نیازمند احراز) | GET |
|
|
129
|
+
| `/api/message/send/` | فرستادن پیامک با یاریدهندهٔ پیکربندیشده | POST |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### `/api/otp/send/` — فرستادن رمز یکبارمصرف
|
|
134
|
+
|
|
135
|
+
**روش:** `POST`\
|
|
136
|
+
**شرح:** یک OTP به شمارهٔ همراه کاربر فرستاده میشود.
|
|
137
|
+
|
|
138
|
+
**بدنهٔ درخواست:**
|
|
139
|
+
|
|
140
|
+
| فیلد | نوع | شرح | نمونه |
|
|
141
|
+
| --------------- | ----- | ------------------ | ------------- |
|
|
142
|
+
| `mobile_number` | `str` | شمارهٔ همراه کاربر | `09121234567` |
|
|
143
|
+
|
|
144
|
+
**نمونهٔ درخواست:**
|
|
145
|
+
|
|
146
|
+
```http
|
|
147
|
+
POST /api/otp/send/ HTTP/1.1
|
|
148
|
+
Content-Type: application/json
|
|
149
|
+
|
|
150
|
+
{
|
|
151
|
+
"mobile_number": "09121234567"
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**پاسخهای ممکن:**
|
|
156
|
+
|
|
157
|
+
- `200 OK`
|
|
158
|
+
```json
|
|
159
|
+
{ "details": "The OTP code was sent correctly." }
|
|
160
|
+
```
|
|
161
|
+
- `400 Bad Request` — ساختار نادرست `mobile_number`
|
|
162
|
+
- `409 Conflict`
|
|
163
|
+
```json
|
|
164
|
+
{ "details": "An OTP code has already been sent. Please wait X seconds before trying again." }
|
|
165
|
+
```
|
|
166
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### `/api/authenticate/` — راستیآزمایی با OTP و دریافت JWT
|
|
171
|
+
|
|
172
|
+
**روش:** `POST`\
|
|
173
|
+
**شرح:** اعتبارسنجی کاربر با OTP؛ در صورت موفقیت، توکنهای `access` و `refresh` بازگردانده میشود.
|
|
174
|
+
|
|
175
|
+
**بدنهٔ درخواست:**
|
|
176
|
+
|
|
177
|
+
| فیلد | نوع | شرح | نمونه |
|
|
178
|
+
| --------------- | ----- | --------------------------- | ------------- |
|
|
179
|
+
| `mobile_number` | `str` | شمارهٔ همراه کاربر | `09121234567` |
|
|
180
|
+
| `code` | `str` | رمز یکبارمصرف دریافتشده | `12345678` |
|
|
181
|
+
| `group` | `int` | (اختیاری) شناسهٔ گروه کاربر | `1` |
|
|
182
|
+
|
|
183
|
+
**نمونهٔ درخواست:**
|
|
184
|
+
|
|
185
|
+
```http
|
|
186
|
+
POST /api/authenticate/ HTTP/1.1
|
|
187
|
+
Content-Type: application/json
|
|
188
|
+
|
|
189
|
+
{
|
|
190
|
+
"mobile_number": "09121234567",
|
|
191
|
+
"code": "12345678",
|
|
192
|
+
"group": 1
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**پاسخهای ممکن:**
|
|
197
|
+
|
|
198
|
+
- `200 OK`
|
|
199
|
+
```json
|
|
200
|
+
{ "access": "...", "refresh": "..." }
|
|
201
|
+
```
|
|
202
|
+
- `401 Unauthorized`
|
|
203
|
+
```json
|
|
204
|
+
{ "error": "The code sent to this mobile number was not found." }
|
|
205
|
+
```
|
|
206
|
+
- `400 Bad Request` — فیلدهای الزامی ناپیدا/نامعتبر
|
|
207
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### `/api/message/send/` — فرستادن پیامک
|
|
212
|
+
|
|
213
|
+
**روش:** `POST`\
|
|
214
|
+
**شرح:** فرستادن پیامک سفارشی با یاریدهندهٔ پیکربندیشده.
|
|
215
|
+
|
|
216
|
+
**بدنهٔ درخواست:**
|
|
217
|
+
|
|
218
|
+
| فیلد | نوع | شرح | نمونه |
|
|
219
|
+
| --------------- | ----- | ---------------------------------------------- | --------------- |
|
|
220
|
+
| `mobile_number` | `str` | شمارهٔ همراه گیرنده | `09121234567` |
|
|
221
|
+
| `message_text` | `str` | متن پیام (حداکثر ۲۹۰ نویسه) | `Hello, World!` |
|
|
222
|
+
| `template_id` | `int` | (برای برخی یاریدهندهها مانند پارسیان الزامی) | `1` |
|
|
223
|
+
|
|
224
|
+
**نمونهٔ درخواست:**
|
|
225
|
+
|
|
226
|
+
```http
|
|
227
|
+
POST /api/message/send/ HTTP/1.1
|
|
228
|
+
Content-Type: application/json
|
|
229
|
+
|
|
230
|
+
{
|
|
231
|
+
"mobile_number": "09121234567",
|
|
232
|
+
"message_text": "Hello, World!",
|
|
233
|
+
"template_id": 1
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**پاسخهای ممکن:**
|
|
238
|
+
|
|
239
|
+
- `200 OK`
|
|
240
|
+
```json
|
|
241
|
+
{ "details": "The Message was sent correctly." }
|
|
242
|
+
```
|
|
243
|
+
- `400 Bad Request` — خطاهای اعتبارسنجی فیلدها
|
|
244
|
+
- `401 Unauthorized` — احراز انجام نشده
|
|
245
|
+
- `500 Internal Server Error` — خطا در کارگذار
|
|
246
|
+
- `502 Bad Gateway` — خطای بازگشتی از یاریدهندهٔ پیامکی
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### `/api/sessions/` — فهرست نشستهای فعال
|
|
251
|
+
|
|
252
|
+
**روش:** `GET`\
|
|
253
|
+
**شرح:** همهٔ نشستهای فعال کاربر را برمیگرداند. نیازمند **احراز هویت** (`IsAuthenticated`).
|
|
254
|
+
|
|
255
|
+
**سربرگهای لازم:**
|
|
256
|
+
|
|
257
|
+
| سربرگ | مقدار |
|
|
258
|
+
| --------------- | ---------------------------- |
|
|
259
|
+
| `Authorization` | `Bearer <your_access_token>` |
|
|
260
|
+
|
|
261
|
+
**نمونهٔ درخواست:**
|
|
262
|
+
|
|
263
|
+
```http
|
|
264
|
+
GET /api/sessions/ HTTP/1.1
|
|
265
|
+
Authorization: Bearer <your_access_token>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## مدلها
|
|
271
|
+
|
|
272
|
+
این بسته یک مدل **Session** برای مدیریت نشستهای فعال کاربران فراهم میکند.\
|
|
273
|
+
از طریق نقطهٔ پایانی `/api/sessions/` میتوانید نشستها را مشاهده/مدیریت کنید.
|