Remove the guest system entirely: no is_guest/device_id, no guest throttles, phone login is the only way in

accounts.0008 drops the columns and refuses to run while guest rows exist.
Docs describe the current state; tests that only proved guest behaviour are gone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-05 18:20:10 +03:30
parent 8835e01595
commit 663252a260
61 changed files with 357 additions and 1518 deletions

View File

@@ -72,7 +72,7 @@ class AskAIRagPathTests(TestCase):
cache.clear()
reset_clients_cache()
self.client = APIClient()
self.user = User.objects.create(device_id='dev-rag-1', is_guest=True, name='')
self.user = User.objects.create(phone='09000000031', name='')
self.token = issue_access_token(self.user.id)
def _ask(self, body):
@@ -277,7 +277,7 @@ class AskAIStreamTests(TestCase):
cache.clear()
reset_clients_cache()
self.client = APIClient()
self.user = User.objects.create(device_id='dev-stream-1', is_guest=True, name='')
self.user = User.objects.create(phone='09000000032', name='')
self.token = issue_access_token(self.user.id)
def _ask_stream(self, body):
@@ -330,7 +330,7 @@ class AskAIAnswerCacheTests(TestCase):
cache.clear()
reset_clients_cache()
self.client = APIClient()
self.user = User.objects.create(device_id='dev-cache-1', is_guest=True, name='')
self.user = User.objects.create(phone='09000000033', name='')
self.token = issue_access_token(self.user.id)
def _ask(self, body):
@@ -468,7 +468,7 @@ class AnswerAnnotationTests(TestCase):
def setUp(self):
cache.clear()
reset_clients_cache()
self.user = User.objects.create(phone='09120000777', is_guest=False, grade_id=1)
self.user = User.objects.create(phone='09120000777', grade_id=1)
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(self.user.id)}')
@@ -815,7 +815,7 @@ class AskDerivesContextFromLessonTests(TestCase):
cache.clear()
reset_clients_cache()
self.user = User.objects.create(device_id='dev-ctx-1', is_guest=True)
self.user = User.objects.create(phone='09000000034')
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(self.user.id)}')
@@ -886,7 +886,7 @@ class FollowUpStaysGroundedTests(TestCase):
cache.clear()
reset_clients_cache()
self.user = User.objects.create(device_id='dev-follow-1', is_guest=True)
self.user = User.objects.create(phone='09000000035')
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(self.user.id)}')
@@ -961,7 +961,7 @@ class ReviewFixRegressionTests(TestCase):
def test_feedback_reason_survives_a_second_vote_without_one(self):
from ai_tutor.models import Conversation, Message, MessageFeedback
user = User.objects.create(device_id='dev-reason', is_guest=True)
user = User.objects.create(phone='09000000036')
client = APIClient()
client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(user.id)}')
conversation = Conversation.objects.create(user_id=user.id)

View File

@@ -111,7 +111,7 @@ class DiagramThroughTheApiTests(TestCase):
cache.clear()
reset_clients_cache()
self.client = APIClient()
self.user = User.objects.create(device_id='dev-diagram', is_guest=True, name='')
self.user = User.objects.create(phone='09000000030', name='')
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(self.user.id)}')
def test_stream_sends_text_without_json_and_diagram_in_done_and_history(self):

View File

@@ -123,7 +123,7 @@ class GuardrailThroughTheApiTests(TestCase):
def setUp(self):
cache.clear()
reset_clients_cache()
self.user = User.objects.create(device_id='dev-guardrail', is_guest=True, name='')
self.user = User.objects.create(phone='09000000037', name='')
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(self.user.id)}')

View File

@@ -183,7 +183,7 @@ class ConversationMemoryTests(TestCase):
cache.clear()
def _user(self, phone):
user = User.objects.create(phone=phone, is_guest=False)
user = User.objects.create(phone=phone)
client = APIClient()
client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(user.id)}')
return client
@@ -231,7 +231,7 @@ class ProviderStateTests(TestCase):
def setUp(self):
cache.clear()
reset_clients_cache()
user = User.objects.create(phone='09120000904', is_guest=False)
user = User.objects.create(phone='09120000904')
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(user.id)}')
@@ -276,7 +276,7 @@ class QuestionFocusTests(TestCase):
type='multiple_choice', prompt='۲ به توان منفی ۳؟')
self.right = Choice.objects.create(question=self.question, value='1/8', is_correct=True)
self.wrong = Choice.objects.create(question=self.question, value='-8', is_correct=False)
user = User.objects.create(phone='09120000905', is_guest=False, grade_id=grade.id)
user = User.objects.create(phone='09120000905', grade_id=grade.id)
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {issue_access_token(user.id)}')