From 858c2fe0c3100c1dcf296d2f4ab9cb70b5cf733b Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 11 Dec 2023 13:04:28 +0100 Subject: [PATCH] Messages REST --- create_notice.http | 12 +++++++++++ delete_notice.http | 6 ++++++ mysite/settings.py | 1 + polls/serializers.py | 9 ++++++++ polls/urls.py | 3 +++ polls/views.py | 51 ++++++++++++++++++++++++++++++++++++++++++-- requirements.txt | 1 + 7 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 create_notice.http create mode 100644 delete_notice.http create mode 100644 polls/serializers.py diff --git a/create_notice.http b/create_notice.http new file mode 100644 index 0000000..6515599 --- /dev/null +++ b/create_notice.http @@ -0,0 +1,12 @@ +POST http://127.0.0.1:8000/polls/notices/ HTTP/1.1 +Content-Type: application/json + +{ + "notice_title": "Notice via API", + "notice_text": "This is a notice created via the API", + "pub_start": "2019-01-01T00:00:00Z", + "pub_end": "2119-12-31T23:59:59Z", + "user_id": 1 +} + +### diff --git a/delete_notice.http b/delete_notice.http new file mode 100644 index 0000000..b26efcb --- /dev/null +++ b/delete_notice.http @@ -0,0 +1,6 @@ +DELETE http://127.0.0.1:8000/polls/notices/15/ HTTP/1.1 +Content-Type: application/json + +{} + +### diff --git a/mysite/settings.py b/mysite/settings.py index abf2b1b..4390791 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -29,6 +29,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'rest_framework', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/polls/serializers.py b/polls/serializers.py new file mode 100644 index 0000000..c2b41ea --- /dev/null +++ b/polls/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers +from .models import Notice + +class NoticeSerializer(serializers.ModelSerializer): + class Meta: + model = Notice + fields = ['id', 'notice_title', 'notice_text', 'pub_start', 'pub_end', 'user_id'] + + diff --git a/polls/urls.py b/polls/urls.py index 8a3876b..1c08f93 100644 --- a/polls/urls.py +++ b/polls/urls.py @@ -5,6 +5,9 @@ urlpatterns = [ path('', views.index, name='index'), path('new', views.new, name='new'), path('delete/', views.delete, name='delete'), + + path('notices/', views.notice_list, name='notice_list'), + path('notices//', views.notice_detail, name='notice_detail'), ] diff --git a/polls/views.py b/polls/views.py index 6eae921..39a4f6c 100644 --- a/polls/views.py +++ b/polls/views.py @@ -1,10 +1,17 @@ - +from django.http import JsonResponse from django.shortcuts import render, redirect +from rest_framework.parsers import JSONParser + from .models import Notice from django.utils import timezone from .forms import NoticeForm from django.contrib.auth.decorators import login_required +from django.views.decorators.csrf import csrf_exempt + + + from django.contrib import messages +from .serializers import NoticeSerializer @login_required @@ -34,13 +41,14 @@ def delete(request, deleteId=None): notice = Notice.objects.get(pk=deleteId) if request.user.id == notice.user_id or request.user.is_staff: notice.delete() - messages.success(request, f"Nachricht gelöscht") + messages.success(request, f"Nachricht cht") else: messages.warning(request, f"Keine Berechtigung") except: messages.warning(request, f"Nachricht nicht gefunden") return redirect('index') + def index(request): notices = Notice.objects.all() notices = notices.filter(pub_start__lte=timezone.now()) @@ -48,3 +56,42 @@ def index(request): context = {'notices': notices} return render(request, 'polls/index.html', context) + + +@csrf_exempt +def notice_list(request): + if request.method == 'GET': + notices = Notice.objects.all() + serializer = NoticeSerializer(notices, many=True) + return JsonResponse(serializer.data, safe=False) + elif request.method == 'POST': + data = JSONParser().parse(request) + serializer = NoticeSerializer(data=data) + if serializer.is_valid(): + serializer.save() + return JsonResponse(serializer.data, status=201) + return JsonResponse(serializer.errors) + else: + return JsonResponse({'error': 'GET or POST request required'}, status=400) + +@csrf_exempt +def notice_detail(request, id): + try: + notice = Notice.objects.get(pk=id) + except Notice.DoesNotExist: + return JsonResponse({'error': 'Notice not found'}, status=404) + if request.method == 'GET': + serializer = NoticeSerializer(notice) + return JsonResponse(serializer.data) + elif request.method == 'PUT': + data = JSONParser().parse(request) + serializer = NoticeSerializer(notice, data=data) + if serializer.is_valid(): + serializer.save() + return JsonResponse(serializer.data) + return JsonResponse(serializer.errors, status=400) + elif request.method == 'DELETE': + notice.delete() + return JsonResponse({'message': 'Notice was deleted successfully!'}, status=204) + else: + return JsonResponse({'error': 'GET, PUT or DELETE request required'}, status=400) diff --git a/requirements.txt b/requirements.txt index 41f0147..77149c7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ Django>=4.2.6 +djangorestframework>=3.14.0