def check_messages_task(): """ Checks to see if any of our aggregators have errored messages that need to be retried. Also takes care of flipping Contacts from Failed to Normal and back based on their status. """ from django.utils import timezone from .models import INCOMING, PENDING from temba.orgs.models import Org from temba.channels.tasks import send_msg_task now = timezone.now() five_minutes_ago = now - timedelta(minutes=5) # for any org that sent messages in the past five minutes, check for pending messages for org in Org.objects.filter(msgs__created_on__gte=five_minutes_ago).distinct(): org.trigger_send() # fire a few send msg tasks in case we dropped one somewhere during a restart # (these will be no-ops if there is nothing to do) send_msg_task.delay() send_msg_task.delay() handle_event_task.delay() handle_event_task.delay() # also check any incoming messages that are still pending somehow, reschedule them to be handled unhandled_messages = Msg.objects.filter(direction=INCOMING, status=PENDING, created_on__lte=five_minutes_ago) unhandled_messages = unhandled_messages.exclude(channel__org=None).exclude(contact__is_test=True) unhandled_count = unhandled_messages.count() if unhandled_count: print("** Found %d unhandled messages" % unhandled_count) for msg in unhandled_messages[:100]: msg.handle()
def check_messages_task(): """ Checks to see if any of our aggregators have errored messages that need to be retried. Also takes care of flipping Contacts from Failed to Normal and back based on their status. """ from django.utils import timezone from .models import INCOMING, OUTGOING, PENDING, QUEUED, ERRORED, FAILED, WIRED, SENT, DELIVERED from temba.contacts.models import NORMAL from temba.orgs.models import Org from temba.channels.tasks import send_msg_task r = get_redis_connection() # only do this if we aren't already running key = 'check_messages_task' if not r.get(key): with r.lock(key, timeout=900): now = timezone.now() five_minutes_ago = now - timedelta(minutes=5) # get any contacts that are currently normal that had a failed message in the past five minutes for contact in Contact.objects.filter(msgs__created_on__gte=five_minutes_ago, msgs__direction=OUTGOING, msgs__status=FAILED, status=NORMAL): # if the last message from this contact is failed, then fail this contact if contact.msgs.all().order_by('-created_on').first().status == FAILED: contact.fail() # get any contacts that are currently failed that had a normal message in the past five minutes for contact in Contact.objects.filter(msgs__created_on__gte=five_minutes_ago, msgs__direction=OUTGOING, msgs__status__in=[WIRED, SENT, DELIVERED], status=FAILED): # if the last message from this contact is ok, then mark them as normal if contact.msgs.all().order_by('-created_on').first().status in [WIRED, SENT, DELIVERED]: contact.unfail() # for any org that sent messages in the past five minutes, check for pending messages for org in Org.objects.filter(msgs__created_on__gte=five_minutes_ago).distinct(): org.trigger_send() # fire a few send msg tasks in case we dropped one somewhere during a restart # (these will be no-ops if there is nothing to do) send_msg_task.delay() send_msg_task.delay() handle_event_task.delay() handle_event_task.delay() # also check any incoming messages that are still pending somehow, reschedule them to be handled unhandled_messages = Msg.objects.filter(direction=INCOMING, status=PENDING, created_on__lte=five_minutes_ago) unhandled_messages = unhandled_messages.exclude(channel__org=None).exclude(contact__is_test=True) unhandled_count = unhandled_messages.count() if unhandled_count: print "** Found %d unhandled messages" % unhandled_count for msg in unhandled_messages: msg.handle()
def check_messages_task(): """ Checks to see if any of our aggregators have errored messages that need to be retried. Also takes care of flipping Contacts from Failed to Normal and back based on their status. """ from django.utils import timezone from .models import INCOMING, OUTGOING, PENDING, QUEUED, ERRORED, FAILED, WIRED, SENT, DELIVERED from temba.orgs.models import Org from temba.channels.tasks import send_msg_task r = get_redis_connection() # only do this if we aren't already running key = 'check_messages_task' if not r.get(key): with r.lock(key, timeout=900): now = timezone.now() five_minutes_ago = now - timedelta(minutes=5) # get any contacts that are currently normal that had a failed message in the past five minutes for contact in Contact.objects.filter(msgs__created_on__gte=five_minutes_ago, msgs__direction=OUTGOING, msgs__status=FAILED, is_failed=False): # if the last message from this contact is failed, then fail this contact if contact.msgs.all().order_by('-created_on').first().status == FAILED: contact.fail() # get any contacts that are currently failed that had a normal message in the past five minutes for contact in Contact.objects.filter(msgs__created_on__gte=five_minutes_ago, msgs__direction=OUTGOING, msgs__status__in=[WIRED, SENT, DELIVERED], is_failed=True): # if the last message from this contact is ok, then mark them as normal if contact.msgs.all().order_by('-created_on').first().status in [WIRED, SENT, DELIVERED]: contact.unfail() # for any org that sent messages in the past five minutes, check for pending messages for org in Org.objects.filter(msgs__created_on__gte=five_minutes_ago).distinct(): org.trigger_send() # fire a few send msg tasks in case we dropped one somewhere during a restart # (these will be no-ops if there is nothing to do) send_msg_task.delay() send_msg_task.delay() handle_event_task.delay() handle_event_task.delay() # also check any incoming messages that are still pending somehow, reschedule them to be handled unhandled_messages = Msg.objects.filter(direction=INCOMING, status=PENDING, created_on__lte=five_minutes_ago) unhandled_messages = unhandled_messages.exclude(channel__org=None).exclude(contact__is_test=True) unhandled_count = unhandled_messages.count() if unhandled_count: print "** Found %d unhandled messages" % unhandled_count for msg in unhandled_messages[:100]: msg.handle()
def check_messages_task(): """ Checks to see if any of our aggregators have errored messages that need to be retried. Also takes care of flipping Contacts from Failed to Normal and back based on their status. """ from django.utils import timezone from .models import INCOMING, PENDING from temba.orgs.models import Org from temba.channels.tasks import send_msg_task r = get_redis_connection() # only do this if we aren't already running key = 'check_messages_task' if not r.get(key): with r.lock(key, timeout=900): now = timezone.now() five_minutes_ago = now - timedelta(minutes=5) # for any org that sent messages in the past five minutes, check for pending messages for org in Org.objects.filter( msgs__created_on__gte=five_minutes_ago).distinct(): org.trigger_send() # fire a few send msg tasks in case we dropped one somewhere during a restart # (these will be no-ops if there is nothing to do) send_msg_task.delay() send_msg_task.delay() handle_event_task.delay() handle_event_task.delay() # also check any incoming messages that are still pending somehow, reschedule them to be handled unhandled_messages = Msg.objects.filter( direction=INCOMING, status=PENDING, created_on__lte=five_minutes_ago) unhandled_messages = unhandled_messages.exclude( channel__org=None).exclude(contact__is_test=True) unhandled_count = unhandled_messages.count() if unhandled_count: print "** Found %d unhandled messages" % unhandled_count for msg in unhandled_messages[:100]: msg.handle()