Example #1
0
    def test_org(self):
        url = reverse('api.v2.org')

        self.assertEndpointAccess(url)

        # fetch as JSON
        response = self.fetchJSON(url)
        self.assertEqual(200, response.status_code)
        self.assertEqual(response.json, {
            'name': "Temba",
            'country': "RW",
            'languages': [],
            'primary_language': None,
            'timezone': "Africa/Kigali",
            'date_style': "day_first",
            'anon': False
        })

        eng = Language.create(self.org, self.admin, "English", 'eng')
        Language.create(self.org, self.admin, "French", 'fre')
        self.org.primary_language = eng
        self.org.save()

        response = self.fetchJSON(url)
        self.assertEqual(response.json, {
            'name': "Temba",
            'country': "RW",
            'languages': ["eng", "fre"],
            'primary_language': "eng",
            'timezone': "Africa/Kigali",
            'date_style': "day_first",
            'anon': False
        })
Example #2
0
    def test_open_ended_word_frequencies(self):
        flow = self.get_flow('random_word')

        def run_flow(contact, word):
            self.assertEquals("Thank you", self.send_message(flow, word, contact=contact, restart_participants=True))

        (c1, c2, c3, c4, c5, c6) = (self.create_contact("Contact1", '0788111111'),
                                    self.create_contact("Contact2", '0788222222'),
                                    self.create_contact("Contact3", '0788333333'),
                                    self.create_contact("Contact4", '0788444444'),
                                    self.create_contact("Contact5", '0788555555'),
                                    self.create_contact("Contact6", '0788666666', is_test=True))

        run_flow(c1, "1 better place")
        run_flow(c2, "the great coffee")
        run_flow(c3, "1 cup of black tea")
        run_flow(c4, "awesome than this encore")
        run_flow(c5, "from an awesome place in kigali")
        run_flow(c6, "awesome coffee")

        random = RuleSet.objects.get(flow=flow, label="Random")

        result = Value.get_value_summary(ruleset=random)[0]
        self.assertEquals(10, len(result['categories']))
        self.assertTrue(result['open_ended'])
        self.assertResult(result, 0, "awesome", 2)
        self.assertResult(result, 1, "place", 2)
        self.assertResult(result, 2, "better", 1)
        self.assertResult(result, 3, "black", 1)
        self.assertResult(result, 4, "coffee", 1)
        self.assertResult(result, 5, "cup", 1)
        self.assertResult(result, 6, "encore", 1)
        self.assertResult(result, 7, "great", 1)
        self.assertResult(result, 8, "kigali", 1)
        self.assertResult(result, 9, "tea", 1)

        # add French to org languages
        Language.create(self.org, self.admin, 'French', 'fre')

        # make sure we cleared the cache
        Value.invalidate_cache(ruleset=random)

        # encore is a french stop word and should not be included this time
        result = Value.get_value_summary(ruleset=random)[0]
        self.assertEquals(9, len(result['categories']))
        self.assertTrue(result['open_ended'])
        self.assertResult(result, 0, "awesome", 2)
        self.assertResult(result, 1, "place", 2)
        self.assertResult(result, 2, "better", 1)
        self.assertResult(result, 3, "black", 1)
        self.assertResult(result, 4, "coffee", 1)
        self.assertResult(result, 5, "cup", 1)
        self.assertResult(result, 6, "great", 1)
        self.assertResult(result, 7, "kigali", 1)
        self.assertResult(result, 8, "tea", 1)
Example #3
0
    def test_open_ended_word_frequencies(self):
        flow = self.get_flow('random_word')

        def run_flow(contact, word):
            self.assertEqual("Thank you", self.send_message(flow, word, contact=contact, restart_participants=True))

        (c1, c2, c3, c4, c5, c6) = (self.create_contact("Contact1", '0788111111'),
                                    self.create_contact("Contact2", '0788222222'),
                                    self.create_contact("Contact3", '0788333333'),
                                    self.create_contact("Contact4", '0788444444'),
                                    self.create_contact("Contact5", '0788555555'),
                                    self.create_contact("Contact6", '0788666666', is_test=True))

        run_flow(c1, "1 better place")
        run_flow(c2, "the great coffee")
        run_flow(c3, "1 cup of black tea")
        run_flow(c4, "awesome than this encore")
        run_flow(c5, "from an awesome place in kigali")
        run_flow(c6, "awesome coffee")

        random = RuleSet.objects.get(flow=flow, label="Random")

        result = Value.get_value_summary(ruleset=random)[0]
        self.assertEqual(10, len(result['categories']))
        self.assertTrue(result['open_ended'])
        self.assertResult(result, 0, "awesome", 2)
        self.assertResult(result, 1, "place", 2)
        self.assertResult(result, 2, "better", 1)
        self.assertResult(result, 3, "black", 1)
        self.assertResult(result, 4, "coffee", 1)
        self.assertResult(result, 5, "cup", 1)
        self.assertResult(result, 6, "encore", 1)
        self.assertResult(result, 7, "great", 1)
        self.assertResult(result, 8, "kigali", 1)
        self.assertResult(result, 9, "tea", 1)

        # add French to org languages
        Language.create(self.org, self.admin, 'French', 'fre')

        # make sure we cleared the cache
        Value.invalidate_cache(ruleset=random)

        # encore is a french stop word and should not be included this time
        result = Value.get_value_summary(ruleset=random)[0]
        self.assertEqual(9, len(result['categories']))
        self.assertTrue(result['open_ended'])
        self.assertResult(result, 0, "awesome", 2)
        self.assertResult(result, 1, "place", 2)
        self.assertResult(result, 2, "better", 1)
        self.assertResult(result, 3, "black", 1)
        self.assertResult(result, 4, "coffee", 1)
        self.assertResult(result, 5, "cup", 1)
        self.assertResult(result, 6, "great", 1)
        self.assertResult(result, 7, "kigali", 1)
        self.assertResult(result, 8, "tea", 1)
Example #4
0
    def test_join_group_trigger(self):

        self.login(self.admin)
        group = self.create_group(name='Chat', contacts=[])

        # create a trigger that sets up a group join flow
        post_data = dict(keyword='join', action_join_group=group.pk, response='Thanks for joining')
        self.client.post(reverse("triggers.trigger_register"), data=post_data)

        # did our group join flow get created?
        flow = Flow.objects.get(flow_type=Flow.FLOW)

        # check that our trigger exists and shows our group
        trigger = Trigger.objects.get(keyword='join', flow=flow)
        self.assertEqual(trigger.flow.name, 'Join Chat')

        # the org has no language, so it should be a 'base' flow
        self.assertEqual(flow.base_language, 'base')

        # now let's try it out
        contact = self.create_contact('macklemore', '+250788382382')
        msg = self.create_msg(direction=INCOMING, contact=contact, text="join ben haggerty")
        self.assertIsNone(msg.msg_type)

        self.assertTrue(Trigger.find_and_handle(msg))

        self.assertEqual(msg.msg_type, 'F')
        self.assertEqual(Trigger.objects.get(pk=trigger.pk).trigger_count, 1)

        contact.refresh_from_db()
        self.assertEqual('Ben Haggerty', contact.name)

        # we should be in the group now
        self.assertEqual({group}, set(contact.user_groups.all()))

        # and have one incoming and one outgoing message
        self.assertEqual(2, contact.msgs.count())

        # deleting our contact group should leave our triggers and flows since the group can be recreated
        self.client.post(reverse("contacts.contactgroup_delete", args=[group.pk]))
        self.assertTrue(Trigger.objects.get(pk=trigger.pk).is_active)

        # try creating a join group on an org with a language
        language = Language.create(self.org, self.admin, "Klingon", 'kli')
        self.org.primary_language = language
        self.org.save()

        # now create another group trigger
        group = self.create_group(name='Lang Group', contacts=[])
        post_data = dict(keyword='join_lang', action_join_group=group.pk, response='Thanks for joining')
        response = self.client.post(reverse("triggers.trigger_register"), data=post_data)
        self.assertEqual(response.status_code, 200)

        # confirm our objects
        flow = Flow.objects.filter(flow_type=Flow.FLOW).order_by('-pk').first()
        trigger = Trigger.objects.get(keyword='join_lang', flow=flow)
        self.assertEqual(trigger.flow.name, 'Join Lang Group')

        # the flow should be created with the primary language for the org
        self.assertEqual(flow.base_language, 'kli')
Example #5
0
    def test_join_group_trigger(self):

        self.login(self.admin)
        group = self.create_group(name='Chat', contacts=[])

        # create a trigger that sets up a group join flow
        post_data = dict(keyword='join', action_join_group=group.pk, response='Thanks for joining')
        self.client.post(reverse("triggers.trigger_register"), data=post_data)

        # did our group join flow get created?
        flow = Flow.objects.get(flow_type=Flow.FLOW)

        # check that our trigger exists and shows our group
        trigger = Trigger.objects.get(keyword='join', flow=flow)
        self.assertEqual(trigger.flow.name, 'Join Chat')

        # the org has no language, so it should be a 'base' flow
        self.assertEqual(flow.base_language, 'base')

        # now let's try it out
        contact = self.create_contact('macklemore', '+250788382382')
        msg = self.create_msg(direction=INCOMING, contact=contact, text="join ben haggerty")
        self.assertIsNone(msg.msg_type)

        self.assertTrue(Trigger.find_and_handle(msg))

        self.assertEqual(msg.msg_type, 'F')
        self.assertEqual(Trigger.objects.get(pk=trigger.pk).trigger_count, 1)

        contact.refresh_from_db()
        self.assertEqual('Ben Haggerty', contact.name)

        # we should be in the group now
        self.assertEqual({group}, set(contact.user_groups.all()))

        # and have one incoming and one outgoing message
        self.assertEqual(2, contact.msgs.count())

        # deleting our contact group should leave our triggers and flows since the group can be recreated
        self.client.post(reverse("contacts.contactgroup_delete", args=[group.pk]))
        self.assertTrue(Trigger.objects.get(pk=trigger.pk).is_active)

        # try creating a join group on an org with a language
        language = Language.create(self.org, self.admin, "Klingon", 'kli')
        self.org.primary_language = language
        self.org.save()

        # now create another group trigger
        group = self.create_group(name='Lang Group', contacts=[])
        post_data = dict(keyword='join_lang', action_join_group=group.pk, response='Thanks for joining')
        response = self.client.post(reverse("triggers.trigger_register"), data=post_data)
        self.assertEqual(response.status_code, 200)

        # confirm our objects
        flow = Flow.objects.filter(flow_type=Flow.FLOW).order_by('-pk').first()
        trigger = Trigger.objects.get(keyword='join_lang', flow=flow)
        self.assertEqual(trigger.flow.name, 'Join Lang Group')

        # the flow should be created with the primary language for the org
        self.assertEqual(flow.base_language, 'kli')
Example #6
0
    def test_join_group_trigger(self):
        self.login(self.admin)
        group = self.create_group(name="Chat", contacts=[])

        favorites = self.get_flow("favorites")

        # create a trigger that sets up a group join flow
        self.client.post(
            reverse("triggers.trigger_register"),
            {"keyword": "join", "action_join_group": group.id, "response": "Thanks for joining", "flow": favorites.id},
        )

        # did our group join flow get created?
        flow = Flow.objects.get(flow_type=Flow.TYPE_MESSAGE, name="Join Chat")
        flow_def = flow.as_json()

        self.assertEqual(len(flow_def["nodes"]), 1)
        self.assertEqual(len(flow_def["nodes"][0]["actions"]), 4)
        self.assertEqual(flow_def["nodes"][0]["actions"][0]["type"], "add_contact_groups")
        self.assertEqual(flow_def["nodes"][0]["actions"][1]["type"], "set_contact_name")
        self.assertEqual(flow_def["nodes"][0]["actions"][2]["type"], "send_msg")
        self.assertEqual(flow_def["nodes"][0]["actions"][3]["type"], "enter_flow")

        # check that our trigger exists and shows our group
        trigger = Trigger.objects.get(keyword="join", flow=flow)
        self.assertEqual(trigger.flow.name, "Join Chat")

        # the org has no language, so it should be a 'base' flow
        self.assertEqual(flow.base_language, "base")

        # deleting our contact group should leave our triggers and flows since the group can be recreated
        self.client.post(reverse("contacts.contactgroup_delete", args=[group.id]))
        self.assertTrue(Trigger.objects.get(pk=trigger.id).is_active)

        # try creating a join group on an org with a language
        language = Language.create(self.org, self.admin, "Klingon", "kli")
        self.org.primary_language = language
        self.org.save(update_fields=("primary_language",))

        # now create another group trigger
        group = self.create_group(name="Lang Group", contacts=[])
        response = self.client.post(
            reverse("triggers.trigger_register"),
            {"keyword": "join_lang", "action_join_group": group.id, "response": "Thanks for joining"},
        )

        self.assertEqual(response.status_code, 200)

        # confirm our objects
        flow = Flow.objects.filter(flow_type=Flow.TYPE_MESSAGE).order_by("id").last()
        trigger = Trigger.objects.get(keyword="join_lang", flow=flow)

        self.assertEqual(trigger.flow.name, "Join Lang Group")

        # the flow should be created with the primary language for the org
        self.assertEqual(flow.base_language, "kli")
Example #7
0
def get_translated_quick_replies(bcast, contact, org=None):
    """
    Gets the appropriate quick replies translation for the given contact
    """
    preferred_languages = bcast._get_preferred_languages(contact, org)
    language_metadata = []
    metadata = bcast.metadata

    for item in metadata.get(bcast.METADATA_QUICK_REPLIES, []):
        text = Language.get_localized_text(
            text_translations=item, preferred_languages=preferred_languages)
        language_metadata.append(text)

    return language_metadata
Example #8
0
def get_translated_media(bcast, contact, org=None):
    """
    Gets the appropriate media for the given contact
    """
    preferred_languages = bcast._get_preferred_languages(contact, org)
    return Language.get_localized_text(bcast.media, preferred_languages)