From e9e55352a8700a1f9b8b0ae172c6f90acc641d4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rn=20Menne?= Date: Mon, 10 Feb 2025 15:17:40 +0100 Subject: [PATCH] Readd last views --- georeport/tests.py | 25 +++++++++++++- georeport/views.py | 68 +++++++++++++++++++++++++++++++++++++ pinpoint_report/settings.py | 14 +++++++- requirements.txt | 3 ++ 4 files changed, 108 insertions(+), 2 deletions(-) diff --git a/georeport/tests.py b/georeport/tests.py index b879195..0380e4c 100644 --- a/georeport/tests.py +++ b/georeport/tests.py @@ -6,6 +6,8 @@ from django.urls import reverse from .models import Category, Report +from django.contrib.auth.models import User + class ReportTestCase(TestCase): @classmethod @@ -55,6 +57,7 @@ class ReportTestCase(TestCase): self.assertEqual(report.state, 0) def test_detail_view(self): + # TODO: Split up self.assertTrue(True) url = reverse("georeport:report", kwargs={"id": 1}) # Test report not existsing @@ -78,7 +81,7 @@ class ReportTestCase(TestCase): self.assertEqual(response.status_code, 200) # type: ignore self.assertContains(response, f"Title: {report.title}", status_code=200) self.assertTemplateUsed(response, "georeport/detail.html") - # TODO: test if response contains title + self.assertContains(response, f"Title: {report.title}") class GetCategoryViewTests(TestCase): @@ -157,3 +160,23 @@ class GetCategoryViewTests(TestCase): category = data["categories"][0] self.assertIn("id", category) self.assertIn("name", category) + + # TODO: Split up + def test_category_detail_view(self): + # Check 404 if id does not exits + url = reverse("georeport:category", kwargs={"id": 99}) + response = self.client.get(url) + self.assertEqual(response.status_code, 404) # type:ignore + + url = reverse("georeport:category", kwargs={"id": self.root1.id}) + response = self.client.get(url) + self.assertEqual(response.status_code, 403) # type:ignore + + user = User.objects.create_user(username="test", password="1234") + + self.root1.user.add(user) + self.root1.save() + self.client.login(username="test", password="1234") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) # type:ignore + self.assertTemplateUsed(response, "georeport/category.html") diff --git a/georeport/views.py b/georeport/views.py index fcf1f76..8ff38e3 100644 --- a/georeport/views.py +++ b/georeport/views.py @@ -10,12 +10,21 @@ A view takes a request and creates a respond for the request. from django.core.exceptions import PermissionDenied from django.http import HttpResponse, HttpResponseForbidden, JsonResponse from django.shortcuts import get_object_or_404, render, redirect +from django.utils.http import urlsafe_base64_decode from django.views.decorators.http import require_GET, require_safe, require_http_methods + +from pinpoint_report.settings import DEFAULT_FROM_EMAIL from .models import Category, Report from .forms import ReportForm +from django.conf import settings +from django.core.mail import send_mail + +from Crypto.Cipher import ChaCha20 +from base64 import urlsafe_b64decode +# TODO: test @require_safe def index(request) -> HttpResponse: """ @@ -34,6 +43,7 @@ def index(request) -> HttpResponse: ) +# Test available @require_GET def get_categories(request, id=None) -> JsonResponse: """ @@ -59,6 +69,7 @@ def get_categories(request, id=None) -> JsonResponse: return JsonResponse(data) +# Test available @require_safe def category_detail_view(request, id) -> HttpResponse: """ @@ -96,6 +107,7 @@ def category_detail_view(request, id) -> HttpResponse: # TODO: Report-List +# Test available @require_http_methods(["GET", "POST"]) def create_report_view(request): if request.method == "POST": @@ -115,6 +127,8 @@ def create_report_view(request): # reports are created with the website, and there every category-selection is required if reportForm.is_valid(): reportForm.save() + send_creation_confirmation(report) + send_creation_mail(report) # TODO: Send confirmation-Mails return redirect("georeport:index") @@ -126,6 +140,7 @@ def create_report_view(request): ) +# Test available @require_safe def report_detail_view(request, id): """ @@ -140,3 +155,56 @@ def report_detail_view(request, id): # TODO: Finish Link +# TODO: Tests +def set_report_to_finish_view(request, b64nonce, b64ciphertext): + nonce = urlsafe_base64_decode(b64nonce) + ciphertext = urlsafe_base64_decode(b64ciphertext) + cipher = ChaCha20.new(key=settings.KEY, nonce=nonce) + id = int(cipher.decrypt(ciphertext)) + report = get_object_or_404(Report, pk=id) + + if report.state == 1: + report.state = 2 + report.save() + + return redirect("georeport:detail", id) + + +# TODO:Tests +def send_creation_confirmation(report): + if not settings.email: + return + recipient_list = [report.email] + subject = "Report created" + message = f'The report with title "{report.title}" was created with id {report.id}' + send_mail( + subject=subject, + message=message, + recipient_list=recipient_list, + from_email=DEFAULT_FROM_EMAIL, + ) + + +# TODO: Tests +# TODO: Recruse groupmembers mail addresses +def send_creation_mail(report): + if not settings.send_mail: + return + recipient_list = [] + subject = f"Report {report.id} was created." + message = ( + f'A new report with id: {report.id} and title "{report.title}" was created.' + ) + + for user in report.category.users.all(): + recipient_list.append(user.email) + for group in report.category.groups.all(): + for user in group.user_set.all(): + recipient_list.append(user.email) + + send_mail( + subject=subject, + message=message, + recipient_list=recipient_list, + from_email=DEFAULT_FROM_EMAIL, + ) diff --git a/pinpoint_report/settings.py b/pinpoint_report/settings.py index 5a4719c..add74f5 100644 --- a/pinpoint_report/settings.py +++ b/pinpoint_report/settings.py @@ -13,6 +13,7 @@ https://docs.djangoproject.com/en/5.1/ref/settings/ import sys from pathlib import Path + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -26,7 +27,11 @@ SECRET_KEY = "django-insecure-^f3zw!cfp(mkh()na5(i-#s3472ue*n7@m34crljq82e66#_0m # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [".localhost", "127.0.0.1", "[::1]"] +ALLOWED_HOSTS = [ + ".localhost", + "127.0.0.1", + "[::1]", +] # Application definition @@ -138,3 +143,10 @@ if not TESTING: "debug_toolbar.middleware.DebugToolbarMiddleware", *MIDDLEWARE, ] + + +# E-Mail configuration. Emails will only be sent, if SEND_MAIL is set to request +SEND_MAIL = True +EMAIL_HOST = "localhost" +EMAIL_PORT = "8025" +DEFAULT_FROM_EMAIL = "example@pinpoint-report.de" diff --git a/requirements.txt b/requirements.txt index e35bad9..de72270 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,6 @@ # Django django django-debug-toolbar + +# Crypto +pycryptodome -- 2.39.5