Beispiel #1
0
    def testGetSubmissionsByEmail(self):
        survey_id = connection.execute(survey_table.select().where(
            survey_table.c.survey_title == 'test_title')).first().survey_id
        for i in range(2):
            connection.execute(submission_insert(
                submitter='test_submitter{}'.format(i),
                submitter_email='*****@*****.**', survey_id=survey_id))

        submissions = get_submissions_by_email(
            connection, 'test_email', survey_id=survey_id
        )
        self.assertEqual(submissions.rowcount, 2)

        submissions = get_submissions_by_email(
            connection,
            'test_email',
            survey_id=survey_id,
            submitters=['test_submitter1']
        )
        self.assertEqual(submissions.rowcount, 1)

        submissions = get_submissions_by_email(
            connection,
            'test_email',
            survey_id=survey_id,
            order_by='submitter', direction='desc'
        )
        self.assertEqual(
            submissions.first()['submitter'],
            'test_submitter1'
        )
Beispiel #2
0
def _copy_submission_entries(connection: Connection,
                             existing_survey_id: str,
                             new_survey_id: str,
                             email: str) -> tuple:
    """
    Copy submissions from an existing survey to its updated copy.

    :param connection: the SQLAlchemy connection used for the transaction
    :param existing_survey_id: the UUID of the existing survey
    :param new_survey_id: the UUID of the survey's updated copy
    :param email: the user's e-mail address
    :return: a tuple containing the old and new submission IDs
    """
    submissions = get_submissions_by_email(
        connection, email,
        survey_id=existing_survey_id
    )
    for sub in submissions:
        values = {'submitter': sub.submitter,
                  'submitter_email': sub.submitter_email,
                  'submission_time': sub.submission_time,
                  'save_time': sub.save_time,
                  'survey_id': new_survey_id}
        result = connection.execute(submission_insert(**values))
        yield sub.submission_id, result.inserted_primary_key[0]
Beispiel #3
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)
Beispiel #4
0
def get_all(connection: Connection,
            email: str,
            survey_id: str=None,
            submitters: Iterator=None,
            filters: list=None,
            order_by: str=None,
            direction: str='ASC',
            limit: int=None) -> dict:
    """
    Create a JSON representation of the submissions to a given survey and
    email.

    :param connection: a SQLAlchemy Connection
    :param survey_id: the UUID of the survey
    :param email: the user's e-mail address
    :param submitters: if supplied, filters results by all given submitters
    :param filters: if supplied, filters results by answers
    :param order_by: if supplied, the column for the ORDER BY clause
    :param direction: optional sort direction for order_by (default ASC)
    :param limit: if supplied, the limit to apply to the number of results
    :return: a JSON dict
    """
    submissions = get_submissions_by_email(
        connection,
        email=email,
        survey_id=survey_id,
        submitters=submitters,
        filters=filters,
        order_by=order_by,
        direction=direction,
        limit=limit
    )
    # TODO: Check if this is a performance problem
    result = [
        get_one(
            connection,
            sub.submission_id,
            email=email
        ) for sub in submissions
    ]
    return json_response(result)