public user IDs, plans priced by tutor cost, age-based tutor tone, self-service account deletion
- profile publicId ("User482917", accounts/public_id.py); admin shows and searches it
- plans API reports aiDailyQuota per plan and freeAiDailyQuota; migration 0007 sets the
temporary prices (monthly 99,000 / yearly 990,000 toman, 5 tutor questions a day) unless
an admin already edited the yearly plan
- tutor tone follows the learner's age (18+ gets an adult tone at any grade); notation
still follows the grade's book; answer cache keyed by tone (prompt tutor-v12-age-tone)
- POST /api/user/delete: phone users confirm with a fresh SMS code (same checks as login,
now shared in verify_phone_otp), guests type "حذف"; payment records are kept, demo
accounts refused
- delete_users --skip-paid
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -92,3 +92,15 @@ def parse(value: str) -> date:
|
||||
def to_string(d: date) -> str:
|
||||
jy, jm, jd = from_gregorian(d)
|
||||
return f'{jy:04d}-{jm:02d}-{jd:02d}'
|
||||
|
||||
|
||||
def age_of(birth_date: date | None, birth_year: int | None, today: date | None = None) -> int | None:
|
||||
"""سنِ کامل از تاریخِ تولد؛ برای کاربری که فقط سالِ شمسی داده، تقریبی (سال منهای سال)."""
|
||||
from django.utils import timezone
|
||||
|
||||
today = today or timezone.localdate()
|
||||
if birth_date:
|
||||
return today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
|
||||
if birth_year:
|
||||
return from_gregorian(today)[0] - birth_year
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user