Skip to content

Commit 536933f

Browse files
committed
feat(logic,views): RecombinantFieldError;
- `KeyError` -> `RecombinantFieldError` - Sysadmin only refresh.
1 parent 24447f6 commit 536933f

File tree

5 files changed

+51
-47
lines changed

5 files changed

+51
-47
lines changed

ckanext/recombinant/errors.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ class RecombinantException(Exception):
77
pass
88

99

10+
class RecombinantFieldError(Exception):
11+
pass
12+
13+
1014
class RecombinantConfigurationError(Exception):
1115
pass
1216

ckanext/recombinant/templates/recombinant/force_update.html

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<h3>{{_('Errors in Recombinant Resource')}}</h3>
2+
<p>{{ _('The Recombinant resource is out of date:') }}</p>
3+
<ul>
4+
<li>{{ _('Field(s) <em>{0}</em> do not exist in the database for this resource.').format(key_errors) }}</li>
5+
</ul>
6+
{% if not g.userobj.sysadmin %}
7+
<p>{{ _('Please contact <a href="mailto:open-ouvert@tbs-sct.gc.ca">open-ouvert@tbs-sct.gc.ca</a> for assistance.') }}</p>
8+
{% else %}
9+
{# only let sysadmins refresh the recombinant record via UI #}
10+
<div class="clearfix"></div>
11+
<h3>{{ _('Refresh Recombinant Resource') }}{% snippet 'snippets/sysadmin_only.html' %}</h3>
12+
<p>{{ _('You can refresh your resource in the database to try to solve the problem.') }}</p>
13+
<div class="clearfix"></div>
14+
<p class="form-actions">
15+
<form id="recombinant-refresh-form" action="{{ h.url_for('recombinant.refresh_dataset', resource_name=res_name, owner_org=owner_org) }}" method="post">
16+
{{ h.csrf_input() }}
17+
<input type="hidden" name="dataset_id" value="{{ dataset_id }}"/>
18+
<button class="btn btn-danger mrgn-bttm-md m-b-3" type="submit" name="refresh" >{{ _('Refresh…') }}</button>
19+
</form>
20+
</p>
21+
{% endif %}

ckanext/recombinant/views.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from ckanext.recombinant.errors import (
3434
RecombinantException,
35+
RecombinantFieldError,
3536
BadExcelData,
3637
format_trigger_error
3738
)
@@ -106,13 +107,15 @@ def upload(id: str) -> Union[Response, str]:
106107
return h.redirect_to('recombinant.preview_table',
107108
resource_name=resource_name,
108109
owner_org=org['name'])
109-
except KeyError as e:
110-
return render(
111-
'recombinant/force_update.html',
112-
extra_vars={'key_errors': str(e).replace("'", ''),
113-
'dataset_id': dataset['id'],
114-
'res_name': resource_name,
115-
'owner_org': dataset['owner_org']})
110+
except RecombinantFieldError as e:
111+
h.flash_error(render('recombinant/snippets/outdated_error.html',
112+
extra_vars={'key_errors': str(e).replace("'", ''),
113+
'dataset_id': dataset['id'],
114+
'res_name': resource_name,
115+
'owner_org': dataset['owner_org']}))
116+
return h.redirect_to('recombinant.preview_table',
117+
resource_name=resource_name,
118+
owner_org=org['name'])
116119
except BadExcelData as e:
117120
h.flash_error(_(e.message))
118121
return h.redirect_to('recombinant.preview_table',
@@ -331,13 +334,15 @@ def template(dataset_type: str, lang: str, owner_org: str) -> Union[Response, st
331334

332335
try:
333336
append_data(book, record_data, chromo)
334-
except KeyError as e:
335-
return render(
336-
'recombinant/force_update.html',
337-
extra_vars={'key_errors': str(e).replace("'", ''),
338-
'dataset_id': dataset['id'],
339-
'res_name': resource['name'],
340-
'owner_org': dataset['owner_org']})
337+
except RecombinantFieldError as e:
338+
h.flash_error(render('recombinant/snippets/outdated_error.html',
339+
extra_vars={'key_errors': str(e).replace("'", ''),
340+
'dataset_id': dataset['id'],
341+
'res_name': resource_name,
342+
'owner_org': dataset['owner_org']}))
343+
return h.redirect_to('recombinant.preview_table',
344+
resource_name=resource_name,
345+
owner_org=org['name'])
341346

342347
resource_names = dict((r['id'], r['name']) for r in dataset['resources'])
343348
ds_info = lc.action.datastore_info(id=resource['id'])
@@ -665,13 +670,15 @@ def preview_table(resource_name: str,
665670
@recombinant.route('/recombinant/refresh/<resource_name>/<owner_org>',
666671
methods=['GET', 'POST'])
667672
def refresh_dataset(resource_name: str, owner_org: str):
673+
if not is_sysadmin(g.user):
674+
return abort(403)
668675
if request.method != 'POST':
669676
# handle page refreshes
670677
h.flash_notice(_('Form not submitted, please try again.'))
671678
return h.redirect_to('recombinant.preview_table',
672679
resource_name=resource_name,
673680
owner_org=owner_org)
674-
if 'confirm' in request.form:
681+
if 'refresh' in request.form:
675682
dataset_id = request.form['dataset_id']
676683
if not dataset_id:
677684
h.flash_error(_('Could not determine dataset to update.'))
@@ -832,7 +839,7 @@ def _process_upload_file(lc: LocalCKAN,
832839
key = key.group(1)
833840
else:
834841
key = _('unknown')
835-
raise KeyError(key)
842+
raise RecombinantFieldError(key)
836843
else:
837844
# type_ignore_reason: incomplete typing
838845
pgerror = e.error_dict['records'][0] # type: ignore

ckanext/recombinant/write_excel.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from typing import Any, Dict, List, Tuple, Optional, Union
2222

2323
from ckanext.recombinant.tables import get_geno
24-
from ckanext.recombinant.errors import RecombinantException
24+
from ckanext.recombinant.errors import RecombinantException, RecombinantFieldError
2525
from ckanext.recombinant.datatypes import datastore_type
2626
from ckanext.recombinant.helpers import (
2727
recombinant_choice_fields, recombinant_language_text)
@@ -175,6 +175,8 @@ def append_data(book: Workbook,
175175
current_row = DATA_FIRST_ROW
176176
for record in record_data:
177177
for col_num, field in template_cols_fields(chromo):
178+
if field['datastore_id'] not in record:
179+
raise RecombinantFieldError(field['datastore_id'])
178180
item = datastore_type_format(
179181
record[field['datastore_id']], field['datastore_type'])
180182
sheet.cell(row=current_row, column=col_num).value = item

0 commit comments

Comments
 (0)