diff --git a/Makefile b/Makefile
index 217d6a9..7b61a76 100644
--- a/Makefile
+++ b/Makefile
@@ -57,3 +57,16 @@ _migrate: migrations
.PHONY: migrate
migrate: _migrate format
+
+
+.PHONY: test-coverage
+test-coverage:
+ coverage run --source=adminsec,usersec --omit={adminsec,usersec}/migrations/*,*.html manage.py test -v2 --settings=config.settings.test
+ coverage report
+ coverage html
+
+.PHONY: test-coverage-keepdb
+test-coverage-keepdb:
+ coverage run --source=adminsec,usersec --omit={adminsec,usersec}/migrations/*,*.html manage.py test -v2 --settings=config.settings.test --keepdb
+ coverage report
+ coverage html
diff --git a/Pipfile.lock b/Pipfile.lock
index b28c902..bb4ce85 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -77,11 +77,11 @@
},
"async-timeout": {
"hashes": [
- "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f",
- "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"
+ "sha256:49675ec889daacfe65ff66d2dde7dd1447a6f4b2f23721022e4ba121f8772a85",
+ "sha256:904719a4bd6e0520047d0ddae220aabee67b877f7ca17bf8cea20f67f6247ae0"
],
"markers": "python_full_version < '3.11.3'",
- "version": "==4.0.3"
+ "version": "==5.0.0"
},
"billiard": {
"hashes": [
@@ -367,7 +367,6 @@
"sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd",
"sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"
],
- "markers": "python_version >= '3.7'",
"version": "==43.0.3"
},
"defusedxml": {
@@ -1317,11 +1316,11 @@
},
"faker": {
"hashes": [
- "sha256:4f7f133560b9d4d2a915581f4ba86f9a6a83421b89e911f36c4c96cff58135a5",
- "sha256:93e8b70813f76d05d98951154681180cb795cfbcff3eced7680d963bcc0da2a9"
+ "sha256:4a82b2908cd19f3bba1a4da2060cc4eb18a40410ccdf9350d071d79dc92fe3ce",
+ "sha256:aa31b52cdae3673d6a78b4857c7bcdc0e98f201a5cb77d7827fa9e6b5876da94"
],
"markers": "python_version >= '3.8'",
- "version": "==30.8.1"
+ "version": "==30.8.2"
},
"fastdiff": {
"hashes": [
@@ -2221,11 +2220,11 @@
},
"werkzeug": {
"hashes": [
- "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17",
- "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d"
+ "sha256:208a2e31a4a54c8b3d2244f2079ca1d3851629a7a7d546646059c64fb746023a",
+ "sha256:6f2a0d38f25ba5a75c36c45b4ae350c7a23b57e3b974e9eb2d6851f2c648c00d"
],
"index": "pypi",
- "version": "==3.0.6"
+ "version": "==3.1.0"
}
},
"ldap-packages": {
@@ -2327,11 +2326,11 @@
},
"whitenoise": {
"hashes": [
- "sha256:11042f39f1dcfbb3814726b9364703af6901706582d988e96494cfefdc3a89e2",
- "sha256:196ba04ca0a80f4a3f99f88381864f218a28b5fb5b44d29feea484d501fa0ba3"
+ "sha256:486bd7267a375fa9650b136daaec156ac572971acc8bf99add90817a530dd1d4",
+ "sha256:df12dce147a043d1956d81d288c6f0044147c6d2ab9726e5772ac50fb45d2280"
],
"index": "pypi",
- "version": "==6.8.1"
+ "version": "==6.8.2"
}
}
}
diff --git a/adminsec/templates/adminsec/overview.html b/adminsec/templates/adminsec/overview.html
index 43d0ff2..0e95ee5 100644
--- a/adminsec/templates/adminsec/overview.html
+++ b/adminsec/templates/adminsec/overview.html
@@ -4,16 +4,13 @@
- Welcome {% if user.first_name or user.last_name %} {{ user.first_name }} {{ user.last_name }}{% else %}{{ user.username }}{% endif %}
- —
+ Welcome {% if user.first_name or user.last_name %} {{ user.first_name }} {{ user.last_name }}{% else %}{{ user.username }}{% endif %}!
- Open Requests
-
Terms & Conditions
- {% include "usersec/modules/request_grid.html" %}
+ {% include "adminsec/requests.html" %}
{% endblock content %}
diff --git a/adminsec/templates/adminsec/requests.html b/adminsec/templates/adminsec/requests.html
new file mode 100644
index 0000000..ce28360
--- /dev/null
+++ b/adminsec/templates/adminsec/requests.html
@@ -0,0 +1,35 @@
+{% load common %}
+
+
+
+
+ Request Type |
+ Requester |
+ Created |
+ Modified |
+
+
+
+ {% for obj in pending_requests %}
+
+
+
+
+ {{ obj.get_request_type }}
+
+ |
+ {{ obj.requester.name }} |
+ {{ obj.date_created|date:"Y-m-d H:i" }} |
+ {{ obj.date_modified|date:"Y-m-d H:i" }} |
+
+ {% empty %}
+
+
+ No pending requests.
+ |
+
+ {% endfor %}
+
+
+
+
diff --git a/adminsec/templates/adminsec/termsandconditions_list.html b/adminsec/templates/adminsec/termsandconditions_list.html
index f86a451..4f1c46a 100644
--- a/adminsec/templates/adminsec/termsandconditions_list.html
+++ b/adminsec/templates/adminsec/termsandconditions_list.html
@@ -5,8 +5,7 @@
diff --git a/adminsec/tests/test_rules.py b/adminsec/tests/test_rules.py
index 9db0985..1634c4a 100644
--- a/adminsec/tests/test_rules.py
+++ b/adminsec/tests/test_rules.py
@@ -62,7 +62,9 @@ def test_admin_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_detail_view(self):
url = reverse(
@@ -79,7 +81,9 @@ def test_hpc_user_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_project_detail_view(self):
url = reverse(
@@ -96,7 +100,9 @@ def test_hpc_project_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_detail_view(self):
url = reverse(
@@ -113,7 +119,9 @@ def test_hpc_group_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_create_request_approve_view_get(self):
self.hpc_group_create_request.name = "new_group"
@@ -133,7 +141,9 @@ def test_hpc_group_create_request_approve_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_create_request_approve_view_post(self):
self.hpc_group_create_request.name = "new_group"
@@ -166,8 +176,11 @@ def rollback_callback():
302,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully approved request for group creation."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_group_create_request_deny_view_get(self):
url = reverse(
@@ -184,7 +197,9 @@ def test_hpc_group_create_request_deny_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_create_request_deny_view_post(self):
url = reverse(
@@ -214,8 +229,11 @@ def rollback_callback():
redirect_url=reverse("adminsec:overview"),
req_kwargs=data,
rollback_callback=rollback_callback,
+ messages_exp=["Successfully denied request for group creation."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_group_create_request_revision_view_get(self):
url = reverse(
@@ -232,7 +250,9 @@ def test_hpc_group_create_request_revision_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_create_request_revision_view_post(self):
url = reverse(
@@ -262,6 +282,7 @@ def rollback_callback():
req_kwargs=data,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully requested revision for group creation."],
)
self.assert_permissions_on_url(
bad_users,
@@ -270,6 +291,7 @@ def rollback_callback():
302,
req_kwargs=data,
redirect_url=reverse("home"),
+ not_authorized=True,
)
def test_hpc_group_create_request_detail_view(self):
@@ -287,7 +309,9 @@ def test_hpc_group_create_request_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_change_request_approve_view_get(self):
url = reverse(
@@ -304,7 +328,9 @@ def test_hpc_group_change_request_approve_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_change_request_approve_view_post(self):
url = reverse(
@@ -332,8 +358,11 @@ def rollback_callback():
302,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully approved request for group update."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_group_change_request_deny_view_get(self):
url = reverse(
@@ -350,7 +379,9 @@ def test_hpc_group_change_request_deny_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_change_request_deny_view_post(self):
url = reverse(
@@ -380,8 +411,11 @@ def rollback_callback():
redirect_url=reverse("adminsec:overview"),
req_kwargs=data,
rollback_callback=rollback_callback,
+ messages_exp=["Successfully denied request for group update."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_group_change_request_revision_view_get(self):
url = reverse(
@@ -398,7 +432,9 @@ def test_hpc_group_change_request_revision_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_group_change_request_revision_view_post(self):
url = reverse(
@@ -428,6 +464,7 @@ def rollback_callback():
req_kwargs=data,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully requested revision for group update."],
)
self.assert_permissions_on_url(
bad_users,
@@ -436,6 +473,7 @@ def rollback_callback():
302,
req_kwargs=data,
redirect_url=reverse("home"),
+ not_authorized=True,
)
def test_hpc_group_change_request_detail_view(self):
@@ -453,7 +491,9 @@ def test_hpc_group_change_request_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_create_request_approve_view_get(self):
url = reverse(
@@ -470,7 +510,9 @@ def test_hpc_user_create_request_approve_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
@patch("adminsec.ldap.LdapConnector.connect")
@patch("adminsec.ldap.LdapConnector.get_ldap_username_domain_by_mail")
@@ -509,8 +551,11 @@ def rollback_callback():
302,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Request approved and invitation created."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_user_create_request_deny_view_get(self):
url = reverse(
@@ -527,7 +572,9 @@ def test_hpc_user_create_request_deny_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_create_request_deny_view_post(self):
url = reverse(
@@ -557,8 +604,11 @@ def rollback_callback():
redirect_url=reverse("adminsec:overview"),
req_kwargs=data,
rollback_callback=rollback_callback,
+ messages_exp=["Successfully denied request for user creation."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_user_create_request_revision_view_get(self):
url = reverse(
@@ -575,7 +625,9 @@ def test_hpc_user_create_request_revision_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_create_request_revision_view_post(self):
url = reverse(
@@ -605,6 +657,7 @@ def rollback_callback():
req_kwargs=data,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully requested revision for user creation."],
)
self.assert_permissions_on_url(
bad_users,
@@ -613,6 +666,7 @@ def rollback_callback():
302,
req_kwargs=data,
redirect_url=reverse("home"),
+ not_authorized=True,
)
def test_hpc_user_create_request_detail_view(self):
@@ -630,7 +684,9 @@ def test_hpc_user_create_request_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_change_request_approve_view_get(self):
url = reverse(
@@ -647,7 +703,9 @@ def test_hpc_user_change_request_approve_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_change_request_approve_view_post(self):
url = reverse(
@@ -675,8 +733,11 @@ def rollback_callback():
302,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully approved request for user update."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_user_change_request_deny_view_get(self):
url = reverse(
@@ -693,7 +754,9 @@ def test_hpc_user_change_request_deny_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_change_request_deny_view_post(self):
url = reverse(
@@ -723,8 +786,11 @@ def rollback_callback():
redirect_url=reverse("adminsec:overview"),
req_kwargs=data,
rollback_callback=rollback_callback,
+ messages_exp=["Successfully denied request for user update."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_user_change_request_revision_view_get(self):
url = reverse(
@@ -741,7 +807,9 @@ def test_hpc_user_change_request_revision_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_user_change_request_revision_view_post(self):
url = reverse(
@@ -771,6 +839,7 @@ def rollback_callback():
req_kwargs=data,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully requested revision for user update."],
)
self.assert_permissions_on_url(
bad_users,
@@ -779,6 +848,7 @@ def rollback_callback():
302,
req_kwargs=data,
redirect_url=reverse("home"),
+ not_authorized=True,
)
def test_hpc_user_change_request_detail_view(self):
@@ -796,7 +866,9 @@ def test_hpc_user_change_request_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_project_create_request_approve_view_get(self):
self.hpc_project_create_request.name = "new_project"
@@ -816,7 +888,9 @@ def test_hpc_project_create_request_approve_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_project_create_request_approve_view_post(self):
self.hpc_project_create_request.name = "new_project"
@@ -848,8 +922,11 @@ def rollback_callback():
302,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully approved request for project creation."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_project_create_request_deny_view_get(self):
url = reverse(
@@ -866,7 +943,9 @@ def test_hpc_project_create_request_deny_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_project_create_request_deny_view_post(self):
url = reverse(
@@ -896,8 +975,11 @@ def rollback_callback():
redirect_url=reverse("adminsec:overview"),
req_kwargs=data,
rollback_callback=rollback_callback,
+ messages_exp=["Request successfully denied."],
+ )
+ self.assert_permissions_on_url(
+ bad_users, url, "POST", 302, redirect_url=reverse("home"), not_authorized=True
)
- self.assert_permissions_on_url(bad_users, url, "POST", 302, redirect_url=reverse("home"))
def test_hpc_project_create_request_revision_view_get(self):
url = reverse(
@@ -914,7 +996,9 @@ def test_hpc_project_create_request_revision_view_get(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
def test_hpc_project_create_request_revision_view_post(self):
url = reverse(
@@ -945,6 +1029,7 @@ def rollback_callback():
req_kwargs=data,
redirect_url=reverse("adminsec:overview"),
rollback_callback=rollback_callback,
+ messages_exp=["Successfully requested revision for project creation."],
)
self.assert_permissions_on_url(
bad_users,
@@ -953,6 +1038,7 @@ def rollback_callback():
302,
req_kwargs=data,
redirect_url=reverse("home"),
+ not_authorized=True,
)
def test_hpc_project_create_request_detail_view(self):
@@ -970,4 +1056,6 @@ def test_hpc_project_create_request_detail_view(self):
]
self.assert_permissions_on_url(good_users, url, "GET", 200)
- self.assert_permissions_on_url(bad_users, url, "GET", 302, redirect_url=reverse("home"))
+ self.assert_permissions_on_url(
+ bad_users, url, "GET", 302, redirect_url=reverse("home"), not_authorized=True
+ )
diff --git a/adminsec/tests/test_views.py b/adminsec/tests/test_views.py
index b4388c8..316f5f1 100644
--- a/adminsec/tests/test_views.py
+++ b/adminsec/tests/test_views.py
@@ -55,7 +55,7 @@ def test_get(self):
self.assertEqual(response.status_code, 200)
self.assertEqual(
- list(response.context["hpcgroupcreaterequests"]),
+ list(response.context["pending_requests"]),
list(HpcGroupCreateRequest.objects.active()),
)
@@ -1477,8 +1477,9 @@ def setUp(self):
status=REQUEST_STATUS_ACTIVE,
name="new_project",
folders={"tier1": "/path/new_project"},
+ delegate=self.hpc_delegate,
)
- self.obj.members.add(self.hpc_member, self.hpc_delegate)
+ self.obj.members.add(self.hpc_owner, self.hpc_delegate, self.hpc_member)
def test_get(self):
with self.login(self.user_hpcadmin):
@@ -1492,6 +1493,7 @@ def test_get(self):
self.assertIsNotNone(response.context["form"])
def test_post(self):
+ self.maxDiff = None
with self.login(self.user_hpcadmin):
response = self.client.post(
reverse(
@@ -1521,16 +1523,20 @@ def test_post(self):
hpcproject = HpcProject.objects.get(name=self.obj.name)
hpcproject_version = hpcproject.version_history.last()
- invitation1 = HpcProjectInvitation.objects.first()
- invitation2 = HpcProjectInvitation.objects.last()
+ invitation1, invitation2 = list(HpcProjectInvitation.objects.all())
self.assertEqual(invitation1.user, self.hpc_member)
self.assertEqual(invitation2.user, self.hpc_delegate)
self.assertEqual(hpcproject.group.owner, self.hpc_owner)
self.assertEqual(hpcproject.name, self.obj.name)
- self.assertEqual(list(hpcproject.members.all()), [self.hpc_owner])
- self.assertEqual(list(hpcproject_version.members.all()), [self.hpc_owner])
+ self.assertEqual(
+ list(hpcproject.members.all()), [self.hpc_owner, self.hpc_member, self.hpc_delegate]
+ )
+ self.assertEqual(
+ list(hpcproject_version.members.all()),
+ [self.hpc_owner, self.hpc_member, self.hpc_delegate],
+ )
self.assertEqual(len(mail.outbox), 3)
diff --git a/adminsec/views.py b/adminsec/views.py
index 5ddf5d2..0566010 100644
--- a/adminsec/views.py
+++ b/adminsec/views.py
@@ -1,4 +1,6 @@
import unicodedata
+from datetime import datetime
+from itertools import chain
from django.conf import settings
from django.contrib import messages
@@ -9,7 +11,6 @@
from django.shortcuts import render
from django.urls import reverse, reverse_lazy
from django.utils import timezone
-from django.utils.datetime_safe import datetime
from django.views import View
from django.views.generic import (
CreateView,
@@ -174,32 +175,16 @@ def get_context_data(self, **kwargs):
# Used as switch in template
context["admin"] = True
- # Add open HpcGroupCreateRequest
- context["hpcgroupcreaterequests"] = HpcGroupCreateRequest.objects.active()
-
- # Add open HpcUserCreateRequest
- context["hpcusercreaterequests"] = HpcUserCreateRequest.objects.active()
-
- # Add open HpcProjectCreateRequest
- context["hpcprojectcreaterequests"] = HpcProjectCreateRequest.objects.active()
-
- # Add open HpcUserChangeRequest
- context["hpcuserchangerequests"] = HpcUserChangeRequest.objects.active()
-
- # Add open HpcGroupChangeRequest
- context["hpcgroupchangerequests"] = HpcGroupChangeRequest.objects.active()
-
- # Add open HpcProjectChangeRequest
- context["hpcprojectchangerequests"] = HpcProjectChangeRequest.objects.active()
-
- # Add open HpcGroupDeleteRequest
- context["hpcgroupdeleterequests"] = None
-
- # Add open HpcUserDeleteRequest
- context["hpcuserdeleterequests"] = None
-
- # Add open HpcProjectDeleteRequest
- context["hpcprojectdeleterequests"] = None
+ context["pending_requests"] = list(
+ chain(
+ HpcGroupCreateRequest.objects.active(),
+ HpcGroupChangeRequest.objects.active(),
+ HpcProjectCreateRequest.objects.active(),
+ HpcProjectChangeRequest.objects.active(),
+ HpcUserCreateRequest.objects.active(),
+ HpcUserChangeRequest.objects.active(),
+ )
+ )
return context
@@ -240,6 +225,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["hpc_group_name_suggestion"] = obj.name if obj.name else name
tier1_work = folders.get("tier1_work")
tier1_scratch = folders.get("tier1_scratch")
@@ -490,6 +476,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["admin"] = True
return context
@@ -659,6 +646,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["admin"] = True
return context
@@ -822,6 +810,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["hpc_project_name_suggestion"] = name
tier1_work = folders.get("tier1_work")
tier1_scratch = folders.get("tier1_scratch")
@@ -970,12 +959,14 @@ def post(self, request, *args, **kwargs):
creator=self.request.user,
status=OBJECT_STATUS_ACTIVE,
expiration=obj.expiration,
+ delegate=obj.delegate,
)
- project.members.add(obj.group.owner)
- project.version_history.last().members.add(obj.group.owner)
+ members = list(obj.members.all())
+ project.members.add(*members)
+ project.get_latest_version().members.add(*members)
# Create invitations for users
- for member in obj.members.all():
+ for member in members:
if member == obj.group.owner:
continue
@@ -1084,6 +1075,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["admin"] = True
return context
@@ -1237,6 +1229,7 @@ def get_context_data(self, **kwargs):
context["is_active"] = obj.is_active()
context["is_revision"] = obj.is_revision()
context["is_revised"] = obj.is_revised()
+ context["is_archived"] = obj.is_archived()
context["admin"] = True
return context
@@ -1244,7 +1237,7 @@ def get_context_data(self, **kwargs):
class HpcProjectChangeRequestRevisionView(HpcPermissionMixin, UpdateView):
"""HPC project change request revision view."""
- template_name = "usersec/hpcprojectchangerequest_form.html"
+ template_name = "usersec/hpcprojectcreaterequest_form.html"
model = HpcProjectChangeRequest
form_class = HpcProjectChangeRequestForm
slug_field = "uuid"
diff --git a/hpcaccess/static/js/project.js b/hpcaccess/static/js/project.js
index d1ed616..7f8c9c2 100644
--- a/hpcaccess/static/js/project.js
+++ b/hpcaccess/static/js/project.js
@@ -1,30 +1,10 @@
/* Project specific Javascript goes here. */
-var delegate_id = null;
-
-
-function buildSelectedMembers() {
- $("#membersSelected").empty();
-
- $("#id_members option:selected").each(function () {
- let id = $(this).val();
- let element = '' + $(this).text();
- if (id !== delegate_id && id !== $("#submit").data("owner-id").toString()) {
- element += ' X';
- }
- element += '';
- $("#membersSelected").append(element);
- });
-
- $(".cancelMember").on('click', cancelMember)
-}
-
-
function mergeToJson() {
- var content = [];
+ var content = []
$(".mergeToJson").each(function () {
- content.push('"' + $(this).attr("name") + '": "' + $(this).val() + '"');
+ content.push('"' + $(this).attr("name") + '": ' + $(this).val());
});
$("#id_resources_requested").val("{" + content.join(", ") + "}")
}
@@ -40,64 +20,31 @@ function jsonToFields() {
}
-function addOwnerMember() {
- var members = $("#id_members").val();
- members.push($("#submit").data("owner-id").toString());
- $("#id_members").val(members);
-}
-
-
-function addDelegateMember() {
- var members = $("#id_members").val();
- delegate_id = $("#id_delegate").val();
- var position = members.indexOf(delegate_id);
-
- if (position === -1) {
- console.error("Delegate (" + delegate_id + ") not found in list. List of members: " + members)
- return
- }
-
- if (delegate_id) {
- members.splice(position, 1);
- $("#id_members").val(members);
- }
-
- if (delegate_id) {
- members.push(delegate_id);
- $("#id_members").val(members);
- }
-
- buildSelectedMembers();
-}
-
-
-function addMember() {
- var member_id = $("#id_members_dropdown").val();
-
- if (member_id) {
- var members = $("#id_members").val();
-
- members.push(member_id);
- $("#id_members").val(members);
+function buildSelectedMembers() {
+ $("#membersSelected").empty();
+ $("#id_members option:selected").each(function () {
+ const id = $(this).val();
+ const isOwner = id === $("#submit").data("owner-id").toString();
+ let cancelButton = '';
+ if (!isOwner) {
+ cancelButton = `
+
+ `;
+ }
- buildSelectedMembers();
- }
+ let element = `
+ ${$(this).text()}
+ ${cancelButton}
+ `;
+ $("#membersSelected").append(element);
+ });
+ $(".cancelMember").on('click', cancelMember)
}
function cancelMember() {
var member_id = $(this).data("member-id");
- var members = $("#id_members").val();
- var position = members.indexOf(member_id.toString());
-
- if (position === -1) {
- console.error("Member (" + member_id + ") not found in list. List of members: " + members)
- return
- }
-
- members.splice(position, 1);
-
- $("#id_members").val(members);
-
+ $(`#id_delegate option[value='${member_id}']`).remove();
+ $(`#id_members option[value='${member_id}']`).remove();
buildSelectedMembers();
}
diff --git a/hpcaccess/templates/base.html b/hpcaccess/templates/base.html
index e4650f1..96ab46e 100644
--- a/hpcaccess/templates/base.html
+++ b/hpcaccess/templates/base.html
@@ -65,6 +65,12 @@
integrity="sha384-FItuQ+AF7gqljIq5rozCj0vTwFbFlxfi7HCL/AHpP6jtDXICPcQyHXOceH/poGUw"
crossorigin="anonymous"
>
+
{% else %}
{# Custom Javascript includes #}
{% for js_inc in custom_js_includes %}
diff --git a/hpcaccess/templates/pages/login.html b/hpcaccess/templates/pages/login.html
index 894ec28..11dc229 100644
--- a/hpcaccess/templates/pages/login.html
+++ b/hpcaccess/templates/pages/login.html
@@ -4,11 +4,10 @@
{% block content %}
-
-
- Welcome to HPC Access.
-
-
+
+ Welcome to HPC Access!
+
+
This website allows users of the BIH HPC cluster to
@@ -24,8 +23,8 @@
- create projects with dedicated and collaborative storage resources,
- and make requests for additional group/project resources.
-
-
+
+
Please log in using your Charité or MDC account.
@@ -40,7 +39,6 @@
str:
+ return obj.user.name
+
+ class Meta:
+ model = HpcUser
+ fields = [
+ "id",
+ "username",
+ "primary_group",
+ "full_name",
+ ]
+
+
class HpcUserVersionSerializer(HpcUserAbstractSerializer, serializers.ModelSerializer):
"""Serializer for HpcUserVersion model."""
diff --git a/usersec/templates/usersec/form_field.html b/usersec/templates/usersec/form_field.html
new file mode 100644
index 0000000..f4085d2
--- /dev/null
+++ b/usersec/templates/usersec/form_field.html
@@ -0,0 +1,20 @@
+
+ {% if field.errors %}
+
+ {{ field.errors }}
+
+ {% endif %}
+
+ {{ field }}
+
+
+ {% if field.help_text %}
+
{{ field.help_text }}
+ {% endif %}
+
diff --git a/usersec/templates/usersec/hpcgroup_detail.html b/usersec/templates/usersec/hpcgroup_detail.html
index 1992a7f..9666eca 100644
--- a/usersec/templates/usersec/hpcgroup_detail.html
+++ b/usersec/templates/usersec/hpcgroup_detail.html
@@ -14,7 +14,6 @@