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' )
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]
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)
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)