mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Merge pull request #2487 from modoboa/feature/sender_addresses
Added support for sender addresses
This commit is contained in:
@@ -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>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"))
|
||||
|
||||
Reference in New Issue
Block a user