Skip to content

Commit c00cfd5

Browse files
authored
Merge pull request #1556 from open-data/feature/handle-dataset-resource-validation
New Translations and Template Code for Delete Resource Confirmation
2 parents afad39c + f4328bd commit c00cfd5

File tree

6 files changed

+182
-1
lines changed

6 files changed

+182
-1
lines changed

changes/1556.changes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
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.

ckanext/canada/strings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@
8888
_('Currently re-indexing records') # TODO: remove after upstream contrib
8989
_('All records indexed') # TODO: remove after upstream contrib
9090
_('Error indexing records') # TODO: remove after upstream contrib
91+
_('Could not create or update resource because another resource in this dataset has errors: {}')
92+
_('Could not delete resource because another resource in this dataset has errors: {}')
93+
_('Could not reorder resources because a resource in this dataset has errors: {}')
94+
_('Could not create or update resource because the dataset has errors')
95+
_('Could not delete resource because the dataset has errors')
96+
_('Could not reorder resources because the dataset has errors')
9197

9298
# strings from security
9399
_("Please upload a file or link to an external resource")

ckanext/canada/templates/package/confirm_delete_resource.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55
{% block primary_content_inner %}
66
<div class="col-md-12">
77
{% block form %}
8+
{% block errors %}
9+
{%- set schema = h.scheming_get_dataset_schema(dataset_type) -%}
10+
{% if resource_validation_errors %}
11+
{%- snippet 'scheming/snippets/resource_validation_errors.html',
12+
errors=resource_validation_errors, resource_fields=schema.resource_fields,
13+
dataset_fields=schema.dataset_fields, pkg_dict=pkg_dict,
14+
entity_type='dataset', object_type=dataset_type -%}
15+
{% else %}
16+
{%- snippet 'scheming/snippets/errors.html',
17+
errors=errors, fields=schema.resource_fields,
18+
entity_type='dataset', object_type=dataset_type -%}
19+
{% endif %}
20+
{% endblock %}
821
<p>{{ _('Are you sure you want to delete resource - {name}?').format(name=h.resource_display_name(g.resource_dict)) }}</p>
922
<p class="form-actions">
1023
<form action="{{ h.url_for('dataset_resource.delete', resource_id=g.resource_dict.id, id=pkg_id) }}" method="post">

ckanext/canada/templates/scheming/package/snippets/resource_form.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

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

5+
{% block errors %}
6+
{%- if resource_validation_errors -%}
7+
{%- set schema = h.scheming_get_dataset_schema(dataset_type) -%}
8+
{%- snippet 'scheming/snippets/resource_validation_errors.html',
9+
errors=resource_validation_errors, resource_fields=schema.resource_fields,
10+
dataset_fields=schema.dataset_fields, pkg_dict=pkg_dict,
11+
entity_type='dataset', object_type=dataset_type -%}
12+
{%- else -%}
13+
{{ super() }}
14+
{%- endif -%}
15+
{% endblock %}
16+
517
{# Separate our resource fields into common and resource/related-specific panels #}
618

719
{% block basic_fields %}

ckanext/canada/templates/scheming/snippets/errors.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,5 @@ <h3>{{_('Errors in form')}}</h3>
99
{{ super() }}
1010
{% endblock %}
1111
</ul>
12-
</h3>
1312
</section>
1413
{% endblock %}
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
{# shallow copy errors so we can remove processed keys #}
2+
{%- set unprocessed = errors.copy() -%}
3+
4+
{% block errors_list %}
5+
<section class="alert alert-danger{{ ' ' ~ classes | join(' ') }}">
6+
<h3>{{_('Errors in dataset')}}</h3>
7+
{% if 'dataset' in unprocessed and unprocessed.dataset %}
8+
{% set dataset_link = h.url_for('dataset.read', id=pkg_dict.id) %}
9+
{% set dataset_name = h.get_translated(pkg_dict, 'title') %}
10+
<p>{{ _('The dataset <a href="{0}" target="_blank">{1}</a> contains errors:').format(dataset_link, dataset_name) }}</p>
11+
<ul>
12+
{%- for field in dataset_fields -%}
13+
{%- if 'error_snippet' in field -%}
14+
{%- set error_snippet = field.error_snippet -%}
15+
16+
{%- if '/' not in error_snippet -%}
17+
{%- set error_snippet = 'scheming/error_snippets/' +
18+
error_snippet -%}
19+
{%- endif -%}
20+
21+
{%- snippet error_snippet, unprocessed=unprocessed.dataset,
22+
field=field, fields=dataset_fields,
23+
entity_type=entity_type, object_type=object_type -%}
24+
{%- endif -%}
25+
26+
{%- if field.field_name in unprocessed.dataset -%}
27+
{%- set errors = unprocessed.dataset.pop(field.field_name) -%}
28+
{%- if 'repeating_subfields' in field %}
29+
{%- for se in errors -%}
30+
{%- if se -%}
31+
<li data-field-label="{{ field.field_name }}-{{ loop.index }}">{{
32+
h.scheming_language_text(field.repeating_label or field.label) }} {{ loop.index }}:
33+
<ul>
34+
{%- for sf in field.repeating_subfields -%}
35+
{%- set se_unprocessed = se.copy() -%}
36+
37+
{%- if 'error_snippet' in sf -%}
38+
{%- set sfe_snippet = sf.error_snippet -%}
39+
40+
{%- if '/' not in sfe_snippet -%}
41+
{%- set sfe_snippet = 'scheming/error_snippets/' +
42+
sfe_snippet -%}
43+
{%- endif -%}
44+
45+
{%- snippet sfe_snippet, unprocessed=se_unprocessed,
46+
field=sf, fields=field.repeating_subfileds,
47+
entity_type=entity_type, object_type=object_type -%}
48+
{%- endif -%}
49+
50+
{%- if sf.field_name in se_unprocessed -%}
51+
<li data-field-label="{{ field.field_name }}-{{ loop.index }}-{{ sf.field_name }}">{{
52+
h.scheming_language_text(sf.label) }}:
53+
{{ se_unprocessed[sf.field_name][0] }}</li>
54+
{%- endif -%}
55+
{%- endfor -%}
56+
</ul>
57+
</li>
58+
{%- endif -%}
59+
{%- endfor -%}
60+
{%- else -%}
61+
<li data-field-label="{{ field.field_name }}">{{
62+
h.scheming_language_text(field.label) }}:
63+
{{ errors[0] }}</li>
64+
{%- endif -%}
65+
{%- endif -%}
66+
{%- endfor -%}
67+
68+
{%- for key, errors in unprocessed.dataset.items() | sort -%}
69+
<li data-field-label="{{ key }}">{{ _(key) }}: {{ errors[0] }}</li>
70+
{%- endfor -%}
71+
</ul>
72+
{% endif %}
73+
{% if 'resources' in unprocessed and unprocessed.resources %}
74+
<p>{{ _('The dataset contains invalid resources:') }}</p>
75+
<ul>
76+
{% for res_id, errs in unprocessed.resources.items() %}
77+
{% set ns = namespace(resource_name=res_id) %}
78+
{% for r in pkg_dict.resources %}
79+
{% if r.id == res_id %}
80+
{% set ns.resource_name = h.get_translated(r, 'name') %}
81+
{% break %}
82+
{% endif %}
83+
{% endfor %}
84+
<li><a href="{{ h.url_for('resource.read', id=pkg_dict.id, resource_id=res_id) }}" target="_blank">{{ ns.resource_name }}</a></li>
85+
<ul>
86+
{%- for field in resource_fields -%}
87+
{%- if 'error_snippet' in field -%}
88+
{%- set error_snippet = field.error_snippet -%}
89+
90+
{%- if '/' not in error_snippet -%}
91+
{%- set error_snippet = 'scheming/error_snippets/' +
92+
error_snippet -%}
93+
{%- endif -%}
94+
95+
{%- snippet error_snippet, unprocessed=unprocessed.resources[res_id],
96+
field=field, fields=resource_fields,
97+
entity_type=entity_type, object_type=object_type -%}
98+
{%- endif -%}
99+
100+
{%- if field.field_name in unprocessed.resources[res_id] -%}
101+
{%- set errors = unprocessed.resources[res_id].pop(field.field_name) -%}
102+
{%- if 'repeating_subfields' in field %}
103+
{%- for se in errors -%}
104+
{%- if se -%}
105+
<li data-field-label="{{ field.field_name }}-{{ loop.index }}">{{
106+
h.scheming_language_text(field.repeating_label or field.label) }} {{ loop.index }}:
107+
<ul>
108+
{%- for sf in field.repeating_subfields -%}
109+
{%- set se_unprocessed = se.copy() -%}
110+
111+
{%- if 'error_snippet' in sf -%}
112+
{%- set sfe_snippet = sf.error_snippet -%}
113+
114+
{%- if '/' not in sfe_snippet -%}
115+
{%- set sfe_snippet = 'scheming/error_snippets/' +
116+
sfe_snippet -%}
117+
{%- endif -%}
118+
119+
{%- snippet sfe_snippet, unprocessed=se_unprocessed,
120+
field=sf, fields=field.repeating_subfileds,
121+
entity_type=entity_type, object_type=object_type -%}
122+
{%- endif -%}
123+
124+
{%- if sf.field_name in se_unprocessed -%}
125+
<li data-field-label="{{ field.field_name }}-{{ loop.index }}-{{ sf.field_name }}">{{
126+
h.scheming_language_text(sf.label) }}:
127+
{{ se_unprocessed[sf.field_name][0] }}</li>
128+
{%- endif -%}
129+
{%- endfor -%}
130+
</ul>
131+
</li>
132+
{%- endif -%}
133+
{%- endfor -%}
134+
{%- else -%}
135+
<li data-field-label="{{ field.field_name }}">{{
136+
h.scheming_language_text(field.label) }}:
137+
{{ errors[0] }}</li>
138+
{%- endif -%}
139+
{%- endif -%}
140+
{%- endfor -%}
141+
142+
{%- for key, errors in unprocessed.resources[res_id].items() | sort -%}
143+
<li data-field-label="{{ key }}">{{ _(key) }}: {{ errors[0] }}</li>
144+
{%- endfor -%}
145+
</ul>
146+
{% endfor %}
147+
</ul>
148+
{% endif %}
149+
</section>
150+
{% endblock %}

0 commit comments

Comments
 (0)