You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
3.9 KiB
79 lines
3.9 KiB
from django.core.management.base import BaseCommand
|
|
from django.db import transaction
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from apps.chat.models import RoomMessage, ChatMessage, MessageReadStatus
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Clear chat data: all rooms, messages and read statuses, but preserve course-related rooms'
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--force',
|
|
action='store_true',
|
|
dest='force',
|
|
help=_('Force deletion without confirmation'),
|
|
)
|
|
parser.add_argument(
|
|
'--all-rooms',
|
|
action='store_true',
|
|
dest='all_rooms',
|
|
help=_('Delete ALL rooms including course-related rooms'),
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
force = options['force']
|
|
all_rooms = options['all_rooms']
|
|
|
|
if not force:
|
|
if all_rooms:
|
|
confirm = input(_('This will delete ALL chat data including course rooms. Are you sure? (yes/no): '))
|
|
else:
|
|
confirm = input(_('This will delete all messages and read statuses, and non-course rooms. Course rooms will be preserved but their messages will be deleted. Are you sure? (yes/no): '))
|
|
|
|
if confirm.lower() != 'yes':
|
|
self.stdout.write(self.style.WARNING(_('Operation cancelled.')))
|
|
return
|
|
|
|
try:
|
|
with transaction.atomic():
|
|
# Count existing data
|
|
total_messages = ChatMessage.objects.count()
|
|
total_read_statuses = MessageReadStatus.objects.count()
|
|
total_rooms = RoomMessage.objects.count()
|
|
course_rooms = RoomMessage.objects.filter(course__isnull=False).count()
|
|
non_course_rooms = RoomMessage.objects.filter(course__isnull=True).count()
|
|
|
|
self.stdout.write(self.style.WARNING(f'Found:'))
|
|
self.stdout.write(f' - {total_messages} messages')
|
|
self.stdout.write(f' - {total_read_statuses} read statuses')
|
|
self.stdout.write(f' - {total_rooms} total rooms ({course_rooms} course rooms, {non_course_rooms} non-course rooms)')
|
|
|
|
# Step 1: Delete all MessageReadStatus records
|
|
deleted_read_statuses = MessageReadStatus.objects.all().delete()[0]
|
|
self.stdout.write(self.style.SUCCESS(f'✓ Deleted {deleted_read_statuses} MessageReadStatus records'))
|
|
|
|
# Step 2: Delete all ChatMessage records
|
|
deleted_messages = ChatMessage.objects.all().delete()[0]
|
|
self.stdout.write(self.style.SUCCESS(f'✓ Deleted {deleted_messages} ChatMessage records'))
|
|
|
|
# Step 3: Handle rooms based on options
|
|
if all_rooms:
|
|
# Delete ALL rooms
|
|
deleted_rooms = RoomMessage.objects.all().delete()[0]
|
|
self.stdout.write(self.style.SUCCESS(f'✓ Deleted {deleted_rooms} RoomMessage records (including course rooms)'))
|
|
else:
|
|
# Delete only non-course rooms (rooms without course relationship)
|
|
deleted_non_course_rooms = RoomMessage.objects.filter(course__isnull=True).delete()[0]
|
|
self.stdout.write(self.style.SUCCESS(f'✓ Deleted {deleted_non_course_rooms} non-course RoomMessage records'))
|
|
|
|
# Reset unread_messages_count for course rooms
|
|
course_rooms_updated = RoomMessage.objects.filter(course__isnull=False).update(unread_messages_count=0)
|
|
self.stdout.write(self.style.SUCCESS(f'✓ Reset unread_messages_count for {course_rooms_updated} course rooms'))
|
|
|
|
self.stdout.write(self.style.SUCCESS(_('Chat data clearing completed successfully!')))
|
|
|
|
except Exception as e:
|
|
self.stdout.write(self.style.ERROR(f'Error occurred: {str(e)}'))
|
|
raise
|