]> git.menne-pb.de Git - pinpoint.git/commitdiff
Readd last views
authorJörn Menne <jmenne@fedora.de>
Mon, 10 Feb 2025 14:17:40 +0000 (15:17 +0100)
committerJörn Menne <jmenne@fedora.de>
Mon, 10 Feb 2025 14:17:40 +0000 (15:17 +0100)
georeport/tests.py
georeport/views.py
pinpoint_report/settings.py
requirements.txt

index b879195b51aff0bafb79d03214969faf1700d4df..0380e4c2ea663fc0dc33aae1518afc3616aebc13 100644 (file)
@@ -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")
index fcf1f76e613a4387ca7d12e88a8d7ebf356afcaa..8ff38e31df39f51bb714094b7e58e18ae9b8b24c 100644 (file)
@@ -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,
+    )
index 5a4719c20da54bc6e93bb50aa231011cddd85dd7..add74f5c42e8f0bdf335b5e3535ce278a4b64621 100644 (file)
@@ -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"
index e35bad924ba7b2b2c0f225f444f7394c4443ad24..de7227042c19726a0edcb1831dabb0f793474a19 100644 (file)
@@ -1,3 +1,6 @@
 # Django
 django 
 django-debug-toolbar
+
+# Crypto
+pycryptodome