diff --git a/apimail/api/serializers.py b/apimail/api/serializers.py index dfeb02676d0116c29f478e83543f33ad587fb0c6..2072bb492ac52e0028e7423367ce2f386b7825fa 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 0c0680005861a1d3d8f06e4496cb8380ced3f7a0..7b0838d53ee1ef5f125b50665433f9c93ff47e77 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 0000000000000000000000000000000000000000..f8703cb4404729802abc21e2d9e2e7c28485f12f --- /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 0000000000000000000000000000000000000000..0fa6fb915ccaaefc5b0bada2529030df1524ed24 --- /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 905ef2408ea95aa44fb0595415cfdbd161828033..e43ec470bc8b200d033cfde3366bae326bd79890 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 319dbad2590cb433994acd9ed7282e9c9757adfc..68a38c043f0d468c1cc7418ae54b4ff2cf7d8888 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 40854abfccf71a339d197d30de1fa5fdd3327212..7be0712b2835ea2cdb430679237ff69e9295f33e 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 5d8296f04e61e011a7f1f21b36677027a2e0ca2c..48f159e9e2ad26111f2ea985de117ad12367f128 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", ], },