예제 #1
0
    def test_render_date(self):
        date = '{{date|format_date}}'
        context = {'date': datetime.strptime('01/01/2017', '%d/%m/%Y')}

        rendered = TemplateRenderer().render(date, **context)

        self.assertEqual(rendered, '1 January 2017')
    def test_render_nested_templatable_property(self):
        guidance = {
            'title': 'Include',
            'description': '{{someone_else}}',
            'list': [
                '{{yourself}}',
                'People here on holiday',
                '{{someone}}',
            ]
        }

        context = {'yourself': 'Joe Bloggs', 'someone': 'Jane Bloggs', 'someone_else': 'John Doe'}

        rendered = TemplateRenderer().render(guidance, **context)

        expected = {
            'title': 'Include',
            'description': 'John Doe',
            'list': [
                'Joe Bloggs',
                'People here on holiday',
                'Jane Bloggs',
            ]
        }

        self.assertEqual(rendered, expected)
예제 #3
0
    def test_render_nested_templatable_property(self):
        question = Question()
        question.guidance = [{
            'title':
            'Include',
            'description':
            '{{someone_else}}',
            'list':
            ['{{yourself}}', 'People here on holiday', ['{{someone}}']]
        }]
        context = {
            'yourself': 'Joe Bloggs',
            'someone': 'Jane Bloggs',
            'someone_else': 'John Doe'
        }

        schema = TemplateRenderer().render_schema_items(question, context)

        expected = [{
            'title':
            'Include',
            'description':
            'John Doe',
            'list': ['Joe Bloggs', 'People here on holiday', ['Jane Bloggs']]
        }]
        self.assertEqual(schema.guidance, expected)
    def test_should_replace_jinja_template_variable_containing_special_characters(self):
        content = 'How is {{ [answers.first_name[group_instance], answers.last_name[group_instance]] | format_household_name }} ' \
                  'related to the people below?'

        safe_content = TemplateRenderer.safe_content(content)

        self.assertEqual(safe_content, 'How is … related to the people below?')
    def test_render_schema_item(self):
        title = 'Hello {{name}}'
        context = {'name': 'Joe Bloggs'}

        rendered = TemplateRenderer().render(title, **context)

        self.assertEqual(rendered, 'Hello Joe Bloggs')
예제 #6
0
    def test_should_replace_jinja_template_variable_containing_curly_braces(
            self):
        content = 'Is {{ calculate_offset_from_weekday_in_last_whole_week(collection_metadata[started_at], {}, SU) }} correct?'

        safe_content = TemplateRenderer.safe_content(content)

        self.assertEqual(safe_content, 'Is … correct?')
예제 #7
0
def get_view_submission(schema, eq_id, form_type):  # pylint: disable=unused-argument

    session_data = get_session_store().session_data

    if _is_submission_viewable(schema.json, session_data.submitted_time):
        submitted_data = data_access.get_by_key(SubmittedResponse,
                                                session_data.tx_id)

        if submitted_data:

            metadata_context = build_metadata_context_for_survey_completed(
                session_data)

            pepper = current_app.eq['secret_store'].get_secret_by_name(
                'EQ_SERVER_SIDE_STORAGE_ENCRYPTION_USER_PEPPER')
            encrypter = StorageEncryption(current_user.user_id,
                                          current_user.user_ik, pepper)

            submitted_data = json.loads(
                encrypter.decrypt_data(submitted_data.data))
            answer_store = AnswerStore(
                existing_answers=submitted_data.get('answers'))

            metadata = submitted_data.get('metadata')

            routing_path = PathFinder(schema, answer_store, metadata,
                                      []).get_full_routing_path()

            schema_context = _get_schema_context(routing_path, 0, metadata,
                                                 answer_store, schema)
            rendered_schema = renderer.render(schema.json, **schema_context)
            summary_rendered_context = build_summary_rendering_context(
                schema, rendered_schema['sections'], answer_store, metadata)

            context = {
                'summary': {
                    'groups':
                    summary_rendered_context,
                    'answers_are_editable':
                    False,
                    'is_view_submission_response_enabled':
                    is_view_submitted_response_enabled(schema.json),
                },
                'variables': None,
            }

            return render_theme_template(
                schema.json['theme'],
                template_name='view-submission.html',
                metadata=metadata_context,
                analytics_ua_id=current_app.config['EQ_UA_ID'],
                survey_id=schema.json['survey_id'],
                survey_title=TemplateRenderer.safe_content(
                    schema.json['title']),
                content=context)

    return redirect(
        url_for('post_submission.get_thank_you',
                eq_id=eq_id,
                form_type=form_type))
예제 #8
0
 def test_render_min_date(self):
     content = 'The least recent date is {{ min_value(first, second) }}'
     now = datetime.datetime.utcnow()
     then = now - datetime.timedelta(seconds=60)
     context = {'first': now, 'second': then}
     rendered = TemplateRenderer().render(content, **context)
     self.assertEqual(rendered, 'The least recent date is {}'.format(then))
예제 #9
0
def get_session_expired(eq_id, form_type, collection_id):  # pylint: disable=unused-argument
    schema = load_schema_from_params(eq_id, form_type)
    return render_theme_template(
        schema['theme'],
        template_name='session-expired.html',
        analytics_ua_id=current_app.config['EQ_UA_ID'],
        survey_title=TemplateRenderer.safe_content(schema['title']))
 def test_render_min(self):
     content = 'The smallest number is {{ min_value(first, second) }}'
     context = {
         'first': 1,
         'second': 2
     }
     rendered = TemplateRenderer().render(content, **context)
     self.assertEqual(rendered, 'The smallest number is 1')
 def test_render_min_str(self):
     content = 'The smallest string is {{ min_value(first, second) }}'
     context = {
         'first': 'zzz',
         'second': 'zzz1'
     }
     rendered = TemplateRenderer().render(content, **context)
     self.assertEqual(rendered, 'The smallest string is zzz')
    def test_render_date_month_year(self):
        date = '{{date|format_date}}'
        context = {'date': '2017-01'}

        with self.app_request_context('/'):
            rendered = TemplateRenderer().render(date, **context)

        self.assertEqual(rendered, "<span class='date'>January 2017</span>")
    def test_household_summary_with_no_names(self):
        description = "<h2 class='neptune'>Your household includes:</h2> " \
                      '{{ []|format_household_summary }}'
        context = {}

        rendered = TemplateRenderer().render(description, **context)
        self.assertEqual(rendered, "<h2 class='neptune'>Your household includes:</h2> "
                                   '')
예제 #14
0
    def test_render_schema_item(self):
        question = Question()
        question.title = 'Hello {{name}}'
        question.templatable_properties = ['title']
        context = {'name': 'Joe Bloggs'}

        schema = TemplateRenderer().render_schema_items(question, context)

        self.assertEqual(schema.title, 'Hello Joe Bloggs')
예제 #15
0
def get_sign_out():
    logout_user()

    return render_theme_template(
        cookie_session.get('theme', 'default'),
        template_name='signed-out.html',
        analytics_ua_id=current_app.config['EQ_UA_ID'],
        account_service_url=cookie_session.get('account_service_url'),
        survey_title=TemplateRenderer.safe_content(
            cookie_session.get('survey_title', '')))
예제 #16
0
def render_template(template, **kwargs):
    theme = g.schema.json.get('theme')
    template = '{}.html'.format(template).lower()

    return render_theme_template(theme,
                                 template,
                                 survey_title=TemplateRenderer.safe_content(
                                     g.schema.json['title']),
                                 survey_id=g.schema.json['survey_id'],
                                 **kwargs)
예제 #17
0
def render_template(template_name):
    tx_id = get_tx_id()
    user_agent = user_agent_parser.Parse(request.headers.get('User-Agent', ''))

    return render_theme_template(cookie_session.get('theme', 'default'),
                                 template_name=template_name,
                                 analytics_ua_id=current_app.config['EQ_UA_ID'],
                                 ua=user_agent,
                                 tx_id=tx_id,
                                 account_service_url=cookie_session.get('account_service_url'),
                                 survey_title=TemplateRenderer.safe_content(cookie_session.get('survey_title', '')))
    def test_strings_containing_quotes_not_changed(self):
        title = '{{ [answers.person_name] | format_household_name }}'
        context = {
            'answers': {
                'person_name': '"',
            }
        }

        rendered = TemplateRenderer().render(title, **context)

        self.assertEqual(rendered, '&#34;')
    def test_strings_containing_backslashes_are_escaped(self):
        title = '{{ [answers.person_name] | format_household_name }}'
        context = {
            'answers': {
                'person_name': '\\',
            }
        }

        rendered = TemplateRenderer().render(title, **context)

        self.assertEqual(rendered, '\\')
예제 #20
0
def render_template(template, **kwargs):
    theme = g.schema.json.get('theme')
    template = '{}.html'.format(template).lower()

    return render_theme_template(
        theme,
        template,
        survey_title=TemplateRenderer.safe_content(g.schema.json['title']),
        account_service_url=cookie_session.get('account_service_url'),
        account_service_log_out_url=cookie_session.get(
            'account_service_log_out_url'),
        survey_id=g.schema.json['survey_id'],
        **kwargs)
예제 #21
0
def get_page_title_for_location(schema_json, current_location):
    block = SchemaHelper.get_block_for_location(schema_json, current_location)
    if block['type'] == 'Interstitial':
        group = SchemaHelper.get_group(schema_json, current_location.group_id)
        page_title = '{group_title} - {survey_title}'.format(
            group_title=group['title'], survey_title=schema_json['title'])
    elif block['type'] == 'Questionnaire':
        first_question = next(SchemaHelper.get_questions_for_block(block))
        page_title = '{question_title} - {survey_title}'.format(
            question_title=first_question['title'],
            survey_title=schema_json['title'])
    else:
        page_title = schema_json['title']

    return TemplateRenderer.safe_content(page_title)
예제 #22
0
def get_thank_you(schema, metadata, eq_id, form_type):
    session_data = get_session_store().session_data
    completeness = get_completeness(current_user)

    if session_data.submitted_time:
        metadata_context = build_metadata_context_for_survey_completed(
            session_data)

        view_submission_url = None
        view_submission_duration = 0
        if _is_submission_viewable(schema.json, session_data.submitted_time):
            view_submission_url = url_for('.get_view_submission',
                                          eq_id=eq_id,
                                          form_type=form_type)
            view_submission_duration = humanize.naturaldelta(
                timedelta(seconds=schema.json['view_submitted_response']
                          ['duration']))

        cookie_message = request.cookies.get('ons_cookie_message_displayed')
        allow_analytics = analytics_allowed(request)

        return render_theme_template(
            schema.json['theme'],
            template_name='thank-you.html',
            metadata=metadata_context,
            analytics_gtm_id=current_app.config['EQ_GTM_ID'],
            analytics_gtm_env_id=current_app.config['EQ_GTM_ENV_ID'],
            survey_id=schema.json['survey_id'],
            survey_title=TemplateRenderer.safe_content(schema.json['title']),
            is_view_submitted_response_enabled=
            is_view_submitted_response_enabled(schema.json),
            view_submission_url=view_submission_url,
            account_service_url=cookie_session.get('account_service_url'),
            account_service_log_out_url=cookie_session.get(
                'account_service_log_out_url'),
            view_submission_duration=view_submission_duration,
            cookie_message=cookie_message,
            allow_analytics=allow_analytics)

    routing_path = path_finder.get_full_routing_path()

    router = Router(schema, routing_path, completeness)
    next_location = router.get_next_location()

    return _redirect_to_location(metadata['collection_exercise_sid'],
                                 metadata.get('eq_id'),
                                 metadata.get('form_type'), next_location)
예제 #23
0
def get_page_title_for_location(schema, current_location, metadata,
                                answer_store):
    block = schema.get_block(current_location.block_id)
    if block['type'] == 'Interstitial':
        group = schema.get_group(current_location.group_id)
        page_title = '{group_title} - {survey_title}'.format(
            group_title=group['title'], survey_title=schema.json['title'])
    elif block['type'] == 'Question':
        first_question = next(schema.get_questions_for_block(block))
        question_title = get_question_title(first_question, answer_store,
                                            schema, metadata,
                                            current_location.group_instance)
        page_title = '{question_title} - {survey_title}'.format(
            question_title=question_title, survey_title=schema.json['title'])
    else:
        page_title = schema.json['title']

    return TemplateRenderer.safe_content(page_title)
예제 #24
0
def render_template(template_name):
    tx_id = get_tx_id()
    user_agent = user_agent_parser.Parse(request.headers.get('User-Agent', ''))

    cookie_message = request.cookies.get('ons_cookie_message_displayed')
    allow_analytics = analytics_allowed(request)
    return render_theme_template(
        cookie_session.get('theme', 'default'),
        template_name=template_name,
        analytics_gtm_id=current_app.config['EQ_GTM_ID'],
        analytics_gtm_env_id=current_app.config['EQ_GTM_ENV_ID'],
        cookie_message=cookie_message,
        allow_analytics=allow_analytics,
        ua=user_agent,
        tx_id=tx_id,
        account_service_url=cookie_session.get('account_service_url'),
        survey_title=TemplateRenderer.safe_content(
            cookie_session.get('survey_title', '')))
    def test_household_summary_values_are_escaped_and_not_encoded(self):
        description = "<h2 class='neptune'>Your household includes:</h2> " \
                      '{{ [answers.first_name, answers.middle_names, answers.last_name]|format_household_summary }}'
        context = {
            'answers': {
                'first_name': ['Alice', 'Bob', '\\', 'Dave'],
                'middle_names': ['', 'Berty', '"', 'Dixon'],
                'last_name': ['Aardvark', 'Brown', '!', 'Davies'],
            }
        }

        rendered = TemplateRenderer().render(description, **context)
        self.assertEqual(rendered, "<h2 class='neptune'>Your household includes:</h2> "
                                   '<ul>'
                                   '<li>Alice Aardvark</li>'
                                   '<li>Bob Berty Brown</li>'
                                   r'<li>\ &#34; !</li>'
                                   '<li>Dave Dixon Davies</li>'
                                   '</ul>')
예제 #26
0
def get_sign_out():
    """
    Signs the user first out of eq, then the account service by hitting the account services'
    logout url.
    """
    account_service_log_out_url = cookie_session.get(
        'account_service_log_out_url')
    logout_user()

    if account_service_log_out_url:
        return redirect(account_service_log_out_url)

    return render_theme_template(
        cookie_session.get('theme', 'default'),
        template_name='signed-out.html',
        analytics_ua_id=current_app.config['EQ_UA_ID'],
        account_service_url=cookie_session.get('account_service_url'),
        survey_title=TemplateRenderer.safe_content(
            cookie_session.get('survey_title', '')))
예제 #27
0
def _render_template(context, current_location, template, front_end_navigation,
                     metadata_context, previous_url):
    theme = g.schema_json.get('theme', None)
    logger.debug("theme selected", theme=theme)
    session_timeout = current_app.config['EQ_SESSION_TIMEOUT_SECONDS']
    schema_session_timeout = g.schema_json.get('session_timeout_in_seconds')
    if schema_session_timeout is not None and schema_session_timeout < current_app.config[
            'EQ_SESSION_TIMEOUT_SECONDS']:
        session_timeout = schema_session_timeout
    session_timeout_prompt = g.schema_json.get(
        'session_prompt_in_seconds'
    ) or current_app.config['EQ_SESSION_TIMEOUT_PROMPT_SECONDS']

    survey_data = metadata_context['survey']
    url_prefix = '/questionnaire/{}/{}/{}'.format(survey_data['eq_id'],
                                                  survey_data['form_type'],
                                                  survey_data['collection_id'])

    page_title = get_page_title_for_location(g.schema_json, current_location)
    template = '{}.html'.format(template).lower()
    feedback_enable = False
    if settings.FEEDBACK_ENABLED_ALL or request.view_args[
            'form_type'] in settings.FEEDBACK_ENABLED_FOR:
        feedback_enable = True
    return render_theme_template(
        theme,
        template,
        meta=metadata_context,
        content=context,
        current_location=current_location,
        analytics_ua_id=current_app.config['EQ_UA_ID'],
        previous_location=previous_url,
        navigation=front_end_navigation,
        survey_title=TemplateRenderer.safe_content(g.schema_json['title']),
        legal_basis=g.schema_json['legal_basis'],
        survey_id=g.schema_json['survey_id'],
        session_timeout=session_timeout,
        session_timeout_prompt=session_timeout_prompt,
        url_prefix=url_prefix,
        page_title=page_title,
        feedback_enable=feedback_enable,
    )
예제 #28
0
def get_sign_out():
    """
    Signs the user first out of eq, then the account service by hitting the account services'
    logout url.
    """
    account_service_log_out_url = cookie_session.get('account_service_log_out_url')
    logout_user()

    if account_service_log_out_url:
        return redirect(account_service_log_out_url)

    cookie_message = request.cookies.get('ons_cookie_message_displayed')
    allow_analytics = analytics_allowed(request)

    return render_theme_template(cookie_session.get('theme', 'default'),
                                 template_name='signed-out.html',
                                 analytics_gtm_id=current_app.config['EQ_GTM_ID'],
                                 analytics_gtm_env_id=current_app.config['EQ_GTM_ENV_ID'],
                                 cookie_message=cookie_message,
                                 allow_analytics=allow_analytics,
                                 account_service_url=cookie_session.get('account_service_url'),
                                 survey_title=TemplateRenderer.safe_content(cookie_session.get('survey_title', '')))
예제 #29
0
def get_thank_you(eq_id, form_type, collection_id):  # pylint: disable=unused-argument
    survey_completed_metadata = current_app.eq[
        'session_storage'].get_survey_completed_metadata()
    schema = load_schema_from_params(eq_id, form_type)

    if survey_completed_metadata:
        metadata_context = build_metadata_context_for_survey_completed(
            survey_completed_metadata)
        thank_you_template = render_theme_template(
            schema['theme'],
            template_name='thank-you.html',
            meta=metadata_context,
            analytics_ua_id=current_app.config['EQ_UA_ID'],
            survey_id=schema['survey_id'],
            survey_title=TemplateRenderer.safe_content(schema['title']))
        if settings.FEEDBACK_ENABLED_ALL or form_type in settings.FEEDBACK_ENABLED_FOR:
            session['feedback'] = True
            session['form_type'] = form_type
        return thank_you_template
    else:
        return _redirect_to_latest_location(collection_id, eq_id, form_type,
                                            schema)
예제 #30
0
def get_thank_you(schema, metadata, eq_id, form_type):  # pylint: disable=unused-argument
    session_data = get_session_store().session_data
    completeness = get_completeness(current_user)

    if session_data.submitted_time:
        metadata_context = build_metadata_context_for_survey_completed(
            session_data)

        view_submission_url = None
        view_submission_duration = 0
        if _is_submission_viewable(schema.json, session_data.submitted_time):
            view_submission_url = url_for('.get_view_submission',
                                          eq_id=eq_id,
                                          form_type=form_type)
            view_submission_duration = humanize.naturaldelta(
                timedelta(seconds=schema.json['view_submitted_response']
                          ['duration']))

        return render_theme_template(
            schema.json['theme'],
            template_name='thank-you.html',
            metadata=metadata_context,
            analytics_ua_id=current_app.config['EQ_UA_ID'],
            survey_id=schema.json['survey_id'],
            survey_title=TemplateRenderer.safe_content(schema.json['title']),
            is_view_submitted_response_enabled=
            is_view_submitted_response_enabled(schema.json),
            view_submission_url=view_submission_url,
            view_submission_duration=view_submission_duration)

    routing_path = path_finder.get_full_routing_path()

    collection_id = metadata['collection_exercise_sid']

    router = Router(schema, routing_path, completeness)
    next_location = router.get_next_location()

    return _redirect_to_location(collection_id, metadata.get('eq_id'),
                                 metadata.get('form_type'), next_location)