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