Compare commits

..
3 Commits
Author SHA1 Message Date
Tim Lorsbach ff37a17edb ...
CI / test (pull_request) Failing after 28s
API CI / api-tests (pull_request) Failing after 31s
2026-09-23 10:12:48 +02:00
Tim Lorsbach c60eac879e wip 2026-09-15 23:13:21 +02:00
Tim Lorsbach b269b7dfd8 ... 2026-09-08 21:49:54 +02:00
10 changed files with 74 additions and 21 deletions
@@ -36,8 +36,8 @@
img.onerror = () => { img.onerror = () => {
this.pesVizHtml = ` this.pesVizHtml = `
<div class='alert alert-error' role='alert'> <div class='alert alert-error' role='alert'>
<h4 class='alert-heading'>Could not render PES!</h4> <h4 class='alert-heading'>Failed to fetch this PES!</h4>
<p>Could not render PES - Do you have access?</p> <p>Either the PES-ID is incorrect, or you're missing sufficient permissions to access this (potentially secret) item. In case you're missing permissions you can request the entitlement cs.u.enviPath_secret_data_user_group on go/idnow to gain access.</p>
</div>`; </div>`;
}; };
}, },
+1 -1
View File
@@ -102,7 +102,7 @@ def entra_callback(request):
else: else:
auth_log.info(f"Registering {user_name} with OID {user_oid}") auth_log.info(f"Registering {user_name} with OID {user_oid}")
u = UserManager.create_user(user_name, user_email, None, uuid=user_oid, is_active=True) u = UserManager.create_user(user_name, user_email, None, uuid=user_oid, is_active=True, add_to_group=False)
registered = True registered = True
auth_log.info(f"User {user_name} {'(admin) ' if u.is_superuser else ''}with OID {user_oid} successfully logged in as {u.username} from {get_remote_address(request)}") auth_log.info(f"User {user_name} {'(admin) ' if u.is_superuser else ''}with OID {user_oid} successfully logged in as {u.username} from {get_remote_address(request)}")
+3
View File
@@ -581,6 +581,9 @@ class PackageManager(object):
if caller_perm != Permission.ALL[0] and not caller.is_superuser: if caller_perm != Permission.ALL[0] and not caller.is_superuser:
raise ValueError("Only owner are allowed to modify permissions") raise ValueError("Only owner are allowed to modify permissions")
if isinstance(grantee, Group) and package.classification_level == package.Classification.SECRET:
raise ValueError("Cannot grant permissions to a Group on a secret package")
data = { data = {
"package": package, "package": package,
} }
+28
View File
@@ -2456,6 +2456,20 @@ class Node(EnviPathModel, AliasMixin, ScenarioMixin, AdditionalInformationMixin)
else: else:
return self.default_node_label.name return self.default_node_label.name
def get_description(self, include_suffix=True):
default_desc = False
if self.description == "no description":
default_desc = True
if not default_desc:
return self.description
else:
if include_suffix:
return f"{self.default_node_label.description} (taken from underlying structure)"
else:
return self.default_node_label.description
def d3_json(self): def d3_json(self):
app_domain_data = self.get_app_domain_assessment_data() app_domain_data = self.get_app_domain_assessment_data()
@@ -2773,6 +2787,20 @@ class Edge(EnviPathModel, AliasMixin, ScenarioMixin, AdditionalInformationMixin)
else: else:
return self.edge_label.name return self.edge_label.name
def get_description(self, include_suffix=True):
default_desc = False
if self.description == "no description":
default_desc = True
if not default_desc:
return self.description
else:
if include_suffix:
return f"{self.edge_label.description} (taken from underlying reaction)"
else:
return self.edge_label.description
class EPModel(PolymorphicModel, EnviPathModel, AdditionalInformationMixin): class EPModel(PolymorphicModel, EnviPathModel, AdditionalInformationMixin):
package = models.ForeignKey( package = models.ForeignKey(
+12 -1
View File
@@ -1292,7 +1292,7 @@ def package(request, package_uuid):
"user_id", flat=True "user_id", flat=True
) )
) )
users = users.filter(is_active=True) users = users.filter(is_active=True).exclude(username="anonymous")
group_perms = GroupPackagePermission.objects.filter(package=current_package) group_perms = GroupPackagePermission.objects.filter(package=current_package)
groups = Group.objects.exclude( groups = Group.objects.exclude(
@@ -1324,6 +1324,12 @@ def package(request, package_uuid):
return redirect(s.SERVER_URL + "/package") return redirect(s.SERVER_URL + "/package")
elif hidden == "publish-package": elif hidden == "publish-package":
if current_package.classification_level == current_package.Classification.SECRET:
return error(
request,
"Cannot publish a secret package",
"You cannot publish a secret package.",
)
for g in Group.objects.filter(public=True): for g in Group.objects.filter(public=True):
PackageManager.grant_read(current_user, current_package, g) PackageManager.grant_read(current_user, current_package, g)
return redirect(current_package.url) return redirect(current_package.url)
@@ -3314,6 +3320,11 @@ def jobs(request):
"This Package was generated automatically for the batch prediction task.", "This Package was generated automatically for the batch prediction task.",
) )
if current_user.default_package.classification_level == current_user.default_package.Classification.SECRET:
target_package.classification_level = current_user.default_package.Classification.SECRET
target_package.data_pool = current_user.default_package.data_pool
target_package.save()
from .tasks import batch_predict, dispatch from .tasks import batch_predict, dispatch
res = dispatch( res = dispatch(
+9 -11
View File
@@ -185,19 +185,18 @@
<div <div
class="mt-4 rounded-lg border border-base-300 bg-base-50 px-4 py-2.5 text-sm text-base-content/70" class="mt-4 rounded-lg border border-base-300 bg-base-50 px-4 py-2.5 text-sm text-base-content/70"
> >
Prediction will be stored in Prediction will be stored in Package
<strong class="text-base-content" <strong class="text-base-content"
>{{ meta.current_package.name|safe }}</strong ><a class="link" href="{{ meta.current_package.url }}">{{ meta.current_package.name|safe }}</a></strong
> >
{% if meta.user.default_setting %} {% if meta.user.default_setting %}
using setting using setting
<strong class="text-base-content" <strong class="text-base-content"
>{{ meta.user.default_setting.name|safe }}</strong ><a class="link" href="{{ meta.user.default_setting.url}}">{{ meta.user.default_setting.name|safe }}</a></strong
> >
{% endif %} {% endif %}
<br />
To use a different setting click To use a different setting click
<a class="label link" href="/predict">here</a> <a class="link" href="/predict">here</a>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@@ -222,23 +221,22 @@
> >
Predict! Predict!
</button> </button>
{% if meta.current_package %} {% if meta.current_package %}
<div <div
class="mt-4 rounded-lg border border-base-300 bg-base-50 px-4 py-2.5 text-sm text-base-content/70" class="mt-4 rounded-lg border border-base-300 bg-base-50 px-4 py-2.5 text-sm text-base-content/70"
> >
Prediction will be stored in Prediction will be stored in Package
<strong class="text-base-content" <strong class="text-base-content"
>{{ meta.current_package.name|safe }}</strong ><a class="link" href="{{ meta.current_package.url }}">{{ meta.current_package.name|safe }}</a></strong
> >
{% if meta.user.default_setting %} {% if meta.user.default_setting %}
using setting using setting
<strong class="text-base-content" <strong class="text-base-content"
>{{ meta.user.default_setting.name|safe }}</strong ><a class="link" href="{{ meta.user.default_setting.url}}">{{ meta.user.default_setting.name|safe }}</a></strong
> >
{% endif %} {% endif %}
<br />
To use a different setting click To use a different setting click
<a class="label link" href="/predict">here</a> <a class="link" href="/predict">here</a>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@@ -31,6 +31,7 @@
{% csrf_token %} {% csrf_token %}
<div class="form-control mb-3"> <div class="form-control mb-3">
{% if 1 == 0 %}
<label class="label" for="default-package"> <label class="label" for="default-package">
<span class="label-text">Default Package</span> <span class="label-text">Default Package</span>
</label> </label>
@@ -50,7 +51,7 @@
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
{% endif %}
<div class="form-control mb-3"> <div class="form-control mb-3">
<label class="label" for="default-group"> <label class="label" for="default-group">
<span class="label-text">Default Group</span> <span class="label-text">Default Group</span>
+1 -1
View File
@@ -57,7 +57,7 @@
<div class="collapse-arrow bg-base-200 collapse"> <div class="collapse-arrow bg-base-200 collapse">
<input type="checkbox" checked /> <input type="checkbox" checked />
<div class="collapse-title text-xl font-medium">Description</div> <div class="collapse-title text-xl font-medium">Description</div>
<div class="collapse-content">{{ edge.description }}</div> <div class="collapse-content">{{ edge.get_description }}</div>
</div> </div>
{% if edge.aliases %} {% if edge.aliases %}
+1 -1
View File
@@ -60,7 +60,7 @@
<div class="collapse-arrow bg-base-200 collapse"> <div class="collapse-arrow bg-base-200 collapse">
<input type="checkbox" checked /> <input type="checkbox" checked />
<div class="collapse-title text-xl font-medium">Description</div> <div class="collapse-title text-xl font-medium">Description</div>
<div class="collapse-content">{{ node.description }}</div> <div class="collapse-content">{{ node.get_description }}</div>
</div> </div>
{% endif %} {% endif %}
{% epdb_slot_templates "epdb.objects.node.viz" as viz_templates %} {% epdb_slot_templates "epdb.objects.node.viz" as viz_templates %}
+15 -3
View File
@@ -2,11 +2,23 @@
{% load static %} {% load static %}
{% block content %} {% block content %}
<div class="mx-auto w-full p-8"> <div class="mx-auto w-full p-8">
<h1 class="h1 mb-4 text-3xl font-bold"> <h1 class="h1 mb-4 flex items-center gap-2 text-3xl font-bold">
Predict a Pathway Predict a Pathway
<span class="text-base-content/50 text-xs" <span class="inline-flex items-center gap-1 text-base-content/50 text-xs"
>in <strong>{{ meta.current_package.name|safe }}</strong> >in <strong>{{ meta.current_package.name|safe }}</strong>{% if meta.url_contains_package %}
{% if meta.current_package.get_classification_level_display == "Restricted" %}
<img src="{% static 'images/restricted_mid.png' %}" width="100">
{% elif meta.current_package.get_classification_level_display == "Secret" %}
<img src="{% static 'images/secret_mid.png' %}" width="60">
{% endif %}
{% else %}
{% if meta.user.default_package.get_classification_level_display == "Restricted" %}
<img src="{% static 'images/restricted_mid.png' %}" width="100">
{% elif meta.user.default_package.get_classification_level_display == "Secret" %}
<img src="{% static 'images/secret_mid.png' %}" width="60">
{% endif %}
{% endif %}
</span> </span>
</h1> </h1>