diff --git a/generic/templates/generic/supervisor_detail.html b/generic/templates/generic/supervisor_detail.html
index 34e248f1..42d292ce 100755
--- a/generic/templates/generic/supervisor_detail.html
+++ b/generic/templates/generic/supervisor_detail.html
@@ -1,11 +1,11 @@
{% extends 'generic/supervisor_base.html' %}
{% block content %}
-
Supervisor: {{object.name}}
- {{object.email}}
+ Supervisor: {{object.name}}
+ {{object.email}}
-
User account: {{object.user}}
-
Site: {{object.site}}
+
User account: {{object.user}}
+
Site: {{object.site}}
Trainee(s): {% for trainee in object.trainee.all %}
{{trainee.user}}
diff --git a/generic/templates/generic/supervisor_list.html b/generic/templates/generic/supervisor_list.html
index b4b67e74..589c3d73 100755
--- a/generic/templates/generic/supervisor_list.html
+++ b/generic/templates/generic/supervisor_list.html
@@ -3,9 +3,9 @@
Supervisors
-
+
{% for supervisor in object_list %}
- - {{supervisor.name}}
+
- {{supervisor.name}}
{{supervisor.email}} [{{supervisor.site}}]
{% endfor %}
diff --git a/rapids/tests/test_urls.py b/rapids/tests/test_urls.py
index 712e2a0b..304a41dd 100644
--- a/rapids/tests/test_urls.py
+++ b/rapids/tests/test_urls.py
@@ -17,6 +17,8 @@ from longs.views import GenericExamViews as LongExamViews
from physics.views import GenericExamViews as PhysicExamViews
from anatomy.views import GenericExamViews as AnatomyExamViews
+from generic.models import Supervisor
+
APP_NAMES = ("rapids", "anatomy", "longs", "physics", "sbas")
JSON_APPS = ("rapids", "anatomy", "longs")
@@ -52,6 +54,12 @@ def create_cid_manager(db, django_user_model):
user.groups.add(g)
return user
+@pytest.fixture
+def create_basic_user(db, django_user_model):
+ user = django_user_model.objects.create_user(
+ "basicuser", "basic@user.com", "password1234"
+ )
+ return user
@pytest.fixture(params=EXAM_VIEWS)
def set_up_exams(request, django_user_model, create_superuser):
@@ -227,7 +235,7 @@ def test_index(client, create_superuser, exam_views, django_user_model):
assert len(json_response) == 2
-def test_cid_management(client, create_cid_manager, django_user_model):
+def test_cid_management(client, create_cid_manager, django_user_model, create_basic_user):
urls = [
reverse(f"people"),
#reverse(f"generic:update_cid"),
@@ -237,24 +245,92 @@ def test_cid_management(client, create_cid_manager, django_user_model):
reverse(f"generic:cid_group_view"),
reverse(f"generic:cid_group_view_all"),
reverse(f"generic:cid_group_create"),
+ reverse(f"generic:supervisor"),
]
for url in urls:
response = client.get(url)
+ # Some urls will try to redirect to a login page
if response.status_code == 302:
assert "accounts/login/" in response.url
else:
+ # Others just forbid
assert response.status_code == 403
pass
+ basic_user = create_basic_user
+ client.force_login(basic_user)
+ for url in urls:
+ # When logged in there should be no redirection (if access denied)
+ response = client.get(url)
+
+ assert response.status_code == 403
+
cid_manager = create_cid_manager
client.force_login(cid_manager)
for url in urls:
- print(url)
response = client.get(url)
assert response.status_code == 200
- pass
\ No newline at end of file
+ pass
+
+
+def create_supervisor(db, faker):
+ return Supervisor.objects.create(email=faker.email(), name=faker.name())
+
+def test_supervisor_management(db, faker, client, create_cid_manager, django_user_model, create_basic_user ):
+ s1 = create_supervisor(db, faker)
+ s2 = create_supervisor(db, faker)
+ print(s1)
+ print(s2)
+
+
+ basic_user = create_basic_user
+ client.force_login(basic_user)
+
+ response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
+
+ assert response.status_code == 403
+ response = client.get(reverse(f"generic:supervisor"))
+ assert response.status_code == 403
+
+ # Check we can not delete
+ response = client.post(reverse(f"generic:supervisor_delete", kwargs={"pk": s2.pk}))
+ assert response.status_code == 403
+
+ cid_manager = create_cid_manager
+ client.force_login(cid_manager)
+
+ response = client.get(reverse(f"generic:supervisor"))
+ assert response.status_code == 200
+
+ soup = BeautifulSoup(response.content, "html.parser")
+ assert len(soup.find(id="supervisor-list").find_all("li")) == 2
+
+ response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
+ soup = BeautifulSoup(response.content, "html.parser")
+ assert soup.find(id="name").text == s1.name
+ assert soup.find(id="email").text == s1.email
+
+ new_email = "new@email.com"
+ response = client.post(reverse(f"generic:supervisor_edit", kwargs={"pk": s1.pk}), {"email":new_email, "name": s1.name})
+
+ soup = BeautifulSoup(response.content, "html.parser")
+ assert response.status_code == 302
+
+ response = client.get(reverse(f"generic:supervisor_detail", kwargs={"pk": s1.pk}))
+ soup = BeautifulSoup(response.content, "html.parser")
+ assert soup.find(id="name").text == s1.name
+ assert soup.find(id="email").text == new_email
+
+ # Check we can delete
+ response = client.post(reverse(f"generic:supervisor_delete", kwargs={"pk": s2.pk}))
+ assert response.status_code == 302
+ response = client.get(reverse(f"generic:supervisor"))
+ assert response.status_code == 200
+
+ soup = BeautifulSoup(response.content, "html.parser")
+ assert len(soup.find(id="supervisor-list").find_all("li")) == 1
diff --git a/requirements.txt b/requirements.txt
index e547baf6..d57ac46b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -38,4 +38,6 @@ django-ninja
crispy-bootstrap4
django-rich
ipython
-django-htmx-autocomplete
\ No newline at end of file
+django-htmx-autocomplete
+faker
+pytest-faker
\ No newline at end of file