def test_report_config(capsys, monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'namespace1': {'key1': {}, 'key2': {}}}) monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', { 'namespace2': { 'key1': {'type': list, 'default': []}, }, 'namespace1': { 'key2': {'type': int, 'default': 0}, 'key1': {'type': str, 'default': 'default'}, }, }) set_config('namespace1', 'key1', 'value', user) set_config('namespace2', 'key1', ['a', 'value'], user) call_command('config', 'report') out, err = capsys.readouterr() assert out.strip().split('\n') == [ "namespace1 key1: 'value' (default: 'default')", "namespace1 key2: 0 (default: 0)", "namespace2 key1: ['a', 'value'] (default: [])", ] assert err == ''
def test_set_configuration(monkeypatch, value1, value2, user): monkeypatch.setattr('ideascube.configuration.registry.REGISTRY', {'tests': { 'setting1': { 'type': type(value1) } }}) fakenow = datetime.now(tz=timezone.utc) with freezegun.freeze_time(fakenow): set_config('tests', 'setting1', value1, user) assert Configuration.objects.count() == 1 configuration = Configuration.objects.first() assert configuration.namespace == 'tests' assert configuration.key == 'setting1' assert configuration.value == value1 assert configuration.actor == user assert configuration.date == fakenow assert str(configuration) == 'tests.setting1=%r' % value1 set_config('tests', 'setting1', value2, user) assert Configuration.objects.count() == 1 configuration = Configuration.objects.first() assert configuration.namespace == 'tests' assert configuration.key == 'setting1' assert configuration.value == value2 assert str(configuration) == 'tests.setting1=%r' % value2
def test_set_configuration(monkeypatch, value1, value2, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'tests': {'setting1': {'type': type(value1)}}}) fakenow = datetime.now(tz=timezone.utc) with freezegun.freeze_time(fakenow): set_config('tests', 'setting1', value1, user) assert Configuration.objects.count() == 1 configuration = Configuration.objects.first() assert configuration.namespace == 'tests' assert configuration.key == 'setting1' assert configuration.value == value1 assert configuration.actor == user assert configuration.date == fakenow assert str(configuration) == 'tests.setting1=%r' % value1 set_config('tests', 'setting1', value2, user) assert Configuration.objects.count() == 1 configuration = Configuration.objects.first() assert configuration.namespace == 'tests' assert configuration.key == 'setting1' assert configuration.value == value2 assert str(configuration) == 'tests.setting1=%r' % value2
def do_migrate(apps, schema_editor): Setting = apps.get_model('ideascube', 'Setting') db_alias = schema_editor.connection.alias for setting in Setting.objects.using(db_alias).all(): set_config(setting.namespace, setting.key, setting.value, setting.actor)
def test_set_configuration_invalid_type(monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'tests': {'setting1': {'type': int}}}) with pytest.raises(InvalidConfigurationValueError): set_config('tests', 'setting1', 'value1', user)
def do_migrate(apps, schema_editor): Setting = apps.get_model('ideascube', 'Setting') db_alias = schema_editor.connection.alias for setting in Setting.objects.using(db_alias).all(): set_config( setting.namespace, setting.key, setting.value, setting.actor)
def _update_displayed_packages_on_home(*, to_remove_ids=None, to_add_ids=None): displayed_packages = get_config('home-page', 'displayed-package-ids') if to_remove_ids: displayed_packages = [id for id in displayed_packages if id not in to_remove_ids] if to_add_ids: displayed_packages.extend(id for id in to_add_ids if id not in displayed_packages) set_config('home-page', 'displayed-package-ids', displayed_packages, User.objects.get_system_user())
def test_staff_should_see_packages_with_cards(staffapp, systemuser, catalog): from ideascube.configuration import set_config from ideascube.serveradmin.catalog import Package set_config('home-page', 'displayed-package-ids', ['test.package1'], systemuser) catalog.add_mocked_package( Package( 'test.package1', { 'name': 'Test package1', 'description': 'Test package1 description', 'language': 'fr', 'staff_only': False })) catalog.add_mocked_package( Package( 'test.package2', { 'name': 'Test package2', 'description': 'Test package2 description', 'language': 'fr', 'staff_only': False })) catalog.add_mocked_package( Package( 'test.package3', { 'name': 'Test package3 no template', 'description': 'Test package3.\n' 'A package without template' })) res = staffapp.get(reverse("server:home_page"), status=200) form = res.forms['cards'] inputs = form.fields['displayed'] # We use the private attribute _value here cause the # value attribute is set to 'on' if the input is checked. # As we want to test the value set *in the html* we need to # use the real value, ie the _value attribute. # See https://github.com/Pylons/webtest/issues/165 assert len(inputs) == 3 assert inputs[0]._value == 'test.package1' assert inputs[0].checked assert inputs[1]._value == 'test.package2' assert not inputs[1].checked assert inputs[2]._value == 'test.package3' assert not inputs[2].checked # inverse the checked for input_ in form.fields['displayed']: input_.checked = not input_.checked res = form.submit() inputs = res.forms['cards'].fields['displayed'] assert not inputs[0].checked assert inputs[1].checked assert inputs[2].checked
def test_set_configuration_invalid_type(monkeypatch, user): monkeypatch.setattr('ideascube.configuration.registry.REGISTRY', {'tests': { 'setting1': { 'type': int } }}) with pytest.raises(InvalidConfigurationValueError): set_config('tests', 'setting1', 'value1', user)
def test_get_config(capsys, monkeypatch, user, value, expected, default): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'namespace1': {'key1': {'type': type(value), 'default': default}}}) set_config('namespace1', 'key1', value, user) call_command('config', 'get', 'namespace1', 'key1') out, err = capsys.readouterr() assert out.strip() == expected assert err.strip() == ''
def server_info(request): if request.method == 'POST': new_name = request.POST.get('server_name') if new_name: set_config('server', 'site-name', new_name, request.user) messages.success(request, _('Server name changed successfully')) else: messages.error(request, _('Server name cannot be empty')) return render(request, 'serveradmin/settings.html')
def server_name(request): if request.method == 'POST': new_name = request.POST.get('server_name') if new_name: set_config('server', 'site-name', new_name, request.user) messages.success(request, _('Server name changed successfully')) else: messages.error(request, _('Server name cannot be empty')) return render(request, 'serveradmin/name.html')
def set_config(self, options): namespace = options['namespace'] key = options['key'] value = self._evaluate_value(options['value']) system_user = get_user_model().objects.get_system_user() try: set_config(namespace, key, value, system_user) except (InvalidConfigurationValueError, NoSuchConfigurationNamespaceError, NoSuchConfigurationKeyError) as e: raise CommandError(e)
def test_reset_config(capsys, monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'namespace1': {'key1': {'type': str, 'default': 'default'}}}) set_config('namespace1', 'key1', 'A string', user) call_command('config', 'reset', 'namespace1', 'key1') out, err = capsys.readouterr() assert out.strip() == '' assert err.strip() == '' assert get_config('namespace1', 'key1') == 'default'
def _update_displayed_packages_on_home(*, to_remove_ids=None, to_add_ids=None): displayed_packages = get_config('home-page', 'displayed-package-ids') if to_remove_ids: displayed_packages = [ id for id in displayed_packages if id not in to_remove_ids ] if to_add_ids: displayed_packages.extend(id for id in to_add_ids if id not in displayed_packages) set_config('home-page', 'displayed-package-ids', displayed_packages, User.objects.get_system_user())
def test_filtered_lang_select_with_local_setting(user): set_config('content', 'local-languages', ['en', 'zh-hant'], user) expected = ( '<option value="en">English (en)</option>\n' '<option value="zh-hant">繁體中文 (zh-hant)</option>' ) widget = LangSelect(choices=[ ('fr', 'Français'), ('en', 'English'), ('zh-hant', '繁體中文'), ]) rendered = widget.render_options([]) assert rendered == expected
def home_page(request): if request.POST: displayed_packages = request.POST.getlist("displayed") set_config('home-page', 'displayed-package-ids', displayed_packages, request.user) messages.success(request, _('Home cards updated successfully')) catalog = catalog_mod.Catalog() installed_packages = catalog.list_installed(['*']) displayed_packages = get_config('home-page', 'displayed-package-ids') return render(request, 'serveradmin/home_page.html', {'installed_packages': installed_packages, 'displayed_packages': displayed_packages})
def test_filtered_lang_select_with_local_setting(user): set_config('content', 'local-languages', ['en', 'zh-hant'], user) expected = '\n'.join([ '<select name="lang-test">', ' <option value="en">English (en)</option>\n', ' <option value="zh-hant">繁體中文 (zh-hant)</option>\n', '</select>', ]) widget = LangSelect(choices=[ ('fr', 'Français'), ('en', 'English'), ('zh-hant', '繁體中文'), ]) rendered = widget.render('lang-test', None) assert rendered == expected
def home_page(request): if request.POST: displayed_packages = request.POST.getlist("displayed") set_config('home-page', 'displayed-package-ids', displayed_packages, request.user) messages.success(request, _('Home cards updated successfully')) catalog = catalog_mod.Catalog() installed_packages = catalog.list_installed(['*']) displayed_packages = get_config('home-page', 'displayed-package-ids') return render( request, 'serveradmin/home_page.html', { 'installed_packages': installed_packages, 'displayed_packages': displayed_packages })
def test_staff_can_set_languages(staffapp): set_config('content', 'local-languages', ['en'], staffapp.user) response = staffapp.get(reverse('server:languages')) form = response.forms['languages'] checked = sorted(f.id for f in form.fields['languages'] if f.checked) assert checked == ['en'] for field in form.fields['languages']: field.checked = field.id in ('ar', 'zh-hant') response = form.submit() form = response.forms['languages'] checked = sorted(f.id for f in form.fields['languages'] if f.checked) assert checked == ['ar', 'zh-hant'] assert get_config('content', 'local-languages') == ['ar', 'zh-hant']
def test_staff_cannot_unset_all_languages(staffapp): set_config('content', 'local-languages', ['ar', 'zh-hant'], staffapp.user) response = staffapp.get(reverse('server:languages')) form = response.forms['languages'] checked = sorted(f.id for f in form.fields['languages'] if f.checked) assert checked == ['ar', 'zh-hant'] for field in form.fields['languages']: field.checked = False response = form.submit() assert 'Please select at least one language' in response.unicode_body form = response.forms['languages'] checked = sorted(f.id for f in form.fields['languages'] if f.checked) assert checked == ['ar', 'zh-hant'] assert get_config('content', 'local-languages') == ['ar', 'zh-hant']
def languages(request): languages = get_all_languages() if request.method == "POST": selected = request.POST.getlist('languages') if selected: set_config('content', 'local-languages', sorted(selected), request.user) else: messages.error(request, _('Please select at least one language')) local_languages = get_config('content', 'local-languages') return render(request, 'serveradmin/languages.html', { 'languages': languages, 'selected': local_languages, })
def languages(request): languages = get_all_languages() if request.method == "POST": selected = request.POST.getlist('languages') if selected: set_config( 'content', 'local-languages', sorted(selected), request.user) else: messages.error(request, _('Please select at least one language')) local_languages = get_config('content', 'local-languages') return render( request, 'serveradmin/languages.html', { 'languages': languages, 'selected': local_languages, })
def test_build_package_card_info(systemuser, catalog): from ideascube.configuration import set_config from ideascube.views import build_package_card_info from ideascube.serveradmin.catalog import ZippedZim, ZippedMedias catalog.add_mocked_package( ZippedZim( 'test.package1.fr', { 'name': 'Test package1', 'description': 'Test package1 description', 'language': 'fr', 'staff_only': False })) catalog.add_mocked_package( ZippedMedias( 'test.package2.fr', { 'name': 'Test package2', 'description': 'Test package2 description', 'language': 'fr', 'staff_only': False })) set_config('home-page', 'displayed-package-ids', ['test.package1.fr', 'test.package2.fr'], systemuser) assert build_package_card_info() == [{ 'package_id': 'test.package1.fr', 'name': 'Test package1', 'description': 'Test package1 description', 'lang': 'fr', 'is_staff': False, 'id': 'kiwix', 'css_class': 'test.package1', 'theme': 'learn' }, { 'package_id': 'test.package2.fr', 'name': 'Test package2', 'description': 'Test package2 description', 'lang': 'fr', 'is_staff': False, 'id': 'media-package', 'css_class': None, 'theme': None }]
def test_reset_configuration(monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', { 'tests': { 'setting1': { 'type': str }, 'setting2': { 'type': int }, }, 'tests2': { 'setting3': { 'type': list }, }, }) set_config('tests', 'setting1', 'A string', user) set_config('tests', 'setting2', 42, user) set_config('tests2', 'setting3', ['A', 'list'], user) assert Configuration.objects.count() == 3 reset_config('tests', 'setting1') assert Configuration.objects.count() == 2 with pytest.raises(Configuration.DoesNotExist): Configuration.objects.get(namespace='tests', key='settings1')
def test_build_package_card_info(systemuser, catalog): from ideascube.configuration import set_config from ideascube.cards import build_package_card_info from ideascube.serveradmin.catalog import ZippedZim, ZippedMedias catalog.add_mocked_package(ZippedZim('test.package1.fr', { 'name':'Test package1', 'description':'Test package1 description', 'language':'fr', 'staff_only':False})) catalog.add_mocked_package(ZippedMedias('test.package2.fr', { 'name':'Test package2', 'description':'Test package2 description', 'language':'fr', 'staff_only':False})) set_config('home-page', 'displayed-package-ids', ['test.package1.fr', 'test.package2.fr'], systemuser) assert build_package_card_info() == [{ 'package_id' : 'test.package1.fr', 'name' : 'Test package1', 'description': 'Test package1 description', 'lang' : 'fr', 'is_staff' : False, 'id' : 'kiwix', 'css_class' : 'test.package1', 'theme' : 'learn' }, { 'package_id' : 'test.package2.fr', 'name' : 'Test package2', 'description': 'Test package2 description', 'lang' : 'fr', 'is_staff' : False, 'id' : 'media-package', 'css_class' : None, 'theme' : None }]
def test_reset_configuration(monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', { 'tests': { 'setting1': {'type': str}, 'setting2': {'type': int}, }, 'tests2': { 'setting3': {'type': list}, }, }) set_config('tests', 'setting1', 'A string', user) set_config('tests', 'setting2', 42, user) set_config('tests2', 'setting3', ['A', 'list'], user) assert Configuration.objects.count() == 3 reset_config('tests', 'setting1') assert Configuration.objects.count() == 2 with pytest.raises(Configuration.DoesNotExist): Configuration.objects.get(namespace='tests', key='settings1')
def test_set_configuration_invalid_key(monkeypatch, user): monkeypatch.setattr('ideascube.configuration.registry.REGISTRY', {'tests': {}}) with pytest.raises(NoSuchConfigurationKeyError): set_config('tests', 'setting1', 'value1', user)
def test_build_package_card_info_must_not_fail_for_no_package(systemuser): from ideascube.configuration import set_config from ideascube.views import build_package_card_info set_config('home-page', 'displayed-package-ids', ['test.package1'], systemuser) assert build_package_card_info() == []
def test_set_configuration_invalid_key(monkeypatch, user): monkeypatch.setattr( 'ideascube.configuration.registry.REGISTRY', {'tests': {}}) with pytest.raises(NoSuchConfigurationKeyError): set_config('tests', 'setting1', 'value1', user)
def handle(self, *_, **options): pkgs = catalog.Catalog().list_installed(['*']) pkg_ids = [pkg.id for pkg in pkgs] user = User.objects.get_system_user() set_config('home-page', 'displayed-package-ids', pkg_ids, user)
def test_build_package_card_info_must_not_fail_for_no_package(systemuser): from ideascube.configuration import set_config from ideascube.cards import build_package_card_info set_config('home-page', 'displayed-package-ids', ['test.package1'], systemuser) assert build_package_card_info() == []