Пример #1
0
class TestImportData(unittest.TestCase):
    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        self._create_entities()
        self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm))
        self.transport = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        initializer.run(self.dbm)

    def tearDown(self):
        _delete_db_and_remove_db_manager(self.dbm)

    def test_should_load_all_subjects(self):
        self._register_entities()

        subjects = load_subject_registration_data(self.dbm)

        self.assertEqual(4, len(subjects))

        self.assertEqual(subjects[0]['name'], '--')
        self.assertEqual(subjects[0]['geocode'], '1.0, 1.0')

        self.assertEqual(subjects[1]['name'], 'clinic1')
        self.assertEqual(subjects[1]['mobile_number'], '--')

        self.assertEqual(subjects[2]['name'], '--')
        self.assertEqual(subjects[2]['mobile_number'], '12332114')

        self.assertEqual(subjects[3]['name'], '--')
        self.assertEqual(subjects[3]['geocode'], '--')
        self.assertEqual(subjects[3]['location'], 'pune')
        self.assertEqual(subjects[3]['description'], 'this is a clinic')

    def _create_entities(self):
        self.entity_type = ['clinic']
        define_type(self.dbm, self.entity_type)
        define_type(self.dbm, ['reporter'])
        self.name_type = DataDictType(self.dbm,
                                      name='Name',
                                      slug='name',
                                      primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm,
                                                  name='telephone_number',
                                                  slug='telephone_number',
                                                  primitive_type='string')
        rep1 = create_entity(self.dbm, ['reporter'], 'rep1')
        rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234',
                             self.telephone_number_type),
                            (NAME_FIELD, "Test_reporter", self.name_type)],
                      submission=dict(submission_id="2"))

    def _register_entity(self, text):
        self.player.accept(Request(transportInfo=self.transport, message=text))

    def _register_entities(self):
        self._register_entity('reg +t clinic +s 1 +g 1 1')
        self._register_entity('reg +t clinic +s 2 +g 21 21 +n clinic1')
        self._register_entity('reg +t clinic +s 3 +g 11 11 +m 12332114')
        self._register_entity('reg +t clinic +s 4 +d this is a clinic +l pune')
Пример #2
0
def sms(request):
    _message = request.POST["message"]
    _from, _to = _get_from_and_to_numbers(request)
    try:
        dbm = get_db_manager_for(_to)
        sms_player = SMSPlayer(dbm, SubmissionHandler(dbm))
        transportInfo = TransportInfo(transport=SMS, source=_from, destination=_to)
        response = sms_player.accept(Request(transportInfo=transportInfo, message=_message))
        message = SMSResponse(response).text()

    except (SubmissionParseException, FormModelDoesNotExistsException,) as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
        log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=exception.data[0],
                            error=message)
        log.save()
    except NumberNotRegisteredException as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
        log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=None, error=message)
        log.save()
    except MangroveException as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
    except Exception as exception:
        logger.exception('SMS Processing failure: message')
        message = get_exception_message_for(exception=exception, channel=SMS)

    return HttpResponse(message)
Пример #3
0
class TestSMSPlayer(TestCase):
    def _mock_reporter(self):
        self.reporter_mock = Mock(spec=Entity)
        reporter_name = "1234"
        self.reporter_module.find_reporter_entity.return_value = self.reporter_mock, reporter_name

    def setUp(self):
        loc_tree = Mock()
        loc_tree.get_hierarchy_path.return_value = None
        self.dbm = Mock(spec=DatabaseManager)
        self.submission_handler_mock = Mock(spec=SubmissionHandler)
        self.reporter_patcher = patch('mangrove.transport.player.player.reporter')
        self.reporter_module = self.reporter_patcher.start()
        self._mock_reporter()
        self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
        self.request = Request( transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world")
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree)
        self.generate_code_patcher = patch("mangrove.transport.player.player.Player._handle_registration_form")
        self.generate_code_patcher.start()

    def tearDown(self):
        self.reporter_patcher.stop()
        self.generate_code_patcher.stop()

    def test_should_submit_if_parsing_is_successful(self):
        self.sms_player.accept(self.request)

        self.assertEqual(1, self.submission_handler_mock.accept.call_count)

    def test_should_submit_if_submission_by_registered_reporter(self):

        self.sms_player.accept(self.request)

        self.assertEqual(1, self.submission_handler_mock.accept.call_count)

        submission_request = self.submission_handler_mock.accept.call_args[0][0]
        self.assertEqual(self.reporter_mock, submission_request.reporter)

    def test_should_check_if_submission_by_unregistered_reporter(self):
        self.reporter_module.find_reporter_entity.side_effect = NumberNotRegisteredException("1234")
        with self.assertRaises(NumberNotRegisteredException):
            self.sms_player.accept(self.request)


    def test_should_not_submit_if_parsing_is_not_successful(self):
        self.request = Request(transportInfo=self.transport, message="invalid format")
        with self.assertRaises(SubmissionParseException):
            self.sms_player.accept(self.request)

        self.assertEqual(0, self.submission_handler_mock.accept.call_count)


    def test_should_not_parse_if_two_question_codes(self):
        transport = TransportInfo(transport="sms", source="1234", destination="5678")
        self.request = Request(transportInfo=transport, message="cli001 +na tester1 +na tester2")
        with self.assertRaises(SubmissionParseException):
            self.sms_player.accept(self.request)

        self.assertEqual(0, self.submission_handler_mock.accept.call_count)
Пример #4
0
 def setUp(self):
     self.dbm = get_db_manager(database='mangrove-test')
     self._create_entities()
     self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm))
     self.transport = TransportInfo(transport="sms",
                                    source="1234",
                                    destination="5678")
     initializer.run(self.dbm)
Пример #5
0
class TestImportData(unittest.TestCase):


    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        self._create_entities()
        self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm))
        self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
        initializer.run(self.dbm)

    def tearDown(self):
        _delete_db_and_remove_db_manager(self.dbm)


    def test_should_load_all_subjects(self):
        self._register_entities()

        subjects = load_subject_registration_data(self.dbm)

        self.assertEqual(4,len(subjects))

        self.assertEqual(subjects[0]['name'],'--')
        self.assertEqual(subjects[0]['geocode'],'1.0, 1.0')

        self.assertEqual(subjects[1]['name'],'clinic1')
        self.assertEqual(subjects[1]['mobile_number'],'--')

        self.assertEqual(subjects[2]['name'],'--')
        self.assertEqual(subjects[2]['mobile_number'],'12332114')

        self.assertEqual(subjects[3]['name'],'--')
        self.assertEqual(subjects[3]['geocode'],'--')
        self.assertEqual(subjects[3]['location'],'pune')
        self.assertEqual(subjects[3]['description'],'this is a clinic')


    def _create_entities(self):
        self.entity_type = ['clinic']
        define_type(self.dbm, self.entity_type)
        define_type(self.dbm, ['reporter'])
        self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number',
                                                  primitive_type='string')
        rep1 = create_entity(self.dbm, ['reporter'], 'rep1')
        rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
                (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2"))


    def _register_entity(self,text):
        self.player.accept(Request(transportInfo=self.transport, message=text))

    def _register_entities(self):
        self._register_entity('reg +t clinic +s 1 +g 1 1')
        self._register_entity('reg +t clinic +s 2 +g 21 21 +n clinic1')
        self._register_entity('reg +t clinic +s 3 +g 11 11 +m 12332114')
        self._register_entity('reg +t clinic +s 4 +d this is a clinic +l pune')
Пример #6
0
def submit_to_player(incoming_request):
    try:
        dbm = incoming_request['dbm']
        post_sms_parser_processors = [PostSMSProcessorLanguageActivator(dbm, incoming_request),
                    PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request)]
        sms_player = SMSPlayer(dbm, LocationBridge(get_location_tree(),get_loc_hierarchy=get_location_hierarchy),
            post_sms_parser_processors=post_sms_parser_processors)
        mangrove_request = Request(message=incoming_request['incoming_message'],
            transportInfo=incoming_request['transport_info'])
        response = sms_player.accept(mangrove_request, logger=incoming_request.get("logger"))
        message = SMSResponse(response).text(dbm)
        send_message(incoming_request, response)
    except DataObjectAlreadyExists as e:
        message = ugettext("%s with %s = %s already exists.") % (ugettext(e.data[2]), ugettext(e.data[0]), e.data[1])
    except Exception as exception:
        message = handle(exception, incoming_request)

    incoming_request['outgoing_message'] = message
    return incoming_request
Пример #7
0
 def setUp(self):
     loc_tree = Mock()
     loc_tree.get_hierarchy_path.return_value = None
     self.dbm = Mock(spec=DatabaseManager)
     self.submission_handler_mock = Mock(spec=SubmissionHandler)
     self.reporter_patcher = patch(
         'mangrove.transport.player.player.reporter')
     self.reporter_module = self.reporter_patcher.start()
     self._mock_reporter()
     self.transport = TransportInfo(transport="sms",
                                    source="1234",
                                    destination="5678")
     self.request = Request(transportInfo=self.transport,
                            message="FORM_CODE +ID 1 +M hello world")
     self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock,
                                 loc_tree)
     self.generate_code_patcher = patch(
         "mangrove.transport.player.player.Player._handle_registration_form"
     )
     self.generate_code_patcher.start()
Пример #8
0
def sms(request):
    _message = request.POST["message"]
    _from, _to = _get_from_and_to_numbers(request)
    try:
        dbm = get_db_manager_for(_to)
        sms_player = SMSPlayer(dbm, SubmissionHandler(dbm))
        transportInfo = TransportInfo(transport=SMS,
                                      source=_from,
                                      destination=_to)
        response = sms_player.accept(
            Request(transportInfo=transportInfo, message=_message))
        message = SMSResponse(response).text()

    except (
            SubmissionParseException,
            FormModelDoesNotExistsException,
    ) as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
        log = DatawinnerLog(message=_message,
                            from_number=_from,
                            to_number=_to,
                            form_code=exception.data[0],
                            error=message)
        log.save()
    except NumberNotRegisteredException as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
        log = DatawinnerLog(message=_message,
                            from_number=_from,
                            to_number=_to,
                            form_code=None,
                            error=message)
        log.save()
    except MangroveException as exception:
        message = get_exception_message_for(exception=exception, channel=SMS)
    except Exception as exception:
        logger.exception('SMS Processing failure: message')
        message = get_exception_message_for(exception=exception, channel=SMS)

    return HttpResponse(message)
Пример #9
0
 def setUp(self):
     loc_tree = Mock()
     loc_tree.get_hierarchy_path.return_value = None
     self.dbm = Mock(spec=DatabaseManager)
     self.submission_handler_mock = Mock(spec=SubmissionHandler)
     self.reporter_patcher = patch('mangrove.transport.player.player.reporter')
     self.reporter_module = self.reporter_patcher.start()
     self._mock_reporter()
     self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
     self.request = Request( transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world")
     self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree)
     self.generate_code_patcher = patch("mangrove.transport.player.player.Player._handle_registration_form")
     self.generate_code_patcher.start()
Пример #10
0
    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        initializer.run(self.dbm)
        define_type(self.dbm, ["dog"])
        self.entity_type = ["healthfacility", "clinic"]
        define_type(self.dbm, self.entity_type)
        self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number',
                                                  primitive_type='string')
        self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string')
        self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer')
        self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string')

        self.name_type.save()
        self.telephone_number_type.save()
        self.stock_type.save()
        self.color_type.save()

        self.entity = create_entity(self.dbm, entity_type=self.entity_type,
                                    location=["India", "Pune"], aggregation_paths=None, short_code="cli1",
                                    )

        self.data_record_id = self.entity.add_data(data=[("Name", "Ruby", self.name_type)],
                                                   submission=dict(submission_id="1"))

        self.reporter = create_entity(self.dbm, entity_type=["reporter"],
                                      location=["India", "Pune"], aggregation_paths=None, short_code="rep1",
                                      )

        self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
                (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2"))

        question1 = TextField(name="entity_question", code="EID", label="What is associated entity",
                              language="eng", entity_question_flag=True, ddtype=self.entity_id_type)
        question2 = TextField(name="Name", code="NAME", label="Clinic Name",
                              defaultValue="some default value", language="eng", length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120), ddtype=self.stock_type)
        question4 = SelectField(name="Color", code="COL", label="Color",
                                options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type)

        self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model",
                                    form_code="clinic", type='survey', fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model__id = self.form_model.save()

        self.submission_handler = SubmissionHandler(self.dbm)
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree())
Пример #11
0
 def setUp(self):
     self.dbm = get_db_manager(database='mangrove-test')
     self._create_entities()
     self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm))
     self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
     initializer.run(self.dbm)
Пример #12
0
def submit_to_player(incoming_request):
    sent_via_sms_test_questionnaire = incoming_request.get(
        'test_sms_questionnaire', False)
    organization = incoming_request.get('organization')
    organization = organization

    try:
        dbm = incoming_request['dbm']
        post_sms_parser_processors = [
            PostSMSProcessorLanguageActivator(dbm, incoming_request),
            PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request)
        ]
        sms_player = SMSPlayer(
            dbm,
            LocationBridge(get_location_tree(),
                           get_loc_hierarchy=get_location_hierarchy),
            post_sms_parser_processors=post_sms_parser_processors,
            feeds_dbm=incoming_request['feeds_dbm'])
        mangrove_request = Request(
            message=incoming_request['incoming_message'],
            transportInfo=incoming_request['transport_info'])
        response = sms_player.accept(mangrove_request,
                                     logger=incoming_request.get("logger"))

        if response.is_registration and not sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(sms_registration_count=1)

        if not response.is_registration and sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)

        mail_feed_errors(response, dbm.database_name)
        message = SMSResponse(response).text(dbm)
        send_message(incoming_request, response)
    except DataObjectAlreadyExists as e:
        message = ugettext("The Unique ID Number %s is already used for the %s %s. Register your %s with a different ID.") % \
                  (e.data[1], e.data[2], e.data[3], e.data[2])
        if not sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(sms_registration_count=1)
    except DataObjectNotFound as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)
    except FormModelDoesNotExistsException as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)
    except Exception as exception:
        message = handle(exception, incoming_request)

    incoming_request['outgoing_message'] = message

    if not sent_via_sms_test_questionnaire:
        SMS(message=message,
            message_id=incoming_request['message_id'],
            organization=incoming_request['organization'],
            msg_from=mangrove_request.transport.source,
            msg_to=mangrove_request.transport.destination,
            msg_type=MSG_TYPE_SUBMISSION_REPLY,
            status="Submitted").save()

    return incoming_request
from mangrove.transport.player.player import SMSPlayer
from mangrove.transport.contract.submission import Submission

#submission date,       source,     destination, messages,
#2012-11-24 13:48:22	24535435348	26134535750	 009 MCHTDV07 22.11.2012 ABE0000369 72.15 0 0 0 0

data_folder = "/Users/twer/Downloads/lost_data_folder/*.xlsx"

db_server = "localhost"
db_name = "hni_crs-stock_jhw14178"
db_credentials = settings.COUCHDBMAIN_CREDENTIALS

dbm = get_db_manager(server="http://%s:5984" % db_server,
                     database=db_name,
                     credentials=db_credentials)
sms_player = SMSPlayer(dbm)


def update_submission_date(response, submission_date):
    submission = Submission.get(dbm, response.submission_id)
    submission._doc.submitted_on = submission_date
    submission._doc.created = submission_date
    submission._doc.event_time = submission_date
    submission.save()
    pprint(submission.values)


def send_sms(source, destination, text):
    print text
    transport_info = TransportInfo(transport="sms",
                                   source=source,
Пример #14
0
    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        initializer.run(self.dbm)
        define_type(self.dbm, ["dog"])
        self.entity_type = ["healthfacility", "clinic"]
        define_type(self.dbm, self.entity_type)
        self.name_type = DataDictType(self.dbm,
                                      name='Name',
                                      slug='name',
                                      primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm,
                                                  name='telephone_number',
                                                  slug='telephone_number',
                                                  primitive_type='string')
        self.entity_id_type = DataDictType(self.dbm,
                                           name='Entity Id Type',
                                           slug='entity_id',
                                           primitive_type='string')
        self.stock_type = DataDictType(self.dbm,
                                       name='Stock Type',
                                       slug='stock',
                                       primitive_type='integer')
        self.color_type = DataDictType(self.dbm,
                                       name='Color Type',
                                       slug='color',
                                       primitive_type='string')

        self.name_type.save()
        self.telephone_number_type.save()
        self.stock_type.save()
        self.color_type.save()

        self.entity = create_entity(
            self.dbm,
            entity_type=self.entity_type,
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="cli1",
        )

        self.data_record_id = self.entity.add_data(
            data=[("Name", "Ruby", self.name_type)],
            submission=dict(submission_id="1"))

        self.reporter = create_entity(
            self.dbm,
            entity_type=["reporter"],
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="rep1",
        )

        self.reporter.add_data(data=[
            (MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
            (NAME_FIELD, "Test_reporter", self.name_type)
        ],
                               submission=dict(submission_id="2"))

        question1 = TextField(name="entity_question",
                              code="EID",
                              label="What is associated entity",
                              language="eng",
                              entity_question_flag=True,
                              ddtype=self.entity_id_type)
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              language="eng",
                              length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock",
                                 code="ARV",
                                 label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120),
                                 ddtype=self.stock_type)
        question4 = SelectField(name="Color",
                                code="COL",
                                label="Color",
                                options=[("RED", 1), ("YELLOW", 2)],
                                ddtype=self.color_type)

        self.form_model = FormModel(self.dbm,
                                    entity_type=self.entity_type,
                                    name="aids",
                                    label="Aids form_model",
                                    form_code="clinic",
                                    type='survey',
                                    fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model__id = self.form_model.save()

        self.submission_handler = SubmissionHandler(self.dbm)
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler,
                                    LocationTree())
Пример #15
0
class TestSMSPlayer(TestCase):
    def _mock_reporter(self):
        self.reporter_mock = Mock(spec=Entity)
        reporter_name = "1234"
        self.reporter_module.find_reporter_entity.return_value = self.reporter_mock, reporter_name

    def setUp(self):
        loc_tree = Mock()
        loc_tree.get_hierarchy_path.return_value = None
        self.dbm = Mock(spec=DatabaseManager)
        self.submission_handler_mock = Mock(spec=SubmissionHandler)
        self.reporter_patcher = patch(
            'mangrove.transport.player.player.reporter')
        self.reporter_module = self.reporter_patcher.start()
        self._mock_reporter()
        self.transport = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        self.request = Request(transportInfo=self.transport,
                               message="FORM_CODE +ID 1 +M hello world")
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock,
                                    loc_tree)
        self.generate_code_patcher = patch(
            "mangrove.transport.player.player.Player._handle_registration_form"
        )
        self.generate_code_patcher.start()

    def tearDown(self):
        self.reporter_patcher.stop()
        self.generate_code_patcher.stop()

    def test_should_submit_if_parsing_is_successful(self):
        self.sms_player.accept(self.request)

        self.assertEqual(1, self.submission_handler_mock.accept.call_count)

    def test_should_submit_if_submission_by_registered_reporter(self):

        self.sms_player.accept(self.request)

        self.assertEqual(1, self.submission_handler_mock.accept.call_count)

        submission_request = self.submission_handler_mock.accept.call_args[0][
            0]
        self.assertEqual(self.reporter_mock, submission_request.reporter)

    def test_should_check_if_submission_by_unregistered_reporter(self):
        self.reporter_module.find_reporter_entity.side_effect = NumberNotRegisteredException(
            "1234")
        with self.assertRaises(NumberNotRegisteredException):
            self.sms_player.accept(self.request)

    def test_should_not_submit_if_parsing_is_not_successful(self):
        self.request = Request(transportInfo=self.transport,
                               message="invalid format")
        with self.assertRaises(SubmissionParseException):
            self.sms_player.accept(self.request)

        self.assertEqual(0, self.submission_handler_mock.accept.call_count)

    def test_should_not_parse_if_two_question_codes(self):
        transport = TransportInfo(transport="sms",
                                  source="1234",
                                  destination="5678")
        self.request = Request(transportInfo=transport,
                               message="cli001 +na tester1 +na tester2")
        with self.assertRaises(SubmissionParseException):
            self.sms_player.accept(self.request)

        self.assertEqual(0, self.submission_handler_mock.accept.call_count)
Пример #16
0
class TestShouldSaveSMSSurveyResponse(MangroveTestCase):
    def setUp(self):
        MangroveTestCase.setUp(self)
        initializer.run(self.manager)
        define_type(self.manager, ["dog"])
        self.entity_type = ["clinic"]
        define_type(self.manager, self.entity_type)

        self.entity = create_entity(
            self.manager,
            entity_type=self.entity_type,
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="cli1",
        )

        self.data_record_id = self.entity.add_data(
            data=[("Name", "Ruby")], submission=dict(submission_id="1"))

        self.reporter = create_entity(
            self.manager,
            entity_type=["reporter"],
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="rep1",
        )

        self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234'),
                                     (NAME_FIELD, "Test_reporter")],
                               submission=dict(submission_id="2"))

        question1 = UniqueIdField('clinic',
                                  name="entity_question",
                                  code="EID",
                                  label="What is associated entity")
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              constraints=[TextLengthConstraint(4, 15)],
                              required=False)
        question3 = IntegerField(
            name="Arv stock",
            code="ARV",
            label="ARV Stock",
            constraints=[NumericRangeConstraint(min=15, max=120)],
            required=False)
        question4 = SelectField(name="Color",
                                code="COL",
                                label="Color",
                                options=[("RED", 1), ("YELLOW", 2)],
                                required=False)

        self.form_model = FormModel(self.manager,
                                    name="aids",
                                    label="Aids form_model",
                                    form_code="clinic",
                                    fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model_id = self.form_model.save()

        self.submission_handler = None
        self.sms_player = SMSPlayer(self.manager, LocationTree())
        self.sms_player_v2 = SMSPlayerV2(self.manager, [])

    def tearDown(self):
        MangroveTestCase.tearDown(self)

    def _prepare_survey_responses(self):
        doc_id1 = self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id=FORM_MODEL_ID,
                                   values={
                                       'Q1': 'ans1',
                                       'Q2': 'ans2'
                                   },
                                   status=True,
                                   error_message=""))
        doc_id2 = self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id=FORM_MODEL_ID,
                                   values={
                                       'Q1': 'ans12',
                                       'Q2': 'ans22'
                                   },
                                   status=True,
                                   error_message=""))
        doc_id3 = self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id=FORM_MODEL_ID,
                                   values={
                                       'Q3': 'ans12',
                                       'Q4': 'ans22'
                                   },
                                   status=False,
                                   error_message=""))
        doc_id4 = self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id="def",
                                   values={
                                       'defQ1': 'defans12',
                                       'defQ2': 'defans22'
                                   },
                                   status=False,
                                   error_message=""))
        return [doc_id1, doc_id2, doc_id3, doc_id4]

    def test_count_of_survey_responses_should_be_zero_when_form_code_not_existed(
            self):
        self._prepare_survey_responses()
        count = survey_response_count(self.manager, "not_existed_form_code", 0,
                                      self._tomorrow())
        self.assertEqual(0, count)

    def test_get_survey_responses_for_form(self):
        self._prepare_survey_responses()
        survey_responses = get_survey_responses(self.manager, FORM_MODEL_ID, 0,
                                                self._tomorrow())
        self.assertEquals(3, len(survey_responses))
        self.assertEquals({
            'Q3': 'ans12',
            'Q4': 'ans22'
        }, survey_responses[0].values)
        self.assertEquals({
            'Q1': 'ans12',
            'Q2': 'ans22'
        }, survey_responses[1].values)
        self.assertEquals({
            'Q1': 'ans1',
            'Q2': 'ans2'
        }, survey_responses[2].values)

    def test_error_messages_are_being_logged_in_survey_responses(self):
        text = "clinic .EID %s .ARV 150 " % self.entity.short_code
        self.send_sms_v2(text)
        survey_responses = get_survey_responses(self.manager,
                                                self.form_model_id, 0,
                                                self._tomorrow())
        self.assertEquals(1, len(survey_responses))
        self.assertEquals(
            u"Answer 150 for question ARV is greater than allowed.",
            survey_responses[0].errors)

    def test_get_survey_responses_for_form_for_an_activity_period(self):
        self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id="abc",
                                   values={
                                       'Q1': 'ans1',
                                       'Q2': 'ans2'
                                   },
                                   status=False,
                                   error_message="",
                                   data_record_id='2345678',
                                   event_time=datetime.datetime(2011, 9, 1)))
        self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id="abc",
                                   values={
                                       'Q1': 'ans12',
                                       'Q2': 'ans22'
                                   },
                                   status=False,
                                   error_message="",
                                   data_record_id='1234567',
                                   event_time=datetime.datetime(2011, 3, 3)))
        self.manager._save_document(
            SurveyResponseDocument(channel="transport",
                                   destination=12345,
                                   form_model_id="abc",
                                   values={
                                       'Q1': 'ans12',
                                       'Q2': 'defans22'
                                   },
                                   status=False,
                                   error_message="",
                                   data_record_id='345678',
                                   event_time=datetime.datetime(2011, 3, 10)))

        from_time = datetime.datetime(2011, 3, 1)
        end_time = datetime.datetime(2011, 3, 30)

        submissions = get_survey_responses_for_activity_period(
            self.manager, "abc", from_time, end_time)
        self.assertEquals(2, len(submissions))

    def send_sms(self, text):
        transport_info = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        response = self.sms_player.accept(
            Request(message=text, transportInfo=transport_info))
        return response

    def send_sms_v2(self, text):
        transport_info = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        response = self.sms_player_v2.add_survey_response(
            Request(message=text, transportInfo=transport_info))
        return response

    def _tomorrow(self):
        oneDay = datetime.timedelta(days=1)
        tomorrow = datetime.datetime.now() + oneDay
        return int(mktime(tomorrow.timetuple())) * 1000
Пример #17
0
 def setUp(self):
     MangroveTestCase.setUp(self)
     self._create_entities()
     self.player = SMSPlayer(self.manager, location_tree=LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy))
     self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
     initializer.run(self.manager)
Пример #18
0
class TestShouldSaveSMSSubmission(unittest.TestCase):
    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        initializer.run(self.dbm)
        define_type(self.dbm, ["dog"])
        self.entity_type = ["healthfacility", "clinic"]
        define_type(self.dbm, self.entity_type)
        self.name_type = DataDictType(self.dbm,
                                      name='Name',
                                      slug='name',
                                      primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm,
                                                  name='telephone_number',
                                                  slug='telephone_number',
                                                  primitive_type='string')
        self.entity_id_type = DataDictType(self.dbm,
                                           name='Entity Id Type',
                                           slug='entity_id',
                                           primitive_type='string')
        self.stock_type = DataDictType(self.dbm,
                                       name='Stock Type',
                                       slug='stock',
                                       primitive_type='integer')
        self.color_type = DataDictType(self.dbm,
                                       name='Color Type',
                                       slug='color',
                                       primitive_type='string')

        self.name_type.save()
        self.telephone_number_type.save()
        self.stock_type.save()
        self.color_type.save()

        self.entity = create_entity(
            self.dbm,
            entity_type=self.entity_type,
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="cli1",
        )

        self.data_record_id = self.entity.add_data(
            data=[("Name", "Ruby", self.name_type)],
            submission=dict(submission_id="1"))

        self.reporter = create_entity(
            self.dbm,
            entity_type=["reporter"],
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="rep1",
        )

        self.reporter.add_data(data=[
            (MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
            (NAME_FIELD, "Test_reporter", self.name_type)
        ],
                               submission=dict(submission_id="2"))

        question1 = TextField(name="entity_question",
                              code="EID",
                              label="What is associated entity",
                              language="eng",
                              entity_question_flag=True,
                              ddtype=self.entity_id_type)
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              language="eng",
                              length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock",
                                 code="ARV",
                                 label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120),
                                 ddtype=self.stock_type)
        question4 = SelectField(name="Color",
                                code="COL",
                                label="Color",
                                options=[("RED", 1), ("YELLOW", 2)],
                                ddtype=self.color_type)

        self.form_model = FormModel(self.dbm,
                                    entity_type=self.entity_type,
                                    name="aids",
                                    label="Aids form_model",
                                    form_code="clinic",
                                    type='survey',
                                    fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model__id = self.form_model.save()

        self.submission_handler = SubmissionHandler(self.dbm)
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler,
                                    LocationTree())

    def tearDown(self):
        _delete_db_and_remove_db_manager(self.dbm)

    def send_sms(self, text):
        transport_info = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        response = self.sms_player.accept(
            Request(transportInfo=transport_info, message=text))
        return response

    def test_should_save_submitted_sms(self):
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code

        response = self.send_sms(text)

        self.assertTrue(response.success)

        data_record_id = response.datarecord_id
        data_record = self.dbm._load_document(
            id=data_record_id, document_class=DataRecordDocument)
        self.assertEqual(self.name_type.slug,
                         data_record.data["Name"]["type"]["slug"])
        self.assertEqual(self.stock_type.slug,
                         data_record.data["Arv stock"]["type"]["slug"])
        self.assertEqual(self.color_type.slug,
                         data_record.data["Color"]["type"]["slug"])
        self.assertEqual("clinic", data_record.submission['form_code'])
        self.assertEqual(u"Test_reporter",
                         response.reporters[0].get(NAME_FIELD))

        data = self.entity.values({
            "Name": "latest",
            "Arv stock": "latest",
            "Color": "latest"
        })
        self.assertEquals(data["Arv stock"], 50)
        self.assertEquals(data["Name"], "CLINIC-MADA")
        submission_log = self.dbm._load_document(response.submission_id,
                                                 SubmissionLogDocument)
        self.assertEquals(data_record_id, submission_log.data_record_id)

    def test_should_save_submitted_sms_for_activity_report(self):
        question1 = TextField(name="entity_question",
                              code="EID",
                              label="What is associated entity",
                              language="eng",
                              entity_question_flag=True,
                              ddtype=self.entity_id_type)
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              language="eng",
                              length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock",
                                 code="ARV",
                                 label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120),
                                 ddtype=self.stock_type)
        activity_report = FormModel(self.dbm,
                                    entity_type=["reporter"],
                                    name="report",
                                    label="reporting form_model",
                                    form_code="acp",
                                    type='survey',
                                    fields=[question1, question2, question3])
        activity_report.save()

        text = "acp +name tester +ARV 50 "

        response = self.send_sms(text)

        self.assertTrue(response.success)
        self.assertEqual(u"Test_reporter",
                         response.reporters[0].get(NAME_FIELD))

        data_record_id = response.datarecord_id
        data_record = self.dbm._load_document(
            id=data_record_id, document_class=DataRecordDocument)
        self.assertEqual(self.name_type.slug,
                         data_record.data["Name"]["type"]["slug"])
        self.assertEqual(self.stock_type.slug,
                         data_record.data["Arv stock"]["type"]["slug"])
        self.assertEqual("acp", data_record.submission['form_code'])
        data = self.reporter.values({"Name": "latest", "Arv stock": "latest"})
        self.assertEquals(data["Arv stock"], 50)
        self.assertEquals(data["Name"], "tester")
        submission_log = self.dbm._load_document(response.submission_id,
                                                 SubmissionLogDocument)
        self.assertEquals(data_record_id, submission_log.data_record_id)

    def test_should_give_error_for_wrong_integer_value(self):
        text = "clinic +EID %s +ARV 150 " % self.entity.id
        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual(len(response.errors), 1)

    def test_should_give_error_for_wrong_text_value(self):
        text = "clinic +EID CID001 +NAME ABC"

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual(len(response.errors), 1)

    def test_get_submissions_for_form(self):
        self.dbm._save_document(
            SubmissionLogDocument(channel="transport",
                                  source=1234,
                                  destination=12345,
                                  form_code="abc",
                                  values={
                                      'Q1': 'ans1',
                                      'Q2': 'ans2'
                                  },
                                  status=False,
                                  error_message="",
                                  data_record_id='2345678'))
        self.dbm._save_document(
            SubmissionLogDocument(channel="transport",
                                  source=1234,
                                  destination=12345,
                                  form_code="abc",
                                  values={
                                      'Q1': 'ans12',
                                      'Q2': 'ans22'
                                  },
                                  status=False,
                                  error_message="",
                                  data_record_id='1234567'))
        self.dbm._save_document(
            SubmissionLogDocument(channel="transport",
                                  source=1234,
                                  destination=12345,
                                  form_code="def",
                                  values={
                                      'defQ1': 'defans12',
                                      'defQ2': 'defans22'
                                  },
                                  status=False,
                                  error_message="",
                                  data_record_id='345678'))

        oneDay = datetime.timedelta(days=1)
        tomorrow = datetime.datetime.now() + oneDay
        submission_list, ids = get_submissions_made_for_form(
            self.dbm, "abc", 0,
            int(mktime(tomorrow.timetuple())) * 1000)
        self.assertEquals(2, len(submission_list))
        self.assertEquals({
            'Q1': 'ans12',
            'Q2': 'ans22'
        }, submission_list[0]['values'])
        self.assertEquals({
            'Q1': 'ans1',
            'Q2': 'ans2'
        }, submission_list[1]['values'])
        self.assertEquals(2, len(ids))
        self.assertListEqual(['1234567', '2345678'], ids)

    def test_error_messages_are_being_logged_in_submissions(self):
        text = "clinic +EID %s +ARV 150 " % self.entity.id
        self.send_sms(text)
        oneDay = datetime.timedelta(days=1)
        tomorrow = datetime.datetime.now() + oneDay
        submission_list, ids = get_submissions_made_for_form(
            self.dbm, "clinic", 0,
            int(mktime(tomorrow.timetuple())) * 1000)
        self.assertEquals(1, len(submission_list))
        self.assertEquals(
            u"Answer 150 for question ARV is greater than allowed.",
            submission_list[0]['error_message'])

    def test_should_register_new_entity(self):
        message1 = """reg +t  dog +n  Clinic in Diégo–Suarez +l  Diégo–Suarez +g  -12.35  49.3  +d This is a Clinic in
        Diégo–Suarez + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = "dog1"
        self.assertEqual(response.short_code, expected_short_code)
        a = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual(a.short_code, expected_short_code)

        text = "reg +N buddy +S bud +T dog +G 80 80 +D its a dog! +M 45557"

        response = self.send_sms(text)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertEqual(response.short_code, "bud", ["dog"])
        a = get_by_short_code(self.dbm, "bud", ["dog"])
        self.assertEqual(a.short_code, "bud")

        text = "reg +N buddy2 +T dog +L 80 80 +D its another dog! +M 78541"

        response = self.send_sms(text)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = "dog3"
        self.assertEqual(response.short_code, expected_short_code)
        b = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual(b.short_code, expected_short_code)

    def test_should_return_error_for_registration_having_invalid_geo_data(
            self):
        INVALID_LATITUDE = 380
        text = "reg +N buddy2 +T dog +G %s 80 +D its another dog! +M 78541" % (
            INVALID_LATITUDE, )

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual({'g': 'The answer 380 must be between -90 and 90'},
                         response.errors)

        INVALID_LONGITUDE = -184
        text = "reg +N buddy2 +T dog +G 80 %s +D its another dog! +M 78541" % (
            INVALID_LONGITUDE, )

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual({'g': 'The answer -184 must be between -180 and 180'},
                         response.errors)

    def test_should_log_submission(self):
        transport_info = TransportInfo(transport="sms",
                                       source="1234",
                                       destination="5678")
        request = Request(transportInfo=transport_info,
                          message="reg +N buddy +S DOG3 +T dog")

        response = self.sms_player.accept(request)
        submission_log = self.dbm._load_document(response.submission_id,
                                                 SubmissionLogDocument)
        self.assertIsInstance(submission_log, SubmissionLogDocument)
        self.assertEquals(transport_info.transport, submission_log.channel)
        self.assertEquals(transport_info.source, submission_log.source)
        self.assertEquals(transport_info.destination,
                          submission_log.destination)
        self.assertEquals(True, submission_log.status)
        self.assertEquals("reg", submission_log.form_code)
        self.assertEquals({
            'n': 'buddy',
            's': 'DOG3',
            't': 'dog',
            'l': None
        }, submission_log.values)
        self.assertEquals(transport_info.destination,
                          submission_log.destination)
        self.assertEquals(response.datarecord_id,
                          submission_log.data_record_id)

    def test_should_throw_error_if_entity_with_same_short_code_exists(self):
        text = "reg +N buddy +S DOG3 +T dog +G 80 80 +D its a dog! +M 123456"
        self.send_sms(text)
        text = "reg +N buddy2 +S dog3 +T dog +L 80 80 +D its a dog! +M 123456"
        with self.assertRaises(DataObjectAlreadyExists):
            self.send_sms(text)

    def test_should_throw_error_if_reporter_with_same_phone_number_exists(
            self):
        text = "reg +N buddy +T reporter +G 80 80 +M 1@23456"
        self.send_sms(text)
        with self.assertRaises(MultipleReportersForANumberException):
            text = "reg +N buddy2 +T reporter +L 80 80 +M 123456"
            self.send_sms(text)

    def test_should_throw_error_if_reporter_registration_submission_has_no_mobile_number(
            self):
        with self.assertRaises(MobileNumberMissing):
            text = "reg +N buddy2 +T reporter +L 80 80"
            self.send_sms(text)

    def test_should_throw_error_if_entityType_doesnt_exist(self):
        with self.assertRaises(EntityTypeDoesNotExistsException):
            text = "reg +N buddy1 +S DOG3 +T cat +L 80 80 +D its another dog! +M 1234567"
            self.send_sms(text)

    def test_entity_instance_is_case_insensitive(self):
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "CLI1"

        response = self.send_sms(text)

        self.assertTrue(response.success)

    def test_questionnaire_code_is_case_insensitive(self):
        text = "CLINIC +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "cli1"
        response = self.send_sms(text)
        self.assertTrue(response.success)

    def test_entity_type_is_case_insensitive_in_registration(self):
        text = "reg +n buddy +T DOG +G 80 80 +M 123456"
        response = self.send_sms(text)
        self.assertTrue(response.success)
        data_record = self.dbm._load_document(response.datarecord_id,
                                              DataRecordDocument)
        actual_type = data_record["entity"]["aggregation_paths"]["_type"]
        self.assertEquals(["dog"], actual_type)

    def test_should_accept_unicode_submissions(self):
        text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45 56"
        with self.assertRaises(EntityTypeDoesNotExistsException):
            self.send_sms(text)

    def test_should_accept_unicode_submissions_and_invalidate_wrong_GPS(self):
        text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45Ö 56"
        with self.assertRaises(GeoCodeFormatException):
            self.send_sms(text)

    def test_should_raise_exception_for_inactive_form_model(self):
        self.form_model.deactivate()
        self.form_model.save()
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code
        with self.assertRaises(InactiveFormModelException):
            self.send_sms(text)

    def test_should_set_submission_log_as_Test_for_form_model_in_test_mode(
            self):
        self.form_model.set_test_mode()
        self.form_model.save()
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code
        response = self.send_sms(text)

        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertIsNotNone(response.submission_id)
        submission_log = self.dbm._load_document(response.submission_id,
                                                 SubmissionLogDocument)
        self.assertTrue(submission_log.test)

    def test_should_register_entity_with_geo_code(self):
        message1 = """reg +t dog +n Dog in Diégo–Suarez +g -12.35  49.3  +d This is a Dog in
        Diégo–Suarez + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([-12.35, 49.3], dog.geometry.get("coordinates"))

    def test_should_register_entity_with_geocode_if_only_location_provided(
            self):
        message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +d This is a Dog in
        AMPIZARANTANY + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([-12, 60], dog.geometry.get("coordinates"))

    def test_should_register_entity_with_geocode_and_location_provided(self):
        message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +g 10 10 +d This is a Dog in
        AMPIZARANTANY + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([10, 10], dog.geometry.get("coordinates"))
        self.assertEqual(["ampizarantany"], dog.location_path)
Пример #19
0
    def setUpClass(cls):
        cls.dbm = create_db(uniq('mangrove-test'))
        initializer.initial_data_setup(cls.dbm)
        cls.entity_type = ["healthfacility", "clinic"]
        safe_define_type(cls.dbm, cls.entity_type)

        cls.entity_short_code = "cli" + str(int(random.random() * 10000))
        cls.entity = create_entity(
            cls.dbm,
            entity_type=cls.entity_type,
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code=cls.entity_short_code,
        )
        cls.entity.save()
        cls.reporter_id = "rep" + str(int(random.random() * 10000))
        cls.reporter = create_contact(cls.dbm,
                                      location=["India", "Pune"],
                                      aggregation_paths=None,
                                      short_code=cls.reporter_id)
        cls.reporter.save()

        cls.phone_number = str(int(random.random() * 10000000))
        cls.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, cls.phone_number),
                                    (NAME_FIELD, "Test_reporter")],
                              submission=dict(submission_id="2"))

        question1 = ShortCodeField(
            name="entity_question",
            code="EID",
            label="What is associated entity",
            constraints=[TextLengthConstraint(min=1, max=20)])
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              constraints=[TextLengthConstraint(4, 15)],
                              required=False)
        question3 = IntegerField(
            name="Arv stock",
            code="ARV",
            label="ARV Stock",
            constraints=[NumericRangeConstraint(min=15, max=120)],
            required=False)
        question4 = SelectField(name="Color",
                                code="COL",
                                label="Color",
                                options=[("RED", 'a'), ("YELLOW", 'a')],
                                required=False)

        try:
            cls.form_model = get_form_model_by_code(cls.dbm, "clinic")
        except FormModelDoesNotExistsException:
            cls.form_model = EntityFormModel(
                cls.dbm,
                entity_type=cls.entity_type,
                name="aids",
                label="Aids form_model",
                form_code="clinic",
                fields=[question1, question2, question3],
                is_registration_model=True)
            cls.form_model.add_field(question4)
            cls.form_model.save()
        cls.sms_player = SMSPlayer(cls.dbm, LocationTree())
        cls.sms_ordered_message_player = SMSPlayer(cls.dbm, LocationTree())
Пример #20
0
def submit_to_player(incoming_request):
    sent_via_sms_test_questionnaire = incoming_request.get(
        'test_sms_questionnaire', False)
    organization = incoming_request.get('organization')
    organization = organization

    try:
        dbm = incoming_request['dbm']
        mangrove_request = Request(
            message=incoming_request['incoming_message'],
            transportInfo=incoming_request['transport_info'])
        response = _is_datasender_registered(dbm, incoming_request)
        if not response:
            post_sms_parser_processors = [
                PostSMSProcessorLanguageActivator(dbm, incoming_request)
            ]
            if organization.in_trial_mode:
                post_sms_parser_processors.append(
                    PostSMSProcessorCheckLimits(dbm, incoming_request))

            post_sms_parser_processors.extend([
                PostSMSProcessorNumberOfAnswersValidators(
                    dbm, incoming_request),
                PostSMSProcessorCheckDSIsLinkedToProject(
                    dbm, incoming_request)
            ])

            sms_player = SMSPlayer(
                dbm,
                LocationBridge(get_location_tree(),
                               get_loc_hierarchy=get_location_hierarchy),
                post_sms_parser_processors=post_sms_parser_processors,
                feeds_dbm=incoming_request['feeds_dbm'])

            response = sms_player.accept(
                mangrove_request,
                logger=incoming_request.get("logger"),
                translation_processor=TranslationProcessor)

            if response.is_registration:
                incoming_request['is_registration'] = True
                if not sent_via_sms_test_questionnaire:
                    organization.increment_message_count_for(
                        sms_registration_count=1)

            if not response.is_registration:
                if sent_via_sms_test_questionnaire:
                    organization.increment_message_count_for(
                        incoming_web_count=1)
                check_quotas_and_update_users(organization, sms_channel=True)

        mail_feed_errors(response, dbm.database_name)
        message = SMSResponse(response, incoming_request).text(dbm)
        send_message(incoming_request, response)
    except DataObjectAlreadyExists as e:
        message = identification_number_already_exists_handler(
            dbm, e.data[1], e.data[2])
        if not sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(sms_registration_count=1)

    except DataObjectNotFound as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)

    except FormModelDoesNotExistsException as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = incorrect_questionnaire_code_handler(dbm, exception.data[0])

    except SMSParserWrongNumberOfAnswersException as exception:
        form_model = sms_player.get_form_model(mangrove_request)
        if not form_model.is_entity_registration_form():
            organization.increment_message_count_for(
                incoming_web_count=1
            ) if sent_via_sms_test_questionnaire else organization.increment_message_count_for(
                incoming_sms_count=1)
            message = incorrect_number_of_answers_for_submission_handler(
                dbm, form_model.form_code, incoming_request)
        elif form_model.is_entity_registration_form():
            message = incorrect_number_of_answers_for_uid_registration_handler(
                dbm, form_model.form_code, incoming_request)
        elif not sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(sms_registration_count=1)

    except Exception as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)

    message = incoming_request.get('error_message', message)
    incoming_request['outgoing_message'] = message if incoming_request.get(
        'is_outgoing_reply_sms_enabled', True) else ""

    if not sent_via_sms_test_questionnaire:

        if incoming_request.get('is_outgoing_reply_sms_enabled', True):
            organization.increment_message_count_for(outgoing_sms_count=1)

        SMS(message=message,
            message_id=incoming_request['message_id'],
            organization=incoming_request['organization'],
            msg_from=mangrove_request.transport.source,
            msg_to=mangrove_request.transport.destination,
            msg_type=MSG_TYPE_SUBMISSION_REPLY,
            status="Submitted").save()

    return incoming_request
Пример #21
0
    def setUp(self):
        MangroveTestCase.setUp(self)
        initializer.run(self.manager)
        define_type(self.manager, ["dog"])
        self.entity_type = ["clinic"]
        define_type(self.manager, self.entity_type)

        self.entity = create_entity(
            self.manager,
            entity_type=self.entity_type,
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="cli1",
        )

        self.data_record_id = self.entity.add_data(
            data=[("Name", "Ruby")], submission=dict(submission_id="1"))

        self.reporter = create_entity(
            self.manager,
            entity_type=["reporter"],
            location=["India", "Pune"],
            aggregation_paths=None,
            short_code="rep1",
        )

        self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234'),
                                     (NAME_FIELD, "Test_reporter")],
                               submission=dict(submission_id="2"))

        question1 = UniqueIdField('clinic',
                                  name="entity_question",
                                  code="EID",
                                  label="What is associated entity")
        question2 = TextField(name="Name",
                              code="NAME",
                              label="Clinic Name",
                              defaultValue="some default value",
                              constraints=[TextLengthConstraint(4, 15)],
                              required=False)
        question3 = IntegerField(
            name="Arv stock",
            code="ARV",
            label="ARV Stock",
            constraints=[NumericRangeConstraint(min=15, max=120)],
            required=False)
        question4 = SelectField(name="Color",
                                code="COL",
                                label="Color",
                                options=[("RED", 1), ("YELLOW", 2)],
                                required=False)

        self.form_model = FormModel(self.manager,
                                    name="aids",
                                    label="Aids form_model",
                                    form_code="clinic",
                                    fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model_id = self.form_model.save()

        self.submission_handler = None
        self.sms_player = SMSPlayer(self.manager, LocationTree())
        self.sms_player_v2 = SMSPlayerV2(self.manager, [])
def load_sms_data_for_cli001(manager):
    FEB = datetime(2011, 02, 28, hour=12, minute=00, second=00, tzinfo=UTC)
    MARCH = datetime(2011, 03, 01, tzinfo=UTC)
    DEC_2010 = datetime(2010,
                        12,
                        28,
                        hour=00,
                        minute=00,
                        second=59,
                        tzinfo=UTC)
    NOV_2010 = datetime(2010,
                        11,
                        26,
                        hour=23,
                        minute=59,
                        second=59,
                        tzinfo=UTC)
    today = datetime.today()
    THIS_MONTH = datetime(today.year, today.month, 5, 12, 45, 58)
    PREV_MONTH = THIS_MONTH - timedelta(days=8)
    tree = get_location_tree()
    sms_player = SMSPlayer(manager,
                           SubmissionHandler(manager),
                           location_tree=tree)
    FROM_NUMBER = '1234567890'
    TO_NUMBER = '261333782943'
    transport = TransportInfo(SMS, FROM_NUMBER, TO_NUMBER)

    message1 = "reg +t  clinic +n  Clinic in Analalava  +l  Analalava  +g  -14.6333  47.7667  +d This is a Clinic in Analalava +m 987654321"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Andapa  +l  Andapa  +g  -14.65  49.6167  +d This is a Clinic in Andapa  +m 87654322"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Antalaha  +l  Antalaha  +g  -14.8833  50.25  +d This is a Clinic in Antalaha  +m 87654323"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in ANALAMANGA  +l  ANALAMANGA  +g  -18.8  47.4833  +d This is a Clinic in Antananarivo  +m 87654324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in TSIMANARIRAZANA +l  TSIMANARIRAZANA +g  -12.35  49.3  +d This is a Clinic in Diégo–Suarez +m 87654325"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Antsirabe  +l  Antsirabe  +g  -19.8167  47.0667  +d This is a Clinic in Antsirabe  +m 87654326"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Besalampy  +l  Besalampy  +g  -16.75  44.5  +d This is a Clinic in Besalampy  +m 87654327"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  clinique à Farafangana  +l  Farafangana  +g  -22.8  47.8333  +d This is a Clinic in Farafangana  +m 87654328"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Fianarantsoa I +l  Fianarantsoa I +g  -21.45  47.1 +d  C'est une clinique à Fianarantsoa +m 87654329"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Sainte Marie  +l  Sainte Marie  +g  -17.0833  49.8167  +d This is a Clinic in Île Sainte–Marie  +m 87654330"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Mahajanga +l  Mahajanga +g  -15.6667  46.35  +d This is a Clinic in Mahajanga +m 87654331"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker = DateTimeMocker()
    datetime_mocker.set_date_time_now(FEB)
    # Total number of identical records = 3
    message1 = "cli001 +EID cid001 +NA Mr. Tessy +FA 58 +RD 28.02.2011 +BG c +SY ade +GPS 79.2 20.34567"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid002 +NA Mr. Adam +FA 62 +RD 15.02.2011 +BG a +SY ab +GPS 74.2678 23.3567"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA Ms. Beth +FA 75 +RD 09.02.2011 +BG b +SY bc +GPS 18.245 29.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(MARCH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cid004 +NA Jannita +FA 90 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA Aanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid001 +NA Ianda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid001 +NA ànita +FA 45 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid004 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid005 +NA Vanda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA ànnita +FA 80 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid002 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid004 +NA Panda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA ànnita +FA 50 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA Jimanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli10 +NA Kanda (",) +FA 64 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid004 +NA ànnita +FA 30 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA Qamanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid001 +NA Huanda (*_*) +FA 74 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(DEC_2010)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli12 +FA 47 +RD 15.12.2010 +BG d +SY ace +GPS -58.3452 19.3345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA De'melo +FA 38 +RD 27.12.2010 +BG c +SY ba +GPS 81.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli13 +NA Dono`mova +FA 24 +RD 06.12.2010 +BG b +SY cd +GPS 65.23452 -28.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA Aàntra +FA 89 +RD 11.12.2010 +BG a +SY bd +GPS 45.234 89.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(NOV_2010)
    # Total number of identical records = 3
    message1 = "cli001 +EID cli12 +NA ànnita +FA 90 +RD 07.11.2010 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA ànnita +FA 90 +RD 17.11.2010 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid007 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(PREV_MONTH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 98 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 37 +RD 05.05.2011 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 02.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 95 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 35 +RD 09.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Demelo +FA 32 +RD 27.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 43 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 91 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 45 +RD 15.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(THIS_MONTH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli13 +NA Dmanda +FA 69 +RD 05.06.2011 +BG c +SY ce +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Vamand +FA 36 +RD 03.06.2011 +BG a +SY ace +GPS 58.3452 115.3345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA M!lo +FA 88 +RD 02.06.2011 +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli16 +NA K!llo +FA 88 +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli13 +NA Dmanda +FA 89 +RD 04.06.2011 +BG c +SY ce +GPS 40.2 69.3123"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Vamand +FA 56 +RD 01.06.2011 +BG a +SY ace +GPS 58.3452 115.3345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA M!lo +FA 45 +RD 07.06.2011 +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli16 +NA K!llo +FA 28 +GPS 19.672 92.33456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    datetime_mocker.end_mock()

    # Total number of identical records = 3
    message1 = "cli001 +EID cli17 +NA Catty +FA 78 +RD 15.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli18 +NA àntra +FA 28 +RD 12.06.2011 +BG a +SY adb +GPS -45.234 169.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Tinnita +FA 37 +BG d +SY ace +GPS -78.233 -28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))

    message1 = "cli001 +EID cli17 +NA Catty +FA 98 +RD 25.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli18 +NA àntra +FA 58 +RD 22.06.2011 +BG a +SY adb +GPS -45.234 169.32345"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Tinnita +FA 27 +BG d +SY ace +GPS -78.233 -28.3324"
    response = sms_player.accept(
        Request(transportInfo=transport, message=message1))
    def SendSubmission(self, message):
        sms_player = SMSPlayer(self.manager, location_tree=["China", "Beijing"], parser=(OrderSMSParser(self.manager)))
        transport_info = TransportInfo(transport="sms", source="1234567890", destination="5678")
        request = Request(message=message, transportInfo=transport_info)

        return sms_player.accept(request)
Пример #24
0
def submit_to_player(incoming_request):
    sent_via_sms_test_questionnaire = incoming_request.get('test_sms_questionnaire', False)
    organization = incoming_request.get('organization')
    organization = organization
    should_increment_incoming_sms_count = True if not sent_via_sms_test_questionnaire else False
    response =None
    try:

        dbm = incoming_request['dbm']
        mangrove_request = Request(message=incoming_request['incoming_message'],
                                   transportInfo=incoming_request['transport_info'])

        post_sms_parser_processors = [PostSMSProcessorLanguageActivator(dbm, incoming_request),
                                      PostSMSProcessorCheckDSIsRegistered(dbm, incoming_request)]
        if organization.in_trial_mode:
            post_sms_parser_processors.append(PostSMSProcessorCheckLimits(dbm, incoming_request))

        post_sms_parser_processors.extend([PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request),
                                           PostSMSProcessorCheckDSIsLinkedToProject(dbm, incoming_request)])

        sms_player = SMSPlayer(dbm, LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy),
                               post_sms_parser_processors=post_sms_parser_processors,
                               feeds_dbm=incoming_request['feeds_dbm'])

        response = sms_player.accept(mangrove_request, logger=incoming_request.get("logger"),
                                     translation_processor=TranslationProcessor)

        if response.is_registration:
            incoming_request['is_registration'] = True
            if not sent_via_sms_test_questionnaire:
                organization.increment_message_count_for(sms_registration_count=1)
        else:
            if sent_via_sms_test_questionnaire:
                organization.increment_message_count_for(incoming_web_count=1)
            check_quotas_and_update_users(organization, sms_channel=True)

        mail_feed_errors(response, dbm.database_name)
        message = SMSResponse(response, incoming_request).text(dbm)
        send_message(incoming_request, response)
    except DataObjectAlreadyExists as e:
        message = identification_number_already_exists_handler(dbm, e.data[1], e.data[2])
        if not sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(sms_registration_count=1)

    except DataObjectNotFound as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)

    except FormModelDoesNotExistsException as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = incorrect_questionnaire_code_handler(dbm, exception.data[0], incoming_request)

    except SMSParserWrongNumberOfAnswersException:
        form_model = sms_player.get_form_model(mangrove_request)
        if not form_model.is_entity_registration_form():
            if sent_via_sms_test_questionnaire:
                organization.increment_message_count_for(incoming_web_count=1)

            message = incorrect_number_of_answers_for_submission_handler(dbm, form_model.form_code, incoming_request)
        elif form_model.is_entity_registration_form():
            message = incorrect_number_of_answers_for_uid_registration_handler(dbm, form_model.form_code, incoming_request)

    except (ExceedSubmissionLimitException, ExceedSMSLimitException) as exception:
        should_increment_incoming_sms_count = False
        message = handle(exception, incoming_request)

    except Exception as exception:
        if sent_via_sms_test_questionnaire:
            organization.increment_message_count_for(incoming_web_count=1)
        message = handle(exception, incoming_request)

    if should_increment_incoming_sms_count:
        organization.increment_incoming_message_count()

    if response and not response.is_registration:
        check_quotas_and_update_users(organization, )
    return post_player_handler(incoming_request, message)
Пример #25
0
class TestShouldSaveSMSSubmission(unittest.TestCase):
    def setUp(self):
        self.dbm = get_db_manager(database='mangrove-test')
        initializer.run(self.dbm)
        define_type(self.dbm, ["dog"])
        self.entity_type = ["healthfacility", "clinic"]
        define_type(self.dbm, self.entity_type)
        self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string')
        self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number',
                                                  primitive_type='string')
        self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string')
        self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer')
        self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string')

        self.name_type.save()
        self.telephone_number_type.save()
        self.stock_type.save()
        self.color_type.save()

        self.entity = create_entity(self.dbm, entity_type=self.entity_type,
                                    location=["India", "Pune"], aggregation_paths=None, short_code="cli1",
                                    )

        self.data_record_id = self.entity.add_data(data=[("Name", "Ruby", self.name_type)],
                                                   submission=dict(submission_id="1"))

        self.reporter = create_entity(self.dbm, entity_type=["reporter"],
                                      location=["India", "Pune"], aggregation_paths=None, short_code="rep1",
                                      )

        self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
                (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2"))

        question1 = TextField(name="entity_question", code="EID", label="What is associated entity",
                              language="eng", entity_question_flag=True, ddtype=self.entity_id_type)
        question2 = TextField(name="Name", code="NAME", label="Clinic Name",
                              defaultValue="some default value", language="eng", length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120), ddtype=self.stock_type)
        question4 = SelectField(name="Color", code="COL", label="Color",
                                options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type)

        self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model",
                                    form_code="clinic", type='survey', fields=[question1, question2, question3])
        self.form_model.add_field(question4)
        self.form_model__id = self.form_model.save()

        self.submission_handler = SubmissionHandler(self.dbm)
        self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree())

    def tearDown(self):
        _delete_db_and_remove_db_manager(self.dbm)

    def send_sms(self, text):
        transport_info = TransportInfo(transport="sms", source="1234", destination="5678")
        response = self.sms_player.accept(Request(transportInfo=transport_info, message=text))
        return response

    def test_should_save_submitted_sms(self):
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code

        response = self.send_sms(text)

        self.assertTrue(response.success)

        data_record_id = response.datarecord_id
        data_record = self.dbm._load_document(id=data_record_id, document_class=DataRecordDocument)
        self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"])
        self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"])
        self.assertEqual(self.color_type.slug, data_record.data["Color"]["type"]["slug"])
        self.assertEqual("clinic", data_record.submission['form_code'])
        self.assertEqual(u"Test_reporter",response.reporters[0].get(NAME_FIELD))

        data = self.entity.values({"Name": "latest", "Arv stock": "latest", "Color": "latest"})
        self.assertEquals(data["Arv stock"], 50)
        self.assertEquals(data["Name"], "CLINIC-MADA")
        submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument)
        self.assertEquals(data_record_id, submission_log.data_record_id)

    def test_should_save_submitted_sms_for_activity_report(self):
        question1 = TextField(name="entity_question", code="EID", label="What is associated entity",
                              language="eng", entity_question_flag=True, ddtype=self.entity_id_type)
        question2 = TextField(name="Name", code="NAME", label="Clinic Name",
                              defaultValue="some default value", language="eng", length=TextConstraint(4, 15),
                              ddtype=self.name_type)
        question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock",
                                 range=NumericConstraint(min=15, max=120), ddtype=self.stock_type)
        activity_report = FormModel(self.dbm, entity_type=["reporter"], name="report", label="reporting form_model",
                                    form_code="acp", type='survey', fields=[question1, question2, question3])
        activity_report.save()

        text = "acp +name tester +ARV 50 "

        response = self.send_sms(text)

        self.assertTrue(response.success)
        self.assertEqual(u"Test_reporter",response.reporters[0].get(NAME_FIELD))

        data_record_id = response.datarecord_id
        data_record = self.dbm._load_document(id=data_record_id, document_class=DataRecordDocument)
        self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"])
        self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"])
        self.assertEqual("acp", data_record.submission['form_code'])
        data = self.reporter.values({"Name": "latest", "Arv stock": "latest"})
        self.assertEquals(data["Arv stock"], 50)
        self.assertEquals(data["Name"], "tester")
        submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument)
        self.assertEquals(data_record_id, submission_log.data_record_id)

    def test_should_give_error_for_wrong_integer_value(self):
        text = "clinic +EID %s +ARV 150 " % self.entity.id
        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual(len(response.errors), 1)

    def test_should_give_error_for_wrong_text_value(self):
        text = "clinic +EID CID001 +NAME ABC"

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual(len(response.errors), 1)

    def test_get_submissions_for_form(self):
        self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234,
                                                      destination=12345, form_code="abc",
                                                      values={'Q1': 'ans1', 'Q2': 'ans2'},
                                                      status=False, error_message="", data_record_id='2345678'))
        self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234,
                                                      destination=12345, form_code="abc",
                                                      values={'Q1': 'ans12', 'Q2': 'ans22'},
                                                      status=False, error_message="", data_record_id='1234567'))
        self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234,
                                                      destination=12345, form_code="def",
                                                      values={'defQ1': 'defans12', 'defQ2': 'defans22'},
                                                      status=False, error_message="", data_record_id='345678'))

        oneDay = datetime.timedelta(days=1)
        tomorrow = datetime.datetime.now() + oneDay
        submission_list, ids = get_submissions_made_for_form(self.dbm, "abc", 0,
                                                             int(mktime(tomorrow.timetuple())) * 1000)
        self.assertEquals(2, len(submission_list))
        self.assertEquals({'Q1': 'ans12', 'Q2': 'ans22'}, submission_list[0]['values'])
        self.assertEquals({'Q1': 'ans1', 'Q2': 'ans2'}, submission_list[1]['values'])
        self.assertEquals(2, len(ids))
        self.assertListEqual(['1234567', '2345678'], ids)

    def test_error_messages_are_being_logged_in_submissions(self):
        text = "clinic +EID %s +ARV 150 " % self.entity.id
        self.send_sms(text)
        oneDay = datetime.timedelta(days=1)
        tomorrow = datetime.datetime.now() + oneDay
        submission_list, ids = get_submissions_made_for_form(self.dbm, "clinic", 0,
                                                             int(mktime(tomorrow.timetuple())) * 1000)
        self.assertEquals(1, len(submission_list))
        self.assertEquals(u"Answer 150 for question ARV is greater than allowed.", submission_list[0]['error_message'])


    def test_should_register_new_entity(self):
        message1 = """reg +t  dog +n  Clinic in Diégo–Suarez +l  Diégo–Suarez +g  -12.35  49.3  +d This is a Clinic in
        Diégo–Suarez + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = "dog1"
        self.assertEqual(response.short_code, expected_short_code)
        a = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual(a.short_code, expected_short_code)

        text = "reg +N buddy +S bud +T dog +G 80 80 +D its a dog! +M 45557"

        response = self.send_sms(text)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertEqual(response.short_code, "bud", ["dog"])
        a = get_by_short_code(self.dbm, "bud", ["dog"])
        self.assertEqual(a.short_code, "bud")

        text = "reg +N buddy2 +T dog +L 80 80 +D its another dog! +M 78541"

        response = self.send_sms(text)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = "dog3"
        self.assertEqual(response.short_code, expected_short_code)
        b = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual(b.short_code, expected_short_code)

    def test_should_return_error_for_registration_having_invalid_geo_data(self):
        INVALID_LATITUDE = 380
        text = "reg +N buddy2 +T dog +G %s 80 +D its another dog! +M 78541" % (INVALID_LATITUDE,)

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual({'g': 'The answer 380 must be between -90 and 90'}, response.errors)

        INVALID_LONGITUDE = -184
        text = "reg +N buddy2 +T dog +G 80 %s +D its another dog! +M 78541" % (INVALID_LONGITUDE,)

        response = self.send_sms(text)
        self.assertFalse(response.success)
        self.assertEqual({'g': 'The answer -184 must be between -180 and 180'}, response.errors)

    def test_should_log_submission(self):
        transport_info = TransportInfo(transport="sms", source="1234", destination="5678")
        request = Request(transportInfo=transport_info, message="reg +N buddy +S DOG3 +T dog")

        response = self.sms_player.accept(request)
        submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument)
        self.assertIsInstance(submission_log, SubmissionLogDocument)
        self.assertEquals(transport_info.transport, submission_log.channel)
        self.assertEquals(transport_info.source, submission_log.source)
        self.assertEquals(transport_info.destination, submission_log.destination)
        self.assertEquals(True, submission_log. status)
        self.assertEquals("reg", submission_log.form_code)
        self.assertEquals({'n': 'buddy', 's': 'DOG3', 't': 'dog', 'l':None}, submission_log.values)
        self.assertEquals(transport_info.destination, submission_log.destination)
        self.assertEquals(response.datarecord_id, submission_log.data_record_id)


    def test_should_throw_error_if_entity_with_same_short_code_exists(self):
        text = "reg +N buddy +S DOG3 +T dog +G 80 80 +D its a dog! +M 123456"
        self.send_sms(text)
        text = "reg +N buddy2 +S dog3 +T dog +L 80 80 +D its a dog! +M 123456"
        with self.assertRaises(DataObjectAlreadyExists):
            self.send_sms(text)

    def test_should_throw_error_if_reporter_with_same_phone_number_exists(self):
        text = "reg +N buddy +T reporter +G 80 80 +M 1@23456"
        self.send_sms(text)
        with self.assertRaises(MultipleReportersForANumberException):
            text = "reg +N buddy2 +T reporter +L 80 80 +M 123456"
            self.send_sms(text)

    def test_should_throw_error_if_reporter_registration_submission_has_no_mobile_number(self):
        with self.assertRaises(MobileNumberMissing):
            text = "reg +N buddy2 +T reporter +L 80 80"
            self.send_sms(text)

    def test_should_throw_error_if_entityType_doesnt_exist(self):
        with self.assertRaises(EntityTypeDoesNotExistsException):
            text = "reg +N buddy1 +S DOG3 +T cat +L 80 80 +D its another dog! +M 1234567"
            self.send_sms(text)

    def test_entity_instance_is_case_insensitive(self):
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "CLI1"

        response = self.send_sms(text)

        self.assertTrue(response.success)

    def test_questionnaire_code_is_case_insensitive(self):
        text = "CLINIC +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "cli1"
        response = self.send_sms(text)
        self.assertTrue(response.success)

    def test_entity_type_is_case_insensitive_in_registration(self):
        text = "reg +n buddy +T DOG +G 80 80 +M 123456"
        response = self.send_sms(text)
        self.assertTrue(response.success)
        data_record = self.dbm._load_document(response.datarecord_id, DataRecordDocument)
        actual_type = data_record["entity"]["aggregation_paths"]["_type"]
        self.assertEquals(["dog"], actual_type)

    def test_should_accept_unicode_submissions(self):
        text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45 56"
        with self.assertRaises(EntityTypeDoesNotExistsException):
            self.send_sms(text)

    def test_should_accept_unicode_submissions_and_invalidate_wrong_GPS(self):
        text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45Ö 56"
        with self.assertRaises(GeoCodeFormatException):
            self.send_sms(text)

    def test_should_raise_exception_for_inactive_form_model(self):
        self.form_model.deactivate()
        self.form_model.save()
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code
        with self.assertRaises(InactiveFormModelException):
            self.send_sms(text)

    def test_should_set_submission_log_as_Test_for_form_model_in_test_mode(self):
        self.form_model.set_test_mode()
        self.form_model.save()
        text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code
        response = self.send_sms(text)

        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertIsNotNone(response.submission_id)
        submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument)
        self.assertTrue(submission_log.test)


    def test_should_register_entity_with_geo_code(self):
        message1 = """reg +t dog +n Dog in Diégo–Suarez +g -12.35  49.3  +d This is a Dog in
        Diégo–Suarez + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([-12.35 , 49.3] ,dog.geometry.get("coordinates"))

    def test_should_register_entity_with_geocode_if_only_location_provided(self):
        message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +d This is a Dog in
        AMPIZARANTANY + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([-12, 60] ,dog.geometry.get("coordinates"))

    def test_should_register_entity_with_geocode_and_location_provided(self):
        message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +g 10 10 +d This is a Dog in
        AMPIZARANTANY + m
        87654325
        """
        response = self.send_sms(message1)
        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        expected_short_code = 'dog1'
        self.assertEqual(response.short_code, expected_short_code)
        dog = get_by_short_code(self.dbm, expected_short_code, ["dog"])
        self.assertEqual([10, 10] ,dog.geometry.get("coordinates"))
        self.assertEqual(["ampizarantany"] ,dog.location_path)
Пример #26
0
class TestImportData(MangroveTestCase):
    def setUp(self):
        MangroveTestCase.setUp(self)
        self._create_entities()
        self.player = SMSPlayer(self.manager, location_tree=LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy))
        self.transport = TransportInfo(transport="sms", source="1234", destination="5678")
        initializer.run(self.manager)

    def tearDown(self):
        MangroveTestCase.tearDown(self)

    def test_should_load_all_subjects(self):
        self._register_entities()

        subjects = load_all_subjects(self.manager)

        self.assertEqual(2, len(subjects))
        self.assertEqual(subjects[0]["entity"], "clinic")
        self.assertEqual(subjects[1]["entity"], "waterpoint")
        self.assertEqual(subjects[0]["code"], "cli")
        self.assertEqual(subjects[1]["code"], "wat")
        self.assertEqual(6, len(subjects[0]["names"]))
        self.assertEqual(6, len(subjects[0]["labels"]))

        self.assertEqual(subjects[0]['data'][0]['cols'][0], 'Bhopal')
        self.assertEqual(subjects[0]['data'][0]['cols'][2], 'India')
        self.assertEqual(subjects[0]['data'][0]['cols'][5], 'clb')

        self.assertEqual(subjects[0]['data'][1]['cols'][0], 'Satna')
        self.assertEqual(subjects[0]['data'][1]['cols'][3], '-10.66, 13.1')
        self.assertEqual(subjects[0]['data'][1]['cols'][5], 'cli2')

        self.assertEqual(subjects[1]['data'][0]['cols'][0], 'Ambovombe')
        self.assertEqual(subjects[1]['data'][0]['cols'][3], '-18.16, 14.1')
        self.assertEqual(subjects[1]['data'][0]['cols'][4], '123444')
        self.assertEqual(subjects[1]['data'][0]['cols'][5], 'wat1')

    def _create_entities(self):
        self.entity_type = ['clinic']
        define_type(self.manager, self.entity_type)
        create_registration_form(self.manager, self.entity_type)
        self.entity_type = ['waterpoint']
        define_type(self.manager, self.entity_type)
        create_registration_form(self.manager, self.entity_type)
        define_type(self.manager, ['reporter'])
        self.name_type = DataDictType(self.manager, name='Name', slug='name', primitive_type='string')
        self.telephone_number_type = DataDictType(self.manager, name='telephone_number', slug='telephone_number',
                                                  primitive_type='string')
        rep1 = create_entity(self.manager, ['reporter'], 'rep1')
        rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type),
            (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2"))


    def _register_entity(self, text):
        self.player.accept(Request(text, self.transport))

    def _register_entities(self):
        self._register_entity('cli Bhopal Clinic India -12.35,49.3 123444 clb')
        self._register_entity('cli Satna Clinic India -10.66,13.1 567223')
        self._register_entity('cli Pune Clinic Yerawada -18.16,14.1 643321')
        self._register_entity('wat Ambovombe Test Androy -18.16,14.1 123444')
        self._register_entity('wat Morondava Test Menabe -15.91,12.67 138866')
def load_sms_data_for_cli001(manager):
    FEB = datetime(2011, 02, 28, hour=12, minute=00, second=00, tzinfo=UTC)
    MARCH = datetime(2011, 03, 01, tzinfo=UTC)
    DEC_2010 = datetime(2010, 12, 28, hour=00, minute=00, second=59, tzinfo=UTC)
    NOV_2010 = datetime(2010, 11, 26, hour=23, minute=59, second=59, tzinfo=UTC)
    today = datetime.today()
    THIS_MONTH = datetime(today.year,today.month,5,12,45,58)
    PREV_MONTH = THIS_MONTH - timedelta(days=8)
    tree = get_location_tree()
    sms_player = SMSPlayer(manager, SubmissionHandler(manager), location_tree=tree)
    FROM_NUMBER = '1234567890'
    TO_NUMBER = '261333782943'
    transport = TransportInfo(SMS, FROM_NUMBER, TO_NUMBER)

    message1 = "reg +t  clinic +n  Clinic in Analalava  +l  Analalava  +g  -14.6333  47.7667  +d This is a Clinic in Analalava +m 987654321"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Andapa  +l  Andapa  +g  -14.65  49.6167  +d This is a Clinic in Andapa  +m 87654322"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Antalaha  +l  Antalaha  +g  -14.8833  50.25  +d This is a Clinic in Antalaha  +m 87654323"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in ANALAMANGA  +l  ANALAMANGA  +g  -18.8  47.4833  +d This is a Clinic in Antananarivo  +m 87654324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in TSIMANARIRAZANA +l  TSIMANARIRAZANA +g  -12.35  49.3  +d This is a Clinic in Diégo–Suarez +m 87654325"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Antsirabe  +l  Antsirabe  +g  -19.8167  47.0667  +d This is a Clinic in Antsirabe  +m 87654326"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Besalampy  +l  Besalampy  +g  -16.75  44.5  +d This is a Clinic in Besalampy  +m 87654327"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  clinique à Farafangana  +l  Farafangana  +g  -22.8  47.8333  +d This is a Clinic in Farafangana  +m 87654328"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Fianarantsoa I +l  Fianarantsoa I +g  -21.45  47.1 +d  C'est une clinique à Fianarantsoa +m 87654329"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Sainte Marie  +l  Sainte Marie  +g  -17.0833  49.8167  +d This is a Clinic in Île Sainte–Marie  +m 87654330"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "reg +t  clinic +n  Clinic in Mahajanga +l  Mahajanga +g  -15.6667  46.35  +d This is a Clinic in Mahajanga +m 87654331"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker = DateTimeMocker()
    datetime_mocker.set_date_time_now(FEB)
    # Total number of identical records = 3
    message1 = "cli001 +EID cid001 +NA Mr. Tessy +FA 58 +RD 28.02.2011 +BG c +SY ade +GPS 79.2 20.34567"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid002 +NA Mr. Adam +FA 62 +RD 15.02.2011 +BG a +SY ab +GPS 74.2678 23.3567"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA Ms. Beth +FA 75 +RD 09.02.2011 +BG b +SY bc +GPS 18.245 29.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(MARCH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cid004 +NA Jannita +FA 90 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA Aanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid001 +NA Ianda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid001 +NA ànita +FA 45 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid004 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid005 +NA Vanda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA ànnita +FA 80 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid002 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid004 +NA Panda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA ànnita +FA 50 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid003 +NA Jimanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli10 +NA Kanda (",) +FA 64 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid004 +NA ànnita +FA 30 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid005 +NA Qamanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cid001 +NA Huanda (*_*) +FA 74 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(DEC_2010)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli12 +FA 47 +RD 15.12.2010 +BG d +SY ace +GPS -58.3452 19.3345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA De'melo +FA 38 +RD 27.12.2010 +BG c +SY ba +GPS 81.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli13 +NA Dono`mova +FA 24 +RD 06.12.2010 +BG b +SY cd +GPS 65.23452 -28.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA Aàntra +FA 89 +RD 11.12.2010 +BG a +SY bd +GPS 45.234 89.32345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(NOV_2010)
    # Total number of identical records = 3
    message1 = "cli001 +EID cli12 +NA ànnita +FA 90 +RD 07.11.2010 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA ànnita +FA 90 +RD 17.11.2010 +BG b +SY bbe +GPS 45.233 28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cid007 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345'
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(PREV_MONTH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 98 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 37 +RD 05.05.2011 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 02.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 95 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 35 +RD 09.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Demelo +FA 32 +RD 27.05.2011 +BG c +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli10 +NA Zorro +FA 43 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli11 +NA Aàntra +FA 91 +RD 12.05.2011 +BG a +GPS -45.234 89.32345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli12 +NA ànnita +FA 45 +RD 15.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.set_date_time_now(THIS_MONTH)
    # Total number of identical records = 4
    message1 = "cli001 +EID cli13 +NA Dmanda +FA 69 +RD 05.06.2011 +BG c +SY ce +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Vamand +FA 36 +RD 03.06.2011 +BG a +SY ace +GPS 58.3452 115.3345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA M!lo +FA 88 +RD 02.06.2011 +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli16 +NA K!llo +FA 88 +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli13 +NA Dmanda +FA 89 +RD 04.06.2011 +BG c +SY ce +GPS 40.2 69.3123"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli14 +NA Vamand +FA 56 +RD 01.06.2011 +BG a +SY ace +GPS 58.3452 115.3345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli15 +NA M!lo +FA 45 +RD 07.06.2011 +SY ba +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli16 +NA K!llo +FA 28 +GPS 19.672 92.33456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    datetime_mocker.end_mock()

    # Total number of identical records = 3
    message1 = "cli001 +EID cli17 +NA Catty +FA 78 +RD 15.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli18 +NA àntra +FA 28 +RD 12.06.2011 +BG a +SY adb +GPS -45.234 169.32345"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Tinnita +FA 37 +BG d +SY ace +GPS -78.233 -28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))

    message1 = "cli001 +EID cli17 +NA Catty +FA 98 +RD 25.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))
    message1 = "cli001 +EID cli18 +NA àntra +FA 58 +RD 22.06.2011 +BG a +SY adb +GPS -45.234 169.32345"
    response = sms_player.accept(Request(transportInfo=
                                         transport, message=message1))
    message1 = "cli001 +EID cli9 +NA Tinnita +FA 27 +BG d +SY ace +GPS -78.233 -28.3324"
    response = sms_player.accept(Request(transportInfo=transport, message=message1))