def fire_email_event(reminder, handler, recipients, verified_numbers,
                     logged_event):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)
    email_usage = EmailUsage.get_or_create_usage_record(reminder.domain)
    is_trial = domain_is_on_trial(reminder.domain)

    uses_custom_content_handler, content_handler = get_custom_content_handler(
        handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    for recipient in recipients:
        _add_recipient_to_template_params(recipient, template_params)
        logged_subevent = logged_event.create_subevent(handler, reminder,
                                                       recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            subject, message = content_handler(reminder, handler, recipient)
        else:
            subject = current_event.subject.get(
                lang, current_event.subject[handler.default_lang])
            message = current_event.message.get(
                lang, current_event.message[handler.default_lang])
            try:
                subject = Message.render(subject, **template_params)
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(
                    MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        subject = subject or '(No Subject)'
        if message:
            try:
                email_address = recipient.get_email()
            except:
                email_address = None

            if email_address:
                if is_trial and EmailUsage.get_total_count(
                        reminder.domain) >= TRIAL_MAX_EMAILS:
                    logged_subevent.error(
                        MessagingEvent.ERROR_TRIAL_EMAIL_LIMIT_REACHED)
                    continue
                send_mail_async.delay(subject, message,
                                      settings.DEFAULT_FROM_EMAIL,
                                      [email_address])
                email_usage.update_count()
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_EMAIL_ADDRESS)
                continue

        logged_subevent.completed()
    def test_render_missing_references(self):
        message = "Case name {case.name}, Case id {case.external_id}, Parent name {case.parent.name}"
        context = {"case": {"name": "abc"}}
        self.assertEqual(Message.render(message, **context), "Case name abc, Case id (?), Parent name (?)")

        message = "Ref {ref1} {ref1.ref2}"
        context = {"case": {"name": "abc"}}
        self.assertEqual(Message.render(message, **context), "Ref (?) (?)")
Exemple #3
0
    def test_render_missing_references(self):
        message = 'Case name {case.name}, Case id {case.external_id}, Parent name {case.parent.name}'
        context = {'case': {'name': 'abc'}}
        self.assertEqual(Message.render(message, **context),
                         'Case name abc, Case id (?), Parent name (?)')

        message = 'Ref {ref1} {ref1.ref2}'
        context = {'case': {'name': 'abc'}}
        self.assertEqual(Message.render(message, **context), 'Ref (?) (?)')
Exemple #4
0
def fire_email_event(reminder, handler, recipients, verified_numbers,
                     logged_event):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)

    uses_custom_content_handler, content_handler = get_custom_content_handler(
        handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    for recipient in recipients:
        logged_subevent = logged_event.create_subevent(handler, reminder,
                                                       recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            subject, message = content_handler(reminder, handler, recipient)
        else:
            subject = current_event.subject.get(
                lang, current_event.subject[handler.default_lang])
            message = current_event.message.get(
                lang, current_event.message[handler.default_lang])
            try:
                subject = Message.render(subject, **template_params)
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(
                    MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        subject = subject or '(No Subject)'
        if message:
            try:
                email_address = recipient.get_email()
            except:
                email_address = None

            if email_address:
                send_mail_async.delay(subject, message,
                                      settings.DEFAULT_FROM_EMAIL,
                                      [email_address])
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_EMAIL_ADDRESS)
                continue

        logged_subevent.completed()
def fire_email_event(reminder, handler, recipients, verified_numbers, logged_event):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)
    email_usage = EmailUsage.get_or_create_usage_record(reminder.domain)
    is_trial = domain_is_on_trial(reminder.domain)

    uses_custom_content_handler, content_handler = get_custom_content_handler(handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    for recipient in recipients:
        logged_subevent = logged_event.create_subevent(handler, reminder, recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            subject, message = content_handler(reminder, handler, recipient)
        else:
            subject = current_event.subject.get(lang, current_event.subject[handler.default_lang])
            message = current_event.message.get(lang, current_event.message[handler.default_lang])
            try:
                subject = Message.render(subject, **template_params)
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        subject = subject or '(No Subject)'
        if message:
            try:
                email_address = recipient.get_email()
            except:
                email_address = None

            if email_address:
                if is_trial and EmailUsage.get_total_count(reminder.domain) >= TRIAL_MAX_EMAILS:
                    logged_subevent.error(MessagingEvent.ERROR_TRIAL_EMAIL_LIMIT_REACHED)
                    continue
                send_mail_async.delay(subject, message, settings.DEFAULT_FROM_EMAIL, [email_address])
                email_usage.update_count()
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_EMAIL_ADDRESS)
                continue

        logged_subevent.completed()
Exemple #6
0
def fire_sms_event(reminder,
                   handler,
                   recipients,
                   verified_numbers,
                   logged_event,
                   workflow=None):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)

    uses_custom_content_handler, content_handler = get_custom_content_handler(
        handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    domain_obj = Domain.get_by_name(reminder.domain, strict=True)
    for recipient in recipients:
        logged_subevent = logged_event.create_subevent(handler, reminder,
                                                       recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            message = content_handler(reminder, handler, recipient)
        else:
            message = current_event.message.get(
                lang, current_event.message[handler.default_lang])
            try:
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(
                    MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        verified_number, unverified_number = get_recipient_phone_number(
            reminder, recipient, verified_numbers)

        if message:
            metadata = MessageMetadata(
                workflow=workflow or get_workflow(handler),
                reminder_id=reminder._id,
                messaging_subevent_id=logged_subevent.pk,
            )
            if verified_number is not None:
                send_sms_to_verified_number(verified_number, message, metadata)
            elif isinstance(recipient, CouchUser) and unverified_number:
                send_sms(reminder.domain, recipient, unverified_number,
                         message, metadata)
            elif (isinstance(recipient, CommCareCase) and unverified_number
                  and domain_obj.send_to_duplicated_case_numbers):
                send_sms(reminder.domain, recipient, unverified_number,
                         message, metadata)
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_PHONE_NUMBER)
                continue

        logged_subevent.completed()
Exemple #7
0
 def test_render_nested_context(self):
     message = 'Case name {case.name}, Parent name {case.parent.name}'
     context = {'case': {'name': 'abc', 'parent': {'name': 'def'}}}
     self.assertEqual(
         Message.render(message, **context),
         'Case name abc, Parent name def'
     )
Exemple #8
0
 def test_render_context(self):
     message = 'The EDD for client with ID {case.external_id} is approaching in {case.edd.days_until} days.'
     context = {'case': {'external_id': 123, 'edd': datetime.utcnow() + timedelta(days=30)}}
     self.assertEqual(
         Message.render(message, **context),
         'The EDD for client with ID 123 is approaching in 30 days.'
     )
Exemple #9
0
 def test_unicode_template_params(self):
     message = u'Case name {case.name}'
     context = {'case': {'name': u'\u0928\u092e\u0938\u094d\u0924\u0947'}}
     self.assertEqual(
         Message.render(message, **context),
         u'Case name \u0928\u092e\u0938\u094d\u0924\u0947'
     )
    def render_message(self, message, schedule_instance):
        from corehq.messaging.scheduling.scheduling_partitioned.models import (
            CaseAlertScheduleInstance,
            CaseTimedScheduleInstance,
        )

        if not message:
            return None

        if isinstance(schedule_instance,
                      (CaseAlertScheduleInstance, CaseTimedScheduleInstance)):
            case = CaseAccessors(schedule_instance.domain).get_case(
                schedule_instance.case_id)
            template_params = get_message_template_params(case)
            try:
                return Message.render(message, **template_params)
            except:
                subject = "[Scheduling] Could not render message"
                notify_exception(None,
                                 message=subject,
                                 details={
                                     'schedule_instance_id':
                                     schedule_instance.schedule_instance_id,
                                 })
                return None
Exemple #11
0
def fire_email_event(reminder, handler, recipients, verified_numbers, logged_event):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)

    uses_custom_content_handler, content_handler = get_custom_content_handler(handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    for recipient in recipients:
        logged_subevent = logged_event.create_subevent(handler, reminder, recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            subject, message = content_handler(reminder, handler, recipient)
        else:
            subject = current_event.subject.get(lang, current_event.subject[handler.default_lang])
            message = current_event.message.get(lang, current_event.message[handler.default_lang])
            try:
                subject = Message.render(subject, **template_params)
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        subject = subject or "(No Subject)"
        if message:
            try:
                email_address = recipient.get_email()
            except:
                email_address = None

            if email_address:
                send_mail_async.delay(subject, message, settings.DEFAULT_FROM_EMAIL, [email_address])
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_EMAIL_ADDRESS)
                continue

        logged_subevent.completed()
def fire_sms_event(reminder, handler, recipients, verified_numbers, logged_event, workflow=None):
    current_event = reminder.current_event
    case = reminder.case
    template_params = get_message_template_params(case)

    uses_custom_content_handler, content_handler = get_custom_content_handler(handler, logged_event)
    if uses_custom_content_handler and not content_handler:
        return

    domain_obj = Domain.get_by_name(reminder.domain, strict=True)
    for recipient in recipients:
        logged_subevent = logged_event.create_subevent(handler, reminder, recipient)

        try:
            lang = recipient.get_language_code()
        except Exception:
            lang = None

        if content_handler:
            message = content_handler(reminder, handler, recipient)
        else:
            message = current_event.message.get(lang, current_event.message[handler.default_lang])
            try:
                message = Message.render(message, **template_params)
            except Exception:
                logged_subevent.error(MessagingEvent.ERROR_CANNOT_RENDER_MESSAGE)
                continue

        verified_number, unverified_number = get_recipient_phone_number(
            reminder, recipient, verified_numbers)

        if message:
            metadata = MessageMetadata(
                workflow=workflow or get_workflow(handler),
                reminder_id=reminder._id,
                messaging_subevent_id=logged_subevent.pk,
            )
            if verified_number is not None:
                send_sms_to_verified_number(verified_number,
                    message, metadata, logged_subevent=logged_subevent)
            elif isinstance(recipient, CouchUser) and unverified_number:
                send_sms(reminder.domain, recipient, unverified_number,
                    message, metadata)
            elif (is_commcarecase(recipient) and unverified_number and
                    domain_obj.send_to_duplicated_case_numbers):
                send_sms(reminder.domain, recipient, unverified_number,
                    message, metadata)
            else:
                logged_subevent.error(MessagingEvent.ERROR_NO_PHONE_NUMBER)
                continue

        logged_subevent.completed()
 def test_render_nested_context(self):
     message = "Case name {case.name}, Parent name {case.parent.name}"
     context = {"case": {"name": "abc", "parent": {"name": "def"}}}
     self.assertEqual(Message.render(message, **context), "Case name abc, Parent name def")
 def test_render_context(self):
     message = "The EDD for client with ID {case.external_id} is approaching in {case.edd.days_until} days."
     context = {"case": {"external_id": 123, "edd": datetime.utcnow() + timedelta(days=30)}}
     self.assertEqual(
         Message.render(message, **context), "The EDD for client with ID 123 is approaching in 30 days."
     )
 def test_unicode_template_params(self):
     message = u"Case name {case.name}"
     context = {"case": {"name": u"\u0928\u092e\u0938\u094d\u0924\u0947"}}
     self.assertEqual(Message.render(message, **context), u"Case name \u0928\u092e\u0938\u094d\u0924\u0947")