From 4677660d627be819dd18f8e61235569f6aeab2c4 Mon Sep 17 00:00:00 2001 From: "J.-S. Caux" <J.S.Caux@uva.nl> Date: Tue, 14 Jan 2020 14:34:55 +0100 Subject: [PATCH] Work on accounts listing --- apimail/api/serializers.py | 20 +++++++- apimail/api/views.py | 20 +++++++- .../apimail/assets/vue/accounts_table.js | 13 +++++ .../assets/vue/components/Accounts.vue | 47 +++++++++++++++++++ .../assets/vue/components/MessagesTable.vue | 2 +- apimail/templates/apimail/message_list.html | 6 +++ apimail/urls.py | 10 ++++ webpack.dev.config.js | 1 + 8 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 apimail/static/apimail/assets/vue/accounts_table.js create mode 100644 apimail/static/apimail/assets/vue/components/Accounts.vue diff --git a/apimail/api/serializers.py b/apimail/api/serializers.py index dfeb02676..2072bb492 100644 --- a/apimail/api/serializers.py +++ b/apimail/api/serializers.py @@ -5,7 +5,25 @@ __license__ = "AGPL v3" from django.urls import reverse from rest_framework import serializers -from ..models import Event, StoredMessage, StoredMessageAttachment +from ..models import ( + EmailAccount, EmailAccountAccess, + Event, + StoredMessage, StoredMessageAttachment) + + +class EmailAccountSerializer(serializers.ModelSerializer): + class Meta: + model = EmailAccount + fields = ['name', 'email', 'description'] + + +class EmailAccountAccessSerializer(serializers.ModelSerializer): + """For request.user, return list of email account accesses.""" + account = EmailAccountSerializer() + + class Meta: + model = EmailAccountAccess + fields = ['account', 'rights', 'date_from', 'date_until'] class EventSerializer(serializers.ModelSerializer): diff --git a/apimail/api/views.py b/apimail/api/views.py index 0c0680005..7b0838d53 100644 --- a/apimail/api/views.py +++ b/apimail/api/views.py @@ -11,8 +11,24 @@ from rest_framework.generics import ListAPIView, RetrieveAPIView from rest_framework.permissions import AllowAny, IsAdminUser from rest_framework import filters -from ..models import Event, StoredMessage -from .serializers import EventSerializer, StoredMessageSerializer +from ..models import EmailAccount, EmailAccountAccess, Event, StoredMessage +from .serializers import ( + EmailAccountSerializer, EmailAccountAccessSerializer, + EventSerializer, + StoredMessageSerializer) + + +class EmailAccountListAPIView(ListAPIView): + permission_classes = (IsAdminUser,) + serializer_class = EmailAccountSerializer + + +class UserEmailAccountAccessListAPIView(ListAPIView): + """ListAPIView returning request.user's email account accesses.""" + serializer_class = EmailAccountAccessSerializer + + def get_queryset(self): + return self.request.user.email_account_accesses.all() class EventListAPIView(ListAPIView): diff --git a/apimail/static/apimail/assets/vue/accounts_table.js b/apimail/static/apimail/assets/vue/accounts_table.js new file mode 100644 index 000000000..f8703cb44 --- /dev/null +++ b/apimail/static/apimail/assets/vue/accounts_table.js @@ -0,0 +1,13 @@ +import Vue from 'vue'; + +import BootstrapVue from 'bootstrap-vue'; +Vue.use(BootstrapVue); + +import 'bootstrap-vue/dist/bootstrap-vue.css'; + +import UserAccountsTable from './components/Accounts.vue' + + +new Vue({ + render: h => h(UserAccountsTable), +}).$mount('#user-accounts-table'); diff --git a/apimail/static/apimail/assets/vue/components/Accounts.vue b/apimail/static/apimail/assets/vue/components/Accounts.vue new file mode 100644 index 000000000..0fa6fb915 --- /dev/null +++ b/apimail/static/apimail/assets/vue/components/Accounts.vue @@ -0,0 +1,47 @@ +<template> +<div class="overflow-auto"> + <b-card bg-variant="light"> + <b-form-group> + <div v-for="access in accesses"> + <input + type="radio" + v-model="accountSelected" + :id="access" + :value="access.account.email" + > + {{ access.account.email }} + </div> + <!-- <b-form-checkbox-group --> + <!-- v-model="accountSelected"> --> + <!-- <b-form-checkbox v-for="account in accounts" :value="account.email"> --> + <!-- {{ account }} --> + <!-- </b-form-checkbox> --> + <!-- </b-form-checkbox-group> --> + </b-form-group> + <p>Account to display: {{ accountSelected }}</p> + </b-card> +</div> +</template> + +<script> +export default { + name: "user-accounts-table", + data() { + return { + accesses: null, + accountSelected: null, + } + }, + methods: { + fetchAccounts () { + fetch('/mail/api/user_account_accesses') + .then(stream => stream.json()) + .then(data => this.accesses = data.results) + .catch(error => console.error(error)) + } + }, + mounted() { + this.fetchAccounts() + }, +} +</script> diff --git a/apimail/static/apimail/assets/vue/components/MessagesTable.vue b/apimail/static/apimail/assets/vue/components/MessagesTable.vue index 905ef2408..e43ec470b 100644 --- a/apimail/static/apimail/assets/vue/components/MessagesTable.vue +++ b/apimail/static/apimail/assets/vue/components/MessagesTable.vue @@ -91,7 +91,7 @@ <script> - import MessageContent from './MessageContent.vue' +import MessageContent from './MessageContent.vue' export default { name: "messages-table", diff --git a/apimail/templates/apimail/message_list.html b/apimail/templates/apimail/message_list.html index 319dbad25..68a38c043 100644 --- a/apimail/templates/apimail/message_list.html +++ b/apimail/templates/apimail/message_list.html @@ -29,6 +29,12 @@ {% endfor %} </table> + <h3>Accounts</h3> + <div id="user-accounts-table"> + <user-accounts-table></user-accounts-table> + </div> + + <h3>Messages</h3> <div id="messages-table"> diff --git a/apimail/urls.py b/apimail/urls.py index 40854abfc..7be0712b2 100644 --- a/apimail/urls.py +++ b/apimail/urls.py @@ -16,6 +16,16 @@ urlpatterns = [ path('api/', include([ + path( # /mail/api/accounts + 'accounts', + apiviews.EmailAccountListAPIView.as_view(), + name='accounts' + ), + path( # /mail/api/user_account_accesses + 'user_account_accesses', + apiviews.UserEmailAccountAccessListAPIView.as_view(), + name='user_account_accesses' + ), path( # /mail/api/events 'events', apiviews.EventListAPIView.as_view(), diff --git a/webpack.dev.config.js b/webpack.dev.config.js index 5d8296f04..48f159e9e 100644 --- a/webpack.dev.config.js +++ b/webpack.dev.config.js @@ -20,6 +20,7 @@ module.exports = { "./scipost/static/scipost/assets/js/newsticker.js", ], vue: [ + "./apimail/static/apimail/assets/vue/accounts_table.js", "./apimail/static/apimail/assets/vue/messages_table.js", ], }, -- GitLab