forked from enviPath/enviPy
wip
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 6.0.3 on 2026-09-08 08:54
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bayer', '0003_pescompound_pesstructure_package_data_pool'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='package',
|
||||||
|
name='shareable',
|
||||||
|
field=models.BooleanField(default=True, verbose_name='Shareable'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -23,6 +23,7 @@ class Package(EnviPathModel):
|
|||||||
license = models.ForeignKey(
|
license = models.ForeignKey(
|
||||||
"epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License"
|
"epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License"
|
||||||
)
|
)
|
||||||
|
shareable = models.BooleanField(verbose_name="Shareable", default=True)
|
||||||
|
|
||||||
class Classification(models.IntegerChoices):
|
class Classification(models.IntegerChoices):
|
||||||
INTERNAL = 0, "Internal"
|
INTERNAL = 0, "Internal"
|
||||||
|
|||||||
+2
-2
@@ -119,8 +119,8 @@ def create_pes_node(request, package_uuid, pathway_uuid):
|
|||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return error(
|
return error(
|
||||||
request,
|
request,
|
||||||
"Could not fetch PES",
|
"Failed to fetch this PES",
|
||||||
f"Could not fetch PES data for {pes_link}"
|
"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."
|
||||||
)
|
)
|
||||||
|
|
||||||
classification = pes_data.get("classificationLevel", "")
|
classification = pes_data.get("classificationLevel", "")
|
||||||
|
|||||||
+8
-2
@@ -77,7 +77,7 @@ def entra_callback(request):
|
|||||||
return error(
|
return error(
|
||||||
request,
|
request,
|
||||||
"Login Failed",
|
"Login Failed",
|
||||||
"The user is not authenticated. A reason for this might be a missing assignment to the respective enviPath group.",
|
"Request access to role 1230/MON/APPS/Envipath/Envipath_Prod on go/idnow",
|
||||||
403,
|
403,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -139,10 +139,16 @@ def entra_callback(request):
|
|||||||
auth_log.info(f"Login Group Sync: Adding {u.username} to Group {g.name} ({ uuid })")
|
auth_log.info(f"Login Group Sync: Adding {u.username} to Group {g.name} ({ uuid })")
|
||||||
else:
|
else:
|
||||||
g = Group.objects.get(uuid=uuid)
|
g = Group.objects.get(uuid=uuid)
|
||||||
if g.user_member.contains(u):
|
# Do not remove users from All enviPath Users
|
||||||
|
if g.user_member.contains(u) and g.name != 'All enviPath Users':
|
||||||
g.user_member.remove(u)
|
g.user_member.remove(u)
|
||||||
auth_log.info(f"Login Group Sync: Removing {u.username} from Group {g.name} ({ uuid })")
|
auth_log.info(f"Login Group Sync: Removing {u.username} from Group {g.name} ({ uuid })")
|
||||||
|
|
||||||
|
# Ensure people are part of All enviPath Users -> they have to as, envipath_registered_user is granted
|
||||||
|
all_envipath_users = Group.objects.get(name="All enviPath Users")
|
||||||
|
if not all_envipath_users.user_member.contains(u):
|
||||||
|
all_envipath_users.user_member.add(u)
|
||||||
|
|
||||||
if registered:
|
if registered:
|
||||||
# #72 make package secret if user is part of a secret group
|
# #72 make package secret if user is part of a secret group
|
||||||
for id, name in s.ENTRA_SECRET_GROUPS.items():
|
for id, name in s.ENTRA_SECRET_GROUPS.items():
|
||||||
|
|||||||
+5
-2
@@ -211,7 +211,7 @@ class UserManager(object):
|
|||||||
# Create package
|
# Create package
|
||||||
package_name = f"{u.username}{'’' if u.username[-1] in 'sxzß' else 's'} Package"
|
package_name = f"{u.username}{'’' if u.username[-1] in 'sxzß' else 's'} Package"
|
||||||
package_description = "This package was generated during registration."
|
package_description = "This package was generated during registration."
|
||||||
p = PackageManager.create_package(u, package_name, package_description)
|
p = PackageManager.create_package(u, package_name, package_description, shareable=False)
|
||||||
u.default_package = p
|
u.default_package = p
|
||||||
u.save()
|
u.save()
|
||||||
|
|
||||||
@@ -547,7 +547,7 @@ class PackageManager(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create_package(current_user, name: str, description: str = None):
|
def create_package(current_user, name: str, description: str = None, *args, **kwargs):
|
||||||
p = Package()
|
p = Package()
|
||||||
|
|
||||||
# Clean for potential XSS
|
# Clean for potential XSS
|
||||||
@@ -556,6 +556,9 @@ class PackageManager(object):
|
|||||||
if description is not None and description.strip() != "":
|
if description is not None and description.strip() != "":
|
||||||
p.description = nh3.clean(description.strip(), tags=s.ALLOWED_HTML_TAGS).strip()
|
p.description = nh3.clean(description.strip(), tags=s.ALLOWED_HTML_TAGS).strip()
|
||||||
|
|
||||||
|
if "shareable" in kwargs:
|
||||||
|
p.shareable = kwargs["shareable"]
|
||||||
|
|
||||||
p.save()
|
p.save()
|
||||||
|
|
||||||
up = UserPackagePermission()
|
up = UserPackagePermission()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<i class="glyphicon glyphicon-edit"></i> Edit Package</a
|
<i class="glyphicon glyphicon-edit"></i> Edit Package</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
{% if meta.current_package.shareable %}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
role="button"
|
role="button"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<i class="glyphicon glyphicon-user"></i> Edit Permissions</a
|
<i class="glyphicon glyphicon-user"></i> Edit Permissions</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% if meta.current_package.get_classification_level_display != "Secret" %}
|
{% if meta.current_package.get_classification_level_display != "Secret" %}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
@@ -52,7 +54,7 @@
|
|||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if not meta.can_edit %}
|
{% if not meta.can_edit and meta.current_package.shareable %}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
role="button"
|
role="button"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<i class="glyphicon glyphicon-edit"></i> Update</a
|
<i class="glyphicon glyphicon-edit"></i> Update</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
{% if 1 == 0 %}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
role="button"
|
role="button"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<i class="glyphicon glyphicon-lock"></i> Update Password</a
|
<i class="glyphicon glyphicon-lock"></i> Update Password</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
role="button"
|
role="button"
|
||||||
|
|||||||
@@ -180,12 +180,26 @@
|
|||||||
>Aspartame</a
|
>Aspartame</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<a
|
|
||||||
class="absolute top-0 left-[calc(100%-5.4rem)]"
|
|
||||||
href="/predict"
|
|
||||||
>Advanced</a
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
|
{% if meta.current_package %}
|
||||||
|
<div
|
||||||
|
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
|
||||||
|
<strong class="text-base-content"
|
||||||
|
>{{ meta.current_package.name|safe }}</strong
|
||||||
|
>
|
||||||
|
{% if meta.user.default_setting %}
|
||||||
|
using setting
|
||||||
|
<strong class="text-base-content"
|
||||||
|
>{{ meta.user.default_setting.name|safe }}</strong
|
||||||
|
>
|
||||||
|
{% endif %}
|
||||||
|
<br />
|
||||||
|
To use a different setting click
|
||||||
|
<a class="label link" href="/predict">here</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
id="ketcher-container"
|
id="ketcher-container"
|
||||||
@@ -208,9 +222,25 @@
|
|||||||
>
|
>
|
||||||
Predict!
|
Predict!
|
||||||
</button>
|
</button>
|
||||||
<div class="mt-1 flex w-full justify-end">
|
{% if meta.current_package %}
|
||||||
<a class="label justify-end" href="/predict">Advanced</a>
|
<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"
|
||||||
|
>
|
||||||
|
Prediction will be stored in
|
||||||
|
<strong class="text-base-content"
|
||||||
|
>{{ meta.current_package.name|safe }}</strong
|
||||||
|
>
|
||||||
|
{% if meta.user.default_setting %}
|
||||||
|
using setting
|
||||||
|
<strong class="text-base-content"
|
||||||
|
>{{ meta.user.default_setting.name|safe }}</strong
|
||||||
|
>
|
||||||
|
{% endif %}
|
||||||
|
<br />
|
||||||
|
To use a different setting click
|
||||||
|
<a class="label link" href="/predict">here</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<input
|
<input
|
||||||
type="hidden"
|
type="hidden"
|
||||||
|
|||||||
Reference in New Issue
Block a user