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 == ''
Exemple #2
0
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
Exemple #3
0
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_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 == ''
Exemple #6
0
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)
Exemple #8
0
 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())
Exemple #9
0
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
Exemple #10
0
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)
Exemple #11
0
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 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() == ''
Exemple #13
0
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')
Exemple #14
0
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')
Exemple #15
0
    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)
Exemple #16
0
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'
Exemple #17
0
    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)
Exemple #18
0
 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_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'
Exemple #20
0
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
Exemple #21
0
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})
Exemple #22
0
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
Exemple #23
0
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
        })
Exemple #24
0
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']
Exemple #25
0
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']
Exemple #26
0
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,
    })
Exemple #27
0
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,
        })
Exemple #28
0
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
    }]
Exemple #29
0
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')
Exemple #30
0
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
    }]
Exemple #31
0
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')
Exemple #32
0
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)
Exemple #33
0
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() == []
Exemple #34
0
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)
Exemple #35
0
 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)
Exemple #36
0
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() == []