From 1b4213e39e8515b0ff40ee0b8af301d8449f0f30 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sat, 23 Dec 2023 13:42:56 +0100 Subject: [PATCH 01/10] Update version --- rdmo/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdmo/__init__.py b/rdmo/__init__.py index 58039f5051..e1a0667327 100644 --- a/rdmo/__init__.py +++ b/rdmo/__init__.py @@ -1 +1 @@ -__version__ = "2.1.1" +__version__ = "2.1.2.dev1" From 6edcaae96ee889d57538e5f64d764aa4ca915554 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sat, 23 Dec 2023 13:44:20 +0100 Subject: [PATCH 02/10] Fix webpack config --- webpack/common.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webpack/common.config.js b/webpack/common.config.js index 15ca8de8a7..57f6f89b9b 100644 --- a/webpack/common.config.js +++ b/webpack/common.config.js @@ -40,7 +40,9 @@ const base = { test: /(fonts|files)\/.*\.(svg|woff2?|ttf|eot|otf)(\?.*)?$/, loader: 'file-loader', options: { - name: 'fonts/[name].[ext]' + name: '[name].[ext]', + outputPath: 'fonts', + postTransformPublicPath: (p) => `'../' + ${p}` } } ] From d4e0059ce9485b94c1b0710e68212a4b20af82fd Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sat, 23 Dec 2023 13:46:16 +0100 Subject: [PATCH 03/10] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d51cb9688..c2fad60c21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [RDMO 2.1.2](https://github.com/rdmorganiser/rdmo/compare/2.1.1...2.1.2) + +* Fix a bug with webpack font paths + ## [RDMO 2.1.1](https://github.com/rdmorganiser/rdmo/compare/2.1.0...2.1.1) (Dec 21, 2023) * Fix translations From 38b4e86a6fec69601e1f2db256248248011991b8 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Sat, 23 Dec 2023 14:59:19 +0100 Subject: [PATCH 04/10] Fix options actions in ProjectViewSet --- CHANGELOG.md | 1 + rdmo/projects/viewsets.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2fad60c21..bfefa671a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [RDMO 2.1.2](https://github.com/rdmorganiser/rdmo/compare/2.1.1...2.1.2) * Fix a bug with webpack font paths +* Fix a bug with option set provider plugins ## [RDMO 2.1.1](https://github.com/rdmorganiser/rdmo/compare/2.1.0...2.1.1) (Dec 21, 2023) diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index 235573deb9..c45ad45cce 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -166,7 +166,7 @@ def options(self, request, pk=None): if Question.objects.filter_by_catalog(project.catalog).filter(optionsets=optionset) and \ optionset.provider is not None: options = [ - dict(**option, text_and_help=option.get('text_and_help', 'text')) + dict(**option, text_and_help=option.get('text_and_help', option.get('text', ''))) for option in optionset.provider.get_options(project, search=request.GET.get('search')) ] return Response(options) From 5418c3a23fe54e402026c21d3b4b7afe3495d30b Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 4 Jan 2024 11:13:01 +0100 Subject: [PATCH 05/10] Add invite.email to send_invite_email context --- rdmo/projects/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rdmo/projects/utils.py b/rdmo/projects/utils.py index 5e5c374d43..c23b0137fa 100644 --- a/rdmo/projects/utils.py +++ b/rdmo/projects/utils.py @@ -151,6 +151,7 @@ def send_invite_email(request, invite): context = { 'invite_url': request.build_absolute_uri(project_invite_path), 'invite_user': invite.user, + 'invite_email': invite.email, 'project': invite.project, 'user': request.user, 'site': Site.objects.get_current() From adbd83a8e9ef82343705fac2f3e1254e40a50a39 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 9 Jan 2024 11:40:07 +0100 Subject: [PATCH 06/10] Fix options actions in ProjectViewSet, again --- rdmo/options/providers.py | 9 ++-- rdmo/projects/tests/test_viewset_project.py | 48 +++++++++++++++++++++ rdmo/projects/viewsets.py | 17 ++++++-- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/rdmo/options/providers.py b/rdmo/options/providers.py index f0b014b818..9a36d2af48 100644 --- a/rdmo/options/providers.py +++ b/rdmo/options/providers.py @@ -19,14 +19,17 @@ def get_options(self, project, search=None): return [ { 'id': 'simple_1', - 'text': 'Simple answer 1' + 'text': 'Simple answer 1', + 'help': 'One' }, { 'id': 'simple_2', - 'text': 'Simple answer 2' + 'text': 'Simple answer 2', + 'help': 'Two' }, { 'id': 'simple_3', - 'text': 'Simple answer 3' + 'text': 'Simple answer 3', + 'help': 'Three' } ] diff --git a/rdmo/projects/tests/test_viewset_project.py b/rdmo/projects/tests/test_viewset_project.py index adf83dc608..8e9d8b6371 100644 --- a/rdmo/projects/tests/test_viewset_project.py +++ b/rdmo/projects/tests/test_viewset_project.py @@ -43,6 +43,7 @@ 'detail': 'v1-projects:project-detail', 'overview': 'v1-projects:project-overview', 'navigation': 'v1-projects:project-navigation', + 'options': 'v1-projects:project-options', 'resolve': 'v1-projects:project-resolve', } @@ -54,6 +55,10 @@ section_id = 1 +optionset_id = 4 + +project_id = 1 + @pytest.mark.parametrize('username,password', users) def test_list(db, client, username, password): client.login(username=username, password=password) @@ -311,3 +316,46 @@ def test_resolve(db, client, username, password, project_id, condition_id): assert response.status_code == 404 else: assert response.status_code == 401 + + +@pytest.mark.parametrize('username,password', users) +def test_options(db, client, username, password): + client.login(username=username, password=password) + + url = reverse(urlnames['options'], args=[project_id]) + f'?optionset={optionset_id}' + response = client.get(url) + + if project_id in view_project_permission_map.get(username, []): + assert response.status_code == 200 + assert isinstance(response.json(), list) + + for item in response.json(): + assert item['text_and_help'] == '{text} [{help}]'.format(**item) + else: + if password: + assert response.status_code == 404 + else: + assert response.status_code == 401 + + +def test_options_text_and_help(db, client, mocker): + mocker.patch('rdmo.options.providers.SimpleProvider.get_options', return_value=[ + { + 'id': 'simple_1', + 'text': 'Simple answer 1' + } + ]) + + client.login(username='author', password='author') + + url = reverse(urlnames['options'], args=[project_id]) + f'?optionset={optionset_id}' + response = client.get(url) + + assert response.status_code == 200 + assert response.json() == [ + { + 'id': 'simple_1', + 'text': 'Simple answer 1', + 'text_and_help': 'Simple answer 1' + } + ] diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index c45ad45cce..11b9c296c6 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -165,10 +165,19 @@ def options(self, request, pk=None): project.catalog.prefetch_elements() if Question.objects.filter_by_catalog(project.catalog).filter(optionsets=optionset) and \ optionset.provider is not None: - options = [ - dict(**option, text_and_help=option.get('text_and_help', option.get('text', ''))) - for option in optionset.provider.get_options(project, search=request.GET.get('search')) - ] + options = [] + for option in optionset.provider.get_options(project, search=request.GET.get('search')): + if 'id' not in option: + raise RuntimeError(f"'id' is missing in options of '{optionset.provider.class_name}'") + elif 'text' not in option: + raise RuntimeError(f"'text' is missing in options of '{optionset.provider.class_name}'") + if 'text_and_help' not in option: + if 'help' in option: + option['text_and_help'] = '{text} [{help}]'.format(**option) + else: + option['text_and_help'] = '{text}'.format(**option) + options.append(option) + return Response(options) except OptionSet.DoesNotExist: From 2dbdb49004ba05e66ef7d935eef99b61b62dbb54 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Tue, 9 Jan 2024 13:36:14 +0100 Subject: [PATCH 07/10] Fix autocomplete widget --- .../projects/js/project_questions/services.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index 7cad4350e8..d0f50b43d0 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -660,6 +660,15 @@ angular.module('project_questions') value.autocomplete_text = option.text_and_help; } }); + } else if (value.external_id) { + value.autocomplete_locked = false; + angular.forEach(question.options, function(option) { + if (value.autocomplete_locked === false && option.id === value.external_id) { + value.autocomplete_locked = true; + value.autocomplete_input = option.text_and_help; + value.autocomplete_text = option.text_and_help; + } + }); } else if (value.text) { value.autocomplete_locked = true; value.autocomplete_input = value.text; @@ -776,7 +785,7 @@ angular.module('project_questions') // loop over options angular.forEach(question.options, function(option) { if (option.has_provider && value.selected === option.id) { - value.text = option.text_and_help; + value.text = option.text; // has to be value.text, since the help is not supposed to be stored value.external_id = option.id; } else if (value.selected === option.id.toString()) { // get text from additional_input for the selected option @@ -1492,8 +1501,8 @@ angular.module('project_questions') // store the option value.text = ''; value.selected = option.id.toString(); - value.autocomplete_text = option.text; - value.autocomplete_input = option.text; + value.autocomplete_text = option.text_and_help; + value.autocomplete_input = option.text_and_help; } service.changed(value, true); From 5a69d69036e2a93462537116df2aa5a94525733e Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 12 Jan 2024 10:49:35 +0100 Subject: [PATCH 08/10] Fix autocomplete, again --- .../projects/js/project_questions/services.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index d0f50b43d0..e9deda355b 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -656,17 +656,8 @@ angular.module('project_questions') angular.forEach(question.options, function(option) { if (value.autocomplete_locked === false && option.id === value.option) { value.autocomplete_locked = true; - value.autocomplete_input = option.text_and_help; - value.autocomplete_text = option.text_and_help; - } - }); - } else if (value.external_id) { - value.autocomplete_locked = false; - angular.forEach(question.options, function(option) { - if (value.autocomplete_locked === false && option.id === value.external_id) { - value.autocomplete_locked = true; - value.autocomplete_input = option.text_and_help; - value.autocomplete_text = option.text_and_help; + value.autocomplete_input = option.text; + value.autocomplete_text = option.text; } }); } else if (value.text) { @@ -1460,7 +1451,7 @@ angular.module('project_questions') } if (angular.isDefined(next)) { next.active = true; - value.autocomplete_input = next.text_and_help; + value.autocomplete_input = next.text; } } else if ($event.code == 'Enter' || $event.code == 'NumpadEnter') { if (value.autocomplete_input == '') { @@ -1501,8 +1492,8 @@ angular.module('project_questions') // store the option value.text = ''; value.selected = option.id.toString(); - value.autocomplete_text = option.text_and_help; - value.autocomplete_input = option.text_and_help; + value.autocomplete_text = option.text; + value.autocomplete_input = option.text; } service.changed(value, true); From b893ffd79a3d0b0dde6576978df036ec56192142 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 12 Jan 2024 12:20:32 +0100 Subject: [PATCH 09/10] Fix autocomplete, once more --- .../projects/js/project_questions/services.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index e9deda355b..1d5fbc84d5 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -660,6 +660,22 @@ angular.module('project_questions') value.autocomplete_text = option.text; } }); + } else if (value.external_id) { + value.autocomplete_locked = false; + angular.forEach(question.options, function(option) { + if (value.autocomplete_locked === false && option.id === value.external_id) { + value.autocomplete_locked = true; + value.autocomplete_input = option.text; + value.autocomplete_text = option.text; + } + }) + + // if no option was found (for autocomplete search fields), use the text + if (value.text) { + value.autocomplete_locked = true; + value.autocomplete_input = value.text; + value.autocomplete_text = value.text; + } } else if (value.text) { value.autocomplete_locked = true; value.autocomplete_input = value.text; From 9125354ffaeb0032dcb463ed10c24536889231ee Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Mon, 15 Jan 2024 12:59:11 +0100 Subject: [PATCH 10/10] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfefa671a9..853f9baf1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Changelog -## [RDMO 2.1.2](https://github.com/rdmorganiser/rdmo/compare/2.1.1...2.1.2) +## [RDMO 2.1.2](https://github.com/rdmorganiser/rdmo/compare/2.1.1...2.1.2) (Jan 15, 2024) * Fix a bug with webpack font paths * Fix a bug with option set provider plugins +* Fix a bug with the autocomplete widget +* Add invite.email to send_invite_email context ## [RDMO 2.1.1](https://github.com/rdmorganiser/rdmo/compare/2.1.0...2.1.1) (Dec 21, 2023)