Beispiel #1
0
    def test_registry_numeric(self):
        user = self.create_user()
        field_printers_registry = _FieldPrintersRegistry()

        # Integer
        capital = 12345

        create_orga = partial(FakeOrganisation.objects.create, user=user)
        orga1 = create_orga(name='Hawk', capital=capital)
        orga2 = create_orga(name='God hand')

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual(str(capital), get_csv_val(orga1, 'capital', user))
        self.assertEqual('', get_csv_val(orga2, 'capital', user))

        # Decimal & integer with choices
        line1 = FakeInvoiceLine(
            item='Swords',
            quantity='3.00',
            unit_price='125.6',
            # discount_unit=FAKE_PERCENT_UNIT,
            discount_unit=FakeInvoiceLine.Discount.PERCENT,
        )
        dec_format = partial(number_format, use_l10n=True)
        self.assertEqual(dec_format('3.00'),
                         get_csv_val(line1, 'quantity', user))
        self.assertEqual(dec_format('125.6'),
                         get_csv_val(line1, 'unit_price', user))
Beispiel #2
0
    def test_registry_m2m_entity01(self):
        user = self.login()

        registry = field_printers._FieldPrintersRegistry()
        as_html = registry.get_html_field_value
        as_csv = registry.get_csv_field_value

        create_ml = partial(FakeMailingList.objects.create, user=user)
        ml1 = create_ml(name='Swimsuits', description='Best swimsuits of this year')
        ml2 = create_ml(name='Hats')  # Notice that description is empty

        camp = FakeEmailCampaign.objects.create(user=user, name='Summer 2020')
        camp.mailing_lists.set([ml1, ml2])

        self.assertHTMLEqual(
            f'<ul><li>{ml2.name}</li><li>{ml1.name}</li></ul>',
            as_html(camp, 'mailing_lists__name', user),
        )
        self.assertEqual(
            f'{ml2.name}/{ml1.name}',
            as_csv(camp, 'mailing_lists__name', user),
        )

        self.assertHTMLEqual(
            f'<ul><li><p>{ml1.description}</p></li></ul>',
            as_html(camp, 'mailing_lists__description', user),
        )
        self.assertEqual(
            ml1.description,
            as_csv(camp, 'mailing_lists__description', user),
        )
Beispiel #3
0
    def test_registry_choice02(self):
        user = CremeUser()

        registry = _FieldPrintersRegistry()

        def print_choices_html(entity, fval, user, field):
            return '<em>{}</em>'.format(
                getattr(entity, f'get_{field.name}_display')())

        def print_choices_csv(entity, fval, user, field):
            return getattr(entity, f'get_{field.name}_display')().upper()

        registry.register_choice_printer(
            print_choices_html,
            output='html',
        ).register_choice_printer(
            print_choices_csv,
            output='csv',
        )

        # line = FakeInvoiceLine(discount_unit=FAKE_PERCENT_UNIT)
        line = FakeInvoiceLine(discount_unit=FakeInvoiceLine.Discount.PERCENT)
        label = _('Percent')
        self.assertEqual(
            '<em>{}</em>'.format(label),
            registry.get_html_field_value(line, 'discount_unit', user))
        self.assertEqual(
            label.upper(),
            registry.get_csv_field_value(line, 'discount_unit', user))
Beispiel #4
0
    def test_field_printers02(self):
        "ManyToMany (simple model)"
        user = self.login()
        field_printers_registry = _FieldPrintersRegistry()

        create_lang = Language.objects.create
        lang1 = create_lang(name='Klingon')
        lang2 = create_lang(name='Namek')

        goku = FakeContact.objects.create(user=user, first_name='Goku', last_name='Son')
        # goku.languages = [lang1, lang2]
        goku.languages.set([lang1, lang2])

        get_html_val = field_printers_registry.get_html_field_value
        result_fmt = '<ul><li>{}</li><li>{}</li></ul>'.format
        self.assertEqual(result_fmt(lang1, lang2),
                         get_html_val(goku, 'languages', user)
                        )
        self.assertEqual(result_fmt(lang1.name, lang2.name),
                         get_html_val(goku,  'languages__name', user)
                        )

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual('{}/{}'.format(lang1, lang2),
                         get_csv_val(goku, 'languages', user)
                        )
        self.assertEqual('{}/{}'.format(lang1.name, lang2.name),
                         get_csv_val(goku, 'languages__name', user)
                        )
Beispiel #5
0
    def test_field_printers07(self):
        "Numerics Field"
        user = self.login()
        field_printers_registry = _FieldPrintersRegistry()

        # Integer
        capital = 12345

        create_orga = partial(FakeOrganisation.objects.create, user=user)
        orga1 = create_orga(name='Hawk', capital=capital)
        orga2 = create_orga(name='God hand')

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual(capital, get_csv_val(orga1, 'capital', user))
        self.assertEqual('',      get_csv_val(orga2, 'capital', user))

        # Decimal & integer with choices
        invoice = FakeInvoice.objects.create(user=user, name='Swords & shields')

        create_line = partial(FakeInvoiceLine.objects.create, user=user, linked_invoice=invoice)
        line1 = create_line(item='Swords',  quantity='3.00', unit_price='125.6', discount_unit=FAKE_PERCENT_UNIT)
        line2 = create_line(item='Shields', quantity='2.00', unit_price='53.4',  discount_unit=None)

        dec_format = partial(number_format, use_l10n=True)
        self.assertEqual(dec_format('3.00'),  get_csv_val(line1, 'quantity',   user))
        self.assertEqual(dec_format('125.6'), get_csv_val(line1, 'unit_price', user))
        self.assertEqual(FAKE_DISCOUNT_UNIT[FAKE_PERCENT_UNIT],
                         get_csv_val(line1, 'discount_unit', user)
                        )
        self.assertEqual('', get_csv_val(line2, 'discount_unit', user))
Beispiel #6
0
    def test_registry01(self):
        user = CremeUser()

        registry = field_printers._FieldPrintersRegistry()
        as_html = registry.get_html_field_value
        as_csv = registry.get_csv_field_value

        sector = FakeSector.objects.all()[0]
        o = FakeOrganisation(
            user=user, name='Mars', url_site='www.mars.info', sector=sector,
        )

        self.assertEqual(o.name, as_html(o, 'name', user))
        self.assertEqual(o.name, as_csv(o, 'name', user))

        self.assertHTMLEqual(
            '<a href="{url}" target="_blank">{url}</a>'.format(url=o.url_site),
            as_html(o, 'url_site', user),
        )
        self.assertEqual(o.url_site, as_csv(o, 'url_site', user))

        self.assertEqual(sector.title, as_html(o, 'sector', user))
        self.assertEqual(sector.title, as_csv(o, 'sector', user))

        self.assertEqual(sector.title, as_html(o, 'sector__title', user))
        self.assertEqual(sector.title, as_csv(o, 'sector__title', user))
Beispiel #7
0
    def test_registry_m2m_entity02(self):
        "Credentials."
        user = self.login(is_superuser=False)
        SetCredentials.objects.create(
            role=self.role,
            value=EntityCredentials.VIEW,
            set_type=SetCredentials.ESET_OWN,
        )

        create_ml = FakeMailingList.objects.create
        ml1 = create_ml(user=user, name='Swimsuits')
        ml2 = create_ml(user=self.other_user, name='Hats')

        camp = FakeEmailCampaign.objects.create(user=user, name='Summer 2020')
        camp.mailing_lists.set([ml1, ml2])

        registry = field_printers._FieldPrintersRegistry()
        self.assertHTMLEqual(
            f'<ul><li>{settings.HIDDEN_VALUE}</li><li>{ml1.name}</li></ul>',
            registry.get_html_field_value(camp, 'mailing_lists__name', user),
        )
        self.assertEqual(
            f'{settings.HIDDEN_VALUE}/{ml1.name}',
            registry.get_csv_field_value(camp, 'mailing_lists__name', user),
        )
Beispiel #8
0
    def test_registry_credentials(self):
        user = self.login(is_superuser=False, allowed_apps=['creme_core'])
        SetCredentials.objects.create(
            role=self.role,
            value=(EntityCredentials.VIEW
                   | EntityCredentials.CHANGE
                   | EntityCredentials.DELETE
                   | EntityCredentials.LINK
                   | EntityCredentials.UNLINK),
            set_type=SetCredentials.ESET_OWN,
        )

        field_printers_registry = _FieldPrintersRegistry()

        create_img = FakeImage.objects.create
        casca_face = create_img(
            name='Casca face',
            user=self.other_user,
            description="Casca's selfie",
        )
        judo_face = create_img(name='Judo face',
                               user=user,
                               description="Judo's selfie")
        self.assertTrue(user.has_perm_to_view(judo_face))
        self.assertFalse(user.has_perm_to_view(casca_face))

        create_contact = partial(FakeContact.objects.create, user=user)
        casca = create_contact(first_name='Casca',
                               last_name='Mylove',
                               image=casca_face)
        judo = create_contact(first_name='Judo',
                              last_name='Doe',
                              image=judo_face)

        get_html_val = field_printers_registry.get_html_field_value
        self.assertEqual(
            f'<a href="{judo_face.get_absolute_url()}">{judo_face}</a>',
            get_html_val(judo, 'image', user))
        self.assertEqual(
            # '<p>Judo&#39;s selfie</p>',
            '<p>Judo&#x27;s selfie</p>',
            get_html_val(judo, 'image__description', user))

        HIDDEN_VALUE = settings.HIDDEN_VALUE
        self.assertEqual(HIDDEN_VALUE, get_html_val(casca, 'image', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_html_val(casca, 'image__description', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_html_val(casca, 'image__categories', user))

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual(HIDDEN_VALUE, get_csv_val(casca, 'image', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_csv_val(casca, 'image__description', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_csv_val(casca, 'image__categories', user))
Beispiel #9
0
    def test_field_printers04(self):
        "Credentials"
        user = self.login(is_superuser=False, allowed_apps=['creme_core'])
        self.role.exportable_ctypes.set(
            [ContentType.objects.get_for_model(FakeContact)])
        SetCredentials.objects.create(
            role=self.role,
            value=EntityCredentials.VIEW | EntityCredentials.CHANGE
            | EntityCredentials.DELETE | EntityCredentials.LINK
            | EntityCredentials.UNLINK,
            set_type=SetCredentials.ESET_OWN)

        field_printers_registry = _FieldPrintersRegistry()

        create_img = FakeImage.objects.create
        casca_face = create_img(name='Casca face',
                                user=self.other_user,
                                description="Casca's selfie")
        judo_face = create_img(name='Judo face',
                               user=user,
                               description="Judo's selfie")
        self.assertTrue(user.has_perm_to_view(judo_face))
        self.assertFalse(user.has_perm_to_view(casca_face))

        create_contact = partial(FakeContact.objects.create, user=user)
        casca = create_contact(first_name='Casca',
                               last_name='Mylove',
                               image=casca_face)
        judo = create_contact(first_name='Judo',
                              last_name='Doe',
                              image=judo_face)

        get_html_val = field_printers_registry.get_html_field_value
        self.assertEqual(
            '<a href="{}">{}</a>'.format(judo_face.get_absolute_url(),
                                         judo_face),
            get_html_val(judo, 'image', user))
        self.assertEqual('<p>Judo&#39;s selfie</p>',
                         get_html_val(judo, 'image__description', user))

        HIDDEN_VALUE = settings.HIDDEN_VALUE
        self.assertEqual(HIDDEN_VALUE, get_html_val(
            casca, 'image',
            user))  #_('Entity #%s (not viewable)') % casca_face.id
        self.assertEqual(HIDDEN_VALUE,
                         get_html_val(casca, 'image__description', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_html_val(casca, 'image__categories', user))

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual(HIDDEN_VALUE, get_csv_val(casca, 'image', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_csv_val(casca, 'image__description', user))
        self.assertEqual(HIDDEN_VALUE,
                         get_csv_val(casca, 'image__categories', user))
Beispiel #10
0
    def test_field_printers08(self):
        "Test TexField: link => no target"
        user = self.login()
        field_printers_registry = _FieldPrintersRegistry()

        hawk = FakeOrganisation.objects.create(user=user, name='Hawk',
                                               description='A powerful army.\nOfficial site: www.hawk-troop.org'
                                              )

        get_html_val = field_printers_registry.get_html_field_value
        self.assertEqual('<p>A powerful army.<br />Official site: <a href="http://www.hawk-troop.org">www.hawk-troop.org</a></p>',
                         get_html_val(hawk, 'description', user)
                        )
Beispiel #11
0
    def test_registry02(self):
        "Register by field types, different outputs..."
        user = self.create_user()

        print_charfield_html_args = []
        print_integerfield_html_args = []

        def print_charfield_html(entity, fval, user, field):
            print_charfield_html_args.append((entity, fval, user, field))
            return f'<span>{fval}</span>'

        def print_charfield_csv(entity, fval, user, field):
            return f'«{fval}»'

        def print_integerfield_html(entity, fval, user, field):
            print_integerfield_html_args.append((entity, fval, user, field))
            return f'<span data-type="integer">{fval}</span>'

        registry = _FieldPrintersRegistry().register(
            models.CharField, print_charfield_html).register(
                models.CharField,
                print_charfield_csv,
                output='csv',
            ).register(
                models.IntegerField,
                print_integerfield_html,
                output='html',
            )

        create_orga = partial(FakeOrganisation.objects.create, user=user)
        orga1 = create_orga(name='NERV', capital=1234)
        orga2 = create_orga(name='Seele')

        get_html_val = registry.get_html_field_value
        get_field = FakeOrganisation._meta.get_field

        self.assertEqual('<span>NERV</span>',
                         get_html_val(orga1, 'name', user))
        self.assertListEqual([(orga1, orga1.name, user, get_field('name'))],
                             print_charfield_html_args)

        self.assertEqual('<span>Seele</span>',
                         get_html_val(orga2, 'name', user))
        self.assertEqual('«NERV»',
                         registry.get_csv_field_value(orga1, 'name', user))

        self.assertEqual('<span data-type="integer">1234</span>',
                         get_html_val(orga1, 'capital', user))
        self.assertListEqual(
            [(orga1, orga1.capital, user, get_field('capital'))],
            print_integerfield_html_args)
Beispiel #12
0
    def test_field_printers09(self):
        "Test TexField: link => target='_blank'"
        user = self.login()
        field_printers_registry = _FieldPrintersRegistry()

        hawk = FakeOrganisation.objects.create(
            user=user,
            name='Hawk',
            description='A powerful army.\nOfficial site: www.hawk-troop.org')

        get_html_val = field_printers_registry.get_html_field_value
        self.assertEqual(
            '<p>A powerful army.<br>'
            'Official site: <a target="_blank" rel="noopener noreferrer" href="http://www.hawk-troop.org">www.hawk-troop.org</a>'
            '</p>', get_html_val(hawk, 'description', user))
Beispiel #13
0
    def test_registry_m2m02(self):
        "Empty sub-values."
        user1 = self.create_user(0)
        user2 = self.create_user(1, theme='')

        team = CremeUser.objects.create(username='******', is_team=True)
        team.teammates_set.set([user1, user2])

        registry = _FieldPrintersRegistry()
        theme1 = settings.THEMES[0][1]
        self.assertHTMLEqual(
            f'<ul><li>{theme1}</li></ul>',
            registry.get_html_field_value(team, 'teammates_set__theme', user1),
        )
        self.assertEqual(
            theme1,
            registry.get_csv_field_value(team, 'teammates_set__theme', user1))
Beispiel #14
0
    def test_field_printers06(self):
        "Boolean Field"
        user = self.login()
        field_printers_registry = _FieldPrintersRegistry()

        create_contact = partial(FakeContact.objects.create, user=user)
        casca = create_contact(first_name='Casca', last_name='Mylove', is_a_nerd=False)
        judo  = create_contact(first_name='Judo',  last_name='Doe',    is_a_nerd=True)

        get_html_val = field_printers_registry.get_html_field_value
        self.assertEqual(u'<input type="checkbox" disabled/>' + _('No'),
                         get_html_val(casca, 'is_a_nerd', user)
                        )
        self.assertEqual(u'<input type="checkbox" checked disabled/>' + _('Yes'),
                         get_html_val(judo, 'is_a_nerd', user)
                        )

        get_csv_val = field_printers_registry.get_csv_field_value
        self.assertEqual(_('No'),  get_csv_val(casca, 'is_a_nerd', user))
        self.assertEqual(_('Yes'), get_csv_val(judo, 'is_a_nerd', user))
Beispiel #15
0
    def test_registry_m2m02(self):
        "Empty sub-values."
        user1 = self.login()

        user2 = self.other_user
        user2.theme = ''
        user2.save()

        team = CremeUser.objects.create(username='******', is_team=True)
        team.teammates_set.set([user1, user2])

        registry = field_printers._FieldPrintersRegistry()
        self.assertHTMLEqual(
            f'<ul><li>{user1.theme}</li></ul>',
            registry.get_html_field_value(team, 'teammates_set__theme', user1),
        )
        self.assertEqual(
            user1.theme,
            registry.get_csv_field_value(team, 'teammates_set__theme', user1)
        )
Beispiel #16
0
    def test_registry_m2m_entity03(self):
        "Deleted entity."
        user = self.login()

        create_ml = partial(FakeMailingList.objects.create, user=user)
        ml1 = create_ml(name='Swimsuits')
        ml2 = create_ml(name='Hats', is_deleted=True)

        camp = FakeEmailCampaign.objects.create(user=user, name='Summer 2020')
        camp.mailing_lists.set([ml1, ml2])

        registry = field_printers._FieldPrintersRegistry()
        self.assertHTMLEqual(
            f'<ul><li>{ml1.name}</li></ul>',
            registry.get_html_field_value(camp, 'mailing_lists__name', user),
        )
        self.assertEqual(
            ml1.name,
            registry.get_csv_field_value(camp, 'mailing_lists__name', user),
        )
Beispiel #17
0
    def test_registry_choice01(self):
        user = CremeUser()

        registry = _FieldPrintersRegistry()
        as_html = registry.get_html_field_value
        as_csv = registry.get_csv_field_value

        # l1 = FakeInvoiceLine(discount_unit=FAKE_PERCENT_UNIT)
        l1 = FakeInvoiceLine(discount_unit=FakeInvoiceLine.Discount.PERCENT)
        expected1 = _('Percent')
        self.assertEqual(expected1, as_html(l1, 'discount_unit', user))
        self.assertEqual(expected1, as_csv(l1, 'discount_unit', user))

        # l2 = FakeInvoiceLine(discount_unit=FAKE_AMOUNT_UNIT)
        l2 = FakeInvoiceLine(discount_unit=FakeInvoiceLine.Discount.AMOUNT)
        expected2 = _('Amount')
        self.assertEqual(expected2, as_html(l2, 'discount_unit', user))
        self.assertEqual(expected2, as_csv(l2, 'discount_unit', user))

        l3 = FakeInvoiceLine(discount_unit=None)
        self.assertEqual('', as_html(l3, 'discount_unit', user))
        self.assertEqual('', as_csv(l3, 'discount_unit', user))
Beispiel #18
0
    def test_registry_m2m01(self):
        user = self.login()

        registry = field_printers._FieldPrintersRegistry()
        as_html = registry.get_html_field_value
        as_csv = registry.get_csv_field_value

        img = FakeImage.objects.create(user=user, name='My img')
        img.categories.set([
            FakeImageCategory.objects.create(name=name) for name in ('A', 'B', 'C')
        ])

        self.assertHTMLEqual(
            '<ul><li>A</li><li>B</li><li>C</li></ul>',
            as_html(img, 'categories', user),
        )
        self.assertEqual('A/B/C', as_csv(img, 'categories', user))

        self.assertHTMLEqual(
            '<ul><li>A</li><li>B</li><li>C</li></ul>',
            as_html(img, 'categories__name', user),
        )
        self.assertEqual('A/B/C', as_csv(img, 'categories', user))
Beispiel #19
0
    def test_field_printers03(self):
        "ManyToMany (CremeEntity)"
        user = self.login(is_superuser=False)
        # self.role.exportable_ctypes = [ContentType.objects.get_for_model(FakeEmailCampaign)]
        self.role.exportable_ctypes.set([ContentType.objects.get_for_model(FakeEmailCampaign)])
        SetCredentials.objects.create(role=self.role,
                                      value=EntityCredentials.VIEW   |
                                            EntityCredentials.CHANGE |
                                            EntityCredentials.DELETE |
                                            EntityCredentials.LINK   |
                                            EntityCredentials.UNLINK,
                                      set_type=SetCredentials.ESET_OWN
                                     )

        field_printers_registry = _FieldPrintersRegistry()

        create_camp = partial(FakeEmailCampaign.objects.create, user=user)
        camp1 = create_camp(name='Camp#1')
        camp2 = create_camp(name='Camp#2')
        create_camp(name='Camp#3')

        create_ml = partial(FakeMailingList.objects.create, user=user)
        ml1 = create_ml(name='ML#1')
        ml2 = create_ml(name='ML#2')
        ml3 = create_ml(name='ML#3', user=self.other_user)
        # camp1.mailing_lists = [ml1, ml2]
        # camp2.mailing_lists = [ml3]
        camp1.mailing_lists.set([ml1, ml2])
        camp2.mailing_lists.set([ml3])

        get_html_val = field_printers_registry.get_html_field_value
        get_csv_val  = field_printers_registry.get_csv_field_value
        self.assertEqual('<ul>'
                            '<li><a target="_blank" href="{}">{}</a></li>'
                            '<li><a target="_blank" href="{}">{}</a></li>'
                         '</ul>'.format(
                                ml1.get_absolute_url(), ml1,
                                ml2.get_absolute_url(), ml2,
                            ),
                         get_html_val(camp1, 'mailing_lists', user)
                        )
        self.assertEqual('<ul>'
                            '<li>{}</li>'
                            '<li>{}</li>'
                         '</ul>'.format(
                                ml1.name,
                                ml2.name,
                            ),
                         get_html_val(camp1, 'mailing_lists__name', user)
                        )

        csv_value = u'{}/{}'.format(ml1, ml2)
        self.assertEqual(csv_value, get_csv_val(camp1, 'mailing_lists', user))
        self.assertEqual(csv_value, get_csv_val(camp1, 'mailing_lists__name', user))

        HIDDEN_VALUE = settings.HIDDEN_VALUE
        html_value = '<ul><li>{}</li></ul>'.format(HIDDEN_VALUE)  #_(u'Entity #%s (not viewable)') % ml3.id,
        self.assertEqual(html_value, get_html_val(camp2, 'mailing_lists', user))
        self.assertEqual(html_value, get_html_val(camp2, 'mailing_lists__name', user))

        self.assertEqual(HIDDEN_VALUE, get_csv_val(camp2, 'mailing_lists', user))
        self.assertEqual(HIDDEN_VALUE, get_csv_val(camp2, 'mailing_lists__name', user))
Beispiel #20
0
    def test_field_printers01(self):
        user = self.login()

        print_foreignkey_html = FKPrinter(none_printer=FKPrinter.print_fk_null_html,
                                          default_printer=simple_print_html,
                                         )
        print_foreignkey_html.register(CremeEntity, FKPrinter.print_fk_entity_html)

        field_printers_registry = _FieldPrintersRegistry()
        field_printers_registry.register(models.ForeignKey, print_foreignkey_html)

        get_html_val = field_printers_registry.get_html_field_value
        get_csv_val  = field_printers_registry.get_csv_field_value

        create_cat = FakeImageCategory.objects.create
        cat1 = create_cat(name='Photo of contact')
        cat2 = create_cat(name='Photo of product')

        img = FakeImage.objects.create(name="Casca's face", user=user, description="Casca's selfie")
        # img.categories = [cat1, cat2]
        img.categories.set([cat1, cat2])

        create_contact = partial(FakeContact.objects.create, user=user)
        casca = create_contact(first_name='Casca', last_name='Mylove',
                               position=FakePosition.objects.create(title='Warrior<script>'),
                               image=img,
                              )
        judo = create_contact(first_name='Judo', last_name='Doe')

        escaped_title = 'Warrior&lt;script&gt;'

        self.assertEqual(casca.last_name,      get_html_val(casca, 'last_name',       user))
        self.assertEqual(casca.last_name,      get_csv_val(casca,  'last_name',       user))

        self.assertEqual(casca.first_name,     get_html_val(casca, 'first_name',      user))
        self.assertEqual(escaped_title,        get_html_val(casca, 'position',        user))

        self.assertEqual(escaped_title,        get_html_val(casca, 'position__title', user))
        self.assertEqual(casca.position.title, get_csv_val(casca,  'position__title', user))

        # FK: with & without customised null_label
        self.assertEqual('', get_html_val(judo, 'position', user))
        self.assertEqual('', get_csv_val(judo,  'position', user))
        self.assertEqual(u'<em>{}</em>'.format(pgettext('persons-is_user', 'None')),
                         get_html_val(casca, 'is_user', user)
                        )
        self.assertEqual('', get_csv_val(casca, 'is_user', user))  # Null_label not used in CSV backend

        self.assertEqual(u'<a href="{}">{}</a>'.format(img.get_absolute_url(), escape(img)),
                         get_html_val(casca, 'image', user)
                        )
        self.assertEqual(str(casca.image), get_csv_val(casca, 'image', user))

        self.assertEqual('<p>Casca&#39;s selfie</p>',
                         get_html_val(casca, 'image__description', user)
                        )
        self.assertEqual(casca.image.description,
                         get_csv_val(casca, 'image__description', user)
                        )

        date_str = date_format(localtime(casca.created), 'DATETIME_FORMAT')
        self.assertEqual(date_str, get_html_val(casca, 'created', user))
        self.assertEqual(date_str, get_csv_val(casca,  'created', user))

        self.assertEqual('<ul><li>{}</li><li>{}</li></ul>'.format(cat1.name, cat2.name),
                         get_html_val(casca, 'image__categories', user)
                        )
        self.assertEqual('{}/{}'.format(cat1.name, cat2.name),
                         get_csv_val(casca, 'image__categories', user)
                        )
        # TODO: test ImageField

        self.assertEqual('', get_html_val(judo, 'position__title',    user))
        self.assertEqual('', get_html_val(judo, 'image',              user))
        self.assertEqual('', get_html_val(judo, 'image__description', user))
        self.assertEqual('', get_html_val(judo, 'image__categories',  user))

        self.assertEqual(str(user), get_html_val(casca, 'image__user', user))            # depth = 2
        self.assertEqual(user.username, get_html_val(casca, 'image__user__username', user))  # depth = 3