diff --git a/frontend/src/api/identities.js b/frontend/src/api/identities.js new file mode 100644 index 000000000..e2b74e5d2 --- /dev/null +++ b/frontend/src/api/identities.js @@ -0,0 +1,9 @@ +import repository from './repository' + +const resource = 'identities' + +export default { + getAll () { + return repository.get(`${resource}/`) + } +} diff --git a/frontend/src/components/identities/AccountCreationForm.vue b/frontend/src/components/identities/AccountCreationForm.vue new file mode 100644 index 000000000..f6ac7caff --- /dev/null +++ b/frontend/src/components/identities/AccountCreationForm.vue @@ -0,0 +1,114 @@ + + + + + + + General + + + + Mail + + + mdi-close + + + + + + New account / + General + + + + + Next + + + + + + + + + + + + diff --git a/frontend/src/components/identities/AccountGeneralForm.vue b/frontend/src/components/identities/AccountGeneralForm.vue new file mode 100644 index 000000000..454bef6b3 --- /dev/null +++ b/frontend/src/components/identities/AccountGeneralForm.vue @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/identities/IdentityList.vue b/frontend/src/components/identities/IdentityList.vue new file mode 100644 index 000000000..e7bb3c091 --- /dev/null +++ b/frontend/src/components/identities/IdentityList.vue @@ -0,0 +1,85 @@ + + + + + + + Actions mdi-chevron-down + + + + + + + + + + + + + {{ tag.label }} + + + + + + + + mdi-dots-horizontal + + + + + + + + + + + + diff --git a/frontend/src/components/layout/Navbar.vue b/frontend/src/components/layout/Navbar.vue index 72b32ae02..5127410c4 100644 --- a/frontend/src/components/layout/Navbar.vue +++ b/frontend/src/components/layout/Navbar.vue @@ -122,6 +122,7 @@ export default { }, { text: this.$gettext('Identities'), + to: { name: 'Identities' }, icon: 'mdi-account' }, { diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 93ab5b3e3..4c7a77ffb 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -18,7 +18,7 @@ const routes = [ component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue') }, { - path: '/domains/', + path: '/domains', name: 'DomainList', component: () => import('../views/Domains.vue'), meta: { @@ -41,6 +41,14 @@ const routes = [ requiresAuth: true } }, + { + path: '/identities', + name: 'Identities', + component: () => import('../views/identities/Identities.vue'), + meta: { + requiresAuth: true + } + }, { path: '/parameters/:app', name: 'ParametersEdit', diff --git a/frontend/src/views/identities/Identities.vue b/frontend/src/views/identities/Identities.vue new file mode 100644 index 000000000..9b3fde372 --- /dev/null +++ b/frontend/src/views/identities/Identities.vue @@ -0,0 +1,62 @@ + + + + Identities + + + mdi-file-import-outline + + + mdi-file-export-outline + + + + + mdi-plus + New + + + + + Account + + + Alias + + + + + + + + + + + + + diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index 0bc1cbb55..99198f194 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -132,3 +132,19 @@ class SimpleDomainAdminSerializer(serializers.Serializer): account = serializers.PrimaryKeyRelatedField( queryset=core_models.User.objects.all() ) + + +class TagSerializer(serializers.Serializer): + """Serializer used to represent a tag.""" + + name = serializers.CharField() + label = serializers.CharField() + type = serializers.CharField() + + +class IdentitySerializer(serializers.Serializer): + """Serializer used for identities.""" + + identity = serializers.CharField() + name_or_rcpt = serializers.CharField() + tags = TagSerializer(many=True) diff --git a/modoboa/admin/api/v2/urls.py b/modoboa/admin/api/v2/urls.py index afcf104a4..be379f3b5 100644 --- a/modoboa/admin/api/v2/urls.py +++ b/modoboa/admin/api/v2/urls.py @@ -15,5 +15,7 @@ router.register(r"aliases", v1_viewsets.AliasViewSet, basename="alias") router.register( r"senderaddresses", v1_viewsets.SenderAddressViewSet, basename="sender_address") +router.register( + r"identities", viewsets.IdentityViewSet, basename="identities") urlpatterns = router.urls diff --git a/modoboa/admin/api/v2/viewsets.py b/modoboa/admin/api/v2/viewsets.py index 905884bbb..d0a942aa1 100644 --- a/modoboa/admin/api/v2/viewsets.py +++ b/modoboa/admin/api/v2/viewsets.py @@ -18,6 +18,7 @@ from modoboa.admin.api.v1 import ( from modoboa.core import models as core_models from modoboa.lib import viewsets as lib_viewsets +from ... import lib from ... import models from . import serializers @@ -144,3 +145,15 @@ class AccountViewSet(v1_viewsets.AccountViewSet): .values_list("object_id", flat=True) ) return core_models.User.objects.filter(pk__in=ids) + + +class IdentityViewSet(viewsets.ViewSet): + """Viewset for identities.""" + + permission_classes = (permissions.IsAuthenticated, ) + + def list(self, request, **kwargs): + """Return all identities.""" + serializer = serializers.IdentitySerializer( + lib.get_identities(request.user), many=True) + return response.Response(serializer.data)