Beispiel #1
0
    def test_deletor_job02(self):
        "One replacement."
        user = self.create_user()

        civ = FakeCivility.objects.first()
        civ2del = FakeCivility.objects.create(title='Kun')

        contact = FakeContact.objects.create(
            user=user,
            civility=civ2del,
            last_name='Hattori',
            first_name='Genzo',
        )

        job = Job.objects.create(
            type_id=deletor_type.id,
            user=user,
        )
        DeletionCommand.objects.create(
            job=job,
            instance_to_delete=civ2del,
            replacers=[
                FixedValueReplacer(
                    model_field=FakeContact._meta.get_field('civility'),
                    value=civ,
                ),
            ],
            total_count=1,
        )
        progress = deletor_type.progress(job)
        self.assertEqual(0, progress.percentage)
        self.assertFalse(progress.label)

        deletor_type.execute(job)
        self.assertDoesNotExist(civ2del)
        self.assertEqual(civ, self.refresh(contact).civility)

        self.assertFalse(JobResult.objects.filter(job=job))

        job = self.refresh(job)
        self.assertListEqual([
            ngettext('{count} entity updated.', '{count} entities updated.',
                     1).format(count=1),
        ], deletor_type.get_stats(job))
        progress = deletor_type.progress(job)
        self.assertEqual(100, progress.percentage)
        self.assertFalse(progress.label)

        # NB: we check the description is OK _after_ the instance is deleted
        self.assertListEqual([
            _('Deleting «{object}» ({model})').format(
                object=civ2del.title,
                model='Test civility',
            ),
            _('In «{model} - {field}», replace by «{new}»').format(
                model='Test Contact',
                field=_('Civility'),
                new=civ.title,
            ),
        ], deletor_type.get_description(job))
Beispiel #2
0
    def test_delete_enum_value03(self):
        "ENUM used + replacing by NULL."
        user = self.login()

        cfield = CustomField.objects.create(
            content_type=FakeContact,
            field_type=CustomField.ENUM,
            name='Programming languages',
        )

        create_evalue = partial(CustomFieldEnumValue.objects.create, custom_field=cfield)
        eval1_01 = create_evalue(value='C')
        create_evalue(value='lisp')

        linus = FakeContact.objects.create(user=user, first_name='Linus', last_name='Torvalds')

        enum1 = CustomFieldEnum.objects.create(
            entity=linus, custom_field=cfield, value=eval1_01,
        )

        response = self.client.post(
            reverse('creme_config__delete_custom_enum', args=(eval1_01.id,)),
            # data={'to_choice': eval1_02.id}
        )
        self.assertNoFormError(response)

        dcom = self.get_deletion_command_or_fail(CustomFieldEnumValue)
        self.assertFalse(dcom.replacers)
        self.assertEqual(1, dcom.total_count)

        deletor_type.execute(dcom.job)
        self.assertDoesNotExist(eval1_01)
        self.assertDoesNotExist(enum1)
Beispiel #3
0
    def test_deletor_job04(self):
        "No replacement + exception."
        user = self.login()
        sector = FakeSector.objects.create(title='Ninja')
        orga = FakeOrganisation.objects.create(
            user=user,
            sector=sector,
            name='Hattori clan',
        )

        job = Job.objects.create(
            type_id=deletor_type.id,
            user=user,
        )
        DeletionCommand.objects.create(
            job=job,
            instance_to_delete=sector,
            replacers=[],
        )

        deletor_type.execute(job)
        self.assertStillExists(sector)
        self.assertEqual(sector, self.refresh(orga).sector)

        jresult = self.get_object_or_fail(JobResult, job=job)
        self.assertEqual([
            _('«{instance}» can not be deleted because of its dependencies: {dependencies}'
              ).format(instance=sector,
                       dependencies=_('{count} {model}').format(
                           count=1,
                           model=get_model_verbose_name(FakeOrganisation, 1),
                       )),
        ], jresult.messages)
Beispiel #4
0
    def test_delete_enum_value01(self):
        "ENUM not used."
        user = self.login(is_superuser=False, admin_4_apps=('creme_core',))

        self.assertIsNone(DeletionCommand.objects.first())

        cfield = CustomField.objects.create(
            content_type=FakeContact,
            name='Programming languages',
            field_type=CustomField.ENUM,
        )

        create_evalue = partial(CustomFieldEnumValue.objects.create, custom_field=cfield)
        create_evalue(value='C')
        eval02 = create_evalue(value='bash')
        create_evalue(value='sh')

        url = reverse('creme_config__delete_custom_enum', args=(eval02.id,))
        response = self.assertGET200(url)
        self.assertTemplateUsed(
            response,
            'creme_core/generics/blockform/delete-popup.html'
        )

        context = response.context
        self.assertEqual(
            _('Replace & delete «{object}»').format(object=eval02.value),
            context.get('title'),
        )
        self.assertEqual(_('Delete the choice'), context.get('submit_label'))

        with self.assertNoException():
            fields = context['form'].fields
            info = fields['info']

        self.assertFalse(info.required)
        self.assertNotIn('to_choice', fields)

        response = self.client.post(url)
        self.assertNoFormError(response)
        self.assertTemplateUsed(response, 'creme_config/deletion-job-popup.html')

        dcom = self.get_deletion_command_or_fail(CustomFieldEnumValue)
        self.assertEqual(eval02,       dcom.instance_to_delete)
        self.assertEqual(eval02.value, dcom.deleted_repr)
        self.assertFalse(dcom.replacers)
        self.assertEqual(0, dcom.total_count)
        self.assertEqual(0, dcom.updated_count)

        job = dcom.job
        self.assertEqual(deletor_type.id, job.type_id)
        self.assertEqual(user, job.user)

        deletor_type.execute(job)
        self.assertDoesNotExist(eval02)
Beispiel #5
0
    def test_deletor_job01(self):
        "No replacement."
        user = self.create_user()

        civ = FakeCivility.objects.create(title='Kun')
        contact = FakeContact.objects.create(
            user=user,
            civility=civ,
            last_name='Hattori',
            first_name='Hanzo',
        )

        job = Job.objects.create(
            type_id=deletor_type.id,
            user=user,
        )
        dcom = DeletionCommand.objects.create(
            job=job,
            instance_to_delete=civ,
            replacers=[],
        )
        self.assertEqual(0, dcom.total_count)
        self.assertEqual(0, dcom.updated_count)

        self.assertListEqual([
            _('Deleting «{object}» ({model})').format(
                object=civ.title,
                model='Test civility',
            ),
        ], deletor_type.get_description(job))
        progress = deletor_type.progress(job)
        self.assertIsNone(progress.percentage)
        self.assertEqual(
            ngettext('{count} entity updated.', '{count} entities updated.',
                     0).format(count=0), progress.label)

        deletor_type.execute(job)
        self.assertDoesNotExist(civ)

        contact = self.assertStillExists(contact)
        self.assertIsNone(contact.civility)

        self.assertFalse(deletor_type.get_stats(self.refresh(job)))

        job.delete()
        self.assertDoesNotExist(dcom)
Beispiel #6
0
    def test_deletor_job03(self):
        "Several Replacement."
        user = self.create_user()

        civ = FakeCivility.objects.first()
        civ2del = FakeCivility.objects.create(title='Kun')

        create_contact = partial(FakeContact.objects.create,
                                 user=user,
                                 civility=civ2del)
        contact1 = create_contact(last_name='Hattori', first_name='Genzo')
        contact2 = create_contact(last_name='Hattori', first_name='Hanzo')

        job = Job.objects.create(
            type_id=deletor_type.id,
            user=user,
        )
        DeletionCommand.objects.create(
            job=job,
            instance_to_delete=civ2del,
            replacers=[
                FixedValueReplacer(
                    model_field=FakeContact._meta.get_field('civility'),
                    value=civ,
                ),
            ],
        )

        deletor_type.execute(job)
        self.assertDoesNotExist(civ2del)
        self.assertEqual(civ, self.refresh(contact1).civility)
        self.assertEqual(civ, self.refresh(contact2).civility)

        self.assertFalse(JobResult.objects.filter(job=job))

        job = self.refresh(job)
        self.assertListEqual(
            [
                ngettext('{count} entity updated.',
                         '{count} entities updated.', 2).format(count=2),
            ],
            deletor_type.get_stats(job),
        )
Beispiel #7
0
    def test_delete_multi_enum01(self):
        "MULTI_ENUM not used."
        self.login(is_superuser=False, admin_4_apps=('creme_core',))

        cfield = CustomField.objects.create(
            content_type=FakeContact,
            name='Programming languages',
            field_type=CustomField.MULTI_ENUM,
        )

        create_evalue = partial(CustomFieldEnumValue.objects.create, custom_field=cfield)
        create_evalue(value='C')
        eval02 = create_evalue(value='bash')
        create_evalue(value='sh')

        url = reverse('creme_config__delete_custom_enum', args=(eval02.id,))
        response = self.assertGET200(url)

        with self.assertNoException():
            fields = response.context['form'].fields
            info = fields['info']

        self.assertFalse(info.required)
        self.assertNotIn('to_choice', fields)

        response = self.client.post(url)
        self.assertNoFormError(response)

        dcom = self.get_deletion_command_or_fail(CustomFieldEnumValue)
        self.assertEqual(eval02,       dcom.instance_to_delete)
        self.assertEqual(eval02.value, dcom.deleted_repr)
        self.assertFalse(dcom.replacers)
        self.assertEqual(0, dcom.total_count)

        deletor_type.execute(dcom.job)
        self.assertDoesNotExist(eval02)
Beispiel #8
0
    def test_delete_enum_value02(self):
        "ENUM used + replacing."
        user = self.login()

        create_cfield = partial(
            CustomField.objects.create,
            content_type=FakeContact,
            field_type=CustomField.ENUM,
        )
        cfield1 = create_cfield(name='Programming languages')
        cfield2 = create_cfield(name='OS')

        create_evalue = partial(CustomFieldEnumValue.objects.create, custom_field=cfield1)
        eval1_01 = create_evalue(value='C')
        eval1_02 = create_evalue(value='C99')
        eval1_03 = create_evalue(value='lisp')
        eval2_01 = create_evalue(value='Linux', custom_field=cfield2)

        create_contact = partial(FakeContact.objects.create, user=user)
        linus   = create_contact(first_name='Linus',   last_name='Torvalds')
        richard = create_contact(first_name='Richard', last_name='Stallman')

        create_enum = partial(CustomFieldEnum.objects.create, custom_field=cfield1)
        enum1 = create_enum(entity=linus, value=eval1_02)
        enum2 = create_enum(entity=richard, value=eval1_03)

        url = reverse('creme_config__delete_custom_enum', args=(eval1_02.id,))
        response = self.assertGET200(url)

        with self.assertNoException():
            fields = response.context['form'].fields
            choices = [*fields['to_choice'].choices]

        self.assertNotIn('info', fields)

        self.assertInChoices(value='',          label='---------',    choices=choices)
        self.assertInChoices(value=eval1_01.id, label=eval1_01.value, choices=choices)
        self.assertInChoices(value=eval1_03.id, label=eval1_03.value, choices=choices)
        self.assertNotInChoices(value=eval1_02.id, choices=choices)
        self.assertNotInChoices(value=eval2_01.id, choices=choices)

        response = self.client.post(url, data={'to_choice': eval1_01.id})
        self.assertNoFormError(response)

        dcom = self.get_deletion_command_or_fail(CustomFieldEnumValue)
        self.assertEqual(eval1_02, dcom.instance_to_delete)
        self.assertListEqual(
            [('fixed_value', CustomFieldEnum, 'value', eval1_01)],
            [
                (r.type_id, r.model_field.model, r.model_field.name, r.get_value())
                for r in dcom.replacers
            ],
        )
        self.assertEqual(1, dcom.total_count)
        self.assertEqual(0, dcom.updated_count)

        deletor_type.execute(dcom.job)
        self.assertDoesNotExist(eval1_02)

        self.assertEqual(eval1_03, self.refresh(enum2).value)
        self.assertEqual(eval1_01, self.refresh(enum1).value)
Beispiel #9
0
    def test_delete_multi_enum02(self):
        "MULTI_ENUM used + replacing."
        user = self.login()

        create_cfield = partial(
            CustomField.objects.create,
            content_type=FakeContact,
            field_type=CustomField.MULTI_ENUM,
        )
        cfield1 = create_cfield(name='Programming languages')
        cfield2 = create_cfield(name='OS')

        create_evalue = partial(CustomFieldEnumValue.objects.create, custom_field=cfield1)
        eval1_01 = create_evalue(value='C')
        eval1_02 = create_evalue(value='C99')
        eval1_03 = create_evalue(value='lisp')
        eval2_01 = create_evalue(value='Linux', custom_field=cfield2)

        create_contact = partial(FakeContact.objects.create, user=user)
        linus   = create_contact(first_name='Linus',   last_name='Torvalds')
        richard = create_contact(first_name='Richard', last_name='Stallman')
        john    = create_contact(first_name='John',    last_name='Carmack')

        cf_memum = partial(CustomFieldMultiEnum, custom_field=cfield1)
        cf_memum(entity=linus).set_value_n_save([eval1_02])
        cf_memum(entity=richard).set_value_n_save([eval1_01, eval1_03])
        cf_memum(entity=john).set_value_n_save([eval1_02, eval1_01])  # beware to avoid duplicates

        url = reverse('creme_config__delete_custom_enum', args=(eval1_02.id,))
        response = self.assertGET200(url)

        with self.assertNoException():
            fields = response.context['form'].fields
            choices = [*fields['to_choice'].choices]

        self.assertNotIn('info', fields)

        self.assertInChoices(value='',          label='---------',    choices=choices)
        self.assertInChoices(value=eval1_01.id, label=eval1_01.value, choices=choices)
        self.assertInChoices(value=eval1_03.id, label=eval1_03.value, choices=choices)
        self.assertNotInChoices(value=eval1_02.id, choices=choices)
        self.assertNotInChoices(value=eval2_01.id, choices=choices)

        response = self.client.post(url, data={'to_choice': eval1_01.id})
        self.assertNoFormError(response)

        dcom = self.get_deletion_command_or_fail(CustomFieldEnumValue)
        self.assertEqual(eval1_02, dcom.instance_to_delete)
        self.assertListEqual(
            [('fixed_value', CustomFieldMultiEnum, 'value', eval1_01)],
            [
                (r.type_id, r.model_field.model, r.model_field.name, r.get_value())
                for r in dcom.replacers
            ],
        )
        self.assertEqual(2, dcom.total_count)

        deletor_type.execute(dcom.job)
        self.assertDoesNotExist(eval1_02)

        self.assertCountEqual(
            [eval1_01, eval1_03],
            [*self.refresh(richard).get_custom_value(cfield1).get_enumvalues()]
        )
        self.assertCountEqual(
            [eval1_01],
            [*self.refresh(linus).get_custom_value(cfield1).get_enumvalues()]
        )
        self.assertCountEqual(
            [eval1_01],
            [*self.refresh(john).get_custom_value(cfield1).get_enumvalues()]
        )