from celery import shared_task @shared_task(name="chatrooms_cleansing") def chatrooms_cleansing(): """ Deletes chatrooms and encrypted messages of orders that have completely finished more than 3 days ago. """ from datetime import timedelta from django.utils import timezone from api.models import Order from chat.models import ChatRoom finished_states = [ Order.Status.SUC, Order.Status.TLD, Order.Status.MLD, Order.Status.CCA, Order.Status.UCA, ] # Orders that have expired more than 3 days ago # Usually expiry takes place 1 day after a finished order. So, ~4 days # until encrypted messages are deleted. finished_time = timezone.now() - timedelta(days=3) queryset = Order.objects.filter( status__in=finished_states, expires_at__lt=finished_time ) # And do not have an active trade, any past contract or any reward. deleted_chatrooms = [] for order in queryset: # Try an except. In case some chatroom is already missing. try: chatroom = ChatRoom.objects.get(id=order.id) deleted_chatrooms.append(str(chatroom)) chatroom.delete() except Exception: pass results = { "num_deleted": len(deleted_chatrooms), "deleted_chatrooms": deleted_chatrooms, } return results