django-chelseru 1.0.0__tar.gz → 1.0.2__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.2/MANIFEST.in +1 -0
- django_chelseru-1.0.2/PKG-INFO +95 -0
- django_chelseru-1.0.2/README.md +56 -0
- django_chelseru-1.0.2/README_PA.md +56 -0
- django_chelseru-1.0.2/django_chelseru.egg-info/PKG-INFO +95 -0
- django_chelseru-1.0.2/django_chelseru.egg-info/SOURCES.txt +28 -0
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/django_chelseru.egg-info/requires.txt +2 -0
- django_chelseru-1.0.2/django_chelseru.egg-info/top_level.txt +1 -0
- django_chelseru-1.0.2/drfchelseru/admin.py +24 -0
- django_chelseru-1.0.2/drfchelseru/apps.py +9 -0
- django_chelseru-1.0.2/drfchelseru/middlewares.py +44 -0
- django_chelseru-1.0.2/drfchelseru/migrations/0001_initial.py +33 -0
- django_chelseru-1.0.2/drfchelseru/migrations/0002_otpcode_session_user.py +92 -0
- django_chelseru-1.0.2/drfchelseru/migrations/0003_rename_mobile_otpcode_mobile_number.py +18 -0
- django_chelseru-1.0.2/drfchelseru/models.py +77 -0
- django_chelseru-1.0.2/drfchelseru/serializers.py +34 -0
- django_chelseru-1.0.2/drfchelseru/services.py +239 -0
- django_chelseru-1.0.2/drfchelseru/settings.py +187 -0
- django_chelseru-1.0.2/drfchelseru/signals.py +38 -0
- django_chelseru-1.0.2/drfchelseru/urls.py +11 -0
- django_chelseru-1.0.2/drfchelseru/validators.py +15 -0
- django_chelseru-1.0.2/drfchelseru/views.py +213 -0
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/setup.py +8 -6
- django_chelseru-1.0.0/MANIFEST.in +0 -1
- django_chelseru-1.0.0/PKG-INFO +0 -56
- django_chelseru-1.0.0/README.md +0 -19
- django_chelseru-1.0.0/django_chelseru.egg-info/PKG-INFO +0 -56
- django_chelseru-1.0.0/django_chelseru.egg-info/SOURCES.txt +0 -36
- django_chelseru-1.0.0/django_chelseru.egg-info/top_level.txt +0 -3
- django_chelseru-1.0.0/drf_chelseru_auth/admin.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_auth/apps.py +0 -6
- django_chelseru-1.0.0/drf_chelseru_auth/models.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_auth/views.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_chat/__init__.py +0 -0
- django_chelseru-1.0.0/drf_chelseru_chat/admin.py +0 -5
- django_chelseru-1.0.0/drf_chelseru_chat/apps.py +0 -6
- django_chelseru-1.0.0/drf_chelseru_chat/consumers.py +0 -82
- django_chelseru-1.0.0/drf_chelseru_chat/middleware.py +0 -33
- django_chelseru-1.0.0/drf_chelseru_chat/migrations/0001_initial.py +0 -36
- django_chelseru-1.0.0/drf_chelseru_chat/migrations/__init__.py +0 -0
- django_chelseru-1.0.0/drf_chelseru_chat/models.py +0 -23
- django_chelseru-1.0.0/drf_chelseru_chat/routing.py +0 -6
- django_chelseru-1.0.0/drf_chelseru_chat/serializers.py +0 -26
- django_chelseru-1.0.0/drf_chelseru_chat/urls.py +0 -12
- django_chelseru-1.0.0/drf_chelseru_chat/views.py +0 -59
- django_chelseru-1.0.0/drf_chelseru_sms/__init__.py +0 -0
- django_chelseru-1.0.0/drf_chelseru_sms/admin.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_sms/apps.py +0 -6
- django_chelseru-1.0.0/drf_chelseru_sms/migrations/__init__.py +0 -0
- django_chelseru-1.0.0/drf_chelseru_sms/models.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_sms/tests.py +0 -3
- django_chelseru-1.0.0/drf_chelseru_sms/views.py +0 -3
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/LICENSE +0 -0
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/django_chelseru.egg-info/dependency_links.txt +0 -0
- {django_chelseru-1.0.0/drf_chelseru_auth → django_chelseru-1.0.2/drfchelseru}/__init__.py +0 -0
- {django_chelseru-1.0.0/drf_chelseru_auth → django_chelseru-1.0.2/drfchelseru}/migrations/__init__.py +0 -0
- {django_chelseru-1.0.0/drf_chelseru_auth → django_chelseru-1.0.2/drfchelseru}/tests.py +0 -0
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/pyproject.toml +0 -0
- {django_chelseru-1.0.0 → django_chelseru-1.0.2}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
include README_PA.md
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: django-chelseru
|
|
3
|
+
Version: 1.0.2
|
|
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یک بسته جنگویی برای گپزنی همزمان، راستیآزمایی پیامکی و فرستادن پیامک با یاریدهندههای ایرانی.نویسندهSobhan Bahman Rashnu🚀 ویژگیها📱 راستیآزمایی پیامکی (رمز یکبارمصرف): راستیآزمایی امن کاربران با یاریگیری از رمزهای یکبارمصرف که از راه پیامک فرستاده میشوند.💬 گپزنی همزمان: کارکرد پیامرسانی همزمان بر پایه WebSocket.✉️ سامانههای پیامکی: فرستادن پیامک از راه یاریدهندههای نامور پیامکی ایرانی.⚙️ نصببسته را با یاریگیری از pip نصب کنید:pip install django-chelseru
|
|
41
|
+
'drfchelseru' را به INSTALLED_APPS در پرونده settings.py خود بیفزایید:INSTALLED_APPS = [
|
|
42
|
+
...
|
|
43
|
+
'channels',
|
|
44
|
+
'rest_framework',
|
|
45
|
+
'rest_framework_simplejwt',
|
|
46
|
+
'drfchelseru',
|
|
47
|
+
...
|
|
48
|
+
]
|
|
49
|
+
🛠️ پیکربندیبرای پیکربندی بسته، واژهنامه DJANGO_CHELSERU را به پرونده settings.py خود بیفزایید. این واژهنامه به شما پروانه میدهد تا چیدمانهای راستیآزمایی و پیامک را خودساخته نمایید.# settings.py
|
|
50
|
+
|
|
51
|
+
DJANGO_CHELSERU = {
|
|
52
|
+
'AUTH': {
|
|
53
|
+
'AUTH_METHOD' : 'OTP', # روشهای پشتیبانی شده: OTP, PASSWD
|
|
54
|
+
'AUTH_SERVICE' : 'rest_framework_simplejwt', # سرویسهای پشتیبانی شده: rest_framework_simplejwt
|
|
55
|
+
'OPTIONS': {
|
|
56
|
+
'OTP_LENGTH' : 8, # پیشفرض: 8
|
|
57
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # پیشفرض: 4
|
|
58
|
+
'OTP_SMS_TEMPLATE_ID' : 1, # شناسه قالب پیامکی برای رمز یکبارمصرف
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
'SMS': {
|
|
62
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # یاریدهندههای پشتیبانی شده: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
63
|
+
'SETTINGS': {
|
|
64
|
+
'PARSIAN_WEBCO_IR_API_KEY' : 'YOUR_PARSIAN_WEBCO_API_KEY',
|
|
65
|
+
'MELI_PAYAMAK_COM_USERNAME' : 'YOUR_MELI_PAYAMAK_USERNAME',
|
|
66
|
+
'MELI_PAYAMAK_COM_PASSWORD' : 'YOUR_MELI_PAYAMAK_PASSWORD',
|
|
67
|
+
'MELI_PAYAMAK_COM_FROM' : 'YOUR_MELI_PAYAMAK_FROM_NUMBER',
|
|
68
|
+
'KAVENEGAR_COM_API_KEY' : 'YOUR_KAVENEGAR_API_KEY',
|
|
69
|
+
'KAVENEGAR_COM_FROM' : 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
70
|
+
},
|
|
71
|
+
'TEMPLATES': {
|
|
72
|
+
'T1': 1,
|
|
73
|
+
'T2': 2,
|
|
74
|
+
...
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
AUTH_METHOD: روش راستیآزمایی را روشن میسازد. برای راستیآزمایی پیامکی، از 'OTP' بهره بگیرید.OTP_LENGTH: درازای رمز یکبارمصرف.OTP_EXPIRE_PER_MINUTES: زمان پایانیافتن رمز یکبارمصرف بر پایه دقیقه.OTP_SMS_TEMPLATE_ID: شناسه قالب پیامکی که برای فرستادن رمز یکبارمصرف بهره گرفته میشود.SMS_SERVICE: یاریدهنده پیامکی دلخواه خود را برگزینید.SETTINGS: آگاهیهای نیاز برای یاریدهنده پیامکی برگزیدهتان را فراهم آورید.TEMPLATES: شناسههای قالب پیامکی خود را روشن سازید.🔌 نقطههای پایانیبرای به کارگیری کارکردهای این بسته، URLهای زیر را به پرونده urls.py خود بیفزایید.# urls.py
|
|
79
|
+
|
|
80
|
+
from django.urls import path, include
|
|
81
|
+
|
|
82
|
+
urlpatterns = [
|
|
83
|
+
...
|
|
84
|
+
path('api/', include('drfchelseru.urls')),
|
|
85
|
+
...
|
|
86
|
+
]
|
|
87
|
+
این بسته نقطههای پایانی API زیر را فراهم میآورد:نقطه پایانیشرحروش/api/otp/send/یک رمز یکبارمصرف به شماره همراه گفتهشده میفرستد.POST/api/authenticate/کاربری را با رمز یکبارمصرف دریافتشده، راستیآزمایی میکند.POST/api/sessions/نشستهای فعال کاربر را فهرست کرده و درایوری میکند.GET/api/message/send/یک پیامک با یاریدهنده پیکربندیشده میفرستد.POSTبه کارگیری نقطههای پایانی1. فرستادن رمز یکبارمصرف (/api/otp/send/)روش: POSTشرح: یک رمز یکبارمصرف به شماره همراه کاربر میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567پاسخها:HTTP 200 OK: رمز یکبارمصرف با کامیابی فرستاده شد.{"details": "The OTP code was sent correctly."}
|
|
88
|
+
HTTP 400 BAD REQUEST: ساختار نادرست mobile_number.HTTP 409 CONFLICT: یک رمز یکبارمصرف پیشتر فرستاده شده و هنوز روایی دارد.{"details": "An OTP code has already been sent. Please wait X seconds before trying again."}
|
|
89
|
+
HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.2. راستیآزمایی (/api/authenticate/)روش: POSTشرح: کاربر را با رمز یکبارمصرف فراهم شده، راستیآزمایی میکند. اگر با کامیابی انجام شود، توکنهای JWT (access و refresh) را بازمیگرداند.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567codestrرمز یکبارمصرف دریافت شده از راه پیامک.12345678groupintاختیاری: یک شناسه دسته برای کاربر.1پاسخها:HTTP 200 OK: راستیآزمایی با کامیابی انجام شد.{
|
|
90
|
+
"access": "...",
|
|
91
|
+
"refresh": "..."
|
|
92
|
+
}
|
|
93
|
+
HTTP 401 UNAUTHORIZED: رمز یکبارمصرف ناروا یا پایانیافته.{"error": "The code sent to this mobile number was not found."}
|
|
94
|
+
HTTP 400 BAD REQUEST: دادهنماهای نیاز ناپیدا یا ساختار نادرست.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.3. فرستادن پیامک (/api/message/send/)روش: POSTشرح: یک پیامک خودساخته را با یاریدهنده پیکربندیشده میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه گیرنده.09121234567message_textstrنوشتار پیام. (بیشینه ۲۹۰ نویسه)Hello, World!template_idintبرای برخی یاریدهندهها (برای نمونه پارسیان) نیاز است.1پاسخها:HTTP 200 OK: پیام با کامیابی فرستاده شد.{"details": "The Message was sent correctly."}
|
|
95
|
+
HTTP 400 BAD REQUEST: دشواریهای درستسنجی برای دادهنماها.HTTP 401 UNAUTHORIZED: راستیآزمایی انجام نشد.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.HTTP 502 BAD GATEWAY: یاریدهنده پیامکی یک دشواری را بازگرداند.4. فهرست نشستها (/api/sessions/)روش: GETشرح: همه نشستهای فعال کاربران را فهرست میکند. نیاز به راستیآزمایی (IsAuthenticated) دارد.سربرگهای نیاز:سربرگارزشAuthorizationBearer <your_access_token>💡 مدلهااین بسته یک مدل Session برای درایوری نشستهای فعال کاربران دارد. میتوانید به این نشستها از راه نقطه پایانی /api/sessions/ دسترسی یافته و آنها را درایوری کنید.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
django-chelseruA Django package for real-time chat, SMS authentication, and sending SMS messages with Iranian providers.AuthorSobhan Bahman Rashnu🚀 Features📱 SMS Authentication (OTP): Secure user authentication using one-time passwords sent via SMS.💬 Real-time Chat: WebSocket-based real-time messaging functionality.✉️ SMS Services: Send SMS messages through popular Iranian SMS providers.⚙️ InstallationInstall the package using pip:pip install django-chelseru
|
|
2
|
+
Add 'drfchelseru' to your INSTALLED_APPS in settings.py:INSTALLED_APPS = [
|
|
3
|
+
...
|
|
4
|
+
'channels',
|
|
5
|
+
'rest_framework',
|
|
6
|
+
'rest_framework_simplejwt',
|
|
7
|
+
'drfchelseru',
|
|
8
|
+
...
|
|
9
|
+
]
|
|
10
|
+
🛠️ ConfigurationTo configure the package, add the DJANGO_CHELSERU dictionary to your settings.py file. This dictionary allows you to customize authentication and SMS settings.# settings.py
|
|
11
|
+
|
|
12
|
+
DJANGO_CHELSERU = {
|
|
13
|
+
'AUTH': {
|
|
14
|
+
'AUTH_METHOD' : 'OTP', # Supported methods: OTP, PASSWD
|
|
15
|
+
'AUTH_SERVICE' : 'rest_framework_simplejwt', # Supported services: rest_framework_simplejwt
|
|
16
|
+
'OPTIONS': {
|
|
17
|
+
'OTP_LENGTH' : 8, # Default: 8
|
|
18
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # Default: 4
|
|
19
|
+
'OTP_SMS_TEMPLATE_ID' : 1, # SMS template ID for OTP
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
'SMS': {
|
|
23
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # Supported providers: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
24
|
+
'SETTINGS': {
|
|
25
|
+
'PARSIAN_WEBCO_IR_API_KEY' : 'YOUR_PARSIAN_WEBCO_API_KEY',
|
|
26
|
+
'MELI_PAYAMAK_COM_USERNAME' : 'YOUR_MELI_PAYAMAK_USERNAME',
|
|
27
|
+
'MELI_PAYAMAK_COM_PASSWORD' : 'YOUR_MELI_PAYAMAK_PASSWORD',
|
|
28
|
+
'MELI_PAYAMAK_COM_FROM' : 'YOUR_MELI_PAYAMAK_FROM_NUMBER',
|
|
29
|
+
'KAVENEGAR_COM_API_KEY' : 'YOUR_KAVENEGAR_API_KEY',
|
|
30
|
+
'KAVENEGAR_COM_FROM' : 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
31
|
+
},
|
|
32
|
+
'TEMPLATES': {
|
|
33
|
+
'T1': 1,
|
|
34
|
+
'T2': 2,
|
|
35
|
+
...
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
AUTH_METHOD: Specifies the authentication method. Use 'OTP' for SMS-based authentication.OTP_LENGTH: The length of the one-time password.OTP_EXPIRE_PER_MINUTES: The expiration time for the OTP in minutes.OTP_SMS_TEMPLATE_ID: The template ID of the SMS message used for sending the OTP.SMS_SERVICE: Select your desired SMS provider.SETTINGS: Provide the necessary credentials for your chosen SMS provider.TEMPLATES: Define your SMS template IDs.🔌 EndpointsAdd the following URLs to your urls.py file to use the package's functionality.# urls.py
|
|
40
|
+
|
|
41
|
+
from django.urls import path, include
|
|
42
|
+
|
|
43
|
+
urlpatterns = [
|
|
44
|
+
...
|
|
45
|
+
path('api/', include('drfchelseru.urls')),
|
|
46
|
+
...
|
|
47
|
+
]
|
|
48
|
+
The package provides the following API endpoints:EndpointDescriptionMethod/api/otp/send/Sends an OTP to the specified phone number.POST/api/authenticate/Authenticates a user with the received OTP.POST/api/sessions/Lists and manages active user sessions.GET/api/message/send/Sends an SMS message using the configured provider.POSTEndpoint Usage1. OTP Code Sending (/api/otp/send/)Method: POSTDescription: Sends a one-time password to the user's mobile number.Required Parameters:ParameterTypeDescriptionExamplemobile_numberstrThe user's mobile number.09121234567Responses:HTTP 200 OK: OTP code sent successfully.{"details": "The OTP code was sent correctly."}
|
|
49
|
+
HTTP 400 BAD REQUEST: Invalid mobile_number format.HTTP 409 CONFLICT: An OTP has already been sent and is still valid.{"details": "An OTP code has already been sent. Please wait X seconds before trying again."}
|
|
50
|
+
HTTP 500 INTERNAL SERVER ERROR: An issue occurred on the server.2. Authentication (/api/authenticate/)Method: POSTDescription: Authenticates the user with the provided OTP. On success, it returns JWT tokens (access and refresh).Required Parameters:ParameterTypeDescriptionExamplemobile_numberstrThe user's mobile number.09121234567codestrThe OTP received via SMS.12345678groupintOptional: A group identifier for the user.1Responses:HTTP 200 OK: Authentication successful.{
|
|
51
|
+
"access": "...",
|
|
52
|
+
"refresh": "..."
|
|
53
|
+
}
|
|
54
|
+
HTTP 401 UNAUTHORIZED: Invalid or expired OTP code.{"error": "The code sent to this mobile number was not found."}
|
|
55
|
+
HTTP 400 BAD REQUEST: Missing required parameters or invalid format.HTTP 500 INTERNAL SERVER ERROR: An issue occurred on the server.3. Message Sending (/api/message/send/)Method: POSTDescription: Sends a custom SMS message using the configured provider.Required Parameters:ParameterTypeDescriptionExamplemobile_numberstrThe recipient's mobile number.09121234567message_textstrThe text of the message. (Max 290 chars)Hello, World!template_idintRequired for some providers (e.g., Parsian).1Responses:HTTP 200 OK: Message sent successfully.{"details": "The Message was sent correctly."}
|
|
56
|
+
HTTP 400 BAD REQUEST: Validation errors for parameters.HTTP 401 UNAUTHORIZED: Authentication failed.HTTP 500 INTERNAL SERVER ERROR: An issue occurred on the server.HTTP 502 BAD GATEWAY: SMS provider returned an error.4. Session List (/api/sessions/)Method: GETDescription: Lists all active user sessions. Requires authentication (IsAuthenticated).Required Headers:HeaderValueAuthorizationBearer <your_access_token>💡 ModelsThis package includes a Session model for managing active user sessions. You can access and manage these sessions through the /api/sessions/ endpoint.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
django-chelseruیک بسته جنگویی برای گپزنی همزمان، راستیآزمایی پیامکی و فرستادن پیامک با یاریدهندههای ایرانی.نویسندهSobhan Bahman Rashnu🚀 ویژگیها📱 راستیآزمایی پیامکی (رمز یکبارمصرف): راستیآزمایی امن کاربران با یاریگیری از رمزهای یکبارمصرف که از راه پیامک فرستاده میشوند.💬 گپزنی همزمان: کارکرد پیامرسانی همزمان بر پایه WebSocket.✉️ سامانههای پیامکی: فرستادن پیامک از راه یاریدهندههای نامور پیامکی ایرانی.⚙️ نصببسته را با یاریگیری از pip نصب کنید:pip install django-chelseru
|
|
2
|
+
'drfchelseru' را به INSTALLED_APPS در پرونده settings.py خود بیفزایید:INSTALLED_APPS = [
|
|
3
|
+
...
|
|
4
|
+
'channels',
|
|
5
|
+
'rest_framework',
|
|
6
|
+
'rest_framework_simplejwt',
|
|
7
|
+
'drfchelseru',
|
|
8
|
+
...
|
|
9
|
+
]
|
|
10
|
+
🛠️ پیکربندیبرای پیکربندی بسته، واژهنامه DJANGO_CHELSERU را به پرونده settings.py خود بیفزایید. این واژهنامه به شما پروانه میدهد تا چیدمانهای راستیآزمایی و پیامک را خودساخته نمایید.# settings.py
|
|
11
|
+
|
|
12
|
+
DJANGO_CHELSERU = {
|
|
13
|
+
'AUTH': {
|
|
14
|
+
'AUTH_METHOD' : 'OTP', # روشهای پشتیبانی شده: OTP, PASSWD
|
|
15
|
+
'AUTH_SERVICE' : 'rest_framework_simplejwt', # سرویسهای پشتیبانی شده: rest_framework_simplejwt
|
|
16
|
+
'OPTIONS': {
|
|
17
|
+
'OTP_LENGTH' : 8, # پیشفرض: 8
|
|
18
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # پیشفرض: 4
|
|
19
|
+
'OTP_SMS_TEMPLATE_ID' : 1, # شناسه قالب پیامکی برای رمز یکبارمصرف
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
'SMS': {
|
|
23
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # یاریدهندههای پشتیبانی شده: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
24
|
+
'SETTINGS': {
|
|
25
|
+
'PARSIAN_WEBCO_IR_API_KEY' : 'YOUR_PARSIAN_WEBCO_API_KEY',
|
|
26
|
+
'MELI_PAYAMAK_COM_USERNAME' : 'YOUR_MELI_PAYAMAK_USERNAME',
|
|
27
|
+
'MELI_PAYAMAK_COM_PASSWORD' : 'YOUR_MELI_PAYAMAK_PASSWORD',
|
|
28
|
+
'MELI_PAYAMAK_COM_FROM' : 'YOUR_MELI_PAYAMAK_FROM_NUMBER',
|
|
29
|
+
'KAVENEGAR_COM_API_KEY' : 'YOUR_KAVENEGAR_API_KEY',
|
|
30
|
+
'KAVENEGAR_COM_FROM' : 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
31
|
+
},
|
|
32
|
+
'TEMPLATES': {
|
|
33
|
+
'T1': 1,
|
|
34
|
+
'T2': 2,
|
|
35
|
+
...
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
AUTH_METHOD: روش راستیآزمایی را روشن میسازد. برای راستیآزمایی پیامکی، از 'OTP' بهره بگیرید.OTP_LENGTH: درازای رمز یکبارمصرف.OTP_EXPIRE_PER_MINUTES: زمان پایانیافتن رمز یکبارمصرف بر پایه دقیقه.OTP_SMS_TEMPLATE_ID: شناسه قالب پیامکی که برای فرستادن رمز یکبارمصرف بهره گرفته میشود.SMS_SERVICE: یاریدهنده پیامکی دلخواه خود را برگزینید.SETTINGS: آگاهیهای نیاز برای یاریدهنده پیامکی برگزیدهتان را فراهم آورید.TEMPLATES: شناسههای قالب پیامکی خود را روشن سازید.🔌 نقطههای پایانیبرای به کارگیری کارکردهای این بسته، URLهای زیر را به پرونده urls.py خود بیفزایید.# urls.py
|
|
40
|
+
|
|
41
|
+
from django.urls import path, include
|
|
42
|
+
|
|
43
|
+
urlpatterns = [
|
|
44
|
+
...
|
|
45
|
+
path('api/', include('drfchelseru.urls')),
|
|
46
|
+
...
|
|
47
|
+
]
|
|
48
|
+
این بسته نقطههای پایانی API زیر را فراهم میآورد:نقطه پایانیشرحروش/api/otp/send/یک رمز یکبارمصرف به شماره همراه گفتهشده میفرستد.POST/api/authenticate/کاربری را با رمز یکبارمصرف دریافتشده، راستیآزمایی میکند.POST/api/sessions/نشستهای فعال کاربر را فهرست کرده و درایوری میکند.GET/api/message/send/یک پیامک با یاریدهنده پیکربندیشده میفرستد.POSTبه کارگیری نقطههای پایانی1. فرستادن رمز یکبارمصرف (/api/otp/send/)روش: POSTشرح: یک رمز یکبارمصرف به شماره همراه کاربر میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567پاسخها:HTTP 200 OK: رمز یکبارمصرف با کامیابی فرستاده شد.{"details": "The OTP code was sent correctly."}
|
|
49
|
+
HTTP 400 BAD REQUEST: ساختار نادرست mobile_number.HTTP 409 CONFLICT: یک رمز یکبارمصرف پیشتر فرستاده شده و هنوز روایی دارد.{"details": "An OTP code has already been sent. Please wait X seconds before trying again."}
|
|
50
|
+
HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.2. راستیآزمایی (/api/authenticate/)روش: POSTشرح: کاربر را با رمز یکبارمصرف فراهم شده، راستیآزمایی میکند. اگر با کامیابی انجام شود، توکنهای JWT (access و refresh) را بازمیگرداند.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567codestrرمز یکبارمصرف دریافت شده از راه پیامک.12345678groupintاختیاری: یک شناسه دسته برای کاربر.1پاسخها:HTTP 200 OK: راستیآزمایی با کامیابی انجام شد.{
|
|
51
|
+
"access": "...",
|
|
52
|
+
"refresh": "..."
|
|
53
|
+
}
|
|
54
|
+
HTTP 401 UNAUTHORIZED: رمز یکبارمصرف ناروا یا پایانیافته.{"error": "The code sent to this mobile number was not found."}
|
|
55
|
+
HTTP 400 BAD REQUEST: دادهنماهای نیاز ناپیدا یا ساختار نادرست.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.3. فرستادن پیامک (/api/message/send/)روش: POSTشرح: یک پیامک خودساخته را با یاریدهنده پیکربندیشده میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه گیرنده.09121234567message_textstrنوشتار پیام. (بیشینه ۲۹۰ نویسه)Hello, World!template_idintبرای برخی یاریدهندهها (برای نمونه پارسیان) نیاز است.1پاسخها:HTTP 200 OK: پیام با کامیابی فرستاده شد.{"details": "The Message was sent correctly."}
|
|
56
|
+
HTTP 400 BAD REQUEST: دشواریهای درستسنجی برای دادهنماها.HTTP 401 UNAUTHORIZED: راستیآزمایی انجام نشد.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.HTTP 502 BAD GATEWAY: یاریدهنده پیامکی یک دشواری را بازگرداند.4. فهرست نشستها (/api/sessions/)روش: GETشرح: همه نشستهای فعال کاربران را فهرست میکند. نیاز به راستیآزمایی (IsAuthenticated) دارد.سربرگهای نیاز:سربرگارزشAuthorizationBearer <your_access_token>💡 مدلهااین بسته یک مدل Session برای درایوری نشستهای فعال کاربران دارد. میتوانید به این نشستها از راه نقطه پایانی /api/sessions/ دسترسی یافته و آنها را درایوری کنید.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: django-chelseru
|
|
3
|
+
Version: 1.0.2
|
|
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یک بسته جنگویی برای گپزنی همزمان، راستیآزمایی پیامکی و فرستادن پیامک با یاریدهندههای ایرانی.نویسندهSobhan Bahman Rashnu🚀 ویژگیها📱 راستیآزمایی پیامکی (رمز یکبارمصرف): راستیآزمایی امن کاربران با یاریگیری از رمزهای یکبارمصرف که از راه پیامک فرستاده میشوند.💬 گپزنی همزمان: کارکرد پیامرسانی همزمان بر پایه WebSocket.✉️ سامانههای پیامکی: فرستادن پیامک از راه یاریدهندههای نامور پیامکی ایرانی.⚙️ نصببسته را با یاریگیری از pip نصب کنید:pip install django-chelseru
|
|
41
|
+
'drfchelseru' را به INSTALLED_APPS در پرونده settings.py خود بیفزایید:INSTALLED_APPS = [
|
|
42
|
+
...
|
|
43
|
+
'channels',
|
|
44
|
+
'rest_framework',
|
|
45
|
+
'rest_framework_simplejwt',
|
|
46
|
+
'drfchelseru',
|
|
47
|
+
...
|
|
48
|
+
]
|
|
49
|
+
🛠️ پیکربندیبرای پیکربندی بسته، واژهنامه DJANGO_CHELSERU را به پرونده settings.py خود بیفزایید. این واژهنامه به شما پروانه میدهد تا چیدمانهای راستیآزمایی و پیامک را خودساخته نمایید.# settings.py
|
|
50
|
+
|
|
51
|
+
DJANGO_CHELSERU = {
|
|
52
|
+
'AUTH': {
|
|
53
|
+
'AUTH_METHOD' : 'OTP', # روشهای پشتیبانی شده: OTP, PASSWD
|
|
54
|
+
'AUTH_SERVICE' : 'rest_framework_simplejwt', # سرویسهای پشتیبانی شده: rest_framework_simplejwt
|
|
55
|
+
'OPTIONS': {
|
|
56
|
+
'OTP_LENGTH' : 8, # پیشفرض: 8
|
|
57
|
+
'OTP_EXPIRE_PER_MINUTES': 4, # پیشفرض: 4
|
|
58
|
+
'OTP_SMS_TEMPLATE_ID' : 1, # شناسه قالب پیامکی برای رمز یکبارمصرف
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
'SMS': {
|
|
62
|
+
'SMS_SERVICE': 'PARSIAN_WEBCO_IR', # یاریدهندههای پشتیبانی شده: PARSIAN_WEBCO_IR, MELI_PAYAMAK_COM, KAVENEGAR_COM
|
|
63
|
+
'SETTINGS': {
|
|
64
|
+
'PARSIAN_WEBCO_IR_API_KEY' : 'YOUR_PARSIAN_WEBCO_API_KEY',
|
|
65
|
+
'MELI_PAYAMAK_COM_USERNAME' : 'YOUR_MELI_PAYAMAK_USERNAME',
|
|
66
|
+
'MELI_PAYAMAK_COM_PASSWORD' : 'YOUR_MELI_PAYAMAK_PASSWORD',
|
|
67
|
+
'MELI_PAYAMAK_COM_FROM' : 'YOUR_MELI_PAYAMAK_FROM_NUMBER',
|
|
68
|
+
'KAVENEGAR_COM_API_KEY' : 'YOUR_KAVENEGAR_API_KEY',
|
|
69
|
+
'KAVENEGAR_COM_FROM' : 'YOUR_KAVENEGAR_FROM_NUMBER',
|
|
70
|
+
},
|
|
71
|
+
'TEMPLATES': {
|
|
72
|
+
'T1': 1,
|
|
73
|
+
'T2': 2,
|
|
74
|
+
...
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
AUTH_METHOD: روش راستیآزمایی را روشن میسازد. برای راستیآزمایی پیامکی، از 'OTP' بهره بگیرید.OTP_LENGTH: درازای رمز یکبارمصرف.OTP_EXPIRE_PER_MINUTES: زمان پایانیافتن رمز یکبارمصرف بر پایه دقیقه.OTP_SMS_TEMPLATE_ID: شناسه قالب پیامکی که برای فرستادن رمز یکبارمصرف بهره گرفته میشود.SMS_SERVICE: یاریدهنده پیامکی دلخواه خود را برگزینید.SETTINGS: آگاهیهای نیاز برای یاریدهنده پیامکی برگزیدهتان را فراهم آورید.TEMPLATES: شناسههای قالب پیامکی خود را روشن سازید.🔌 نقطههای پایانیبرای به کارگیری کارکردهای این بسته، URLهای زیر را به پرونده urls.py خود بیفزایید.# urls.py
|
|
79
|
+
|
|
80
|
+
from django.urls import path, include
|
|
81
|
+
|
|
82
|
+
urlpatterns = [
|
|
83
|
+
...
|
|
84
|
+
path('api/', include('drfchelseru.urls')),
|
|
85
|
+
...
|
|
86
|
+
]
|
|
87
|
+
این بسته نقطههای پایانی API زیر را فراهم میآورد:نقطه پایانیشرحروش/api/otp/send/یک رمز یکبارمصرف به شماره همراه گفتهشده میفرستد.POST/api/authenticate/کاربری را با رمز یکبارمصرف دریافتشده، راستیآزمایی میکند.POST/api/sessions/نشستهای فعال کاربر را فهرست کرده و درایوری میکند.GET/api/message/send/یک پیامک با یاریدهنده پیکربندیشده میفرستد.POSTبه کارگیری نقطههای پایانی1. فرستادن رمز یکبارمصرف (/api/otp/send/)روش: POSTشرح: یک رمز یکبارمصرف به شماره همراه کاربر میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567پاسخها:HTTP 200 OK: رمز یکبارمصرف با کامیابی فرستاده شد.{"details": "The OTP code was sent correctly."}
|
|
88
|
+
HTTP 400 BAD REQUEST: ساختار نادرست mobile_number.HTTP 409 CONFLICT: یک رمز یکبارمصرف پیشتر فرستاده شده و هنوز روایی دارد.{"details": "An OTP code has already been sent. Please wait X seconds before trying again."}
|
|
89
|
+
HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.2. راستیآزمایی (/api/authenticate/)روش: POSTشرح: کاربر را با رمز یکبارمصرف فراهم شده، راستیآزمایی میکند. اگر با کامیابی انجام شود، توکنهای JWT (access و refresh) را بازمیگرداند.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه کاربر.09121234567codestrرمز یکبارمصرف دریافت شده از راه پیامک.12345678groupintاختیاری: یک شناسه دسته برای کاربر.1پاسخها:HTTP 200 OK: راستیآزمایی با کامیابی انجام شد.{
|
|
90
|
+
"access": "...",
|
|
91
|
+
"refresh": "..."
|
|
92
|
+
}
|
|
93
|
+
HTTP 401 UNAUTHORIZED: رمز یکبارمصرف ناروا یا پایانیافته.{"error": "The code sent to this mobile number was not found."}
|
|
94
|
+
HTTP 400 BAD REQUEST: دادهنماهای نیاز ناپیدا یا ساختار نادرست.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.3. فرستادن پیامک (/api/message/send/)روش: POSTشرح: یک پیامک خودساخته را با یاریدهنده پیکربندیشده میفرستد.دادهنماهای نیاز:دادهنماگونهشرحنمونهmobile_numberstrشماره همراه گیرنده.09121234567message_textstrنوشتار پیام. (بیشینه ۲۹۰ نویسه)Hello, World!template_idintبرای برخی یاریدهندهها (برای نمونه پارسیان) نیاز است.1پاسخها:HTTP 200 OK: پیام با کامیابی فرستاده شد.{"details": "The Message was sent correctly."}
|
|
95
|
+
HTTP 400 BAD REQUEST: دشواریهای درستسنجی برای دادهنماها.HTTP 401 UNAUTHORIZED: راستیآزمایی انجام نشد.HTTP 500 INTERNAL SERVER ERROR: یک دشواری در کارگذار پیش آمده است.HTTP 502 BAD GATEWAY: یاریدهنده پیامکی یک دشواری را بازگرداند.4. فهرست نشستها (/api/sessions/)روش: GETشرح: همه نشستهای فعال کاربران را فهرست میکند. نیاز به راستیآزمایی (IsAuthenticated) دارد.سربرگهای نیاز:سربرگارزشAuthorizationBearer <your_access_token>💡 مدلهااین بسته یک مدل Session برای درایوری نشستهای فعال کاربران دارد. میتوانید به این نشستها از راه نقطه پایانی /api/sessions/ دسترسی یافته و آنها را درایوری کنید.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
README.md
|
|
4
|
+
README_PA.md
|
|
5
|
+
pyproject.toml
|
|
6
|
+
setup.py
|
|
7
|
+
django_chelseru.egg-info/PKG-INFO
|
|
8
|
+
django_chelseru.egg-info/SOURCES.txt
|
|
9
|
+
django_chelseru.egg-info/dependency_links.txt
|
|
10
|
+
django_chelseru.egg-info/requires.txt
|
|
11
|
+
django_chelseru.egg-info/top_level.txt
|
|
12
|
+
drfchelseru/__init__.py
|
|
13
|
+
drfchelseru/admin.py
|
|
14
|
+
drfchelseru/apps.py
|
|
15
|
+
drfchelseru/middlewares.py
|
|
16
|
+
drfchelseru/models.py
|
|
17
|
+
drfchelseru/serializers.py
|
|
18
|
+
drfchelseru/services.py
|
|
19
|
+
drfchelseru/settings.py
|
|
20
|
+
drfchelseru/signals.py
|
|
21
|
+
drfchelseru/tests.py
|
|
22
|
+
drfchelseru/urls.py
|
|
23
|
+
drfchelseru/validators.py
|
|
24
|
+
drfchelseru/views.py
|
|
25
|
+
drfchelseru/migrations/0001_initial.py
|
|
26
|
+
drfchelseru/migrations/0002_otpcode_session_user.py
|
|
27
|
+
drfchelseru/migrations/0003_rename_mobile_otpcode_mobile_number.py
|
|
28
|
+
drfchelseru/migrations/__init__.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
drfchelseru
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from .models import User, OTPCode, Session, Message
|
|
3
|
+
|
|
4
|
+
@admin.register(User)
|
|
5
|
+
class MobileAdmin(admin.ModelAdmin):
|
|
6
|
+
list_display = ['id', 'user__id', 'user__username', 'mobile', 'user__is_active']
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@admin.register(OTPCode)
|
|
10
|
+
class OTPCodeAdmin(admin.ModelAdmin):
|
|
11
|
+
list_display = ['id', 'code', 'mobile_number', 'created_at']
|
|
12
|
+
ordering = ('-created_at', )
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@admin.register(Session)
|
|
16
|
+
class SessionAdmin(admin.ModelAdmin):
|
|
17
|
+
list_display = ['id', 'user__id', 'user__username', 'ip_address', 'last_seen']
|
|
18
|
+
ordering = ('-created_at', )
|
|
19
|
+
|
|
20
|
+
@admin.register(Message)
|
|
21
|
+
class MessageAdmin(admin.ModelAdmin):
|
|
22
|
+
list_display = ['id', 'mobile_number', 'message_text', 'status']
|
|
23
|
+
ordering = ('-created_at', )
|
|
24
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from django.utils.timezone import datetime
|
|
2
|
+
from .models import Session
|
|
3
|
+
import user_agents
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TakeUserSessionMiddlaware:
|
|
7
|
+
def __init__(self, get_response):
|
|
8
|
+
self.get_response = get_response
|
|
9
|
+
|
|
10
|
+
def __call__(self, request):
|
|
11
|
+
response = self.get_response(request)
|
|
12
|
+
|
|
13
|
+
if request.user.is_authenticated:
|
|
14
|
+
user_agent = request.META.get('HTTP_USER_AGENT', '')
|
|
15
|
+
ip = self.get_client_ip(request)
|
|
16
|
+
|
|
17
|
+
if not request.session.session_key:
|
|
18
|
+
request.session.create()
|
|
19
|
+
|
|
20
|
+
session_key = request.session.session_key
|
|
21
|
+
|
|
22
|
+
session, created = Session.objects.get_or_create(
|
|
23
|
+
user = request.user,
|
|
24
|
+
session_key = session_key,
|
|
25
|
+
defaults = {
|
|
26
|
+
'user_agent': user_agent,
|
|
27
|
+
'ip_address': ip,
|
|
28
|
+
'device': user_agents.parse(user_agent).device.family,
|
|
29
|
+
'browser': user_agents.parse(user_agent).browser.family,
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
session.user_agent = user_agent
|
|
34
|
+
session.ip_address = ip
|
|
35
|
+
session.last_seen = datetime.now()
|
|
36
|
+
session.save()
|
|
37
|
+
|
|
38
|
+
return response
|
|
39
|
+
|
|
40
|
+
def get_client_ip(self, request):
|
|
41
|
+
x_forwarded_for = request.META.get('X_FORWARDED_FOR')
|
|
42
|
+
if x_forwarded_for:
|
|
43
|
+
return x_forwarded_for.split(',')[0]
|
|
44
|
+
return request.META.get('REMOTE_ADDR')
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Generated by Django 5.1.6 on 2025-08-12 01:59
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
initial = True
|
|
9
|
+
|
|
10
|
+
dependencies = []
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.CreateModel(
|
|
14
|
+
name="Message",
|
|
15
|
+
fields=[
|
|
16
|
+
(
|
|
17
|
+
"id",
|
|
18
|
+
models.BigAutoField(
|
|
19
|
+
auto_created=True,
|
|
20
|
+
primary_key=True,
|
|
21
|
+
serialize=False,
|
|
22
|
+
verbose_name="ID",
|
|
23
|
+
),
|
|
24
|
+
),
|
|
25
|
+
("message_text", models.TextField()),
|
|
26
|
+
("mobile_number", models.CharField(max_length=20)),
|
|
27
|
+
("_from", models.CharField(blank=True, max_length=20, null=True)),
|
|
28
|
+
("status", models.CharField(blank=True, max_length=20, null=True)),
|
|
29
|
+
("updated_at", models.DateTimeField(auto_now=True)),
|
|
30
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
31
|
+
],
|
|
32
|
+
),
|
|
33
|
+
]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Generated by Django 5.1.6 on 2025-08-12 02:29
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
from django.conf import settings
|
|
5
|
+
from django.db import migrations, models
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Migration(migrations.Migration):
|
|
9
|
+
|
|
10
|
+
dependencies = [
|
|
11
|
+
("drfchelseru", "0001_initial"),
|
|
12
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
operations = [
|
|
16
|
+
migrations.CreateModel(
|
|
17
|
+
name="OTPCode",
|
|
18
|
+
fields=[
|
|
19
|
+
(
|
|
20
|
+
"id",
|
|
21
|
+
models.BigAutoField(
|
|
22
|
+
auto_created=True,
|
|
23
|
+
primary_key=True,
|
|
24
|
+
serialize=False,
|
|
25
|
+
verbose_name="ID",
|
|
26
|
+
),
|
|
27
|
+
),
|
|
28
|
+
("code", models.CharField(max_length=10)),
|
|
29
|
+
("mobile", models.CharField(max_length=11)),
|
|
30
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
31
|
+
],
|
|
32
|
+
),
|
|
33
|
+
migrations.CreateModel(
|
|
34
|
+
name="Session",
|
|
35
|
+
fields=[
|
|
36
|
+
(
|
|
37
|
+
"id",
|
|
38
|
+
models.BigAutoField(
|
|
39
|
+
auto_created=True,
|
|
40
|
+
primary_key=True,
|
|
41
|
+
serialize=False,
|
|
42
|
+
verbose_name="ID",
|
|
43
|
+
),
|
|
44
|
+
),
|
|
45
|
+
("session_key", models.CharField(max_length=40, unique=True)),
|
|
46
|
+
("user_agent", models.TextField()),
|
|
47
|
+
("ip_address", models.GenericIPAddressField()),
|
|
48
|
+
("device", models.TextField()),
|
|
49
|
+
("browser", models.TextField()),
|
|
50
|
+
("last_seen", models.DateTimeField(auto_now=True)),
|
|
51
|
+
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
52
|
+
(
|
|
53
|
+
"user",
|
|
54
|
+
models.ForeignKey(
|
|
55
|
+
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
56
|
+
related_name="session_drf_chelseru",
|
|
57
|
+
to=settings.AUTH_USER_MODEL,
|
|
58
|
+
),
|
|
59
|
+
),
|
|
60
|
+
],
|
|
61
|
+
),
|
|
62
|
+
migrations.CreateModel(
|
|
63
|
+
name="User",
|
|
64
|
+
fields=[
|
|
65
|
+
(
|
|
66
|
+
"id",
|
|
67
|
+
models.BigAutoField(
|
|
68
|
+
auto_created=True,
|
|
69
|
+
primary_key=True,
|
|
70
|
+
serialize=False,
|
|
71
|
+
verbose_name="ID",
|
|
72
|
+
),
|
|
73
|
+
),
|
|
74
|
+
("mobile", models.CharField(max_length=11)),
|
|
75
|
+
(
|
|
76
|
+
"group",
|
|
77
|
+
models.IntegerField(
|
|
78
|
+
default=0,
|
|
79
|
+
help_text="choice group type or user level, with numbers.",
|
|
80
|
+
),
|
|
81
|
+
),
|
|
82
|
+
(
|
|
83
|
+
"user",
|
|
84
|
+
models.OneToOneField(
|
|
85
|
+
on_delete=django.db.models.deletion.CASCADE,
|
|
86
|
+
related_name="mobile_drf_chelseru",
|
|
87
|
+
to=settings.AUTH_USER_MODEL,
|
|
88
|
+
),
|
|
89
|
+
),
|
|
90
|
+
],
|
|
91
|
+
),
|
|
92
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Generated by Django 5.1.6 on 2025-08-12 03:15
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("drfchelseru", "0002_otpcode_session_user"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.RenameField(
|
|
14
|
+
model_name="otpcode",
|
|
15
|
+
old_name="mobile",
|
|
16
|
+
new_name="mobile_number",
|
|
17
|
+
),
|
|
18
|
+
]
|