Postgres support (DB_* env), LoginEvent audit table, Choice.value 300, deploy.sh pg_dump backup
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,3 +84,36 @@ class OTPCode(models.Model):
|
||||
|
||||
def __str__(self):
|
||||
return f"otp-{self.phone}"
|
||||
|
||||
|
||||
class LoginEvent(models.Model):
|
||||
"""
|
||||
سابقهی ماندگارِ ورود و خروج، برای پرسشهایی مثلِ «این کاربر کی آمد، کی رفت».
|
||||
|
||||
چرا جدول و نه فقط لاگ: لاگِ stdout با ریاستارت یا چرخشِ journald از بین میرود؛ این ردیفها
|
||||
در دیتابیس و بکاپ میمانند. `user_id` ارجاعِ سبک است (نه FK، مثلِ بقیهی پروژه)، و ردیف با حذفِ
|
||||
حساب نمیماند مگر در KEPT_ON_ACCOUNT_DELETE. شمارهی کامل برای ادمینها ذخیره میشود
|
||||
(تصمیمِ مالک، ۲۰۲۶-۱۰-۰۸)؛ در سیاستِ حریمِ خصوصی باید بیاید.
|
||||
"""
|
||||
LOGIN_OK = 'login_ok'
|
||||
LOGIN_FAILED = 'login_failed' # کدِ غلط یا منقضی
|
||||
LOGIN_BLOCKED = 'login_blocked' # سقفِ تلاشِ شماره (429)
|
||||
LOGOUT = 'logout'
|
||||
ACCOUNT_DELETED = 'account_deleted'
|
||||
EVENT_CHOICES = [
|
||||
(LOGIN_OK, 'ورود موفق'), (LOGIN_FAILED, 'ورود ناموفق'), (LOGIN_BLOCKED, 'ورود مسدود'),
|
||||
(LOGOUT, 'خروج'), (ACCOUNT_DELETED, 'حذف حساب'),
|
||||
]
|
||||
|
||||
event = models.CharField(max_length=20, choices=EVENT_CHOICES, db_index=True)
|
||||
user_id = models.IntegerField(null=True, blank=True, db_index=True)
|
||||
phone = models.CharField(max_length=15, blank=True, db_index=True)
|
||||
ip = models.GenericIPAddressField(null=True, blank=True)
|
||||
user_agent = models.CharField(max_length=300, blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.event} user={self.user_id} {self.created_at:%Y-%m-%d %H:%M}"
|
||||
|
||||
Reference in New Issue
Block a user