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:
@@ -57,3 +57,9 @@ class DeleteUsersTests(TestCase):
|
||||
self.assertFalse(User.objects.filter(pk=self.doomed.pk).exists())
|
||||
self.assertTrue(User.objects.filter(pk=self.kept.pk).exists())
|
||||
self.assertTrue(User.objects.filter(pk=guest.pk).exists())
|
||||
|
||||
def test_skip_paid_keeps_the_payer_and_deletes_the_rest(self):
|
||||
Order.objects.create(user_id=self.doomed.id, amount=1000, status='paid', idempotency_key='k2')
|
||||
self.run_command('--ids', str(self.doomed.pk), str(self.kept.pk), '--yes', '--skip-paid')
|
||||
self.assertTrue(User.objects.filter(pk=self.doomed.pk).exists())
|
||||
self.assertFalse(User.objects.filter(pk=self.kept.pk).exists())
|
||||
|
||||
Reference in New Issue
Block a user