Example #1
0
    def put(self, event_id):
        req_parser = reqparse.RequestParser()
        req_parser.add_argument('is_open', type=bool, required=True)
        req_parser.add_argument('nominations', type=bool, required=True)
        req_parser.add_argument('id', type=int, required=True)
        req_parser.add_argument('sections',
                                type=dict,
                                required=True,
                                action='append')

        args = req_parser.parse_args()
        user_id = g.current_user['id']
        application_form_id = args['id']

        app_form = application_form_repository.get_by_id(
            application_form_id)  # type: ApplicationForm
        if not app_form:
            return FORM_NOT_FOUND_BY_ID

        if event_id != app_form.event_id:
            return UPDATE_CONFLICT

        app_form.is_open = args['is_open']
        app_form.nominations = args['nominations']

        current_sections = app_form.sections
        incoming_sections = args['sections']

        # Delete questions in the application form that no longer exist
        all_question_ids = [
            q['id'] for s in incoming_sections for q in s['questions']
            if 'id' in q
        ]
        print("all_question_ids:", all_question_ids)
        for question in app_form.questions:
            if question.id not in all_question_ids:
                print("DELETING QUESTION ID ", question.id)
                application_form_repository.delete_question(question)

        all_section_ids = [s['id'] for s in incoming_sections if 'id' in s]
        print("all_section_ids:", all_section_ids)
        for section in app_form.sections:
            if section.id not in all_section_ids:
                print("DELETING SECTION ID ", section.id)
                application_form_repository.delete_section(section)

        # Keep track of which objects match with which incoming data for populating dependencies later.
        section_data_map = {}
        question_data_map = {}
        question_id_map = {}

        for section_data in incoming_sections:
            if 'id' in section_data:
                # If ID is populated, then update the existing section
                section = next(
                    (s
                     for s in current_sections if s.id == section_data['id']),
                    None)  # type: Section
                if not section:
                    return SECTION_NOT_FOUND

                current_translations = section.section_translations  # type: Sequence[SectionTranslation]
                for current_translation in current_translations:
                    current_translation.description = section_data[
                        'description'][current_translation.language]
                    current_translation.name = section_data['name'][
                        current_translation.language]
                    current_translation.show_for_values = section_data[
                        'show_for_values'][current_translation.language]

                section.key = section_data['key']
                section.order = section_data['order']

                db.session.commit()
            else:
                # if not populated, then add new section
                section = Section(app_form.id,
                                  section_data['order'],
                                  key=section_data['key'])
                application_form_repository.add(section)

                languages = section_data['name'].keys()
                for language in languages:
                    section_translation = SectionTranslation(
                        section.id, language, section_data['name'][language],
                        section_data['description'][language],
                        section_data['show_for_values'][language])
                    application_form_repository.add(section_translation)

            section_data_map[section] = section_data
            try:
                question_map, question_ids = _process_questions(
                    section_data['questions'], app_form, section.id)
                question_data_map.update(question_map)
                question_id_map.update(question_ids)
            except ValueError:
                return QUESTION_NOT_FOUND

        db.session.commit()

        # Now that all the questions have been created, we can populate the dependencies
        for section, section_data in section_data_map.items():
            if section_data['depends_on_question_id']:
                section.depends_on_question_id = question_id_map[
                    section_data['depends_on_question_id']]

        for question, question_data in question_data_map.items():
            if question_data['depends_on_question_id']:
                question.depends_on_question_id = question_id_map[
                    question_data['depends_on_question_id']]

        app_form = application_form_repository.get_by_id(app_form.id)

        return app_form, 200
Example #2
0
    def post(self, event_id):
        req_parser = reqparse.RequestParser()
        req_parser.add_argument('is_open', type=bool, required=True)
        req_parser.add_argument('nominations', type=bool, required=True)
        req_parser.add_argument('sections',
                                type=dict,
                                required=True,
                                action='append')
        args = req_parser.parse_args()

        app_form = application_form_repository.get_by_event_id(event_id)
        if app_form:
            return APPLICATION_FORM_EXISTS

        is_open = args['is_open']
        nominations = args['nominations']

        app_form = ApplicationForm(event_id, is_open, nominations)
        application_form_repository.add(app_form)
        sections_data = args['sections']

        # Keep track of which objects match with which incoming data for populating dependencies later.
        section_data_map = {}
        question_data_map = {}
        question_id_map = {}

        for section_data in sections_data:
            section = Section(app_form.id,
                              section_data['order'],
                              key=section_data['key'])
            application_form_repository.add(section)
            section_data_map[section] = section_data

            languages = section_data['name'].keys()
            for language in languages:
                section_translation = SectionTranslation(
                    section.id, language, section_data['name'][language],
                    section_data['description'][language],
                    section_data['show_for_values'][language])
                application_form_repository.add(section_translation)

            for question_data in section_data['questions']:
                # application_form_id, section_id, order, questionType, is_required=True
                question = Question(app_form.id, section.id,
                                    question_data['order'],
                                    question_data['type'],
                                    question_data['is_required'])
                application_form_repository.add(question)
                question_data_map[question] = question_data

                if "surrogate_id" in question_data:
                    question_id_map[
                        question_data["surrogate_id"]] = question.id

                for language in languages:
                    question_translation = QuestionTranslation(
                        question_id=question.id,
                        language=language,
                        headline=question_data['headline'][language],
                        description=question_data['description'][language],
                        placeholder=question_data['placeholder'][language],
                        validation_regex=question_data['validation_regex']
                        [language],
                        validation_text=question_data['validation_text']
                        [language],
                        options=question_data['options'][language],
                        show_for_values=question_data['show_for_values']
                        [language])
                    application_form_repository.add(question_translation)

        # Now that all the questions have been created, we can populate the dependencies
        for section, section_data in section_data_map.items():
            if section_data['depends_on_question_id']:
                section.depends_on_question_id = question_id_map[
                    section_data['depends_on_question_id']]

        for question, question_data in question_data_map.items():
            if question_data['depends_on_question_id']:
                question.depends_on_question_id = question_id_map[
                    question_data['depends_on_question_id']]

        app_form = application_form_repository.get_by_id(app_form.id)
        return app_form, 201