Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/1556.changes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Display errors on the Confirm Resource Delete page. Added new translations for nested resource validation errors. Adds a ckanext-scheming template for the nested resource validation errors to display field labels from the Schema. Adds `get_dataset_title_translated` and `get_resource_name_translated` template helpers to display the Dataset and Resource names in the nested resource validation error messages.
6 changes: 6 additions & 0 deletions ckanext/canada/strings.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@
_('Currently re-indexing records') # TODO: remove after upstream contrib
_('All records indexed') # TODO: remove after upstream contrib
_('Error indexing records') # TODO: remove after upstream contrib
_('Could not create or update resource because another resource in this dataset has errors: {}')
_('Could not delete resource because another resource in this dataset has errors: {}')
_('Could not reorder resources because a resource in this dataset has errors: {}')
_('Could not create or update resource because the dataset has errors')
_('Could not delete resource because the dataset has errors')
_('Could not reorder resources because the dataset has errors')

# strings from security
_("Please upload a file or link to an external resource")
Expand Down
13 changes: 13 additions & 0 deletions ckanext/canada/templates/package/confirm_delete_resource.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,19 @@
{% block primary_content_inner %}
<div class="col-md-12">
{% block form %}
{% block errors %}
{%- set schema = h.scheming_get_dataset_schema(dataset_type) -%}
{% if resource_validation_errors %}
{%- snippet 'scheming/snippets/resource_validation_errors.html',
errors=resource_validation_errors, resource_fields=schema.resource_fields,
dataset_fields=schema.dataset_fields, pkg_dict=pkg_dict,
entity_type='dataset', object_type=dataset_type -%}
{% else %}
{%- snippet 'scheming/snippets/errors.html',
errors=errors, fields=schema.resource_fields,
entity_type='dataset', object_type=dataset_type -%}
{% endif %}
{% endblock %}
<p>{{ _('Are you sure you want to delete resource - {name}?').format(name=h.resource_display_name(g.resource_dict)) }}</p>
<p class="form-actions">
<form action="{{ h.url_for('dataset_resource.delete', resource_id=g.resource_dict.id, id=pkg_id) }}" method="post">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

{% import 'macros/form.html' as form %}

{% block errors %}
{%- if resource_validation_errors -%}
{%- set schema = h.scheming_get_dataset_schema(dataset_type) -%}
{%- snippet 'scheming/snippets/resource_validation_errors.html',
errors=resource_validation_errors, resource_fields=schema.resource_fields,
dataset_fields=schema.dataset_fields, pkg_dict=pkg_dict,
entity_type='dataset', object_type=dataset_type -%}
{%- else -%}
{{ super() }}
{%- endif -%}
{% endblock %}

{# Separate our resource fields into common and resource/related-specific panels #}

{% block basic_fields %}
Expand Down
1 change: 0 additions & 1 deletion ckanext/canada/templates/scheming/snippets/errors.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,5 @@ <h3>{{_('Errors in form')}}</h3>
{{ super() }}
{% endblock %}
</ul>
</h3>
</section>
{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
{# shallow copy errors so we can remove processed keys #}
{%- set unprocessed = errors.copy() -%}

{% block errors_list %}
<section class="alert alert-danger{{ ' ' ~ classes | join(' ') }}">
<h3>{{_('Errors in dataset')}}</h3>
{% if 'dataset' in unprocessed and unprocessed.dataset %}
{% set dataset_link = h.url_for('dataset.read', id=pkg_dict.id) %}
{% set dataset_name = h.get_translated(pkg_dict, 'title') %}
<p>{{ _('The dataset <a href="{0}" target="_blank">{1}</a> contains errors:').format(dataset_link, dataset_name) }}</p>
<ul>
{%- for field in dataset_fields -%}
{%- if 'error_snippet' in field -%}
{%- set error_snippet = field.error_snippet -%}

{%- if '/' not in error_snippet -%}
{%- set error_snippet = 'scheming/error_snippets/' +
error_snippet -%}
{%- endif -%}

{%- snippet error_snippet, unprocessed=unprocessed.dataset,
field=field, fields=dataset_fields,
entity_type=entity_type, object_type=object_type -%}
{%- endif -%}

{%- if field.field_name in unprocessed.dataset -%}
{%- set errors = unprocessed.dataset.pop(field.field_name) -%}
{%- if 'repeating_subfields' in field %}
{%- for se in errors -%}
{%- if se -%}
<li data-field-label="{{ field.field_name }}-{{ loop.index }}">{{
h.scheming_language_text(field.repeating_label or field.label) }} {{ loop.index }}:
<ul>
{%- for sf in field.repeating_subfields -%}
{%- set se_unprocessed = se.copy() -%}

{%- if 'error_snippet' in sf -%}
{%- set sfe_snippet = sf.error_snippet -%}

{%- if '/' not in sfe_snippet -%}
{%- set sfe_snippet = 'scheming/error_snippets/' +
sfe_snippet -%}
{%- endif -%}

{%- snippet sfe_snippet, unprocessed=se_unprocessed,
field=sf, fields=field.repeating_subfileds,
entity_type=entity_type, object_type=object_type -%}
{%- endif -%}

{%- if sf.field_name in se_unprocessed -%}
<li data-field-label="{{ field.field_name }}-{{ loop.index }}-{{ sf.field_name }}">{{
h.scheming_language_text(sf.label) }}:
{{ se_unprocessed[sf.field_name][0] }}</li>
{%- endif -%}
{%- endfor -%}
</ul>
</li>
{%- endif -%}
{%- endfor -%}
{%- else -%}
<li data-field-label="{{ field.field_name }}">{{
h.scheming_language_text(field.label) }}:
{{ errors[0] }}</li>
{%- endif -%}
{%- endif -%}
{%- endfor -%}

{%- for key, errors in unprocessed.dataset.items() | sort -%}
<li data-field-label="{{ key }}">{{ _(key) }}: {{ errors[0] }}</li>
{%- endfor -%}
</ul>
{% endif %}
{% if 'resources' in unprocessed and unprocessed.resources %}
<p>{{ _('The dataset contains invalid resources:') }}</p>
<ul>
{% for res_id, errs in unprocessed.resources.items() %}
{% set ns = namespace(resource_name=res_id) %}
{% for r in pkg_dict.resources %}
{% if r.id == res_id %}
{% set ns.resource_name = h.get_translated(r, 'name') %}
{% break %}
{% endif %}
{% endfor %}
<li><a href="{{ h.url_for('resource.read', id=pkg_dict.id, resource_id=res_id) }}" target="_blank">{{ ns.resource_name }}</a></li>
<ul>
{%- for field in resource_fields -%}
{%- if 'error_snippet' in field -%}
{%- set error_snippet = field.error_snippet -%}

{%- if '/' not in error_snippet -%}
{%- set error_snippet = 'scheming/error_snippets/' +
error_snippet -%}
{%- endif -%}

{%- snippet error_snippet, unprocessed=unprocessed.resources[res_id],
field=field, fields=resource_fields,
entity_type=entity_type, object_type=object_type -%}
{%- endif -%}

{%- if field.field_name in unprocessed.resources[res_id] -%}
{%- set errors = unprocessed.resources[res_id].pop(field.field_name) -%}
{%- if 'repeating_subfields' in field %}
{%- for se in errors -%}
{%- if se -%}
<li data-field-label="{{ field.field_name }}-{{ loop.index }}">{{
h.scheming_language_text(field.repeating_label or field.label) }} {{ loop.index }}:
<ul>
{%- for sf in field.repeating_subfields -%}
{%- set se_unprocessed = se.copy() -%}

{%- if 'error_snippet' in sf -%}
{%- set sfe_snippet = sf.error_snippet -%}

{%- if '/' not in sfe_snippet -%}
{%- set sfe_snippet = 'scheming/error_snippets/' +
sfe_snippet -%}
{%- endif -%}

{%- snippet sfe_snippet, unprocessed=se_unprocessed,
field=sf, fields=field.repeating_subfileds,
entity_type=entity_type, object_type=object_type -%}
{%- endif -%}

{%- if sf.field_name in se_unprocessed -%}
<li data-field-label="{{ field.field_name }}-{{ loop.index }}-{{ sf.field_name }}">{{
h.scheming_language_text(sf.label) }}:
{{ se_unprocessed[sf.field_name][0] }}</li>
{%- endif -%}
{%- endfor -%}
</ul>
</li>
{%- endif -%}
{%- endfor -%}
{%- else -%}
<li data-field-label="{{ field.field_name }}">{{
h.scheming_language_text(field.label) }}:
{{ errors[0] }}</li>
{%- endif -%}
{%- endif -%}
{%- endfor -%}

{%- for key, errors in unprocessed.resources[res_id].items() | sort -%}
<li data-field-label="{{ key }}">{{ _(key) }}: {{ errors[0] }}</li>
{%- endfor -%}
</ul>
{% endfor %}
</ul>
{% endif %}
</section>
{% endblock %}
Loading