From a3e4d3dee845db7136a12fde5c3237b688e344e5 Mon Sep 17 00:00:00 2001 From: manuconcepbrito <manu041196@gmail.com> Date: Mon, 25 Oct 2021 07:42:52 +0200 Subject: [PATCH] delete session endpoint --- wahlfang_api/views.py | 15 +++++++++---- wahlfang_web/src/api/management.js | 22 +++++++++++++++---- .../src/pages/management/ManagerSessions.js | 22 ++++++++++++++----- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/wahlfang_api/views.py b/wahlfang_api/views.py index 4bb1c81..92ee6f5 100644 --- a/wahlfang_api/views.py +++ b/wahlfang_api/views.py @@ -2,6 +2,7 @@ from asgiref.sync import async_to_sync from channels.layers import get_channel_layer from rest_framework import generics, status, viewsets from rest_framework.decorators import action +from rest_framework.generics import get_object_or_404 from rest_framework.response import Response from rest_framework.throttling import AnonRateThrottle from rest_framework_simplejwt.views import TokenViewBase @@ -57,14 +58,17 @@ class SpectatorView(generics.RetrieveAPIView): def get_object(self): return self.queryset.get(spectator_token=self.kwargs['uuid']) +## Management Sessions ## -class ManagerSessionView(generics.ListCreateAPIView): + +class ManagerSessionView(generics.ListCreateAPIView, generics.DestroyAPIView): authentication_classes = [ElectionManagerJWTAuthentication] permission_classes = [IsElectionManager] serializer_class = SessionSerializer - # def perform_create(self, serializer_class): - # serializer_class.save() + def get_object(self): + session = get_object_or_404(Session, pk=self.request.query_params.get('pk')) + return session def perform_create(self, serializer): serializer.save(manager=self.request.user) @@ -73,7 +77,10 @@ class ManagerSessionView(generics.ListCreateAPIView): manager = self.request.user return manager.sessions.order_by('-pk') - + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + self.perform_destroy(instance) + return Response(status=status.HTTP_204_NO_CONTENT) class ElectionViewset(viewsets.ReadOnlyModelViewSet): diff --git a/wahlfang_web/src/api/management.js b/wahlfang_web/src/api/management.js index b34e984..a2d6352 100644 --- a/wahlfang_web/src/api/management.js +++ b/wahlfang_web/src/api/management.js @@ -4,7 +4,8 @@ export const managementAPIRoutes = { login: "/auth/token/", refreshToken: "/auth/token/refresh/", verifyToken: "/auth/token/verify/", - createSession: "/management/add-session", + manageSessions: "/management/add-session", + } // Help functions @@ -65,8 +66,10 @@ export const logoutManager = async () => { // API calls +// sessions + export const createSession = async (form_values) => { - const response = await makeAuthenticatedManagerRequest(managementAPIRoutes.createSession, 'POST', form_values); + const response = await makeAuthenticatedManagerRequest(managementAPIRoutes.manageSessions, 'POST', form_values); if (response.status === 201) { return true; } else { @@ -75,7 +78,18 @@ export const createSession = async (form_values) => { } export const fetchSessions = async () => { - const response = await makeAuthenticatedManagerRequest(managementAPIRoutes.createSession, 'GET'); - console.log(response) + const response = await makeAuthenticatedManagerRequest(managementAPIRoutes.manageSessions, 'GET'); return await response.json(); +} + +export const deleteSession = async (pk) => { + const url = `${managementAPIRoutes.manageSessions}?pk=${pk}` + console.log(url) + const response = await makeAuthenticatedManagerRequest(url, 'DELETE') + console.log(response) + if (response.status === 204) { + return true; + } else { + throw new Error(await response.json()) + } } \ No newline at end of file diff --git a/wahlfang_web/src/pages/management/ManagerSessions.js b/wahlfang_web/src/pages/management/ManagerSessions.js index 0b0b3b9..63ce82c 100644 --- a/wahlfang_web/src/pages/management/ManagerSessions.js +++ b/wahlfang_web/src/pages/management/ManagerSessions.js @@ -1,6 +1,6 @@ import React, {Fragment, useEffect} from 'react'; import Layout from "../../components/Layout"; -import {useRecoilValue} from "recoil"; +import {useRecoilState} from "recoil"; import {sessionList} from "../../state/management" import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; @@ -12,11 +12,12 @@ import DeleteIcon from '@mui/icons-material/Delete'; import { Typography } from '@mui/material'; import { useHistory } from "react-router-dom"; import moment from "moment"; +import {deleteSession} from "../../api/management" export default function ManagerSessions() { - const data = useRecoilValue(sessionList); + const [sessions, setSessions] = useRecoilState(sessionList); const history = useHistory(); const formatDate = (start_date) => { @@ -28,6 +29,17 @@ export default function ManagerSessions() { history.push(path); } + const handleDelete = (pk) => { + deleteSession(pk) + .then(res => { + const sessions_left = sessions.filter(session => session.id !== pk) + setSessions(sessions_left) + }) + .catch(err => { + console.log(err) + }) + } + return ( <Layout> @@ -36,14 +48,14 @@ export default function ManagerSessions() { <div className="card shadow"> <div className="card-body"> <h4>My Sessions</h4> - {data.map(session => ( - <Box pb={3} sx={{ width: '100%', bgcolor: 'background.paper', }}> + {sessions.map(session => ( + <Box key={session.id} pb={3} sx={{ width: '100%', bgcolor: 'background.paper', }}> <List component="nav" aria-label="main mailbox folders"> <ListItemButton> <ListItemText disableTypography primary={<Typography type="body2" style={{ color: '#495057' }}>{session.title}</Typography>} /> {session.start_date && <ListItemText sx={{pr: 2}} primary={<Typography align="right" type="overline" style={{ color: '#495057' }}>{formatDate(session.start_date)}</Typography>}/>} - <Button variant="outlined" startIcon={<DeleteIcon />} color="error"> Delete </Button> + <Button onClick={() => handleDelete(session.id)} variant="outlined" startIcon={<DeleteIcon />} color="error"> Delete </Button> </ListItemButton> </List> <Divider /> -- GitLab