Added support for sender addresses

This commit is contained in:
Antoine Nguyen
2022-04-08 10:47:25 +02:00
parent 333614da4a
commit bd0146e41f
7 changed files with 147 additions and 3 deletions
+18
View File
@@ -0,0 +1,18 @@
import repository from './repository'
const resource = 'senderaddresses'
export default {
getAll () {
return repository.get(`${resource}/`)
},
getAllForMailbox (mailboxId) {
return repository.get(`${resource}/`, { params: { mailbox: mailboxId } })
},
create (data) {
return repository.post(`${resource}/`, data)
},
delete (addressId) {
return repository.delete(`${resource}/${addressId}/`)
}
}
@@ -98,7 +98,9 @@
<account-mailbox-form ref="mailboxForm" :account="editedAccount" />
</v-expansion-panel-content>
</v-expansion-panel>
<v-expansion-panel v-if="limitsConfig.enable_admin_limits && account.role !== 'SimpleUsers'">
<v-expansion-panel
v-if="limitsConfig.enable_admin_limits && account.role !== 'SimpleUsers' && account.role !== 'SuperAdmins'"
>
<v-expansion-panel-header>
<v-row no-gutters>
<v-col cols="4">
@@ -183,6 +185,9 @@ export default {
if (this.$refs.resourcesForm !== undefined) {
data.resources = this.$refs.resourcesForm.getPayload()
}
if (data.aliases === null) {
delete data.aliases
}
await accounts.patch(this.editedAccount.pk, data).then(resp => {
bus.$emit('notification', { msg: this.$gettext('Account updated') })
})
@@ -0,0 +1,103 @@
<template>
<v-card>
<v-card-title>
<translate class="headline">Sender addresses</translate>
</v-card-title>
<v-card-text>
<v-data-table
:headers="headers"
:items="addresses"
hide-default-footer
:no-data-text="'No sender address defined for this account'|translate"
>
<template v-slot:item.address="{ item }">
<span v-if="item.pk">{{ item.address }}</span>
<v-text-field
v-else
v-model="newAddress"
:label="'Specify an email address'|translate"
>
<template v-slot:append-outer>
<v-btn v-if="newAddress" icon color="primary" @click="submit">
<v-icon>mdi-content-save</v-icon>
</v-btn>
</template>
</v-text-field>
</template>
<template v-slot:item.actions="{ item }">
<v-btn v-if="item.pk"
icon
color="red"
@click="deleteSenderAddress(item)"
:title="'Remove this address'|translate"
>
<v-icon>mdi-delete-outline</v-icon>
</v-btn>
</template>
</v-data-table>
<v-btn
v-if="!hideAddBtn"
small
color="primary"
outlined
@click="addRow"
>
<v-icon small>mdi-plus</v-icon> <translate>Add sender address</translate>
</v-btn>
</v-card-text>
</v-card>
</template>
<script>
import { bus } from '@/main'
import senderAddresses from '@/api/senderAddresses'
export default {
props: {
account: Object
},
data () {
return {
addresses: [],
headers: [
{ text: this.$gettext('Address'), value: 'address' },
{ text: '', value: 'actions', align: 'right', sortable: false }
],
hideAddBtn: false,
newAddress: null
}
},
methods: {
addRow () {
this.addresses.push({})
this.hideAddBtn = true
},
fetchSenderAddresses () {
senderAddresses.getAllForMailbox(this.account.mailbox.pk).then(resp => {
this.addresses = resp.data
})
},
submit () {
const data = {
address: this.newAddress,
mailbox: this.account.mailbox.pk
}
senderAddresses.create(data).then(response => {
this.fetchSenderAddresses()
this.newAddress = null
this.hideAddBtn = false
bus.$emit('notification', { msg: this.$gettext('Sender address added') })
})
},
deleteSenderAddress (senderAddress) {
senderAddresses.delete(senderAddress.pk).then(response => {
this.fetchSenderAddresses()
bus.$emit('notification', { msg: this.$gettext('Sender address deleted') })
})
}
},
mounted () {
this.fetchSenderAddresses()
}
}
</script>
+8 -1
View File
@@ -12,10 +12,15 @@
</v-col>
<v-col cols="6">
<resources
v-if="limitsConfig.enable_admin_limits && account.resources && account.resources.length"
v-if="limitsConfig.enable_admin_limits && account.role !== 'SimpleUsers' && account.role !== 'SuperAdmins'"
:resources="account.resources"
/>
<account-aliases v-if="account.aliases" class="mt-2" :account="account" />
<account-sender-addresses
v-if="account.mailbox"
class="mt-2"
:account="account"
/>
</v-col>
</v-row>
<v-row v-if="account.role === 'DomainAdmins'">
@@ -29,6 +34,7 @@
<script>
import accounts from '@/api/accounts'
import AccountAliases from '@/components/identities/AccountAliases'
import AccountSenderAddresses from '@/components/identities/AccountSenderAddresses'
import AccountSummary from '@/components/identities/AccountSummary'
import DomainAdminDomains from '@/components/identities/DomainAdminDomains'
import parameters from '@/api/parameters'
@@ -37,6 +43,7 @@ import Resources from '@/components/tools/Resources'
export default {
components: {
AccountAliases,
AccountSenderAddresses,
AccountSummary,
DomainAdminDomains,
Resources
+10
View File
@@ -200,10 +200,20 @@ class AliasViewSet(lib_viewsets.RevisionModelMixin, viewsets.ModelViewSet):
return queryset
class SenderAddressFilterSet(dj_filters.FilterSet):
"""Custom FilterSet for SenderAddress."""
class Meta:
model = models.SenderAddress
fields = ["mailbox"]
class SenderAddressViewSet(lib_viewsets.RevisionModelMixin,
viewsets.ModelViewSet):
"""View set for SenderAddress model."""
filter_backends = (dj_filters.DjangoFilterBackend, )
filterset_class = SenderAddressFilterSet
permission_classes = [IsAuthenticated, DjangoModelPermissions, ]
serializer_class = serializers.SenderAddressSerializer
+1 -1
View File
@@ -35,7 +35,7 @@ def validate_alias_address(address, creator, internal=False, instance=None):
if not instance or instance.address != address:
if Alias.objects.filter(address=address, internal=internal).exists():
raise ValidationError(_("An alias with this name already exists."))
if instance is None:
if instance is None and not creator.is_superuser:
try:
# Check creator limits
core_signals.can_create_object.send(
+1
View File
@@ -19,6 +19,7 @@ def check_object_limit(sender, context, **kwargs):
if context.__class__.__name__ == "User":
if not param_tools.get_global_parameter("enable_admin_limits"):
return
# FIXME: Useless?
if context.is_superuser:
return True
ct = ContentType.objects.get_for_model(kwargs.get("klass"))