diff --git a/wahlfang_api/serializers.py b/wahlfang_api/serializers.py index 956a29d5dbd3b9601f2e775e42548425af84a4a6..ba6d0a72d0311cf6e4b10e7e592da2a844eb0238 100644 --- a/wahlfang_api/serializers.py +++ b/wahlfang_api/serializers.py @@ -1,6 +1,6 @@ from django.conf import settings from django.contrib.auth import authenticate -from rest_framework import serializers +from rest_framework import serializers, fields from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from rest_framework_simplejwt.tokens import RefreshToken @@ -103,9 +103,10 @@ class SpectatorElectionSerializer(serializers.ModelSerializer): class SessionSerializer(serializers.ModelSerializer): + class Meta: model = Session - fields = '__all__' + fields = ['title', 'start_date'] class VoterDetailSerializer(serializers.ModelSerializer): diff --git a/wahlfang_api/views.py b/wahlfang_api/views.py index 85e8fbeb932df16fc8cffd6a70245a7545dcb0e8..aab9a59e53c5d9a8aa2af694e31f64574c8002c0 100644 --- a/wahlfang_api/views.py +++ b/wahlfang_api/views.py @@ -60,12 +60,12 @@ class SpectatorView(generics.RetrieveAPIView): class ManagerSessionView(generics.ListCreateAPIView): authentication_classes = [ElectionManagerJWTAuthentication] - queryset = Session.objects.all() permission_classes = [IsElectionManager] serializer_class = SessionSerializer def perform_create(self, serializer_class): serializer_class.save() + queryset = Session.objects.all() class ElectionViewset(viewsets.ReadOnlyModelViewSet): diff --git a/wahlfang_web/src/api/management.js b/wahlfang_web/src/api/management.js index 7493da146af5c0d193343c5bd1751ec8e871c3be..6a4b9621df254aa9aa218871bef3590b8219f675 100644 --- a/wahlfang_web/src/api/management.js +++ b/wahlfang_web/src/api/management.js @@ -4,13 +4,31 @@ export const managementAPIRoutes = { login: "/auth/token/", refreshToken: "/auth/token/refresh/", verifyToken: "/auth/token/verify/", - createSession: "management/add-session", + createSession: "/management/add-session", } +// Help functions + export const loadManagerToken = () => { return JSON.parse(localStorage.getItem("managerToken")); } +export async function makeAuthenticatedManagerRequest(url = '', type = '', data = null) { + let token = loadManagerToken(); + if (!isTokenValid(token.access)) { + token = await refreshManagerToken(); + } + const headers = { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token.access}`, + } + + return await makeRequest(url, type, data, headers); +} + + +// Auth api calls + export const refreshManagerToken = async () => { const response = await makeRequest(managementAPIRoutes.refreshToken, 'POST', { refresh: loadManagerToken().refresh @@ -45,8 +63,10 @@ export const logoutManager = async () => { return true; } +// API calls + export const createSession = async (form_values) => { - const response = await makeRequest(managementAPIRoutes.createSession, 'POST', form_values); + const response = await makeAuthenticatedManagerRequest(managementAPIRoutes.createSession, 'POST', form_values); if (response.status === 204) { return true; } else { diff --git a/wahlfang_web/src/pages/management/AddSession.js b/wahlfang_web/src/pages/management/AddSession.js index ee2625550d09698a9e488c882f58b139dd66f1c9..8a6dc25734a544e2d8804659ceb15769a959c07b 100644 --- a/wahlfang_web/src/pages/management/AddSession.js +++ b/wahlfang_web/src/pages/management/AddSession.js @@ -4,15 +4,42 @@ import { Formik, Form, Field } from 'formik'; import Collapse from 'react-bootstrap/Collapse'; import Button from 'react-bootstrap/Button'; import FormikDateTime from "../../components/FormikDateTime" +import {createSession} from "../../api/management"; +import {useHistory} from "react-router-dom"; +import moment from "moment"; +const DATE_FORMAT = 'DD-MM-YYYY HH:mm' export default function AddSession() { const [toggle, setToggle] = useState(false); const [date, onDateChange] = useState(new Date()); - + const history = useHistory(); const handleSubmit = (values, {setSubmitting}) => { - console.log("Adding session submit") + let moment_date = new moment(values.start_date, DATE_FORMAT); + // keepOffset must be true, bug info here https://github.com/moment/moment/issues/947 + values.start_date = moment_date.toISOString(true) + console.log(values) + createSession(values) + .then(res => { + setSubmitting(false) + console.log("Session correctly added") + history.push("/management/add-session") + }) + .catch(err => { + console.log(err) + setSubmitting(false); + }) + // loginManager(values.username, values.password) + // .then(res => { + // setAuthenticated(true); + // setSubmitting(false); + // console.log("Successful manager logging attempt") + // history.push("/management/add-session"); + // }) + // .catch(err => { + // setSubmitting(false); + // }) } @@ -41,17 +68,17 @@ export default function AddSession() { <label>Session's Title*</label> <input type="text" className="form-control form-control-user" - name="sessionTitle" + name="title" autoFocus={true} onChange={handleChange} onBlur={handleBlur} value={values.accessCode} required={true}/> - {errors.sessionTitle && touched.sessionTitle && errors.sessionTitle} + {errors.title && touched.title && errors.title} </div> <div className="mt-3 form-group"> <label>Meeting start (optional)</label> - <Field name="date" timeFormat={false} component={FormikDateTime} /> + <Field name="start_date" timeFormat={false} component={FormikDateTime} /> </div> <div className="mt-3 form-group"> <label>Link to meeting call platform (optional)</label> @@ -159,8 +186,7 @@ export default function AddSession() { autoFocus={true} onChange={handleChange} onBlur={handleBlur} - value={values.accessCode} - required={true}/> + value={values.accessCode}/> </div> <div className="col-4 text-center"> <button type="submit" id="id_btn_send_test"