def test_unregister_model01(self):
        registry = _ConfigRegistry()
        # registry.register((FakeCivility, 'civility'),
        #                   (FakeSector, 'sector'),
        #                   (FakePosition, 'position'),
        #                  )
        registry.register_model(FakeCivility)
        registry.register_model(FakeSector)
        registry.register_model(FakePosition)

        # registry.unregister(FakeCivility, FakePosition)
        registry.unregister_models(FakeCivility, FakePosition)

        with self.assertNoException():
            # app_conf = registry.get_app('creme_core')
            app_conf = registry.get_app_registry('creme_core')

        get_model_conf = app_conf.get_model_conf

        with self.assertNoException():
            get_model_conf(model=FakeSector)

        self.assertRaises(NotRegisteredInConfig,
                          get_model_conf,
                          model=FakeCivility)
        self.assertRaises(NotRegisteredInConfig,
                          get_model_conf,
                          model=FakePosition)
    def test_register_model09(self):
        "Register specific Brick."
        registry = _ConfigRegistry()

        class SectorBrick(GenericModelBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_model08')

        registry.register_model(FakeSector) \
                .brick_class(SectorBrick) \
                .edition(enable_func=lambda x: False)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeSector)

        brick = model_config.get_brick()
        self.assertIsInstance(brick, SectorBrick)
        self.assertEqual('creme_core', brick.app_name)
        self.assertEqual(FakeSector, brick.model_config.model)

        # Change class
        class SectorBrick_V2(GenericModelBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_model08_V2')

        model_config.brick_cls = SectorBrick_V2
        self.assertIsInstance(model_config.get_brick(), SectorBrick_V2)
    def test_register_model07(self):
        "Disable creation forms."
        user = self.login()
        registry = _ConfigRegistry()

        user_name = user.username
        registry.register_model(FakeCivility)\
                .creation(enable_func=lambda user: user.username == user_name)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)
        creator = model_config.creator
        self.assertIsSubclass(creator.form_class, CremeModelForm)
        self.assertEqual(
            reverse('creme_config__create_instance',
                    args=('creme_core', 'fakecivility')),
            creator.get_url(user=user))
        self.assertIsNone(creator.get_url(user=self.other_user))

        editor = model_config.editor
        self.assertIsSubclass(editor.form_class, CremeModelForm)

        civ = FakeCivility.objects.first()
        self.assertEqual(
            reverse(
                'creme_config__edit_instance',
                args=('creme_core', 'fakecivility', civ.id),
            ), editor.get_url(civ, user=user))
    def test_register_model08(self):
        "Disable deletion forms."
        user = self.login()
        registry = _ConfigRegistry()

        civ1, civ2 = FakeCivility.objects.all()[:2]
        registry.register_model(FakeCivility)\
                .deletion(enable_func=lambda instance, user: instance.id == civ1.id)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)
        self.assertIsSubclass(model_config.creator.form_class, CremeModelForm)

        deletor = model_config.deletor
        self.assertIsSubclass(deletor.form_class, CremeModelForm)

        url1 = reverse(
            'creme_config__delete_instance',
            args=('creme_core', 'fakecivility', civ1.id),
        )
        self.assertEqual(url1, deletor.get_url(instance=civ1, user=user))
        self.assertEqual(url1,
                         deletor.get_url(instance=civ1, user=self.other_user))
        self.assertIsNone(deletor.get_url(instance=civ2, user=user))

        # Disable with user
        user_name = user.username
        deletor.enable_func = lambda instance, user: user.username == user_name
        self.assertEqual(url1, deletor.get_url(instance=civ1, user=user))
        self.assertEqual(
            reverse(
                'creme_config__delete_instance',
                args=('creme_core', 'fakecivility', civ2.id),
            ), deletor.get_url(instance=civ2, user=user))
        self.assertIsNone(deletor.get_url(instance=civ1, user=self.other_user))
    def test_register_model04(self):
        "Register specific forms."
        registry = _ConfigRegistry()

        class CivCreationForm(CremeModelForm):
            class Meta:
                model = FakeCivility
                fields = ('title', )

        class CivEditionForm(CremeModelForm):
            class Meta:
                model = FakeCivility
                fields = ('shortcut', )

        class CivDeletionForm(DeletionForm):
            pass

        registry.register_model(FakeCivility) \
                .creation(form_class=CivCreationForm) \
                .edition(form_class=CivEditionForm) \
                .deletion(form_class=CivDeletionForm)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)
        self.assertIsSubclass(model_config.creator.form_class, CivCreationForm)
        self.assertIsSubclass(model_config.editor.form_class, CivEditionForm)
        self.assertIsSubclass(model_config.deletor.form_class, CivDeletionForm)
    def test_get_app_registry(self):
        registry = _ConfigRegistry()
        self.assertFalse([*registry.apps()])

        with self.assertRaises(KeyError):
            registry.get_app_registry('creme_core')

        with self.assertRaises(LookupError):
            registry.get_app_registry('unknownapp')

        app_registry = registry.get_app_registry('creme_core', create=True)
        self.assertEqual('creme_core', app_registry.name)
        self.assertEqual(_('Core'), app_registry.verbose_name)
        self.assertEqual(
            reverse('creme_config__app_portal', args=('creme_core', )),
            app_registry.portal_url)

        self.assertListEqual([app_registry], [*registry.apps()])

        self.assertIs(app_registry,
                      registry.get_app_registry('creme_core', create=True))
        self.assertIs(app_registry, registry.get_app_registry('creme_core'))

        # --
        registry.get_app_registry('documents', create=True)
        self.assertEqual(2, len([*registry.apps()]))
    def test_register_model03(self):
        "Change name_in_url."
        user = self.login()

        registry = _ConfigRegistry()
        self.assertFalse([*registry.apps()])

        registry.register_model(FakeCivility)
        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)

        model_config.model_name = new_name = 'civ'
        self.assertEqual(new_name, model_config.model_name)
        self.assertEqual(
            model_config.creator.get_url(user=user),
            reverse('creme_config__create_instance',
                    args=('creme_core', new_name)))

        civ = FakeCivility.objects.first()
        self.assertEqual(
            model_config.editor.get_url(civ, user=user),
            reverse('creme_config__edit_instance',
                    args=('creme_core', new_name, civ.id)))
        self.assertEqual(
            model_config.deletor.get_url(civ, user=user),
            reverse('creme_config__delete_instance',
                    args=('creme_core', new_name, civ.id)))

        # --
        with self.assertRaises(ValueError):
            registry.register_model(FakeSector,
                                    'my-sector')  # Invalid char '-'
    def test_register_model02(self):
        "Another model ; get_app()/get_model_conf() ; no 'name_in_url' argument."
        user = self.login()
        registry = _ConfigRegistry()

        registry.register_model(DocumentCategory)
        app_registry = registry.get_app_registry('documents')
        self.assertEqual('documents', app_registry.name)
        self.assertEqual(_('Documents'), app_registry.verbose_name)

        model_config = app_registry.get_model_conf(DocumentCategory)
        self.assertEqual(DocumentCategory, model_config.model)
        self.assertEqual('documentcategory', model_config.model_name)

        self.assertEqual(
            model_config.creator.get_url(user),
            reverse(
                'creme_config__create_instance',
                args=('documents', 'documentcategory'),
            ))

        sector = FakeSector.objects.first()
        self.assertEqual(
            model_config.editor.get_url(sector, user=user),
            reverse(
                'creme_config__edit_instance',
                args=('documents', 'documentcategory', sector.id),
            ))

        self.assertEqual(
            model_config.deletor.get_url(sector, user=user),
            reverse(
                'creme_config__delete_instance',
                args=('documents', 'documentcategory', sector.id),
            ))
    def test_register_portal_bricks(self):
        class TestPortalBrick(SimpleBrick):
            pass

        class TestPortalBrick1(TestPortalBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_portal_bricks1')

        class TestPortalBrick2(TestPortalBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_portal_bricks2')

        brick_registry = _BrickRegistry()
        brick_registry.register(TestPortalBrick1, TestPortalBrick2)

        registry = _ConfigRegistry(brick_registry)
        registry.register_portal_bricks(TestPortalBrick1, TestPortalBrick2)

        brick_ids = set()
        for brick in registry.portal_bricks:
            self.assertIsInstance(brick, TestPortalBrick)
            brick_ids.add(brick.id_)

        self.assertIn(TestPortalBrick1.id_, brick_ids)
        self.assertIn(TestPortalBrick2.id_, brick_ids)
示例#10
0
    def test_register_model06(self):
        "Disable edition forms."
        user1 = self.create_user(index=0)
        user2 = self.create_user(index=1)
        registry = _ConfigRegistry()

        civ1, civ2 = FakeCivility.objects.all()[:2]
        registry.register_model(FakeCivility)\
                .edition(enable_func=lambda instance, user: instance.id == civ1.id)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)
        self.assertIsSubclass(model_config.creator.form_class, CremeModelForm)

        editor = model_config.editor
        self.assertIsSubclass(editor.form_class, CremeModelForm)

        url1 = reverse(
            'creme_config__edit_instance',
            args=('creme_core', 'fakecivility', civ1.id),
        )
        self.assertEqual(url1, editor.get_url(instance=civ1, user=user1))
        self.assertEqual(url1, editor.get_url(instance=civ1, user=user2))
        self.assertIsNone(editor.get_url(instance=civ2, user=user1))

        # Disable with user
        user_name = user1.username
        editor.enable_func = lambda instance, user: user.username == user_name
        self.assertEqual(url1, editor.get_url(instance=civ1, user=user1))
        self.assertEqual(
            reverse(
                'creme_config__edit_instance',
                args=('creme_core', 'fakecivility', civ2.id),
            ), editor.get_url(instance=civ2, user=user1))
        self.assertIsNone(editor.get_url(instance=civ1, user=user2))
    def test_register_model10(self):
        "Duplicated registration."
        registry = _ConfigRegistry()

        registry.register_model(FakeCivility)

        with self.assertRaises(RegistrationError):
            registry.register_model(FakeCivility)
示例#12
0
    def test_get_model_creation_info01(self):
        "Not registered model."
        user = self.login()
        registry = _ConfigRegistry()

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertIs(False, allowed)
        self.assertIsNone(url)
    def test_get_model_creation_info03(self):
        "Not super-user"
        user = self.login(is_superuser=False, admin_4_apps=['creme_core'])

        registry = _ConfigRegistry()
        registry.register_model(FakeCivility)

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertTrue(allowed)
    def test_get_model_creation_info06(self):
        "Enable function KO."
        user = self.login()

        registry = _ConfigRegistry()
        registry.register_model(FakeCivility).creation(
            enable_func=lambda user: False)

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertIsNone(url)
    def test_app_registry_is_empty01(self):
        "use models"
        registry = _ConfigRegistry(
            brick_registry=_BrickRegistry(),
            setting_key_registry=_SettingKeyRegistry(),
        )
        app_registry = registry.get_app_registry('creme_core', create=True)
        self.assertIs(True, app_registry.is_empty)

        registry.register_model(FakeCivility)
        self.assertIs(False, app_registry.is_empty)
    def test_get_model_creation_info04(self):
        "Specific creation URL."
        user = self.login()

        registry = _ConfigRegistry()
        registry.register_model(FakeCivility).creation(
            url_name='creme_config__create_team')

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertFalse(allowed)
        self.assertIsNone(url)
    def test_get_model_creation_info05(self):
        "Enable function OK."
        user = self.login()

        registry = _ConfigRegistry()
        registry.register_model(FakeCivility).creation(
            enable_func=lambda user: True)

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertEqual(
            reverse(
                'creme_config__create_instance_from_widget',
                args=('creme_core', 'fakecivility'),
            ), url)
    def test_register_app_brick(self):
        class TestBrick(SimpleBrick):
            pass

        class TestBrick1(TestBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_app_bricks1')

        class TestBrick2(TestBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_app_bricks2')

        class TestBrick3(TestBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_app_bricks3')

        brick_registry = _BrickRegistry()
        brick_registry.register(TestBrick1, TestBrick2, TestBrick3)

        registry = _ConfigRegistry(brick_registry)
        # registry.register_bricks(('creme_core', TestBrick1),
        #                          ('documents',  TestBrick2),
        #                         )
        registry.register_app_bricks('creme_core', TestBrick1, TestBrick2)
        registry.register_app_bricks('documents', TestBrick3)

        with self.assertNoException():
            app_reg1 = registry.get_app_registry('creme_core')

        def get_brick_ids(app_conf_registry):
            b_ids = set()
            for brick in app_conf_registry.bricks:
                self.assertIsInstance(brick, SimpleBrick)
                b_ids.add(brick.id_)
            return b_ids

        brick_ids = get_brick_ids(app_reg1)
        self.assertIn(TestBrick1.id_, brick_ids)
        self.assertIn(TestBrick2.id_, brick_ids)
        self.assertNotIn(TestBrick3, brick_ids)

        with self.assertNoException():
            app_reg2 = registry.get_app_registry('documents')

        brick_ids = get_brick_ids(app_reg2)
        self.assertIn(TestBrick3.id_, brick_ids)
        self.assertNotIn(TestBrick1, brick_ids)
        self.assertNotIn(TestBrick2, brick_ids)
    def test_register_model05(self):
        "Register specific URLs."
        user = self.login()
        registry = _ConfigRegistry()

        creation_url_name = 'creme_config__create_team'
        edition_url_name = 'creme_config__edit_team'  # NB: need an URL with an int arg
        deletion_url_name = 'creme_config__edit_user'  # idem

        registry.register_model(FakeCivility) \
                .edition(url_name=edition_url_name) \
                .deletion(url_name=deletion_url_name) \
                .creation(url_name=creation_url_name)

        model_config = registry.get_app_registry('creme_core').get_model_conf(
            FakeCivility)
        creator = model_config.creator
        self.assertEqual(creator.url_name, creation_url_name)
        self.assertEqual(creator.get_url(user=user),
                         reverse(creation_url_name))

        civ = FakeCivility.objects.first()
        editor = model_config.editor
        self.assertEqual(editor.get_url(civ, user=user),
                         reverse(edition_url_name, args=(civ.id, )))

        deletor = model_config.deletor
        self.assertEqual(deletor.get_url(civ, user=user),
                         reverse(deletion_url_name, args=(civ.id, )))

        # Back to default
        creator.url_name = None
        self.assertEqual(
            creator.get_url(user),
            reverse('creme_config__create_instance',
                    args=('creme_core', 'fakecivility')))

        editor.url_name = None
        self.assertEqual(
            editor.get_url(civ, user),
            reverse(
                'creme_config__edit_instance',
                args=('creme_core', 'fakecivility', civ.id),
            ))
    def test_get_model_creation_info02(self):
        "Registered model."
        user = self.login()

        registry = _ConfigRegistry()
        registry.register_model(FakeCivility)

        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=user)
        self.assertIs(True, allowed)
        creation_url = reverse('creme_config__create_instance_from_widget',
                               args=('creme_core', 'fakecivility'))
        self.assertEqual(creation_url, url)

        # User than cannot admin
        url, allowed = registry.get_model_creation_info(model=FakeCivility,
                                                        user=self.other_user)
        self.assertIs(False, allowed)
        self.assertEqual(creation_url, url)
    def test_register_userbricks(self):
        class TestUserBrick1(SimpleBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_userbricks1')

        class TestUserBrick2(SimpleBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_register_userbricks2')

        brick_registry = _BrickRegistry()
        brick_registry.register(TestUserBrick1, TestUserBrick2)

        registry = _ConfigRegistry(brick_registry)

        registry.register_user_bricks(TestUserBrick1, TestUserBrick2)
        bricks = [*registry.user_bricks]
        self.assertEqual(2, len(bricks))
        self.assertIsInstance(bricks[0], TestUserBrick1)
        self.assertIsInstance(bricks[1], TestUserBrick2)
    def test_app_registry_is_empty02(self):
        "use bricks"

        class TestBrick(SimpleBrick):
            id_ = SimpleBrick.generate_id('creme_config',
                                          'test_app_registry_is_empty02')

        brick_registry = _BrickRegistry()
        registry = _ConfigRegistry(
            brick_registry=brick_registry,
            setting_key_registry=_SettingKeyRegistry(),
        )

        app_registry = registry.get_app_registry('creme_core', create=True)
        self.assertTrue(app_registry.is_empty)

        brick_registry.register(TestBrick)
        self.assertTrue(app_registry.is_empty)

        registry.register_app_bricks('creme_core', TestBrick)
        self.assertFalse(app_registry.is_empty)
    def test_app_registry_is_empty03(self):
        "Use SettingKeys"
        sk1 = SettingKey(
            'creme_core-test_sk_string',
            description='Page title',
            app_label='documents',  # <== not 'creme_core'
            type=SettingKey.STRING,
            blank=True,
        )
        sk2 = SettingKey(
            'creme_core-test_sk_int',
            description='Page size',
            app_label='creme_core',
            type=SettingKey.INT,
            hidden=True,  # <==
        )
        sk3 = SettingKey(
            'creme_core-test_sk_bool',
            description='Page hidden',
            app_label='creme_core',
            type=SettingKey.BOOL,
        )

        skey_registry = _SettingKeyRegistry()

        registry = _ConfigRegistry(setting_key_registry=skey_registry)
        app_registry = registry.get_app_registry('creme_core', create=True)
        self.assertIs(True, app_registry.is_empty)

        skey_registry.register(sk1)
        self.assertIs(True, app_registry.is_empty)

        skey_registry.register(sk2)
        self.assertIs(True, app_registry.is_empty)

        skey_registry.register(sk3)
        self.assertIs(False, app_registry.is_empty)
    def test_register_model01(self):
        user = self.login()

        registry = _ConfigRegistry()

        model_name = 'civility'
        registry.register_model(FakeCivility, model_name=model_name)
        app_registries = [*registry.apps()]
        self.assertEqual(1, len(app_registries))

        app_registry = app_registries[0]
        self.assertEqual('creme_core', app_registry.name)

        model_configs = [*app_registry.models()]
        self.assertEqual(1, len(model_configs))

        model_config = model_configs[0]
        self.assertEqual(FakeCivility, model_config.model)
        self.assertEqual(model_name, model_config.model_name)

        brick = model_config.get_brick()
        self.assertIsInstance(brick, GenericModelBrick)
        self.assertEqual('creme_core', brick.app_name)
        self.assertEqual(FakeCivility, brick.model_config.model)

        with self.assertRaises(NotRegisteredInConfig):
            app_registry.get_model_conf(FakeSector)

        # Creator ---
        creator = model_config.creator
        creation_form = creator.form_class
        self.assertIsSubclass(creation_form, CremeModelForm)
        self.assertEqual(FakeCivility, creation_form._meta.model)
        self.assertIsNone(creator.url_name)
        self.assertEqual(
            creator.get_url(user),
            reverse('creme_config__create_instance',
                    args=('creme_core', 'civility')))

        # Editor ---
        editor = model_config.editor
        edition_form = editor.form_class
        self.assertIsSubclass(edition_form, CremeModelForm)
        self.assertEqual(FakeCivility, edition_form._meta.model)
        self.assertIsNone(editor.url_name)

        civ = FakeCivility.objects.first()
        # self.assertTrue(editor.is_enabled(civ))
        self.assertEqual(
            editor.get_url(civ, user),
            reverse('creme_config__edit_instance',
                    args=('creme_core', 'civility', civ.id)))

        # Deletor ---
        deletor = model_config.deletor
        deletion_form = deletor.form_class
        self.assertIsSubclass(deletion_form, DeletionForm)
        self.assertIsNone(deletor.url_name)
        self.assertEqual(
            deletor.get_url(civ, user),
            reverse('creme_config__delete_instance',
                    args=('creme_core', 'civility', civ.id)))