diff --git a/app/main/forms.py b/app/main/forms.py index e76955779..f6f7412a2 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -2445,10 +2445,14 @@ class TemplateAndFoldersSelectionForm(Form): class ClearCacheForm(StripWhitespaceForm): - model_type = GovukRadiosField( + model_type = GovukCheckboxesField( 'What do you want to clear today', ) + def validate_model_type(self, field): + if not field.data: + raise ValidationError('Select at least one option') + class GoLiveNotesForm(StripWhitespaceForm): request_to_go_live_notes = TextAreaField( diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 1cfbeab97..10e43fb4b 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -420,18 +420,27 @@ def clear_cache(): ]) form = ClearCacheForm() - form.model_type.choices = [(key, key.replace('_', ' ').title()) for key in CACHE_KEYS] + + form.model_type.choices = [ + (key, key.replace('_', ' ').title()) for key in CACHE_KEYS + ] if form.validate_on_submit(): - group_key = form.model_type.data - group = CACHE_KEYS[group_key] + group_keys = form.model_type.data + groups = map(CACHE_KEYS.get, group_keys) + patterns = list(itertools.chain(*groups)) num_deleted = sum( redis_client.delete_cache_keys_by_pattern(pattern) - for pattern in group + for pattern in patterns + ) + + msg = ( + f'Removed {num_deleted} objects ' + f'across {len(patterns)} key formats ' + f'for {", ".join(group_keys)}' ) - msg = f'Removed {num_deleted} {group_key} objects across {len(group)} key formats' flash(msg, category='default') return render_template( diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index e965e7667..fb4cba007 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -735,7 +735,7 @@ def test_clear_cache_shows_form( page = client_request.get('main.clear_cache') assert not redis.delete_cache_keys_by_pattern.called - radios = {el['value'] for el in page.select('input[type=radio]')} + radios = {el['value'] for el in page.select('input[type=checkbox]')} assert radios == { 'user', @@ -753,8 +753,8 @@ def test_clear_cache_shows_form( call('service-????????-????-????-????-????????????-templates'), call('service-????????-????-????-????-????????????-template-????????-????-????-????-????????????-version-*'), call('service-????????-????-????-????-????????????-template-????????-????-????-????-????????????-versions'), - ], 'Removed 6 template objects across 3 key formats'), - ('service', [ + ], 'Removed 6 objects across 3 key formats for template'), + (['service', 'organisation'], [ call('has_jobs-????????-????-????-????-????????????'), call('service-????????-????-????-????-????????????'), call('service-????????-????-????-????-????????????-templates'), @@ -762,16 +762,14 @@ def test_clear_cache_shows_form( call('service-????????-????-????-????-????????????-template-folders'), call('service-????????-????-????-????-????????????-returned-letters-statistics'), call('service-????????-????-????-????-????????????-returned-letters-summary'), - ], 'Removed 14 service objects across 7 key formats'), - ('organisation', [ call('organisations'), call('domains'), call('live-service-and-organisation-counts'), call('organisation-????????-????-????-????-????????????-name'), - ], 'Removed 8 organisation objects across 4 key formats'), + ], 'Removed 22 objects across 11 key formats for service, organisation'), ('broadcast', [ call('service-????????-????-????-????-????????????-broadcast-message-????????-????-????-????-????????????'), - ], 'Removed 2 broadcast objects across 1 key formats'), + ], 'Removed 2 objects across 1 key formats for broadcast'), )) def test_clear_cache_submits_and_tells_you_how_many_things_were_deleted( client_request, @@ -807,7 +805,7 @@ def test_clear_cache_requires_option( page = client_request.post('main.clear_cache', _data={}, _expected_status=200) - assert normalize_spaces(page.find('span', class_='govuk-error-message').text) == 'Error: Select an option' + assert normalize_spaces(page.find('span', class_='govuk-error-message').text) == 'Error: Select at least one option' assert not redis.delete_cache_keys_by_pattern.called