Ejemplo n.º 1
0
def _handle_uploaded_file(file_name, file, manager):
    base_name, extension = os.path.splitext(file_name)
    if extension == '.csv':
        csv_player = CsvPlayer(dbm=manager,
                               submission_handler=SubmissionHandler(manager),
                               parser=CsvParser())
        response = csv_player.accept(file)
    elif extension == '.xls':
        xls_player = XlsPlayer(dbm=manager,
                               submission_handler=SubmissionHandler(manager),
                               parser=XlsParser())
        response = xls_player.accept(file)
    else:
        raise InvalidFileFormatException()
    return response
Ejemplo n.º 2
0
def _validate_post_data(dbm, request):
    form = ReporterRegistrationForm(request.POST)
    message = None
    success = False
    form_errors = []
    form_errors.extend(form.non_field_errors())
    if form.is_valid():
        form_errors = []
        form_data = {
            k: v
            for (k, v) in form.cleaned_data.items() if not is_empty(v)
        }
        try:
            entered_telephone_number = form_data.get("telephone_number")
            tel_number = _get_telephone_number(entered_telephone_number)
            if not helper.unique(dbm, tel_number):
                raise MultipleReportersForANumberException(
                    entered_telephone_number)

            web_player = WebPlayer(dbm, SubmissionHandler(dbm))
            response = web_player.accept(
                Request(message=_get_data(form_data),
                        transportInfo=TransportInfo(transport='web',
                                                    source='web',
                                                    destination='mangrove')))
            message = get_success_msg_for_registration_using(response, "web")
            success = True
        except MangroveException as exception:
            form_errors.append(exception.message)
            success = False
    return form, form_errors, message, success
Ejemplo n.º 3
0
def submit(request):
    dbm = get_database_manager(request)
    post = _get_submission(request.POST)
    success = True
    try:
        web_player = WebPlayer(dbm, SubmissionHandler(dbm))
        message = {
            k: v
            for (k, v) in post.get('message').items() if not is_empty(v)
        }
        if message.get(LOCATION_TYPE_FIELD_CODE) is not None:
            message[LOCATION_TYPE_FIELD_CODE] += COUNTRY
        request = Request(message=message,
                          transportInfo=TransportInfo(
                              transport=post.get('transport'),
                              source=post.get('source'),
                              destination=post.get('destination')))
        response = web_player.accept(request)
        if response.success:
            message = get_success_msg_for_registration_using(response, "web")
        else:
            message = get_submission_error_message_for(response.errors)
        entity_id = response.datarecord_id
    except MangroveException as exception:
        message = get_exception_message_for(exception=exception, channel="web")
        success = False
        entity_id = None
    return HttpResponse(
        json.dumps({
            'success': success,
            'message': message,
            'entity_id': entity_id
        }))
Ejemplo n.º 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)
Ejemplo n.º 5
0
    def setUp(self):
        self.FORM_CODE = "QR1"
        self.VALUES = {"EID": "100", "Q1": "20"}

        self.dbm = Mock(spec=DatabaseManager)
        self.form_model_patcher = patch(
            'mangrove.transport.submissions.get_form_model_by_code')
        self.form_submission_entity_patcher = patch(
            'mangrove.form_model.form_model.entity')
        self.SubmissionLogger_class_patcher = patch(
            'mangrove.transport.submissions.SubmissionLogger', )

        self.get_form_model_mock = self.form_model_patcher.start()
        self.form_submission_entity_module = self.form_submission_entity_patcher.start(
        )
        self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start(
        )
        self.submissionLogger = Mock(spec=SubmissionLogger)
        self.SubmissionLogger_mock_class.return_value = self.submissionLogger
        self.SUBMISSION_ID = "SUBMISSION_ID"
        self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID

        self.form_model_mock = Mock(spec=FormModel)
        self.form_model_mock.is_registration_form.return_value = False
        self.form_model_mock.entity_defaults_to_reporter.return_value = False
        self.form_model_mock.is_inactive.return_value = False
        self.form_model_mock.is_in_test_mode.return_value = False
        self.ENTITY_TYPE = ["entity_type"]
        self.form_model_mock.entity_type = self.ENTITY_TYPE
        entity_question = Mock()
        entity_question.code = "eid"
        self.form_model_mock.entity_question = entity_question
        self.get_form_model_mock.return_value = self.form_model_mock
        self.sms = Channel.SMS

        reporter = Mock(spec=Entity)
        reporter.short_code.return_value = "REP1"
        self.submission_request = SubmissionRequest(form_code=self.FORM_CODE,
                                                    submission=self.VALUES,
                                                    transport=self.sms,
                                                    source="1234",
                                                    destination="5678",
                                                    reporter=reporter)
        self.submission_handler = SubmissionHandler(self.dbm)
Ejemplo n.º 6
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)
Ejemplo n.º 7
0
    def setUp(self):
        self.FORM_CODE = "QR1"
        self.VALUES = {"EID": "100", "Q1": "20"}

        self.dbm = Mock(spec=DatabaseManager)
        self.form_model_patcher = patch('mangrove.transport.submissions.get_form_model_by_code')
        self.form_submission_entity_patcher = patch('mangrove.form_model.form_model.entity')
        self.SubmissionLogger_class_patcher = patch('mangrove.transport.submissions.SubmissionLogger', )

        self.get_form_model_mock = self.form_model_patcher.start()
        self.form_submission_entity_module = self.form_submission_entity_patcher.start()
        self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start()
        self.submissionLogger = Mock(spec=SubmissionLogger)
        self.SubmissionLogger_mock_class.return_value = self.submissionLogger
        self.SUBMISSION_ID = "SUBMISSION_ID"
        self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID

        self.form_model_mock = Mock(spec=FormModel)
        self.form_model_mock.is_registration_form.return_value = False
        self.form_model_mock.entity_defaults_to_reporter.return_value = False
        self.form_model_mock.is_inactive.return_value = False
        self.form_model_mock.is_in_test_mode.return_value = False
        self.ENTITY_TYPE = ["entity_type"]
        self.form_model_mock.entity_type = self.ENTITY_TYPE
        entity_question = Mock()
        entity_question.code = "eid"
        self.form_model_mock.entity_question = entity_question
        self.get_form_model_mock.return_value = self.form_model_mock
        self.sms = Channel.SMS

        reporter = Mock(spec=Entity)
        reporter.short_code.return_value = "REP1"
        self.submission_request = SubmissionRequest(form_code=self.FORM_CODE, submission=self.VALUES,
                                                    transport=self.sms
                                                    , source="1234", destination="5678", reporter=reporter)
        self.submission_handler = SubmissionHandler(self.dbm)
Ejemplo n.º 8
0
class TestSubmissions(TestCase):
    def setUp(self):
        self.FORM_CODE = "QR1"
        self.VALUES = {"EID": "100", "Q1": "20"}

        self.dbm = Mock(spec=DatabaseManager)
        self.form_model_patcher = patch(
            'mangrove.transport.submissions.get_form_model_by_code')
        self.form_submission_entity_patcher = patch(
            'mangrove.form_model.form_model.entity')
        self.SubmissionLogger_class_patcher = patch(
            'mangrove.transport.submissions.SubmissionLogger', )

        self.get_form_model_mock = self.form_model_patcher.start()
        self.form_submission_entity_module = self.form_submission_entity_patcher.start(
        )
        self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start(
        )
        self.submissionLogger = Mock(spec=SubmissionLogger)
        self.SubmissionLogger_mock_class.return_value = self.submissionLogger
        self.SUBMISSION_ID = "SUBMISSION_ID"
        self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID

        self.form_model_mock = Mock(spec=FormModel)
        self.form_model_mock.is_registration_form.return_value = False
        self.form_model_mock.entity_defaults_to_reporter.return_value = False
        self.form_model_mock.is_inactive.return_value = False
        self.form_model_mock.is_in_test_mode.return_value = False
        self.ENTITY_TYPE = ["entity_type"]
        self.form_model_mock.entity_type = self.ENTITY_TYPE
        entity_question = Mock()
        entity_question.code = "eid"
        self.form_model_mock.entity_question = entity_question
        self.get_form_model_mock.return_value = self.form_model_mock
        self.sms = Channel.SMS

        reporter = Mock(spec=Entity)
        reporter.short_code.return_value = "REP1"
        self.submission_request = SubmissionRequest(form_code=self.FORM_CODE,
                                                    submission=self.VALUES,
                                                    transport=self.sms,
                                                    source="1234",
                                                    destination="5678",
                                                    reporter=reporter)
        self.submission_handler = SubmissionHandler(self.dbm)

    def tearDown(self):
        self.form_model_patcher.stop()
        self.form_submission_entity_patcher.stop()

    def _valid_form_submission(self):
        return FormSubmission(self.form_model_mock, {
            'eid': 'CID001',
            "location": "Pune"
        })

    def _valid_form_submission_unicode(self):
        return FormSubmission(self.form_model_mock, {
            'eid': u'Āgra',
            "location": "Agra"
        })

    def _invalid_form_submission_unicode(self):
        return FormSubmission(self.form_model_mock, {}, {"field": u"Āgra"})

    def _valid_form_submission_with_choices(self):
        return FormSubmission(self.form_model_mock, {
            'eid': 'CID001',
            "location": "Pune",
            "favourite_colour": ['red']
        })

    def _empty_form_submission(self):
        return FormSubmission(self.form_model_mock, {'eid': 'CID001'})

    def _invalid_form_submission(self):
        return FormSubmission(self.form_model_mock, {}, {"field": "Invalid"})

    def test_should_return_true_if_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission(
        )

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)
        self.assertFalse(response.is_registration)

    def test_should_save_data_record_if_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission(
        )

        self.submission_handler.accept(self.submission_request)

        self.assertTrue(
            self.form_submission_entity_module.get_by_short_code.called)

    def test_should_not_save_data_record_if_in_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._invalid_form_submission(
        )

        response = self.submission_handler.accept(self.submission_request)

        self.assertEqual({"field": "Invalid"}, response.errors)
        self.assertFalse(response.success)
        self.assertFalse(response.is_registration)

    def test_should_not_save_data_record_if_no_valid_questions_present(self):
        self.form_model_mock.validate_submission.side_effect = NoQuestionsSubmittedException(
        )
        with self.assertRaises(NoQuestionsSubmittedException):
            self.submission_handler.accept(self.submission_request)

    def test_should_create_new_submission_log(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.submission_handler.accept(self.submission_request)

        self.assertTrue(self.submissionLogger.create_submission_log.called)

    def test_should_update_submission_log_on_success(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(
            submission_id=self.SUBMISSION_ID,
            status=True,
            errors=None,
            data_record_id=response.datarecord_id,
            in_test_mode=False)

    def test_should_update_submission_log_on_failure(self):
        form_submission = self._invalid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(
            submission_id=self.SUBMISSION_ID,
            status=False,
            data_record_id=None,
            errors=form_submission.errors,
            in_test_mode=False)

    def test_should_fail_submission_if_invalid_form_code(self):
        self.get_form_model_mock.side_effect = FormModelDoesNotExistsException(
            "INVALID_CODE")

        with self.assertRaises(FormModelDoesNotExistsException):
            self.submission_handler.accept(self.submission_request)

    def test_should_fail_submission_if_invalid_short_code(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.form_submission_entity_module.get_by_short_code.side_effect = DataObjectNotFound(
            "Entity", 'id', 'short_code')

        with self.assertRaises(DataObjectNotFound):
            self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(
            submission_id=self.SUBMISSION_ID,
            status=False,
            errors=u'Entity with id = short_code not found.',
            in_test_mode=False)

    def test_should_register_entity_if_form_submission_valid(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission(
        )
        self.form_model_mock.is_registration_form.return_value = True

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)
        self.assertEqual("cid001", response.short_code)
        self.assertTrue(response.is_registration)
        self.form_submission_entity_module.create_entity.assert_called_once_with(
            dbm=self.dbm,
            entity_type=self.ENTITY_TYPE,
            location=None,
            short_code="cid001",
            geometry=None)
        self.submissionLogger.update_submission_log.assert_called_once_with(
            submission_id=self.SUBMISSION_ID,
            status=True,
            errors=None,
            data_record_id=response.datarecord_id,
            in_test_mode=False)

    def test_should_not_register_entity_if_form_submission_invalid(self):
        form_submission = self._invalid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission
        self.form_model_mock.is_registration_form.return_value = True

        response = self.submission_handler.accept(self.submission_request)

        self.assertFalse(response.success)
        self.assertEqual({"field": "Invalid"}, response.errors)
        self.assertTrue(response.is_registration)
        self.assertFalse(
            self.form_submission_entity_module.create_entity.called)
        self.submissionLogger.update_submission_log.assert_called_once_with(
            submission_id=self.SUBMISSION_ID,
            status=False,
            data_record_id=None,
            errors=form_submission.errors,
            in_test_mode=False)

    def test_should_return_expanded_response(self):
        form_submission = self._valid_form_submission_with_choices()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        expected_message = form_submission.cleaned_data
        self.assertEquals(expected_message, response.processed_data)

    def test_should_accept_unicodes_for_valid_submission(self):
        form_submission = self._valid_form_submission_unicode()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)

    def test_should_accept_unicodes_for_invalid_submission(self):
        form_submission = self._invalid_form_submission_unicode()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertFalse(response.success)
        self.assertEqual({'field': u'Āgra'}, response.errors)

    def test_should_raise_inactive_form_model_exception(self):
        self.form_model_mock.is_inactive.return_value = True
        with self.assertRaises(InactiveFormModelException):
            self.submission_handler.accept(self.submission_request)

    def test_should_log_submissions_in_test_mode(self):
        self.form_model_mock.is_in_test_mode.return_value = True
        self.form_model_mock.is_inactive.return_value = False
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertIsNotNone(response.submission_id)

    def test_should_convert_mobile_number_to_string(self):
        actual_value = self.submission_handler._get_telephone_number(
            u'2.66123321435e+11')
        expected_value = unicode(266123321435)
        self.assertEqual(expected_value, actual_value)

        actual_value = self.submission_handler._get_telephone_number(
            u'266123321')
        expected_value = u'266123321'
        self.assertEqual(expected_value, actual_value)

    def test_should_strip_non_numbers_from_mobile_number(self):
        actual_value = self.submission_handler._get_telephone_number(
            u'26554-2123')
        expected_value = u'265542123'
        self.assertEqual(expected_value, actual_value)
Ejemplo n.º 9
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())
Ejemplo n.º 10
0
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))
Ejemplo n.º 11
0
class TestSubmissions(TestCase):
    def setUp(self):
        self.FORM_CODE = "QR1"
        self.VALUES = {"EID": "100", "Q1": "20"}

        self.dbm = Mock(spec=DatabaseManager)
        self.form_model_patcher = patch('mangrove.transport.submissions.get_form_model_by_code')
        self.form_submission_entity_patcher = patch('mangrove.form_model.form_model.entity')
        self.SubmissionLogger_class_patcher = patch('mangrove.transport.submissions.SubmissionLogger', )

        self.get_form_model_mock = self.form_model_patcher.start()
        self.form_submission_entity_module = self.form_submission_entity_patcher.start()
        self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start()
        self.submissionLogger = Mock(spec=SubmissionLogger)
        self.SubmissionLogger_mock_class.return_value = self.submissionLogger
        self.SUBMISSION_ID = "SUBMISSION_ID"
        self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID

        self.form_model_mock = Mock(spec=FormModel)
        self.form_model_mock.is_registration_form.return_value = False
        self.form_model_mock.entity_defaults_to_reporter.return_value = False
        self.form_model_mock.is_inactive.return_value = False
        self.form_model_mock.is_in_test_mode.return_value = False
        self.ENTITY_TYPE = ["entity_type"]
        self.form_model_mock.entity_type = self.ENTITY_TYPE
        entity_question = Mock()
        entity_question.code = "eid"
        self.form_model_mock.entity_question = entity_question
        self.get_form_model_mock.return_value = self.form_model_mock
        self.sms = Channel.SMS

        reporter = Mock(spec=Entity)
        reporter.short_code.return_value = "REP1"
        self.submission_request = SubmissionRequest(form_code=self.FORM_CODE, submission=self.VALUES,
                                                    transport=self.sms
                                                    , source="1234", destination="5678", reporter=reporter)
        self.submission_handler = SubmissionHandler(self.dbm)

    def tearDown(self):
        self.form_model_patcher.stop()
        self.form_submission_entity_patcher.stop()

    def _valid_form_submission(self):
        return FormSubmission(self.form_model_mock, {'eid': 'CID001', "location": "Pune"})

    def _valid_form_submission_unicode(self):
        return FormSubmission(self.form_model_mock, {'eid': u'Āgra', "location": "Agra"})

    def _invalid_form_submission_unicode(self):
        return FormSubmission(self.form_model_mock, {}, {"field": u"Āgra"})


    def _valid_form_submission_with_choices(self):
        return FormSubmission(self.form_model_mock,
                {'eid': 'CID001', "location": "Pune", "favourite_colour": ['red']})

    def _empty_form_submission(self):
        return FormSubmission(self.form_model_mock, {'eid': 'CID001'})


    def _invalid_form_submission(self):
        return FormSubmission(self.form_model_mock, {}, {"field": "Invalid"})

    def test_should_return_true_if_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission()

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)
        self.assertFalse(response.is_registration)



    def test_should_save_data_record_if_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission()

        self.submission_handler.accept(self.submission_request)

        self.assertTrue(self.form_submission_entity_module.get_by_short_code.called)



    def test_should_not_save_data_record_if_in_valid_form_submission(self):
        self.form_model_mock.validate_submission.return_value = self._invalid_form_submission()

        response = self.submission_handler.accept(self.submission_request)

        self.assertEqual({"field": "Invalid"}, response.errors)
        self.assertFalse(response.success)
        self.assertFalse(response.is_registration)

    def test_should_not_save_data_record_if_no_valid_questions_present(self):
        self.form_model_mock.validate_submission.side_effect = NoQuestionsSubmittedException()
        with self.assertRaises(NoQuestionsSubmittedException):
            self.submission_handler.accept(self.submission_request)


    def test_should_create_new_submission_log(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.submission_handler.accept(self.submission_request)

        self.assertTrue(self.submissionLogger.create_submission_log.called)


    def test_should_update_submission_log_on_success(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID,
                                                                            status=True, errors=None,
                                                                            data_record_id=response.datarecord_id,
                                                                            in_test_mode=False)


    def test_should_update_submission_log_on_failure(self):
        form_submission = self._invalid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID,
                                                                            status=False,
                                                                            data_record_id=None,
                                                                            errors=form_submission.errors,
                                                                            in_test_mode=False)

    def test_should_fail_submission_if_invalid_form_code(self):
        self.get_form_model_mock.side_effect = FormModelDoesNotExistsException("INVALID_CODE")

        with self.assertRaises(FormModelDoesNotExistsException):
            self.submission_handler.accept(self.submission_request)

    def test_should_fail_submission_if_invalid_short_code(self):
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        self.form_submission_entity_module.get_by_short_code.side_effect = DataObjectNotFound("Entity", 'id',
                                                                                              'short_code')

        with self.assertRaises(DataObjectNotFound):
            self.submission_handler.accept(self.submission_request)

        self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID,
                                                                            status=False,
                                                                            errors=u'Entity with id = short_code not found.'
                                                                            ,
                                                                            in_test_mode=False)


    def test_should_register_entity_if_form_submission_valid(self):
        self.form_model_mock.validate_submission.return_value = self._valid_form_submission()
        self.form_model_mock.is_registration_form.return_value = True

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)
        self.assertEqual("cid001", response.short_code)
        self.assertTrue(response.is_registration)
        self.form_submission_entity_module.create_entity.assert_called_once_with(dbm=self.dbm, entity_type=self
        .ENTITY_TYPE,
                                                                                 location=None,
                                                                                 short_code="cid001", geometry=None)
        self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID,
                                                                            status=True, errors=None,
                                                                            data_record_id=response.datarecord_id,
                                                                            in_test_mode=False)


    def test_should_not_register_entity_if_form_submission_invalid(self):
        form_submission = self._invalid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission
        self.form_model_mock.is_registration_form.return_value = True

        response = self.submission_handler.accept(self.submission_request)

        self.assertFalse(response.success)
        self.assertEqual({"field": "Invalid"}, response.errors)
        self.assertTrue(response.is_registration)
        self.assertFalse(self.form_submission_entity_module.create_entity.called)
        self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID,
                                                                            status=False,
                                                                            data_record_id=None,
                                                                            errors=form_submission.errors,
                                                                            in_test_mode=False)

    def test_should_return_expanded_response(self):
        form_submission = self._valid_form_submission_with_choices()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        expected_message = form_submission.cleaned_data
        self.assertEquals(expected_message, response.processed_data)

    def test_should_accept_unicodes_for_valid_submission(self):
        form_submission = self._valid_form_submission_unicode()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertEqual({}, response.errors)

    def test_should_accept_unicodes_for_invalid_submission(self):
        form_submission = self._invalid_form_submission_unicode()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertFalse(response.success)
        self.assertEqual({'field': u'Āgra'}, response.errors)

    def test_should_raise_inactive_form_model_exception(self):
        self.form_model_mock.is_inactive.return_value = True
        with self.assertRaises(InactiveFormModelException):
            self.submission_handler.accept(self.submission_request)


    def test_should_log_submissions_in_test_mode(self):
        self.form_model_mock.is_in_test_mode.return_value = True
        self.form_model_mock.is_inactive.return_value = False
        form_submission = self._valid_form_submission()
        self.form_model_mock.validate_submission.return_value = form_submission

        response = self.submission_handler.accept(self.submission_request)

        self.assertTrue(response.success)
        self.assertIsNotNone(response.datarecord_id)
        self.assertIsNotNone(response.submission_id)

    def test_should_convert_mobile_number_to_string(self):
        actual_value = self.submission_handler._get_telephone_number(u'2.66123321435e+11')
        expected_value = unicode(266123321435)
        self.assertEqual(expected_value, actual_value)

        actual_value = self.submission_handler._get_telephone_number(u'266123321')
        expected_value = u'266123321'
        self.assertEqual(expected_value, actual_value)



    def test_should_strip_non_numbers_from_mobile_number(self):
        actual_value = self.submission_handler._get_telephone_number(u'26554-2123')
        expected_value = u'265542123'
        self.assertEqual(expected_value, actual_value)