Пример #1
0
 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 test_edit_survey_response_when_fields_constraints_are_not_satisfied(
            self):
        survey_response = Mock(spec=SurveyResponse)
        with patch(
                'mangrove.transport.services.survey_response_service.by_short_code'
        ) as get_reporter:
            with patch(
                    'mangrove.datastore.entity.by_short_code') as get_entity:
                with patch(
                        'mangrove.transport.services.survey_response_service.get_form_model_by_code'
                ) as get_form_model:
                    get_reporter.return_value = Mock(spec=Entity)
                    get_entity.return_value = Mock(spec=Entity)
                    get_form_model.return_value = self.form_model()
                    transport_info = TransportInfo('web', 'src', 'dest')
                    values = {'form_code': 'aids', 'q1': 'a1', 'q2': '200'}

                    request = Request(values, transport_info)
                    response = self.survey_response_service.edit_survey(
                        'aids', values, [], survey_response)
                    self.assertFalse(response.success)
                    self.assertEquals('aids', response.form_code)
                    self.assertEquals(
                        OrderedDict([(
                            'q2',
                            u'Answer 200 for question q2 is greater than allowed.'
                        )]), response.errors)
                    self.assertEquals(['clinic'], response.entity_type)
                    self.assertEquals(OrderedDict([('q1', 'a1')]),
                                      response.processed_data)
                    self.assertIsNotNone(response.survey_response_id)

                    assert not survey_response.update.called
Пример #3
0
    def test_should_raise_exception_for_poll_questionnaire(self):
        self.loc_tree.get_location_hierarchy.return_value = None
        sms_message = "questionnaire_code question1_answer question2_answer"
        request = Request(transportInfo=self.transport, message=sms_message)
        contact = MagicMock(Contact)
        contact.value.return_value = None
        contact.short_code = "short_code"
        project = MagicMock(spec=Project)
        project.is_poll = True
        self.reporter_module.find_reporter_entity.return_value = contact
        with patch(
                'mangrove.transport.player.new_players.SurveyResponseService'
        ) as SurveyResponseServiceMock:
            with patch('mangrove.form_model.project.get_project_by_code'
                       ) as get_project_by_code:
                with patch(
                        'mangrove.form_model.project.check_if_form_code_is_poll'
                ) as mock_check_if_form_code_is_poll:
                    instance_mock = Mock()
                    SurveyResponseServiceMock.return_value = instance_mock
                    get_project_by_code.return_value = project

                    self.assertRaises(ProjectPollCodeDoesNotExistsException,
                                      self.sms_player.add_survey_response,
                                      request)
    def test_survey_response_is_saved_with_reporter_id_in_upper_case(self):
        test_data = TestData(self.manager)
        survey_response_service = SurveyResponseService(self.manager)

        values = {'ID': test_data.entity1.short_code, 'Q1': 'name', 'Q2': '80', 'Q3': 'a'}
        transport_info = TransportInfo('web', 'src', 'dest')
        request = Request(values, transport_info)
        response = survey_response_service.save_survey('CL1', values, [], transport_info, 'REP2')

        self.assertTrue(response.success)
        self.assertEqual(0, response.errors.__len__())
        self.assertIsNotNone(response.datarecord_id)
        self.assertIsNotNone(response.survey_response_id)
        self.assertEqual(test_data.entity_type, response.entity_type)
        self.assertEqual('CL1', response.form_code)
        self.assertEqual('1', response.short_code)
        self.assertDictEqual(OrderedDict([('Q1', 'name'), ('Q3', ['RED']), ('Q2', 80), ('ID', u'1')]),
                             response.processed_data)

        survey_response = SurveyResponse.get(self.manager, response.survey_response_id)
        self.assertDictEqual({'Q1': 'name', 'Q3': 'a', 'Q2': '80', 'ID': '1'}, survey_response.values)
        self.assertDictEqual({'Q1': 'name', 'Q3': 'a', 'Q2': '80', 'ID': '1'}, survey_response.values)
        self.assertEqual(test_data.form_model.revision, survey_response.form_model_revision)
        self.assertEqual(True, survey_response.status)
        self.assertIsNotNone(survey_response.data_record)
Пример #5
0
    def test_should_call_parser_post_processor_and_continue_for_no_response(
            self):
        self.loc_tree.get_location_hierarchy.return_value = None
        message = 'SOME_FORM_CODE 1'

        post_sms_processor_mock = Mock()
        post_sms_processors = [post_sms_processor_mock]

        sms_player = SMSPlayerV2(self.dbm, post_sms_processors)
        with patch("inspect.getargspec") as get_arg_spec_mock:
            with patch(
                    'mangrove.transport.player.new_players.SurveyResponseService.save_survey'
            ) as save_survey:
                with patch('mangrove.form_model.project.get_project_by_code'
                           ) as get_project_by_code:
                    with patch(
                            'mangrove.form_model.project.check_if_form_code_is_poll'
                    ) as mock_check_if_form_code_is_poll:
                        get_arg_spec_mock.return_value = ([
                            'self', 'form_code', 'submission_values',
                            'extra_elements'
                        ], )

                        sms_player.add_survey_response(
                            Request(message=message,
                                    transportInfo=self.transport))

                        save_survey.assert_called_once('some_form_code',
                                                       {'id': '1'},
                                                       [{
                                                           'name': '1234'
                                                       }], 'sms', message)
                        post_sms_processor_mock.process.assert_called_once_with(
                            'some_form_code', {'id': '1'}, [])
Пример #6
0
    def test_should_save_survey_for_a_reporter_with_no_name(self):
        self.loc_tree.get_location_hierarchy.return_value = None
        sms_message = "questionnaire_code question1_answer question2_answer"
        request = Request(transportInfo=self.transport, message=sms_message)
        contact = MagicMock(Contact)
        contact.value.return_value = None
        contact.short_code = "short_code"

        self.reporter_module.find_reporter_entity.return_value = contact
        with patch(
                'mangrove.transport.player.new_players.SurveyResponseService'
        ) as SurveyResponseServiceMock:
            with patch('mangrove.form_model.project.get_project_by_code'
                       ) as get_project_by_code:
                with patch(
                        'mangrove.form_model.project.check_if_form_code_is_poll'
                ) as mock_check_if_form_code_is_poll:
                    instance_mock = Mock()
                    SurveyResponseServiceMock.return_value = instance_mock

                    self.sms_player.add_survey_response(request)

                    instance_mock.save_survey.assert_called_with(
                        'questionnaire_code', {'id': 'question1_answer'},
                        None,
                        self.transport,
                        "short_code",
                        additional_feed_dictionary=None,
                        translation_processor=None)
Пример #7
0
 def test_should_accept_ordered_sms_message(self):
     self.loc_tree.get_location_hierarchy.return_value = None
     sms_message = "questionnaire_code question1_answer question2_answer"
     request = Request(transportInfo=self.transport, message=sms_message)
     with patch(
             'mangrove.transport.services.survey_response_service.SurveyResponseService.save_survey'
     ) as save_survey:
         with patch('mangrove.form_model.project.get_project_by_code'
                    ) as get_project_by_code:
             with patch(
                     'mangrove.form_model.project.check_if_form_code_is_poll'
             ) as mock_check_if_form_code_is_poll:
                 mock_form_model = Mock(spec=FormModel)
                 get_project_by_code.return_value = []
                 #mock_get_form_model_by_code.return_value = mock_form_model
                 save_survey.return_value = Mock(spec=Response)
                 self.sms_player.add_survey_response(request)
                 save_survey.assert_called_once_with(
                     'questionnaire_code', {'id': 'question1_answer'},
                     [{
                         'name': '1234'
                     }],
                     self.transport,
                     "short_code",
                     additional_feed_dictionary=None,
                     translation_processor=None)
Пример #8
0
 def add_survey_response(self, text, reporter_id='rep12'):
     transport_info = TransportInfo(transport="web",
                                    source="*****@*****.**",
                                    destination="")
     response = self.web_player.add_survey_response(
         Request(message=text, transportInfo=transport_info), reporter_id)
     return response
Пример #9
0
    def test_should_call_parser_post_processor_and_return_if_there_is_response_from_post_processor(
            self):
        parser_mock = Mock(spec=OrderSMSParser)
        parser_mock.parse.return_value = ('FORM_CODE', {'id': '1'}, [])
        parser_mock.parse.return_value = ('FORM_CODE', {'id': '1'}, [])
        post_sms_processor_mock = Mock()
        expected_response = Response(reporters=None, survey_response_id=None)
        post_sms_processor_mock.process.return_value = expected_response
        message = 'FORM_CODE 1'

        sms_player = SMSPlayerV2(
            self.dbm, post_sms_parser_processors=[post_sms_processor_mock])
        with patch("inspect.getargspec") as get_arg_spec_mock:
            with patch('mangrove.form_model.project.get_project_by_code'
                       ) as get_project_by_code:
                with patch(
                        'mangrove.form_model.project.check_if_form_code_is_poll'
                ) as mock_check_if_form_code_is_poll:
                    get_arg_spec_mock.return_value = ([
                        'self', 'form_code', 'submission_values',
                        'extra_elements'
                    ], )
                    response = sms_player.add_survey_response(
                        Request(message=message, transportInfo=self.transport))
                    self.assertEqual(expected_response, response)
Пример #10
0
 def send_sms(self, text, player=None):
     player = player or self.sms_player
     transport_info = TransportInfo(transport="sms",
                                    source=self.phone_number,
                                    destination="5678")
     response = player.accept(
         Request(message=text, transportInfo=transport_info))
     return response
    def test_survey_response_is_edited_and_new_submission_and_datarecord_is_created(
            self):
        test_data = TestData(self.manager)
        survey_response_service = SurveyResponseService(self.manager)

        values = {
            'ID': test_data.entity1.short_code,
            'Q1': 'name',
            'Q2': '80',
            'Q3': 'a'
        }
        transport_info = TransportInfo('web', 'src', 'dest')
        request = Request(values, transport_info)

        saved_response = survey_response_service.save_survey(
            'CL1', values, [], transport_info, "rep2")
        self.assertDictEqual(
            OrderedDict([('Q1', 'name'), ('Q3', ['RED']), ('Q2', 80),
                         ('ID', u'1')]), saved_response.processed_data)

        new_values = {
            'ID': test_data.entity1.short_code,
            'Q1': 'new_name',
            'Q2': '430',
            'Q3': 'b'
        }
        survey_response_to_edit = SurveyResponse.get(
            self.manager, saved_response.survey_response_id)
        edited_response = survey_response_service.edit_survey(
            'CL1', new_values, [], survey_response_to_edit)

        self.assertTrue(edited_response.success)
        self.assertEqual(0, edited_response.errors.__len__())
        self.assertIsNotNone(edited_response.datarecord_id)
        self.assertIsNotNone(edited_response.survey_response_id)
        self.assertEqual(test_data.entity_type, edited_response.entity_type)
        self.assertEqual('CL1', edited_response.form_code)
        self.assertDictEqual(
            OrderedDict([('Q1', 'new_name'), ('Q3', ['YELLOW']), ('Q2', 430),
                         ('ID', u'1')]), edited_response.processed_data)

        self.assertNotEquals(saved_response.datarecord_id,
                             edited_response.datarecord_id)

        old_data_record = DataRecord.get(self.manager,
                                         saved_response.datarecord_id)
        self.assertTrue(old_data_record.voided)
        new_data_record = DataRecord.get(self.manager,
                                         edited_response.datarecord_id)
        self.assertFalse(new_data_record.voided)

        edited_survey_response = SurveyResponse.get(
            self.manager, edited_response.survey_response_id)
        self.assertEquals(1,
                          len(edited_survey_response._doc.data_record_history))
        self.assertEquals(old_data_record.id,
                          edited_survey_response._doc.data_record_history[0])
Пример #12
0
 def test_should_submit_if_parsing_is_successful(self):
     with patch.object(FormSubmissionFactory,
                       'get_form_submission') as get_form_submission_mock:
         get_form_submission_mock.return_value = self.form_submission_mock
         response = self.web_player.accept(
             Request(message=self.message, transportInfo=self.transport))
         self.form_submission_mock.save.assert_called_once_with(self.dbm)
         self.assertEqual('', response.datarecord_id)
         self.assertEqual([''], response.entity_type)
    def test_response_has_no_error_when_feed_creation_fails(self):
        manager = Mock(spec=DatabaseManager)
        feed_manager = Mock(spec=DatabaseManager)
        values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'}
        transport_info = TransportInfo('web', 'src', 'dest')
        request = Request(values, transport_info)

        additional_dictionary = {
            'project': {
                'name': 'someproject',
                'status': 'active',
                'id': 'someid'
            }
        }

        survey_response_service = SurveyResponseService(manager,
                                                        feeds_dbm=feed_manager)

        with patch(
                'mangrove.transport.services.survey_response_service.by_short_code'
        ) as get_reporter:
            with patch(
                    'mangrove.transport.services.survey_response_service.get_form_model_by_code'
            ) as get_form_model_by_code:
                with patch('mangrove.datastore.entity.by_short_code'
                           ) as by_short_code:
                    with patch(
                            'mangrove.transport.services.survey_response_service.DataFormSubmission'
                    ) as data_form_submission:
                        with patch(
                                'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder'
                        ) as builder:
                            get_reporter.return_value = Mock(spec=Entity)
                            builder.feed_document.side_effect = Exception(
                                'Some error')
                            builder.return_value = builder
                            instance_mock = data_form_submission.return_value
                            type(instance_mock).is_valid = PropertyMock(
                                return_value=True)
                            type(instance_mock).data_record_id = PropertyMock(
                                return_value='sdsddsd')
                            type(instance_mock).errors = PropertyMock(
                                return_value='')

                            by_short_code.return_value = Mock(spec=Entity)
                            mock_form_model = MagicMock(spec=FormModel)
                            mock_form_model._dbm = manager
                            mock_form_model._doc = MagicMock()
                            mock_form_model._data = {}
                            mock_form_model.validate_submission.return_value = values, ""
                            get_form_model_by_code.return_value = mock_form_model
                            response = survey_response_service.save_survey(
                                'CL1', values, [], transport_info, '',
                                additional_dictionary)
                            self.assertFalse(response.errors)
                            self.assertTrue(response.feed_error_message)
 def test_exception_is_raised_for_invalid_short_code_submissions(self):
     survey_response_service = SurveyResponseService(self.manager)
     with patch(
             'mangrove.transport.services.survey_response_service.get_active_form_model') as mock_get_active_form_model:
         mock_get_active_form_model.side_effect = FormModelDoesNotExistsException("form_code")
         values = {'ID': "invalid", 'Q1': 'name', 'Q2': '80', 'Q3': 'a'}
         transport_info = TransportInfo('web', 'src', 'dest')
         request = Request(values, transport_info)
         self.assertRaises(MangroveException, survey_response_service.save_survey, 'CL1', values, [], transport_info,
                           '')
Пример #15
0
 def setUp(self):
     super(TestXformPlayerIT, self).setUp()
     self.org_id = 'SLX364903'
     self.player = XFormPlayerV2(self.manager)
     message = self.xform_message
     self.transport = TransportInfo(transport="xform",
                                    source="*****@*****.**",
                                    destination="5678")
     self.request = Request(message=message, transportInfo=self.transport)
     TestData(self.manager)
     register_datasender(self.manager)
    def test_survey_response_event_created_when_survey_response_created(self):
        manager = Mock(spec=DatabaseManager)
        feed_manager = Mock(spec=DatabaseManager)
        survey_response_service = SurveyResponseService(manager,
                                                        feeds_dbm=feed_manager)

        values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'}
        transport_info = TransportInfo('web', 'src', 'dest')
        request = Request(values, transport_info)

        additional_dictionary = {
            'project': {
                'name': 'someproject',
                'status': 'active',
                'id': 'someid'
            }
        }
        with patch(
                'mangrove.transport.services.survey_response_service.by_short_code'
        ) as get_reporter:
            with patch(
                    'mangrove.transport.services.survey_response_service.get_form_model_by_code'
            ) as get_form_model_by_code:
                with patch('mangrove.datastore.entity.by_short_code'
                           ) as by_short_code:
                    with patch(
                            'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder'
                    ) as builder:
                        with patch(
                                "mangrove.form_model.form_submission.DataRecordDocument"
                        ) as DataRecordDocumentMock:
                            get_reporter.return_value = Mock(spec=Entity)
                            builder.return_value = Mock(
                                spec=EnrichedSurveyResponseBuilder)
                            entity_mock = MagicMock(spec=Entity)
                            entity_mock._doc = EntityDocument()
                            by_short_code.return_value = entity_mock
                            mock_form_model = MagicMock(spec=FormModel)
                            mock_form_model._dbm = manager
                            mock_form_model._doc = MagicMock()
                            mock_form_model._data = {}
                            mock_form_model.validate_submission.return_value = OrderedDict(
                                values), OrderedDict('')
                            mock_form_model.is_entity_registration_form.return_value = False
                            mock_form_model.entity_questions = []
                            mock_form_model.entity_type = 'sometype'
                            get_form_model_by_code.return_value = mock_form_model
                            survey_response_service.save_survey(
                                'CL1', values, [], transport_info, '',
                                additional_dictionary)
                            self.assertEquals(
                                1, feed_manager._save_document.call_count)
Пример #17
0
def submission(request):
    if request.method != 'POST':
        response = HttpResponse(status=204)
        response['Location'] = request.build_absolute_uri()
        return response

    send_to_carbon(create_path('submissions.smartphone'), 1)
    request_user = request.user
    submission_file = request.FILES.get("xml_submission_file").read()
    manager = get_database_manager(request_user)

    if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \
            or is_quota_reached(request):
        response = HttpResponse(status=403)
        return response

    player = XFormPlayerV2(manager, get_feeds_database(request_user))
    try:
        user_profile = NGOUserProfile.objects.get(user=request_user)
        mangrove_request = Request(
            message=submission_file,
            transportInfo=TransportInfo(transport=SMART_PHONE,
                                        source=request_user.email,
                                        destination=''),
            media=request.FILES if len(request.FILES) > 1 else [])

        response = player.add_survey_response(mangrove_request,
                                              user_profile.reporter_id,
                                              logger=sp_submission_logger)
        mail_feed_errors(response, manager.database_name)
        if response.errors:
            logger.error("Error in submission : \n%s" %
                         get_errors(response.errors))
            return HttpResponseBadRequest()

    except MediaAttachmentNotFoundException as me:
        _send_media_error_mail(request, request_user, user_profile, me.message)
        return HttpResponseBadRequest()

    except Exception as e:
        logger.exception("Exception in submission : \n%s" % e)
        return HttpResponseBadRequest()

    organization = Organization.objects.get(org_id=user_profile.org_id)
    organization.increment_message_count_for(incoming_sp_count=1)

    check_quotas_and_update_users(organization)
    response = HttpResponse(status=201)
    response['Location'] = request.build_absolute_uri(request.path)
    return response
Пример #18
0
    def test_should_not_parse_if_two_question_codes(self):
        transport = TransportInfo(transport="sms",
                                  source="1234",
                                  destination="5678")
        with patch('mangrove.form_model.project.get_project_by_code'
                   ) as get_project_by_code:
            with patch('mangrove.form_model.project.check_if_form_code_is_poll'
                       ) as mock_check_if_form_code_is_poll:
                with self.assertRaises(
                        MultipleSubmissionsForSameCodeException):
                    self.sms_player.add_survey_response(
                        Request(message="cli001 .na tester1 .na tester2",
                                transportInfo=transport))

                    self.assertEqual(
                        0, self.form_model_mock.validate_submission.call_count)
Пример #19
0
    def test_should_allow_submission_by_unregistered_reporter_for_open_datasender_questionnaire(
            self):
        self.reporter_module.find_reporter_entity.side_effect = NumberNotRegisteredException(
            "1234")
        self.form_model_mock.is_open_survey = True
        entity_question_field = Mock()
        entity_question_field.code = 'q1'
        self.form_model_mock.entity_questions = [entity_question_field]
        with patch('mangrove.form_model.project.get_project_by_code'
                   ) as get_project_by_code:
            with patch('mangrove.form_model.project.check_if_form_code_is_poll'
                       ) as mock_check_if_form_code_is_poll:
                response = self.sms_player.add_survey_response(
                    Request(message=self.message,
                            transportInfo=self.transport))

                self.assertEqual(response.errors, {})
                self.assertTrue(response.success)
    def test_feeds_created_if_subject_not_found_for_a_submission(self):
        manager = Mock(spec=DatabaseManager)
        feed_manager = Mock(spec=DatabaseManager)
        project = Mock(spec=Project)
        values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'}
        transport_info = TransportInfo('web', 'src', 'dest')
        request = Request(values, transport_info)

        additional_dictionary = {'project': {'name': 'someproject', 'status': 'active', 'id': 'someid'}}

        survey_response_service = SurveyResponseService(manager, feeds_dbm=feed_manager)

        with patch('mangrove.transport.services.survey_response_service.by_short_code') as get_reporter:
            with patch(
                    'mangrove.transport.services.survey_response_service.get_form_model_by_code') as get_form_model_by_code:
                with patch('mangrove.datastore.entity.by_short_code') as by_short_code:
                    with patch(
                            'mangrove.transport.services.survey_response_service.DataFormSubmission') as data_form_submission:
                        with patch(
                                'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder')as builder:
                            with patch('mangrove.transport.services.survey_response_service.Project.from_form_model') as from_form_model:
                                get_reporter.return_value = Mock(spec=Entity)
                                builder.return_value = Mock(spec=EnrichedSurveyResponseBuilder)
                                instance_mock = data_form_submission.return_value
                                type(instance_mock).is_valid = PropertyMock(return_value=True)
                                type(instance_mock).data_record_id = PropertyMock(return_value='sdsddsd')
                                instance_mock.save.side_effect = MangroveException("subject not found")
                                from_form_model.return_value = project
                                project.data_senders = []

                                by_short_code.return_value = Mock(spec=Entity)
                                mock_form_model = MagicMock(spec=FormModel)
                                mock_form_model._dbm = manager
                                mock_form_model._doc = MagicMock()
                                mock_form_model._data = {}
                                mock_form_model.validate_submission.return_value = values, ""
                                get_form_model_by_code.return_value = mock_form_model

                                try:
                                    survey_response_service.save_survey('CL1', values, [], transport_info, '',
                                                                        additional_dictionary)
                                    self.fail('the subject not found exception should be propagated')
                                except MangroveException:
                                    feed_manager._save_document.assert_called_once()
Пример #21
0
def submission(request):
    if request.method != 'POST':
        response = HttpResponse(status=204)
        response['Location'] = request.build_absolute_uri()
        return response

    send_to_carbon(create_path('submissions.smartphone'), 1)
    request_user = request.user
    submission_file = request.FILES.get("xml_submission_file").read()
    manager = get_database_manager(request_user)

    if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \
            or is_quota_reached(request):
        response = HttpResponse(status=403)
        return response

    player = XFormPlayerV2(manager, get_feeds_database(request_user))
    try:
        user_profile = NGOUserProfile.objects.get(user=request_user)
        mangrove_request = Request(
            message=submission_file,
            transportInfo=TransportInfo(transport=SMART_PHONE,
                                        source=request_user.email,
                                        destination=''),
            media=request.FILES if len(request.FILES) > 1 else [])
        form_code, values = XFormParser(manager).parse(
            mangrove_request.message)
        form_model = get_form_model_by_code(manager, form_code)

        if isinstance(
                form_model,
                EntityFormModel) and form_model.is_entity_registration_form:
            location_tree = LocationBridge(
                get_location_tree(), get_loc_hierarchy=get_location_hierarchy)
            response = player.add_subject(form_model, values, location_tree)
        else:
            response = player.add_survey_response(mangrove_request,
                                                  user_profile.reporter_id,
                                                  logger=sp_submission_logger)

        mail_feed_errors(response, manager.database_name)
        if response.errors:
            logger.error("Error in submission : \n%s" %
                         get_errors(response.errors))
            return HttpResponseBadRequest()

    except MediaAttachmentNotFoundException as me:
        _send_media_error_mail(request, request_user, user_profile, me.message)
        return HttpResponseBadRequest()

    except DataObjectAlreadyExists as doe:
        send_email_for_duplicate_unique_id_registration(
            request, doe.data[2], doe.data[1])
        return HttpResponseBadRequest()

    except Exception as e:
        logger.exception("Exception in submission : \n%s" % e)
        return HttpResponseBadRequest()

    organization = Organization.objects.get(org_id=user_profile.org_id)
    organization.increment_message_count_for(incoming_sp_count=1)

    check_quotas_and_update_users(organization)
    response = HttpResponse(status=201)
    response['Location'] = request.build_absolute_uri(request.path)
    return response
Пример #22
0
 def test_should_throw_error_if_transportInfo_is_none(self):
     with self.assertRaises(AssertionError):
         Request(transportInfo=None, message="")
Пример #23
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
Пример #24
0
 def test_should_throw_error_if_message_is_none(self):
     with self.assertRaises(AssertionError):
         transport = TransportInfo(transport="", source="", destination="")
         Request(transportInfo=transport, message=None)
Пример #25
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)
Пример #26
0
def create_request(questionnaire_form, username, is_update=None):
    return Request(message=questionnaire_form.cleaned_data,
                   transportInfo=get_web_transport_info(username),
                   is_update=is_update,
                   media=[])
Пример #27
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