Esempio n. 1
0
    def testInsertLocation(self):
        survey_id = connection.execute(survey_table.select().where(
            survey_table.c.survey_title == 'test_title')).first().survey_id
        q_where = question_table.select().where(
            question_table.c.type_constraint_name == 'location')
        question = connection.execute(q_where).first()
        question_id = question.question_id
        tcn = question.type_constraint_name
        seq = question.sequence_number
        mul = question.allow_multiple
        submission_exec = connection.execute(submission_insert(
            submitter='test_submitter', submitter_email='*****@*****.**',
            survey_id=survey_id))
        submission_id = submission_exec.inserted_primary_key[0]
        answer_exec = connection.execute(answer_insert(
            answer={'lon': 90, 'lat': 0},
            answer_metadata={},
            question_id=question_id,
            submission_id=submission_id,
            survey_id=survey_id,
            type_constraint_name=tcn,
            is_type_exception=False,
            sequence_number=seq,
            allow_multiple=mul))
        answer_id = answer_exec.inserted_primary_key[0]
        self.assertIsNotNone(answer_id)
        condition = answer_table.c.answer_id == answer_id
        answer = connection.execute(
            answer_table.select().where(condition)).first()
        location = get_geo_json(connection, answer)['coordinates']
        self.assertEqual(location, [90, 0])

        submission_2_exec = connection.execute(
            submission_insert(submitter='test_submitter',
                              submitter_email='*****@*****.**',
                              survey_id=survey_id))
        submission_2_id = submission_2_exec.inserted_primary_key[0]
        answer_2_exec = connection.execute(answer_insert(
            answer=None, question_id=question_id,
            answer_metadata={},
            submission_id=submission_2_id,
            survey_id=survey_id,
            type_constraint_name=tcn,
            is_type_exception=False,
            sequence_number=seq,
            allow_multiple=mul))
        answer_2_id = answer_2_exec.inserted_primary_key[0]
        condition_2 = answer_table.c.answer_id == answer_2_id
        answer_2 = connection.execute(
            answer_table.select().where(condition_2)).first()
        location_2 = get_geo_json(connection, answer_2)
        self.assertEqual(location_2,
                         {'coordinates': [], 'type': 'MultiPoint'})
Esempio n. 2
0
 def testAnswerInsertNoMetadata(self):
     survey_id = connection.execute(survey_table.select().where(
         survey_table.c.survey_title == 'test_title')).first().survey_id
     q_where = question_table.select().where(
         question_table.c.type_constraint_name == 'integer')
     question = connection.execute(q_where).first()
     question_id = question.question_id
     tcn = question.type_constraint_name
     seq = question.sequence_number
     mul = question.allow_multiple
     submission_exec = connection.execute(
         submission_insert(submitter='test_submitter',
                           submitter_email='*****@*****.**',
                           survey_id=survey_id))
     submission_id = submission_exec.inserted_primary_key[0]
     answer_exec = connection.execute(answer_insert(
         answer=1, question_id=question_id,
         answer_metadata=None,
         submission_id=submission_id,
         survey_id=survey_id,
         type_constraint_name=tcn,
         is_type_exception=False,
         sequence_number=seq,
         allow_multiple=mul))
     answer_id = answer_exec.inserted_primary_key[0]
     self.assertIsNotNone(answer_id)
Esempio n. 3
0
 def testGetAnswersForQuestion(self):
     survey_id = connection.execute(survey_table.select().where(
         survey_table.c.survey_title == 'test_title')).first().survey_id
     q_where = question_table.select().where(
         question_table.c.type_constraint_name == 'integer')
     question = connection.execute(q_where).first()
     question_id = question.question_id
     tcn = question.type_constraint_name
     seq = question.sequence_number
     mul = question.allow_multiple
     submission_exec = connection.execute(
         submission_insert(submitter='test_submitter',
                           submitter_email='*****@*****.**',
                           survey_id=survey_id))
     submission_id = submission_exec.inserted_primary_key[0]
     connection.execute(answer_insert(answer=1, question_id=question_id,
                                      answer_metadata={},
                                      submission_id=submission_id,
                                      survey_id=survey_id,
                                      type_constraint_name=tcn,
                                      is_type_exception=False,
                                      sequence_number=seq,
                                      allow_multiple=mul))
     self.assertEqual(
         get_answers_for_question(connection, question_id).rowcount, 1)
Esempio n. 4
0
 def testInsertFacility(self):
     survey_id = connection.execute(survey_table.select().where(
         survey_table.c.survey_title == 'test_title')).first().survey_id
     q_where = question_table.select().where(
         question_table.c.type_constraint_name == 'facility')
     question = connection.execute(q_where).first()
     question_id = question.question_id
     tcn = question.type_constraint_name
     seq = question.sequence_number
     mul = question.allow_multiple
     submission_exec = connection.execute(
         submission_insert(submitter='test_submitter',
                           submitter_email='*****@*****.**',
                           survey_id=survey_id))
     submission_id = submission_exec.inserted_primary_key[0]
     answer_exec = connection.execute(answer_insert(
         answer={'id': 'revisit ID', 'lon': 90, 'lat': 0},
         answer_metadata={'facility_name': 'cool facility',
                          'facility_sector': 'health'},
         question_id=question_id,
         submission_id=submission_id,
         survey_id=survey_id,
         type_constraint_name=tcn,
         is_type_exception=False,
         sequence_number=seq,
         allow_multiple=mul))
     answer_id = answer_exec.inserted_primary_key[0]
     self.assertIsNotNone(answer_id)
     condition = answer_table.c.answer_id == answer_id
     answer = connection.execute(
         answer_table.select().where(condition)).first()
     location = get_geo_json(connection, answer)['coordinates']
     self.assertEqual(location, [90, 0])
     facility_id = answer.answer_text
     self.assertEqual(facility_id, 'revisit ID')
Esempio n. 5
0
 def testGetSubmissionsWithFilter(self):
     survey_id = connection.execute(survey_table.select().where(
         survey_table.c.survey_title == 'test_title')).first().survey_id
     q_where = question_table.select().where(
         question_table.c.type_constraint_name == 'integer')
     question = connection.execute(q_where).first()
     question_id = question.question_id
     tcn = question.type_constraint_name
     seq = question.sequence_number
     mul = question.allow_multiple
     for i in range(2):
         submission_exec = connection.execute(submission_insert(
             submitter='test_submitter',
             submitter_email='*****@*****.**',
             survey_id=survey_id))
         submission_id = submission_exec.inserted_primary_key[0]
         connection.execute(answer_insert(
             answer=i,
             question_id=question_id,
             submission_id=submission_id,
             answer_metadata={},
             survey_id=survey_id,
             type_constraint_name=tcn,
             is_type_exception=False,
             sequence_number=seq,
             allow_multiple=mul))
     self.assertEqual(
         len(get_submissions_by_email(
             connection,
             'test_email',
             survey_id=survey_id
         ).fetchall()),
         2)
     f_result = get_submissions_by_email(
         connection,
         'test_email',
         survey_id=survey_id,
         filters=[
             {
                 'question_id': question_id,
                 'answer_integer': 1
             }
         ]
     ).fetchall()
     self.assertEqual(len(f_result), 1)
Esempio n. 6
0
def _create_questions(connection: Connection,
                      questions: list,
                      survey_id: str,
                      submission_map: dict=None) -> Iterator:
    """
    Create the questions of a survey. If this is an update to an existing
    survey, it will also copy over answers to the questions.

    :param connection: the SQLAlchemy Connection object for the transaction
    :param questions: a list of dictionaries, each containing the values
                      associated with a question
    :param survey_id: the UUID of the survey
    :param submission_map: a dictionary mapping old submission_id to new
    :return: an iterable of the resultant question fields
    """
    for number, question in enumerate(questions, start=1):
        values = question.copy()
        values['sequence_number'] = number
        values['survey_id'] = survey_id

        existing_q_id = values.pop('question_id', None)

        executable = question_insert(**values)
        tcn = values['type_constraint_name']
        exceptions = [('question_type_constraint_name_fkey',
                       TypeConstraintDoesNotExistError(tcn)),
                      ('minimal_logic',
                       MissingMinimalLogicError(values['logic']))]
        result = execute_with_exceptions(connection, executable, exceptions)
        result_ipk = result.inserted_primary_key
        q_id = result_ipk[0]

        choices = list(_create_choices(connection,
                                       values,
                                       q_id,
                                       submission_map=submission_map,
                                       existing_question_id=existing_q_id))

        if existing_q_id is not None:
            question_fields = {'question_id': q_id,
                               'sequence_number': result_ipk[1],
                               'allow_multiple': result_ipk[2],
                               'type_constraint_name': result_ipk[3],
                               'survey_id': survey_id}
            for answer in get_answers_for_question(connection, existing_q_id):
                new_tcn = result_ipk[3]
                old_tcn = question_select(connection,
                                          existing_q_id).type_constraint_name
                if new_tcn != old_tcn:
                    continue

                answer_values = question_fields.copy()
                answer_values['answer_metadata'] = answer.answer_metadata
                new_submission_id = submission_map[answer.submission_id]

                is_type_exception = _get_is_type_exception(answer)
                answer_values['is_type_exception'] = is_type_exception
                if is_type_exception:
                    answer_values['answer'] = answer.answer_text
                else:
                    answer_values['answer'] = answer['answer_' + new_tcn]

                allow_other = values['logic']['allow_other']
                allow_dont_know = values['logic']['allow_dont_know']
                with_type_exception = allow_other or allow_dont_know

                if new_tcn == 'multiple_choice' and not with_type_exception:
                    continue
                answer_values['submission_id'] = new_submission_id
                connection.execute(answer_insert(**answer_values))

        q_to_seq_number = values['question_to_sequence_number']
        yield {'question_id': q_id,
               'type_constraint_name': tcn,
               'sequence_number': values['sequence_number'],
               'allow_multiple': values['allow_multiple'],
               'choice_ids': choices,
               'question_to_sequence_number': q_to_seq_number}