diff --git a/frontend/src/api/accounts.js b/frontend/src/api/accounts.js
index 13113435d..c04b97ce5 100644
--- a/frontend/src/api/accounts.js
+++ b/frontend/src/api/accounts.js
@@ -3,9 +3,9 @@ import repository from './repository'
const resource = 'accounts'
export default {
- getAll({ domain, role }) {
+ getAll(params) {
return repository.get(`/${resource}/`, {
- params: { domain, role },
+ params,
paramsSerializer: {
indexes: null,
},
diff --git a/frontend/src/api/aliases.js b/frontend/src/api/aliases.js
index fea9bb285..0ed1993d7 100644
--- a/frontend/src/api/aliases.js
+++ b/frontend/src/api/aliases.js
@@ -3,8 +3,8 @@ import repository from './repository'
const resource = 'aliases'
export default {
- getAll() {
- return repository.get(`${resource}/`)
+ getAll(params) {
+ return repository.get(`${resource}/`, { params })
},
get(aliasId) {
return repository.get(`${resource}/${aliasId}/`)
diff --git a/frontend/src/components/admin/alarms/AlarmList.vue b/frontend/src/components/admin/alarms/AlarmList.vue
index cb2a56bd6..86a78e101 100644
--- a/frontend/src/components/admin/alarms/AlarmList.vue
+++ b/frontend/src/components/admin/alarms/AlarmList.vue
@@ -17,7 +17,7 @@
{
- accounts.value = resp.data.filter(
+ accounts.value = resp.data.results.filter(
(account) =>
administrators.value.find((admin) => admin.id === account.pk) ===
undefined
diff --git a/frontend/src/components/admin/domains/DomainList.vue b/frontend/src/components/admin/domains/DomainList.vue
index 8054267bc..959bd4c34 100644
--- a/frontend/src/components/admin/domains/DomainList.vue
+++ b/frontend/src/components/admin/domains/DomainList.vue
@@ -348,11 +348,20 @@ defineExpose({
})
-
diff --git a/frontend/src/components/admin/identities/IdentityList.vue b/frontend/src/components/admin/identities/IdentityList.vue
index acca12dfb..fcb23d18c 100644
--- a/frontend/src/components/admin/identities/IdentityList.vue
+++ b/frontend/src/components/admin/identities/IdentityList.vue
@@ -1,14 +1,19 @@
-
@@ -24,7 +29,13 @@
class="flex-grow-0 w-33 mr-4"
>
-
+
+
-
+
+
+
+
+
+
+
-
-
-
- {{ item.identity }}
-
-
-
-
- {{ item.identity }}
-
-
+
+
+ {{ item.username }}
+
+
+
+
+ {{ item.address }}
+
+
+
+
-
-
- {{ tag.label }}
+
+ {{ displayRecipients(item) }}
+
+
+ {{ $date(item.date_joined) }}
+
+
+ {{ $date(item.creation) }}
+
+
+ {{ $date(item.last_modification) }}
+
+
+ {{ $date(item.last_login) }}
+
+
+
+ {{ item.role }}
@@ -99,7 +144,7 @@
-
+
+
+
+
+
+
diff --git a/frontend/src/components/tools/ChooseColumnsForm.vue b/frontend/src/components/tools/ChooseColumnsForm.vue
new file mode 100644
index 000000000..215f4387c
--- /dev/null
+++ b/frontend/src/components/tools/ChooseColumnsForm.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $gettext('Apply') }}
+
+
+
+
+
+
diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py
index 50fb3f38a..b955685e0 100644
--- a/modoboa/admin/api/v2/serializers.py
+++ b/modoboa/admin/api/v2/serializers.py
@@ -402,9 +402,13 @@ class AccountSerializer(v1_serializers.AccountSerializer):
aliases = serializers.ListField(
child=lib_fields.DRFEmailFieldUTF8(), source="mailbox.alias_addresses"
)
+ possible_actions = serializers.SerializerMethodField()
class Meta(v1_serializers.AccountSerializer.Meta):
- fields = v1_serializers.AccountSerializer.Meta.fields + ("aliases",)
+ fields = v1_serializers.AccountSerializer.Meta.fields + (
+ "aliases",
+ "possible_actions",
+ )
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -412,6 +416,19 @@ class AccountSerializer(v1_serializers.AccountSerializer):
return
self.fields["resources"] = serializers.SerializerMethodField()
+ def get_possible_actions(self, identity) -> list[IdPossibleActionsSerializer]:
+ actions = admin_signals.extra_account_identities_actions.send(
+ self.__class__, account=identity
+ )
+ cleaned_actions = []
+ for action in actions:
+ try:
+ serialized_data = IdPossibleActionsSerializer(action[1]).data
+ cleaned_actions.append(serialized_data)
+ except (ValidationError, AttributeError):
+ continue
+ return cleaned_actions
+
def get_resources(self, account) -> list[AccountResourceSerializer]:
if account.role == "SimpleUsers":
return []
diff --git a/modoboa/admin/api/v2/viewsets.py b/modoboa/admin/api/v2/viewsets.py
index fa2460735..702440aa9 100644
--- a/modoboa/admin/api/v2/viewsets.py
+++ b/modoboa/admin/api/v2/viewsets.py
@@ -168,7 +168,13 @@ class AccountFilterSet(dj_filters.FilterSet):
class AccountViewSet(v1_viewsets.AccountViewSet):
"""ViewSet for User/Mailbox."""
- filter_backends = (filters.SearchFilter, dj_filters.DjangoFilterBackend)
+ filter_backends = (
+ filters.OrderingFilter,
+ filters.SearchFilter,
+ dj_filters.DjangoFilterBackend,
+ )
+ search_fields = ["^first_name", "^last_name", "^email", "username"]
+ pagination_class = pagination.CustomPageNumberPagination
filterset_class = AccountFilterSet
def get_serializer_class(self):
@@ -258,6 +264,13 @@ class IdentityViewSet(GetThrottleViewsetMixin, viewsets.ViewSet):
class AliasViewSet(v1_viewsets.AliasViewSet):
"""Viewset for Alias."""
+ filter_backends = (
+ filters.OrderingFilter,
+ filters.SearchFilter,
+ dj_filters.DjangoFilterBackend,
+ )
+ pagination_class = pagination.CustomPageNumberPagination
+ search_fields = ["address"]
serializer_class = serializers.AliasSerializer
@action(methods=["post"], detail=False)
diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py
index c18887f3e..e6f605ee9 100644
--- a/modoboa/core/management/commands/load_initial_data.py
+++ b/modoboa/core/management/commands/load_initial_data.py
@@ -119,12 +119,14 @@ class Command(BaseCommand):
redirect_uris = " ".join([f"{uri}/login/logged" for uri in base_uris_list])
redirect_uri = redirect_uris.split(" ")[0]
client_id = ""
+ if options["dev"]:
+ base_uri = "https://localhost:3000/"
+ base_uris = base_uri
+ redirect_uri = "https://localhost:3000/login/logged"
+ redirect_uris = redirect_uri
+ client_id = "LVQbfIIX3khWR3nDvix1u9yEGHZUxcx53bhJ7FlD"
if not frontend_application.exists():
- if options["dev"]:
- base_uri = "https://localhost:3000/"
- redirect_uri = "https://localhost:3000/login/logged"
- client_id = "LVQbfIIX3khWR3nDvix1u9yEGHZUxcx53bhJ7FlD"
- else:
+ if not options["dev"]:
client_id = str(uuid.uuid4())
call_command(
"createapplication",