diff --git a/frontend/src/components/admin/imap_migration/ProviderCreationForm.vue b/frontend/src/components/admin/imap_migration/ProviderCreationForm.vue index 727f31f4e..ccc81c0ae 100644 --- a/frontend/src/components/admin/imap_migration/ProviderCreationForm.vue +++ b/frontend/src/components/admin/imap_migration/ProviderCreationForm.vue @@ -77,6 +77,7 @@ const provider = ref({ }) // forms ref +const form = ref() const general = ref() const associated = ref() @@ -104,13 +105,12 @@ function getForm(step) { } function getVFormRef(step) { - console.log(provider.value) return formStepsComponents[step.name].value.vFormRef } function validateProvider() {} -function submit() { +async function submit() { const data = { ...provider.value } data.domains = [] for (const domain of provider.value.domains) { @@ -123,10 +123,13 @@ function submit() { data.domains.push(domain) } } - providersStore.createProvider(data).then(() => { + try { + await providersStore.createProvider(data) busStore.displayNotification({ msg: $gettext('Provider created') }) close() - }) + } finally { + form.value.working = false + } } diff --git a/frontend/src/components/admin/imap_migration/ProvidersList.vue b/frontend/src/components/admin/imap_migration/ProvidersList.vue index a31d70616..006d36373 100644 --- a/frontend/src/components/admin/imap_migration/ProvidersList.vue +++ b/frontend/src/components/admin/imap_migration/ProvidersList.vue @@ -10,7 +10,7 @@ item-value="name" single-expand show-select - @click:row="(item, slot) => slot.expand(!slot.isExpanded)" + @click:row="expandRow" > @@ -41,7 +41,7 @@ @@ -53,21 +53,31 @@ - {{ item.domains.length }} associated domain(s) + {{ + $ngettext( + '%{count} associated domain', + '%{count} associated domains', + item.domains.length, + { count: item.domains.length } + ) + }} - No associated domain + {{ $gettext('No associated domain') }} - - - - - {{ domain.name }} --> {{ domain.new_domain.name }} - - - {{ domain.name }} --> {{ domain.name }} - - - + + + + + + {{ domain.name }} --> + {{ domainsStore.getDomainName(domain.new_domain) }} + + + {{ domain.name }} --> {{ domain.name }} + + + + @@ -82,13 +92,14 @@ diff --git a/frontend/src/components/admin/imap_migration/form_steps/ProviderAssociatedForm.vue b/frontend/src/components/admin/imap_migration/form_steps/ProviderAssociatedForm.vue index bef48438b..62a8087c6 100644 --- a/frontend/src/components/admin/imap_migration/form_steps/ProviderAssociatedForm.vue +++ b/frontend/src/components/admin/imap_migration/form_steps/ProviderAssociatedForm.vue @@ -11,7 +11,7 @@ - {{ domain.name }} --> {{ getDomainName(domain.new_domain) }} + {{ domain.name }} --> {{ domainsStore.getDomainName(domain.new_domain) }} {{ domain.name }} @@ -42,13 +42,14 @@ - diff --git a/frontend/src/stores/domains.store.js b/frontend/src/stores/domains.store.js index e5b48caac..37e0bc9d1 100644 --- a/frontend/src/stores/domains.store.js +++ b/frontend/src/stores/domains.store.js @@ -22,9 +22,17 @@ export const useDomainsStore = defineStore('domains', () => { } } + function getDomainName(domainId) { + if (typeof domainId === 'object') { + return domainId.name + } + return domains.value.find((domain) => domain.pk === domainId).name + } + return { domainsLoaded, domains, + getDomainName, getDomains, $reset, } diff --git a/modoboa/imap_migration/api/v2/serializers.py b/modoboa/imap_migration/api/v2/serializers.py index e94f67982..213898637 100644 --- a/modoboa/imap_migration/api/v2/serializers.py +++ b/modoboa/imap_migration/api/v2/serializers.py @@ -57,6 +57,19 @@ class EmailProviderSerializer(serializers.ModelSerializer): if domains: to_create = [] for domain in domains: + if models.EmailProviderDomain.objects.filter( + name=domain["name"] + ).exists(): + raise serializers.ValidationError( + { + "error": ( + _("Migrated domain with name {} already exists").format( + domain["name"] + ) + ) + } + ) + to_create.append( models.EmailProviderDomain(provider=provider, **domain) ) diff --git a/modoboa/imap_migration/tests.py b/modoboa/imap_migration/tests.py index a972f2927..0841a091b 100644 --- a/modoboa/imap_migration/tests.py +++ b/modoboa/imap_migration/tests.py @@ -134,6 +134,13 @@ class ViewSetTestCase(DataMixin, ModoAPITestCase): models.EmailProviderDomain.objects.filter(name="gmail.com").exists() ) + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, 400) + self.assertEqual( + response.json()["error"], + "Migrated domain with name gmail.com already exists", + ) + def test_update_provider(self): provider_domain = factories.EmailProviderDomainFactory(name="outlook.com") url = reverse("v2:emailprovider-detail", args=[provider_domain.provider.pk])