diff --git a/README.md b/README.md index 7a9f1243..1ef2ec9d 100644 --- a/README.md +++ b/README.md @@ -73,3 +73,11 @@ From the `server/` directory run the following 3. `python -m http.server 1337` 4. visit `http://localhost:1337/htmlcov/` and dig into modules to see which individual line coverage + +## Selenium tests + +There are a few tests that use a live browser to test interaction. These do not run by default. You'll have to run them via `python manage.py test --selenium tests/selenium/`. + +These tests should work both in postgres and sqlite. But when using postgres, if anything goes wrong, the DB may not reset correctly and you may have to reset it (see dropdb test db command above). + +You can run regular tests or these tests, never both at the same time. Do not attempt to run regular tests with --selenium or selenium tests without it, or else it will error and you will need to reset the test DB. diff --git a/server/cpho/fixtures/dimension_lookups.yaml b/server/cpho/fixtures/dimension_lookups.yaml index 31ee55ad..dcc1ce91 100644 --- a/server/cpho/fixtures/dimension_lookups.yaml +++ b/server/cpho/fixtures/dimension_lookups.yaml @@ -104,7 +104,7 @@ fields: dimension_type: 1 name_en: Male - name_fr: Male + name_fr: Mâle value: m excel_code: "MALES" order: 0.0 @@ -113,7 +113,7 @@ fields: dimension_type: 1 name_en: Female - name_fr: Female + name_fr: Femelle value: f excel_code: "FEMALES" order: 1.0 diff --git a/server/cpho/jinja2/base.jinja2 b/server/cpho/jinja2/base.jinja2 index 32d7fde1..cba1c563 100644 --- a/server/cpho/jinja2/base.jinja2 +++ b/server/cpho/jinja2/base.jinja2 @@ -30,6 +30,7 @@ {% block extra_scripts_css %}{% endblock %} + {{ phac_aspc.phac_aspc_wet_session_timeout_dialog(dict(request=request) , 'logout') }} + {% endblock %} diff --git a/server/cpho/jinja2/breadcrumb_macros.jinja2 b/server/cpho/jinja2/breadcrumb_macros.jinja2 index e7fa2285..fbe4664b 100644 --- a/server/cpho/jinja2/breadcrumb_macros.jinja2 +++ b/server/cpho/jinja2/breadcrumb_macros.jinja2 @@ -15,7 +15,7 @@ {% endmacro %} {% macro indicator(indicator, active) %} - {{ item(indicator.name , url('view_indicator', args=[indicator.id]) , active) }} + {{ item(indicator.bilingual_name , url('view_indicator', args=[indicator.id]) , active) }} {% endmacro %} {% macro indicator_period(indicator, period, active) %} diff --git a/server/cpho/jinja2/changelog/changelog_macros.jinja2 b/server/cpho/jinja2/changelog/changelog_macros.jinja2 index 5ff25d4e..c4adfb56 100644 --- a/server/cpho/jinja2/changelog/changelog_macros.jinja2 +++ b/server/cpho/jinja2/changelog/changelog_macros.jinja2 @@ -1,72 +1,75 @@ {% from 'generic_macros.jinja2' import date_display %} {% macro changelog_table(edit_entries, show_model_type=True, show_user=True) %} - - - - - {% if show_user %}{% endif %} - - {% if show_model_type %}{% endif %} - - - - - - - - {% for edit_entry in edit_entries %} - {% if not edit_entry.diffs %} - - - {% if show_user %} - - {% endif %} - - {% if show_model_type %}{% endif %} - - - - {% endif %} - {% for diff in edit_entry.diffs %} - - - {% if show_user %} +
+ +
{{ tm("date") }}{{ tm("author") }}{{ tm("action") }}{{ tm("object_type") }}{{ tm("name") }}{{ tm("field") }}{{ tm("previous_change") }}{{ tm("this_change") }}
{{ date_display(edit_entry.right_version.timestamp) }} - {% if edit_entry.author %} - {{ edit_entry.author.pretty_name }} - {% else %} - {{ tm("n/a") }} - {% endif %} - {{ tm("saved") }}{{ edit_entry.eternal._meta.verbose_name }}{{ edit_entry.live_name }}{{ tm("no_change_detected_compared_to_previous_version") }}
{{ date_display(edit_entry.right_version.timestamp) }}
+ + + + {% if show_user %}{% endif %} + + {% if show_model_type %}{% endif %} + + + + + + + + {% for edit_entry in edit_entries %} + {% if not edit_entry.diffs %} + + + {% if show_user %} + + {% endif %} + + {% if show_model_type %}{% endif %} + + + + {% endif %} + {% for diff in edit_entry.diffs %} + + + {% if show_user %} + + {% endif %} + + {% if show_model_type %}{% endif %} + - {% endif %} - - {% if show_model_type %}{% endif %} - - - {###############autoescape content is escaped ######################} - {% autoescape false %} - - {% endautoescape %} - {% autoescape false %} - - {% endautoescape %} - {% block extra_columns %}{% endblock %} - + {###############autoescape content is escaped ######################} + {% autoescape false %} + + {% endautoescape %} + {% autoescape false %} + + {% endautoescape %} + {% block extra_columns %}{% endblock %} + + {% endfor %} {% endfor %} - {% endfor %} - -
{{ tm("date") }}{{ tm("author") }}{{ tm("action") }}{{ tm("object_type") }}{{ tm("name") }}{{ tm("field") }}{{ tm("previous_change") }}{{ tm("this_change") }}
{{ date_display(edit_entry.right_version.timestamp) }} + {% if edit_entry.author %} + {{ edit_entry.author.pretty_name }} + {% else %} + {{ tm("n/a") }} + {% endif %} + {{ tm("saved") }}{{ edit_entry.eternal._meta.verbose_name }}{{ edit_entry.live_name }}{{ tm("no_change_detected_compared_to_previous_version") }}
{{ date_display(edit_entry.right_version.timestamp) }} + {% if edit_entry.author %} + {{ edit_entry.author.pretty_name }} + {% else %} + {{ tm("n/a") }} + {% endif %} + {{ diff.action }}{{ edit_entry.eternal._meta.verbose_name }}{{ edit_entry.live_name }} - {% if edit_entry.author %} - {{ edit_entry.author.pretty_name }} - {% else %} - {{ tm("n/a") }} - {% endif %} + {% if diff.field %}{{ diff.field.verbose_name }}{% endif %} {{ diff.action }}{{ edit_entry.eternal._meta.verbose_name }}{{ edit_entry.live_name }} - {% if diff.field %}{{ diff.field.verbose_name }}{% endif %} - {{ diff.get_before_diff() }}{{ diff.get_after_diff() }}
{{ diff.get_before_diff() }}{{ diff.get_after_diff() }}
+ + + {% endmacro %} diff --git a/server/cpho/jinja2/cpho_macros.jinja2 b/server/cpho/jinja2/cpho_macros.jinja2 index 4e6f91b4..a8d0cc22 100644 --- a/server/cpho/jinja2/cpho_macros.jinja2 +++ b/server/cpho/jinja2/cpho_macros.jinja2 @@ -2,34 +2,36 @@ {% macro indicator_data_table_w_submissions(data) %} {# assumes dimension_type and dimension_value are prefetched #} - - - - - - - - - - - - {% for datum in data %} +
+
{{ tm("stratifier_value") }}{{ tm("indicator_value") }}{{ tm("last_modified") }}{{ tm("hso_submission") }}{{ tm("program_submission") }}
+ - - - - - + + + + + - {% endfor %} - -
- {% if datum.dimension_type.is_literal %} - {{ datum.literal_dimension_val }} - {% else %} - {{ datum.dimension_value.name }} - {% endif %} - {{ datum.value }}{{ date_display(datum.last_version_date) }}{{ submission_status_label(datum.submission_status(submission_type="hso") ) }}{{ submission_status_label(datum.submission_status(submission_type="program") ) }}{{ tm("stratifier_value") }}{{ tm("indicator_value") }}{{ tm("last_modified") }}{{ tm("hso_submission") }}{{ tm("program_submission") }}
+ + + {% for datum in data %} + + + {% if datum.dimension_type.is_literal %} + {{ datum.literal_dimension_val }} + {% else %} + {{ datum.dimension_value.name }} + {% endif %} + + {{ datum.value }} + {{ date_display(datum.last_version_date) }} + {{ submission_status_label(datum.submission_status(submission_type="hso") ) }} + {{ submission_status_label(datum.submission_status(submission_type="program") ) }} + + {% endfor %} + + + {% endmacro %} {% macro submission_status_badge(submission_status) %} @@ -57,3 +59,17 @@ {% endmacro %} + + +{# rm whitespace too #} +{% macro form_field_error_id(field) -%} + {{ field.id_for_label }}_errormessage +{%- endmacro %} + +{% macro form_field_error(field) %} + {% if field.errors %} + + {% endif %} +{% endmacro %} diff --git a/server/cpho/jinja2/generic_macros.jinja2 b/server/cpho/jinja2/generic_macros.jinja2 index 5234034c..856b1361 100644 --- a/server/cpho/jinja2/generic_macros.jinja2 +++ b/server/cpho/jinja2/generic_macros.jinja2 @@ -10,3 +10,18 @@
{{ text }}
{% endmacro %} + + +{% macro required_asterisk() %} + +{% endmacro %} + + +{% macro required_explainer_alert() %} +
+ + {{ tm("required_explainer") }} + {{ required_asterisk() }} + +
+{% endmacro %} diff --git a/server/cpho/jinja2/indicator_data/manage_indicator_data.jinja2 b/server/cpho/jinja2/indicator_data/manage_indicator_data.jinja2 index 75809595..d1692390 100644 --- a/server/cpho/jinja2/indicator_data/manage_indicator_data.jinja2 +++ b/server/cpho/jinja2/indicator_data/manage_indicator_data.jinja2 @@ -9,9 +9,10 @@ {{ bc.item(tm("edit") , None, True) }} {% endblock %} -{% macro check_display_error(err, field) %} - {% if err %} -
+{% macro check_display_error(form,field) %} + {% if field.errors %} +
{% for error in field.errors %}{{ error|escape }}{% endfor %}
{% endif %} @@ -27,7 +28,7 @@ {{ form.value }} {{ hidden_a11y_label(form.value, row_name) }} - {{ check_display_error(form.errors.value, form.value) }} + {{ check_display_error(form, form.value) }} {{ form.value_unit }} @@ -36,12 +37,12 @@ {{ form.value_lower_bound }} {{ hidden_a11y_label(form.value_lower_bound, row_name) }} - {{ check_display_error(form.errors.value_lower_bound, form.value_lower_bound) }} + {{ check_display_error(form, form.value_lower_bound) }} {{ form.value_upper_bound }} {{ hidden_a11y_label(form.value_upper_bound, row_name) }} - {{ check_display_error(form.errors.value_upper_bound, form.value_upper_bound) }} + {{ check_display_error(form, form.value_upper_bound) }} {{ form.data_quality }} @@ -50,12 +51,12 @@ {{ form.single_year_timeframe }} {{ hidden_a11y_label(form.single_year_timeframe, row_name) }} - {{ check_display_error(form.errors.single_year_timeframe, form.single_year_timeframe) }} + {{ check_display_error(form, form.single_year_timeframe) }} {{ form.multi_year_timeframe }} {{ hidden_a11y_label(form.multi_year_timeframe, row_name) }} - {{ check_display_error(form.errors.multi_year_timeframe, form.multi_year_timeframe) }} + {{ check_display_error(form, form.multi_year_timeframe) }} {{ form.value_displayed }} @@ -78,15 +79,17 @@ {% endmacro %} {% block content %} -

{{ tm("indicator_data") }} : {{ indicator.name }} ({{ period }})

+

{{ tm("indicator_data") }} : {{ indicator.bilingual_name }} ({{ period }})

Cancel + href="{{ url('view_indicator_for_period', args=[indicator.id, period.id]) }}">{{ tm("cancel") }} +
- - {# This is a form template to be used by 'add new form' feature #} - {# Parent must be a table, otherwise browser will strip the invalid tr/td tags #} - {{ age_group_form(age_group_formset.empty_form) }} -
+ + {# This is a form template to be used by 'add new form' feature #} + {# Parent must be a table, otherwise browser will strip the invalid tr/td tags #} + {{ age_group_form(age_group_formset.empty_form) }} +
+
{% if respects_rule('can_edit_indicator_data', {"indicator": indicator, "period": period}) %} {% set mode = "edit" %} {% else %} @@ -130,7 +133,7 @@ {{ form.value }} {{ hidden_a11y_label(form.value, row_name) }} - {{ check_display_error(form.errors.value, form.value) }} + {{ check_display_error(form, form.value) }} {{ form.value_unit }} @@ -139,12 +142,12 @@ {{ form.value_lower_bound }} {{ hidden_a11y_label(form.value_lower_bound, row_name) }} - {{ check_display_error(form.errors.value_lower_bound, form.value_lower_bound) }} + {{ check_display_error(form, form.value_lower_bound) }} {{ form.value_upper_bound }} {{ hidden_a11y_label(form.value_upper_bound, row_name) }} - {{ check_display_error(form.errors.value_upper_bound, form.value_upper_bound) }} + {{ check_display_error(form, form.value_upper_bound) }} {{ form.data_quality }} @@ -153,12 +156,12 @@ {{ form.single_year_timeframe }} {{ hidden_a11y_label(form.single_year_timeframe, row_name) }} - {{ check_display_error(form.errors.single_year_timeframe, form.single_year_timeframe) }} + {{ check_display_error(form, form.single_year_timeframe) }} {{ form.multi_year_timeframe }} {{ hidden_a11y_label(form.multi_year_timeframe, row_name) }} - {{ check_display_error(form.errors.multi_year_timeframe, form.multi_year_timeframe) }} + {{ check_display_error(form, form.multi_year_timeframe) }} {{ form.value_displayed }} @@ -270,6 +273,10 @@ //newForm.outerHTML = `${newFormHtml}`; totalFormsInput.setAttribute('value', `${numForms}`) + + // a11y: focus on first input of newly added form + newForm.querySelector('select,input').focus(); + } {% endif %} diff --git a/server/cpho/jinja2/indicators/_indicator_form.jinja2 b/server/cpho/jinja2/indicators/_indicator_form.jinja2 index bc610393..3dfac184 100644 --- a/server/cpho/jinja2/indicators/_indicator_form.jinja2 +++ b/server/cpho/jinja2/indicators/_indicator_form.jinja2 @@ -1,14 +1,27 @@ {{ form.media }} -{% from 'cpho_macros.jinja2' import hidden_a11y_label %} +{% from 'cpho_macros.jinja2' import hidden_a11y_label, form_field_error_id, form_field_error %} +{% from 'generic_macros.jinja2' import required_asterisk, required_explainer_alert %} {% macro form_field(field, rich=false) %} {% set hso_field_display = field.name in form.hso_only_field_names and respects_rule('is_admin_or_hso') %} {% set non_hso_field_display = field.name not in form.hso_only_field_names %} + + {% set attrs = {} %} + {% if field.errors %} + {% set attrs = {'aria-describedby': form_field_error_id(field)} %} + {% endif %} + {% if (hso_field_display or non_hso_field_display) %} +
+ {% if field.errors %}
{{ form_field_error(field) }}
{% endif %}
-
{{ field.label_tag(attrs={'class': 'col col-form-label', 'aria-label': field.label }) }}
+ + {% if field.name in form.hso_only_field_names %} {{ tm("hso_only") }} {% endif %} @@ -16,9 +29,9 @@
{% if rich %} - {{ field|safe }} + {{ field.as_widget(attrs=attrs) |safe }} {% else %} - {{ field }} + {{ field.as_widget(attrs=attrs) }} {% endif %}
@@ -27,20 +40,20 @@ {% endmacro %} {% macro fieldset_field(field, helptext=None) %} -
-
+
+
-
- {{ field.label }} -
+
{{ field.label }}
{% if helptext %}
{{ helptext }}
{% endif %} -
-
{{ field }}
+ +
{{ field }}
{% endmacro %} -
+ +{{ required_explainer_alert() }} + {{ csrf_input }}
@@ -58,8 +71,11 @@ {{ form_field(form.sub_indicator_measurement) }} {{ form_field(form.sub_indicator_measurement_fr) }} - {{ fieldset_field(form.relevant_dimensions, helptext=tm("not_published_just_a_convenience_factor_to_filter_in_app_choices") ) }} - {{ fieldset_field(form.relevant_period_types, helptext=tm("not_published_just_a_convenience_factor_to_filter_in_app_choices") ) }} + {# TODO: re-add helptext #} + {# {{ fieldset_field(form.relevant_dimensions, helptext=tm("not_published_just_a_convenience_factor_to_filter_in_app_choices") ) }} #} + {{ fieldset_field(form.relevant_dimensions,) }} + {# {{ fieldset_field(form.relevant_period_types, helptext=tm("not_published_just_a_convenience_factor_to_filter_in_app_choices") ) }} #} + {{ fieldset_field(form.relevant_period_types,) }}
@@ -242,59 +258,61 @@

{{ tm("quintile_metadata_description") }}

- - - - - - - - - - - - - - - - - {% set row_name = tm('quintile_values') %} - - - - - - - - - - - -
{{ tm("quintile") }}{{ vb_name('cpho.Indicator', 'g1') }}{{ vb_name('cpho.Indicator', 'g2_lower') }}{{ vb_name('cpho.Indicator', 'g2_upper') }}{{ vb_name('cpho.Indicator', 'g3_lower') }}{{ vb_name('cpho.Indicator', 'g3_upper') }}{{ vb_name('cpho.Indicator', 'g4_lower') }}{{ vb_name('cpho.Indicator', 'g4_upper') }}{{ vb_name('cpho.Indicator', 'g5') }}
{{ row_name }} -
{{ form.g1 }}
- {{ hidden_a11y_label(form.g1, row_name) }} -
-
{{ form.g2_lower }}
- {{ hidden_a11y_label(form.g2_lower, row_name) }} -
-
{{ form.g2_upper }}
- {{ hidden_a11y_label(form.g2_upper, row_name) }} -
-
{{ form.g3_lower }}
- {{ hidden_a11y_label(form.g3_lower, row_name ,) }} -
-
{{ form.g3_upper }}
- {{ hidden_a11y_label(form.g3_upper, row_name) }} -
-
{{ form.g4_lower }}
- {{ hidden_a11y_label(form.g4_lower, row_name) }} -
-
{{ form.g4_upper }}
- {{ hidden_a11y_label(form.g4_upper, row_name) }} -
-
{{ form.g5 }}
- {{ hidden_a11y_label(form.g5, row_name) }} -
+
+ + + + + + + + + + + + + + + + + {% set row_name = tm('quintile_values') %} + + + + + + + + + + + +
{{ tm("quintile") }}{{ vb_name('cpho.Indicator', 'g1') }}{{ vb_name('cpho.Indicator', 'g2_lower') }}{{ vb_name('cpho.Indicator', 'g2_upper') }}{{ vb_name('cpho.Indicator', 'g3_lower') }}{{ vb_name('cpho.Indicator', 'g3_upper') }}{{ vb_name('cpho.Indicator', 'g4_lower') }}{{ vb_name('cpho.Indicator', 'g4_upper') }}{{ vb_name('cpho.Indicator', 'g5') }}
{{ row_name }} +
{{ form.g1 }}
+ {{ hidden_a11y_label(form.g1, row_name) }} +
+
{{ form.g2_lower }}
+ {{ hidden_a11y_label(form.g2_lower, row_name) }} +
+
{{ form.g2_upper }}
+ {{ hidden_a11y_label(form.g2_upper, row_name) }} +
+
{{ form.g3_lower }}
+ {{ hidden_a11y_label(form.g3_lower, row_name ,) }} +
+
{{ form.g3_upper }}
+ {{ hidden_a11y_label(form.g3_upper, row_name) }} +
+
{{ form.g4_lower }}
+ {{ hidden_a11y_label(form.g4_lower, row_name) }} +
+
{{ form.g4_upper }}
+ {{ hidden_a11y_label(form.g4_upper, row_name) }} +
+
{{ form.g5 }}
+ {{ hidden_a11y_label(form.g5, row_name) }} +
+
diff --git a/server/cpho/jinja2/indicators/edit_indicator.jinja2 b/server/cpho/jinja2/indicators/edit_indicator.jinja2 index f41ed765..da4a9483 100644 --- a/server/cpho/jinja2/indicators/edit_indicator.jinja2 +++ b/server/cpho/jinja2/indicators/edit_indicator.jinja2 @@ -9,7 +9,7 @@ {% block content %} -
{{ tm("edit_indicator") }} : {{ object.name }}
+
{{ tm("edit_indicator") }} : {{ object.bilingual_name }}
{% endif %} -
+
@@ -38,13 +38,13 @@ {% for indicator in object_list %} {% if respects_rule('can_access_indicator', indicator) %} - + {% endif %} diff --git a/server/cpho/jinja2/indicators/upload/upload_help_modal.jinja2 b/server/cpho/jinja2/indicators/upload/upload_help_modal.jinja2 index bd97a0e3..fd867902 100644 --- a/server/cpho/jinja2/indicators/upload/upload_help_modal.jinja2 +++ b/server/cpho/jinja2/indicators/upload/upload_help_modal.jinja2 @@ -10,7 +10,7 @@ + aria-label="{{ tm('close') }}">
{{ indicator.name }}{{ indicator.bilingual_name }} {{ indicator.get_category_display() }} {{ indicator.get_topic_display() }} {{ tm("view_indicator") }} + aria-label="{{ tm("view_indicator") }}, {{ indicator.bilingual_name }}">{{ tm("view_indicator") }}
diff --git a/server/cpho/jinja2/indicators/view_indicator_for_period.jinja2 b/server/cpho/jinja2/indicators/view_indicator_for_period.jinja2 index 1a17f616..fee73396 100644 --- a/server/cpho/jinja2/indicators/view_indicator_for_period.jinja2 +++ b/server/cpho/jinja2/indicators/view_indicator_for_period.jinja2 @@ -10,7 +10,7 @@ {% endblock %} {% block content %} -
{{ tm("indicator_data") }} : {{ object.name }} {{ period }}
+
{{ tm("indicator_data") }} : {{ object.bilingual_name }} {{ period }}
{% if respects_rule('can_edit_indicator_data', {"indicator": indicator, "period": period}) %} diff --git a/server/cpho/jinja2/modals/submission_modal.jinja2 b/server/cpho/jinja2/modals/submission_modal.jinja2 index 8130000d..85ed2e6c 100644 --- a/server/cpho/jinja2/modals/submission_modal.jinja2 +++ b/server/cpho/jinja2/modals/submission_modal.jinja2 @@ -11,7 +11,7 @@ + aria-label="{{ tm('close') }}">
- - - - - - - - {{ field_tr(tm("name") , ind.name) }} - {{ field_tr(tm("name_french") , ind.name_fr) }} +
+
{{ tm("field") }}{{ tm("value") }}
+ + + + + + + + {{ field_tr(tm("name") , ind.name) }} + {{ field_tr(tm("name_french") , ind.name_fr) }} - {{ field_tr(tm("category") , ind.get_category_display() ) }} - {{ field_tr(tm("topic") , ind.get_topic_display() ) }} + {{ field_tr(tm("category") , ind.get_category_display() ) }} + {{ field_tr(tm("topic") , ind.get_topic_display() ) }} - {{ field_tr(tm("detailed_indicator") , ind.detailed_indicator) }} - {{ field_tr(tm("detailed_indicator_french") , ind.detailed_indicator_fr) }} + {{ field_tr(tm("detailed_indicator") , ind.detailed_indicator) }} + {{ field_tr(tm("detailed_indicator_french") , ind.detailed_indicator_fr) }} - {{ field_tr(tm("sub_indicator_measurement") , ind.sub_indicator_measurement) }} - {{ field_tr(tm("sub_indicator_measurement_french") , ind.sub_indicator_measurement_fr) }} - - - - + {{ field_tr(tm("sub_indicator_measurement") , ind.sub_indicator_measurement) }} + {{ field_tr(tm("sub_indicator_measurement_french") , ind.sub_indicator_measurement_fr) }} + + + + - {{ header_tr(tm("general_metadata") ) }} + {{ header_tr(tm("general_metadata") ) }} - {{ field_tr(tm("measure_text") , ind.measure_text) }} - {{ field_tr(tm("measure_text_french") , ind.measure_text_fr) }} + {{ field_tr(tm("measure_text") , ind.measure_text) }} + {{ field_tr(tm("measure_text_french") , ind.measure_text_fr) }} - {{ field_tr(tm("impact_text") , ind.impact_text) }} - {{ field_tr(tm("impact_text_french") , ind.impact_text_fr) }} + {{ field_tr(tm("impact_text") , ind.impact_text) }} + {{ field_tr(tm("impact_text_french") , ind.impact_text_fr) }} - {{ field_tr(tm("title_overall") , ind.title_overall) }} - {{ field_tr(tm("title_overall_french") , ind.title_overall_fr) }} + {{ field_tr(tm("title_overall") , ind.title_overall) }} + {{ field_tr(tm("title_overall_french") , ind.title_overall_fr) }} - {{ field_tr(tm("table_title_overall") , ind.table_title_overall) }} - {{ field_tr(tm("table_title_overall_french") , ind.table_title_overall_fr) }} + {{ field_tr(tm("table_title_overall") , ind.table_title_overall) }} + {{ field_tr(tm("table_title_overall_french") , ind.table_title_overall_fr) }} - {{ field_tr(tm("sdg_goal") , ind.sdg_goal) }} - {{ field_tr(tm("sdg_goal_french") , ind.sdg_goal_fr) }} + {{ field_tr(tm("sdg_goal") , ind.sdg_goal) }} + {{ field_tr(tm("sdg_goal_french") , ind.sdg_goal_fr) }} - {{ field_tr(tm("general_footnotes") , ind.general_footnotes) }} - {{ field_tr(tm("general_footnotes_french") , ind.general_footnotes_fr) }} + {{ field_tr(tm("general_footnotes") , ind.general_footnotes) }} + {{ field_tr(tm("general_footnotes_french") , ind.general_footnotes_fr) }} - {{ field_tr(tm("main_source_english") , ind.main_source_english) }} - {{ field_tr(tm("main_source_french") , ind.main_source_fr) }} + {{ field_tr(tm("main_source_english") , ind.main_source_english) }} + {{ field_tr(tm("main_source_french") , ind.main_source_fr) }} - {{ field_tr(tm("other_relevant_sources_english") , ind.other_relevant_sources_english) }} - {{ field_tr(tm("other_relevant_sources_french") , ind.other_relevant_sources_fr) }} + {{ field_tr(tm("other_relevant_sources_english") , ind.other_relevant_sources_english) }} + {{ field_tr(tm("other_relevant_sources_french") , ind.other_relevant_sources_fr) }} - {{ field_tr(tm("recommendations_for_hso") , ind.recommendations_for_hso) }} - {{ field_tr(tm("recommendations_for_hso_french") , ind.recommendations_for_hso_fr) }} + {{ field_tr(tm("recommendations_for_hso") , ind.recommendations_for_hso) }} + {{ field_tr(tm("recommendations_for_hso_french") , ind.recommendations_for_hso_fr) }} - {{ header_tr(tm("sex_metadata") ) }} - {{ field_tr(tm("title_sex") , ind.title_sex) }} - {{ field_tr(tm("title_sex_french") , ind.title_sex_fr) }} + {{ header_tr(tm("sex_metadata") ) }} + {{ field_tr(tm("title_sex") , ind.title_sex) }} + {{ field_tr(tm("title_sex_french") , ind.title_sex_fr) }} - {{ field_tr(tm("table_title_sex") , ind.table_title_sex) }} - {{ field_tr(tm("table_title_sex_french") , ind.table_title_sex_fr) }} + {{ field_tr(tm("table_title_sex") , ind.table_title_sex) }} + {{ field_tr(tm("table_title_sex_french") , ind.table_title_sex_fr) }} - {{ header_tr(tm("grade_metadata") ) }} - {{ field_tr(tm("title_grade") , ind.title_grade) }} - {{ field_tr(tm("title_grade_french") , ind.title_grade_fr) }} + {{ header_tr(tm("grade_metadata") ) }} + {{ field_tr(tm("title_grade") , ind.title_grade) }} + {{ field_tr(tm("title_grade_french") , ind.title_grade_fr) }} - {{ field_tr(tm("table_title_grade") , ind.table_title_grade) }} - {{ field_tr(tm("table_title_grade_french") , ind.table_title_grade_fr) }} + {{ field_tr(tm("table_title_grade") , ind.table_title_grade) }} + {{ field_tr(tm("table_title_grade_french") , ind.table_title_grade_fr) }} - {{ header_tr(tm("hospital_setting_metadata") ) }} - {{ field_tr(tm("title_hospital_setting") , ind.title_hospital_setting) }} - {{ field_tr(tm("title_hospital_setting_french") , ind.title_hospital_setting_fr) }} + {{ header_tr(tm("hospital_setting_metadata") ) }} + {{ field_tr(tm("title_hospital_setting") , ind.title_hospital_setting) }} + {{ field_tr(tm("title_hospital_setting_french") , ind.title_hospital_setting_fr) }} - {{ field_tr(tm("table_title_hospital_setting") , ind.table_title_hospital_setting) }} - {{ field_tr(tm("table_title_hospital_setting_french") , ind.table_title_hospital_setting_fr) }} + {{ field_tr(tm("table_title_hospital_setting") , ind.table_title_hospital_setting) }} + {{ field_tr(tm("table_title_hospital_setting_french") , ind.table_title_hospital_setting_fr) }} - {{ header_tr(tm("age_metadata") ) }} - {{ field_tr(tm("title_age") , ind.title_age) }} - {{ field_tr(tm("title_age_french") , ind.title_age_fr) }} + {{ header_tr(tm("age_metadata") ) }} + {{ field_tr(tm("title_age") , ind.title_age) }} + {{ field_tr(tm("title_age_french") , ind.title_age_fr) }} - {{ field_tr(tm("table_title_age") , ind.table_title_age) }} - {{ field_tr(tm("table_title_age_french") , ind.table_title_age_fr) }} + {{ field_tr(tm("table_title_age") , ind.table_title_age) }} + {{ field_tr(tm("table_title_age_french") , ind.table_title_age_fr) }} - {{ header_tr(tm("province_metadata") ) }} - {{ field_tr(tm("title_province_territory") , ind.title_province_territory) }} - {{ field_tr(tm("title_province_territory_french") , ind.title_province_territory_fr) }} + {{ header_tr(tm("province_metadata") ) }} + {{ field_tr(tm("title_province_territory") , ind.title_province_territory) }} + {{ field_tr(tm("title_province_territory_french") , ind.title_province_territory_fr) }} - {{ field_tr(tm("table_title_province_territory") , ind.table_title_province_territory) }} - {{ field_tr(tm("table_title_province_territory_french") , ind.table_title_province_territory_fr) }} + {{ field_tr(tm("table_title_province_territory") , ind.table_title_province_territory) }} + {{ field_tr(tm("table_title_province_territory_french") , ind.table_title_province_territory_fr) }} - {{ field_tr(tm("pt_dynamic_text") , ind.pt_dynamic_text) }} - {{ field_tr(tm("pt_dynamic_text_french") , ind.pt_dynamic_text_fr) }} + {{ field_tr(tm("pt_dynamic_text") , ind.pt_dynamic_text) }} + {{ field_tr(tm("pt_dynamic_text_french") , ind.pt_dynamic_text_fr) }} - {{ header_tr(tm("living_arrangement_metadata") ) }} - {{ field_tr(tm("title_living_arrangement") , ind.title_living_arrangement) }} - {{ field_tr(tm("title_living_arrangement_french") , ind.title_living_arrangement_fr) }} + {{ header_tr(tm("living_arrangement_metadata") ) }} + {{ field_tr(tm("title_living_arrangement") , ind.title_living_arrangement) }} + {{ field_tr(tm("title_living_arrangement_french") , ind.title_living_arrangement_fr) }} - {{ field_tr(tm("table_title_living_arrangement") , ind.table_title_living_arrangement) }} - {{ field_tr(tm("table_title_living_arrangement_french") , ind.table_title_living_arrangement_fr) }} + {{ field_tr(tm("table_title_living_arrangement") , ind.table_title_living_arrangement) }} + {{ field_tr(tm("table_title_living_arrangement_french") , ind.table_title_living_arrangement_fr) }} - {{ header_tr(tm("education_household_metadata") ) }} - {{ field_tr(tm("title_education_household") , ind.title_education_household) }} - {{ field_tr(tm("title_education_household_french") , ind.title_education_household_fr) }} + {{ header_tr(tm("education_household_metadata") ) }} + {{ field_tr(tm("title_education_household") , ind.title_education_household) }} + {{ field_tr(tm("title_education_household_french") , ind.title_education_household_fr) }} - {{ field_tr(tm("table_title_education_household") , ind.table_title_education_household) }} - {{ field_tr(tm("table_title_education_household_french") , ind.table_title_education_household_fr) }} + {{ field_tr(tm("table_title_education_household") , ind.table_title_education_household) }} + {{ field_tr(tm("table_title_education_household_french") , ind.table_title_education_household_fr) }} - {{ header_tr(tm("income_quintiles_metadata") ) }} - {{ field_tr(tm("title_income_quintiles") , ind.title_income_quintiles) }} - {{ field_tr(tm("title_income_quintiles_french") , ind.title_income_quintiles_fr) }} + {{ header_tr(tm("income_quintiles_metadata") ) }} + {{ field_tr(tm("title_income_quintiles") , ind.title_income_quintiles) }} + {{ field_tr(tm("title_income_quintiles_french") , ind.title_income_quintiles_fr) }} - {{ field_tr(tm("table_title_income_quintiles") , ind.table_title_income_quintiles) }} - {{ field_tr(tm("table_title_income_quintiles_french") , ind.table_title_income_quintiles_fr) }} + {{ field_tr(tm("table_title_income_quintiles") , ind.table_title_income_quintiles) }} + {{ field_tr(tm("table_title_income_quintiles_french") , ind.table_title_income_quintiles_fr) }} - {{ header_tr(tm("trend_analysis_metadata") ) }} - {{ field_tr(tm("title_trend") , ind.title_trend) }} - {{ field_tr(tm("title_trend_french") , ind.title_trend_fr) }} + {{ header_tr(tm("trend_analysis_metadata") ) }} + {{ field_tr(tm("title_trend") , ind.title_trend) }} + {{ field_tr(tm("title_trend_french") , ind.title_trend_fr) }} - {{ field_tr(tm("table_title_trend") , ind.table_title_trend) }} - {{ field_tr(tm("table_title_trend_french") , ind.table_title_trend_fr) }} + {{ field_tr(tm("table_title_trend") , ind.table_title_trend) }} + {{ field_tr(tm("table_title_trend_french") , ind.table_title_trend_fr) }} - {{ field_tr(tm("visual_description_trend") , ind.visual_description_trend) }} - {{ field_tr(tm("visual_description_trend_french") , ind.visual_description_trend_fr) }} + {{ field_tr(tm("visual_description_trend") , ind.visual_description_trend) }} + {{ field_tr(tm("visual_description_trend_french") , ind.visual_description_trend_fr) }} - {{ field_tr(tm("x_axis_trend") , ind.x_axis_trend) }} - {{ field_tr(tm("x_axis_trend_french") , ind.x_axis_trend_fr) }} + {{ field_tr(tm("x_axis_trend") , ind.x_axis_trend) }} + {{ field_tr(tm("x_axis_trend_french") , ind.x_axis_trend_fr) }} - {{ field_tr(tm("y_axis_trend") , ind.y_axis_trend) }} - {{ field_tr(tm("y_axis_trend_french") , ind.y_axis_trend_fr) }} + {{ field_tr(tm("y_axis_trend") , ind.y_axis_trend) }} + {{ field_tr(tm("y_axis_trend_french") , ind.y_axis_trend_fr) }} - {{ field_tr(tm("y_axis_trend_min") , ind.y_axis_trend_min) }} - {{ field_tr(tm("y_axis_trend_max") , ind.y_axis_trend_max) }} + {{ field_tr(tm("y_axis_trend_min") , ind.y_axis_trend_min) }} + {{ field_tr(tm("y_axis_trend_max") , ind.y_axis_trend_max) }} - {{ field_tr(tm("trend_footnotes") , ind.trend_footnotes) }} - {{ field_tr(tm("trend_footnotes_french") , ind.trend_footnotes_fr) }} + {{ field_tr(tm("trend_footnotes") , ind.trend_footnotes) }} + {{ field_tr(tm("trend_footnotes_french") , ind.trend_footnotes_fr) }} - {{ header_tr(tm("benchmarking_metadata") ) }} - {{ field_tr(tm("title_benchmark") , ind.title_benchmark) }} - {{ field_tr(tm("title_benchmark_french") , ind.title_benchmark_fr) }} + {{ header_tr(tm("benchmarking_metadata") ) }} + {{ field_tr(tm("title_benchmark") , ind.title_benchmark) }} + {{ field_tr(tm("title_benchmark_french") , ind.title_benchmark_fr) }} - {{ field_tr(tm("table_title_benchmark") , ind.table_title_benchmark) }} - {{ field_tr(tm("table_title_benchmark_french") , ind.table_title_benchmark_fr) }} + {{ field_tr(tm("table_title_benchmark") , ind.table_title_benchmark) }} + {{ field_tr(tm("table_title_benchmark_french") , ind.table_title_benchmark_fr) }} - {{ field_tr(tm("x_axis_benchmark") , ind.x_axis_benchmark) }} - {{ field_tr(tm("x_axis_benchmark_french") , ind.x_axis_benchmark_fr) }} + {{ field_tr(tm("x_axis_benchmark") , ind.x_axis_benchmark) }} + {{ field_tr(tm("x_axis_benchmark_french") , ind.x_axis_benchmark_fr) }} - {{ field_tr(tm("benchmarking_dynamic_text") , ind.benchmarking_dynamic_text) }} - {{ field_tr(tm("benchmarking_dynamic_text_french") , ind.benchmarking_dynamic_text_fr) }} + {{ field_tr(tm("benchmarking_dynamic_text") , ind.benchmarking_dynamic_text) }} + {{ field_tr(tm("benchmarking_dynamic_text_french") , ind.benchmarking_dynamic_text_fr) }} - {{ field_tr(tm("benchmarking_footnotes") , ind.benchmarking_footnotes) }} - {{ field_tr(tm("benchmarking_footnotes_french") , ind.benchmarking_footnotes_fr) }} + {{ field_tr(tm("benchmarking_footnotes") , ind.benchmarking_footnotes) }} + {{ field_tr(tm("benchmarking_footnotes_french") , ind.benchmarking_footnotes_fr) }} - {{ field_tr(tm("benchmarking_sources_english") , ind.benchmarking_sources_english) }} - {{ field_tr(tm("benchmarking_sources_french") , ind.benchmarking_sources_fr) }} + {{ field_tr(tm("benchmarking_sources_english") , ind.benchmarking_sources_english) }} + {{ field_tr(tm("benchmarking_sources_french") , ind.benchmarking_sources_fr) }} - -
{{ tm("field") }}{{ tm("value") }}
{{ tm("relevant_dimensions") }} -
    - {% for item in ind.relevant_dimensions.all() %}
  • {{ item.name }}
  • {% endfor %} -
-
{{ tm("relevant_dimensions") }} +
    + {% for item in ind.relevant_dimensions.all() %} + {# #} +
  • {{ item.name }}
  • + {# #} + {% endfor %} +
+
+ + +
{{ tm("quintile_values") }}

{{ tm("quintile_metadata_description") }}

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ tm("quintile") }}G1G2 {{ tm("lower") }}G2 {{ tm("upper") }}G3 {{ tm("lower") }}G3 {{ tm("upper") }}G4 {{ tm("lower") }}G4 {{ tm("upper") }}G5
{{ tm("quintile_values") }}{{ ind.g1 }}{{ ind.g2_lower }}{{ ind.g2_upper }}{{ ind.g3_lower }}{{ ind.g3_upper }}{{ ind.g4_lower }}{{ ind.g4_upper }}{{ ind.g5 }}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ tm("quintile") }}G1G2 {{ tm("lower") }}G2 {{ tm("upper") }}G3 {{ tm("lower") }}G3 {{ tm("upper") }}G4 {{ tm("lower") }}G4 {{ tm("upper") }}G5
{{ tm("quintile_values") }}{{ ind.g1 }}{{ ind.g2_lower }}{{ ind.g2_upper }}{{ ind.g3_lower }}{{ ind.g3_upper }}{{ ind.g4_lower }}{{ ind.g4_upper }}{{ ind.g5 }}
+
@@ -292,32 +301,35 @@
- - - - - - - - - - - - - - {% for item in metadata["benchmarking"].order_by('labels', 'value') %} +
+ +
{{ tm("oecd_country") }}{{ tm("value") }}{{ tm("unit") }}{{ tm("year") }}{{ tm("comparison_to_oecd_average") }}{{ tm("labels") }}{{ tm("methodology_differences") }}
+ - - - - - - - + + + + + + + - {% endfor %} - -
{{ item.oecd_country }}{{ item.value }}{{ item.get_unit_display() }}{{ item.year }}{{ item.get_comparison_to_oecd_avg_display() }}{{ item.get_labels_display() }}{{ tm(item.get_methodology_differences_display() ) }}{{ tm("oecd_country") }}{{ tm("value") }}{{ tm("unit") }}{{ tm("year") }}{{ tm("comparison_to_oecd_average") }}{{ tm("labels") }}{{ tm("methodology_differences") }}
+ + + {% for item in metadata["benchmarking"].order_by('labels', 'value') %} + + {{ item.oecd_country }} + {{ item.value }} + {{ item.get_unit_display() }} + {{ item.year }} + {{ item.get_comparison_to_oecd_avg_display() }} + {{ item.get_labels_display() }} + {{ tm(item.get_methodology_differences_display() ) }} + + {% endfor %} + + +
@@ -344,36 +356,38 @@
- - - - - - - - - - - - - - - - {% for item in metadata["trend"] %} +
+
{{ tm("year_or_range") }}{{ tm("data_point") }}{{ tm("line_of_best_fit_point") }}{{ tm("trend_segment") }}{{ tm("trend") }}{{ tm("data_quality") }}{{ tm("unit") }}{{ tm("data_lower_ci") }}{{ tm("data_upper_ci") }}
+ - - - - - - - - - + + + + + + + + + - {% endfor %} - -
{{ item.year }}{{ item.data_point }}{{ item.line_of_best_fit_point }}{{ item.trend_segment }}{{ item.get_trend_display() }}{{ item.get_data_quality_display() }}{{ item.get_unit_display() }}{{ item.data_point_lower_ci }}{{ item.data_point_upper_ci }}{{ tm("year_or_range") }}{{ tm("data_point") }}{{ tm("line_of_best_fit_point") }}{{ tm("trend_segment") }}{{ tm("trend") }}{{ tm("data_quality") }}{{ tm("unit") }}{{ tm("data_lower_ci") }}{{ tm("data_upper_ci") }}
+ + + {% for item in metadata["trend"] %} + + {{ item.year }} + {{ item.data_point }} + {{ item.line_of_best_fit_point }} + {{ item.trend_segment }} + {{ item.get_trend_display() }} + {{ item.get_data_quality_display() }} + {{ item.get_unit_display() }} + {{ item.data_point_lower_ci }} + {{ item.data_point_upper_ci }} + + {% endfor %} + + +
diff --git a/server/cpho/jinja2/trend_analysis/manage_trend_analysis_data.jinja2 b/server/cpho/jinja2/trend_analysis/manage_trend_analysis_data.jinja2 index d39c899b..eb03eddf 100644 --- a/server/cpho/jinja2/trend_analysis/manage_trend_analysis_data.jinja2 +++ b/server/cpho/jinja2/trend_analysis/manage_trend_analysis_data.jinja2 @@ -7,29 +7,36 @@ {{ bc.item(tm("trend_analysis") , None, True) }} {% endblock %} -{% macro trend_analysis_form_field_with_errors(field) %} - {{ field }} +{% macro trend_analysis_form_field_with_errors(field,row_label_id) %} + {{ field.as_widget(attrs={"aria-labelledby": row_label_id}) }} {% if field.errors %} -
+
{% for error in field.errors %}{{ error|escape }}{% endfor %}
{% endif %} {% endmacro %} {% macro trend_analysis_form(form) %} + {% set row_label_id = form.prefix ~ "-row-label" %} - {{ trend_analysis_form_field_with_errors(form.year) }} - {{ trend_analysis_form_field_with_errors(form.data_point) }} - {{ trend_analysis_form_field_with_errors(form.line_of_best_fit_point) }} - {{ trend_analysis_form_field_with_errors(form.trend_segment) }} - {{ form.trend }} - {{ form.data_quality }} - {{ form.unit }} - {{ trend_analysis_form_field_with_errors(form.data_point_lower_ci) }} - {{ trend_analysis_form_field_with_errors(form.data_point_upper_ci) }} - {{ form.is_deleted }} + {{ trend_analysis_form_field_with_errors(form.year, row_label_id) }} + + + + + + {{ trend_analysis_form_field_with_errors(form.data_point, row_label_id) }} + {{ trend_analysis_form_field_with_errors(form.line_of_best_fit_point, row_label_id) }} + {{ trend_analysis_form_field_with_errors(form.trend_segment, row_label_id) }} + {{ form.trend.as_widget(attrs={"aria-labelledby": row_label_id}) }} + {{ form.data_quality.as_widget(attrs={"aria-labelledby": row_label_id}) }} + {{ form.unit.as_widget(attrs={"aria-labelledby": row_label_id}) }} + {{ trend_analysis_form_field_with_errors(form.data_point_lower_ci, row_label_id) }} + {{ trend_analysis_form_field_with_errors(form.data_point_upper_ci, row_label_id) }} + + {{ form.is_deleted.as_widget(attrs={"aria-labelledby": row_label_id}) }} {{ form.id }} @@ -84,29 +91,6 @@ class="btn btn-primary float-end my-3" value="{{ tm('save') }}"> - + {% endblock %} diff --git a/server/cpho/jinja2/user_management/indicator_directory_home.jinja2 b/server/cpho/jinja2/user_management/indicator_directory_home.jinja2 index aa5fac6a..ab26e17e 100644 --- a/server/cpho/jinja2/user_management/indicator_directory_home.jinja2 +++ b/server/cpho/jinja2/user_management/indicator_directory_home.jinja2 @@ -26,26 +26,29 @@

{{ tm("users") }}

- - - - - - - {% for user in indicator_directory.users.all() %} - - - - - {% endfor %} - -
{{ tm("user") }}{{ tm("last_login") }}
{{ user }} - {% if user.last_login %} - {{ date_display(user.last_login) }} - {% else %} - {{ tm("never") }} - {% endif %} -
+
+ + + + + + + + {% for user in indicator_directory.users.all() %} + + + + + {% endfor %} + +
{{ tm("user") }}{{ tm("last_login") }}
{{ user }} + {% if user.last_login %} + {{ date_display(user.last_login) }} + {% else %} + {{ tm("never") }} + {% endif %} +
+
diff --git a/server/cpho/jinja2/user_management/user_management_page.jinja2 b/server/cpho/jinja2/user_management/user_management_page.jinja2 index c3fc0b11..acb59d16 100644 --- a/server/cpho/jinja2/user_management/user_management_page.jinja2 +++ b/server/cpho/jinja2/user_management/user_management_page.jinja2 @@ -3,39 +3,42 @@ {% block content %}

{{ tm("user_management") }}

- - - - - - - - - - - {% for user in all_users %} +
+ +
{{ tdt("Username") }}{{ tdt("Special roles") }}{{ tdt("Last login") }}{{ tdt("Modify") }}
+ - - - - + + + + - {% endfor %} - -
{{ user }} - {% if user.is_admin %}{{ tdt("Admin") }}{% endif %} - {% if user.is_hso %}{{ tdt("HSO") }}{% endif %} - - {% if user.last_login %}{{ date_display(user.last_login) }}{% endif %} - - {{ tdt("Modify") }} - {{ tdt("Username") }}{{ tdt("Special roles") }}{{ tdt("Last login") }}{{ tdt("Modify") }}
+ + + {% for user in all_users %} + + {{ user }} + + {% if user.is_admin %}{{ tdt("Admin") }}{% endif %} + {% if user.is_hso %}{{ tdt("HSO") }}{% endif %} + + + {% if user.last_login %}{{ date_display(user.last_login) }}{% endif %} + + + {{ tm("edit") }} + + + {% endfor %} + + +
- {{ tdt("Create new user") }} + {{ tm("create_new_user") }}
-

{{ tdt("Indicator directories") }}

+

{{ tm("indicator_directories") }}