All development so far tested and merged into production. #9

Manually merged
adebaumann merged 64 commits from development into main 2025-11-06 15:00:58 +00:00
3 changed files with 43 additions and 0 deletions
Showing only changes of commit da1deac44e - Show all commits

View File

@@ -1,6 +1,7 @@
from django.test import TestCase, Client from django.test import TestCase, Client
from django.urls import reverse from django.urls import reverse
from django.core.management import call_command from django.core.management import call_command
from django.contrib.auth.models import User
from datetime import date, timedelta from datetime import date, timedelta
from io import StringIO from io import StringIO
from .models import ( from .models import (
@@ -825,6 +826,15 @@ class IncompleteVorgabenTest(TestCase):
def setUp(self): def setUp(self):
self.client = Client() self.client = Client()
# Create and login a staff user
self.staff_user = User.objects.create_user(
username='teststaff',
password='testpass123'
)
self.staff_user.is_staff = True
self.staff_user.save()
self.client.login(username='teststaff', password='testpass123')
# Create test data # Create test data
self.dokumententyp = Dokumententyp.objects.create( self.dokumententyp = Dokumententyp.objects.create(
name="Test Typ", name="Test Typ",
@@ -1092,3 +1102,28 @@ class IncompleteVorgabenTest(TestCase):
response = self.client.get(reverse('incomplete_vorgaben')) response = self.client.get(reverse('incomplete_vorgaben'))
# Should NOT appear in "no text" list because it has both text types # Should NOT appear in "no text" list because it has both text types
self.assertNotContains(response, 'Vorgabe mit beiden Texten') self.assertNotContains(response, 'Vorgabe mit beiden Texten')
def test_incomplete_vorgaben_staff_only(self):
"""Test that non-staff users are redirected to login"""
# Logout the staff user
self.client.logout()
# Try to access the page as anonymous user
response = self.client.get(reverse('incomplete_vorgaben'))
self.assertEqual(response.status_code, 302) # Redirect to login
# Create a regular (non-staff) user
regular_user = User.objects.create_user(
username='regularuser',
password='testpass123'
)
self.client.login(username='regularuser', password='testpass123')
# Try to access the page as regular user
response = self.client.get(reverse('incomplete_vorgaben'))
self.assertEqual(response.status_code, 302) # Redirect to login
# Login as staff user again - should work
self.client.login(username='teststaff', password='testpass123')
response = self.client.get(reverse('incomplete_vorgaben'))
self.assertEqual(response.status_code, 200) # Success

View File

@@ -1,4 +1,5 @@
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from .models import Dokument, Vorgabe, VorgabeKurztext, VorgabeLangtext, Checklistenfrage from .models import Dokument, Vorgabe, VorgabeKurztext, VorgabeLangtext, Checklistenfrage
from abschnitte.utils import render_textabschnitte from abschnitte.utils import render_textabschnitte
@@ -56,6 +57,11 @@ def standard_checkliste(request, nummer):
}) })
def is_staff_user(user):
return user.is_staff
@login_required
@user_passes_test(is_staff_user)
def incomplete_vorgaben(request): def incomplete_vorgaben(request):
""" """
Show lists of incomplete Vorgaben: Show lists of incomplete Vorgaben:

View File

@@ -17,7 +17,9 @@
<div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav"> <div class="navbar-nav">
<a class="nav-item nav-link active" href="/dokumente">Standards</a> <a class="nav-item nav-link active" href="/dokumente">Standards</a>
{% if user.is_staff %}
<a class="nav-item nav-link" href="/dokumente/unvollstaendig/">Unvollständig</a> <a class="nav-item nav-link" href="/dokumente/unvollstaendig/">Unvollständig</a>
{% endif %}
<a class="nav-item nav-link" href="/referenzen">Referenzen</a> <a class="nav-item nav-link" href="/referenzen">Referenzen</a>
<a class="nav-item nav-link" href="/stichworte">Stichworte</a> <a class="nav-item nav-link" href="/stichworte">Stichworte</a>
<a class="nav-item nav-link" href="/search">Suche</a> <a class="nav-item nav-link" href="/search">Suche</a>