forked from enviPath/enviPy
adjusted migration
Initial bayer app Show Pack Classification Adjusted docker compose to bayer specifics Adjusted Dockerfile for Bayer Adding secret flags to group, add secret pools to packages Adjusted View for Package creation Prep configs, added Package Create Modal wip More on PES wip wip Wip minor PW interactions API PES wip Make Select Widget reflect required make required generallay available Update UI if pathway mode is set to build Added ais circle adjustments Initial Zoom, fix AD Creation wip auth log, bb4g fix missing import Added viz hint if PES is part of reaction Add Edge check for pes flip boolean ... pes Added extra ... In / Out Edges Viz, Submitting Button Text ... Make PES Link clickable Return proper http response instead of error Fixed error return, removed unused options Fix PES Link HTML for other entities Fixed molfile assignment, adjusted Export Package Export/Import cycle highlight Description links implemented non persistent Harmonised proposed field in Json output Added pesLink field to PW Api output PES Fields in API Output removed debug Fix Classification import, Fix PES Deserialization underline pes link in templates Fix alter name/desc for node, make /node /edge funcitonal provide setting link and copy button Implemented Compound Names / Reaction Names View Option Unconnected Nodes Make links thicker, reduce timeout trigger time Show proposed info in popover Pathway Build no stereo removal Include probs in reaction name option viz Detect clicks outside nodes/edges Provide proper Error Pages View Package Perm wip sync Auth log auth log leftovers ... secret packs viz auth log for api model stats Fix Package Adjustment Adjust Group Auth Log Fix Secret image size in Navbar leftover ... minor
This commit is contained in:
@ -61,6 +61,7 @@ from .models import (
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
auth_log = logging.getLogger("auth")
|
||||
|
||||
Package = s.GET_PACKAGE_MODEL()
|
||||
|
||||
@ -71,6 +72,18 @@ def log_post_params(request):
|
||||
logger.debug(f"{k}\t{v}")
|
||||
|
||||
|
||||
def get_remote_address(request):
|
||||
remote_address = ""
|
||||
|
||||
if request is not None:
|
||||
remote_address = request.META.get("HTTP_X_FORWARDED_FOR")
|
||||
|
||||
if not remote_address:
|
||||
remote_address = request.META.get("REMOTE_ADDR", "")
|
||||
|
||||
return remote_address
|
||||
|
||||
|
||||
def get_error_handler_context(request, for_user=None) -> Dict[str, Any]:
|
||||
current_user = _anonymous_or_real(request)
|
||||
|
||||
@ -147,6 +160,20 @@ def handler500(request):
|
||||
return render(request, "errors/error.html", context, status=500)
|
||||
|
||||
|
||||
def delete_with_log(request, obj):
|
||||
caller = request.user
|
||||
obj_type = obj.__class__.__name__
|
||||
|
||||
try:
|
||||
obj.delete()
|
||||
auth_log.info(f"{caller.username} ({caller.url}) deleted {obj_type}: {obj.name} ({obj.url})")
|
||||
except Exception as e:
|
||||
logger.info(f"Tried to delete {obj_type}: {obj.name} ({obj.url}) but deletion failed! Exception {e}")
|
||||
auth_log.info(
|
||||
f"{caller.username} ({caller.url}) tried to delete {obj_type}: {obj.name} ({obj.url}) but deletion failed!")
|
||||
raise e
|
||||
|
||||
|
||||
def login(request):
|
||||
context = get_base_context(request)
|
||||
|
||||
@ -205,11 +232,18 @@ def login(request):
|
||||
if user is not None:
|
||||
login(request, user)
|
||||
|
||||
if user.is_superuser:
|
||||
auth_log.error(f"admin ({user.username}) login attempt by {get_remote_address(request)} successful")
|
||||
|
||||
if next := request.POST.get("next"):
|
||||
return redirect(next)
|
||||
|
||||
return redirect(reverse("index"))
|
||||
else:
|
||||
if _user := User.objects.get(email=email):
|
||||
if _user.is_superuser:
|
||||
auth_log.error(f"admin ({_user.username}) login attempt by {get_remote_address(request)} failed")
|
||||
|
||||
context["message"] = "Login failed!"
|
||||
return render(request, "static/login.html", context)
|
||||
else:
|
||||
@ -389,6 +423,9 @@ def get_base_context(request, for_user=None) -> Dict[str, Any]:
|
||||
"debug": s.DEBUG,
|
||||
"external_databases": ExternalDatabase.get_databases(),
|
||||
"site_id": s.MATOMO_SITE_ID,
|
||||
# EDIT START
|
||||
"secret_groups": Group.objects.filter(secret=True, user_member=current_user),
|
||||
# EDIT END
|
||||
},
|
||||
}
|
||||
|
||||
@ -589,10 +626,38 @@ def packages(request):
|
||||
"package-description", s.DEFAULT_VALUES["description"]
|
||||
)
|
||||
|
||||
# EDIT START
|
||||
data_pool = None
|
||||
package_classification = request.POST.get("package-classification")
|
||||
classification = Package.Classification(int(package_classification))
|
||||
# For SECRET we'll need a data pool which will be an additional perm check later
|
||||
if classification == Package.Classification.SECRET:
|
||||
package_data_pool = request.POST.get("package-data-pool")
|
||||
|
||||
if package_data_pool is None:
|
||||
return error(request, "Invalid data pool.", "Data Pool is required!")
|
||||
|
||||
data_pool = GroupManager.get_group_by_url(current_user, package_data_pool)
|
||||
|
||||
if data_pool is None:
|
||||
return error(request, "Invalid data pool.", "Data Pool does not exist or no access!")
|
||||
|
||||
if not data_pool.secret:
|
||||
return error(request, "Invalid data pool.", "Data Pool is not a secret group!")
|
||||
|
||||
created_package = PackageManager.create_package(
|
||||
current_user, package_name, package_description
|
||||
)
|
||||
|
||||
created_package.classification_level = classification
|
||||
|
||||
# Set previously determined data pool
|
||||
if classification == Package.Classification.SECRET:
|
||||
created_package.data_pool = data_pool
|
||||
|
||||
created_package.save()
|
||||
# EDIT END
|
||||
|
||||
return redirect(created_package.url)
|
||||
|
||||
elif request.method == "OPTIONS":
|
||||
@ -1251,7 +1316,8 @@ def package(request, package_uuid):
|
||||
"You cannot delete the default package. If you want to delete this package you have to set another default package first.",
|
||||
)
|
||||
|
||||
logger.debug(current_package.delete())
|
||||
delete_with_log(request, current_package)
|
||||
|
||||
return redirect(s.SERVER_URL + "/package")
|
||||
elif hidden == "publish-package":
|
||||
for g in Group.objects.filter(public=True):
|
||||
@ -2242,7 +2308,7 @@ def package_pathway(request, package_uuid, pathway_uuid):
|
||||
elif request.method == "POST":
|
||||
if hidden := request.POST.get("hidden", None):
|
||||
if hidden == "delete":
|
||||
current_pathway.delete()
|
||||
delete_with_log(request, current_pathway)
|
||||
return redirect(current_package.url + "/pathway")
|
||||
else:
|
||||
return HttpResponseBadRequest()
|
||||
@ -2460,7 +2526,7 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid):
|
||||
if hidden := request.POST.get("hidden", None):
|
||||
if hidden == "delete":
|
||||
# pre_delete signal will take care of edge deletion
|
||||
current_node.delete()
|
||||
delete_with_log(request, current_node)
|
||||
|
||||
return redirect(current_pathway.url)
|
||||
else:
|
||||
@ -2614,7 +2680,7 @@ def package_pathway_edge(request, package_uuid, pathway_uuid, edge_uuid):
|
||||
|
||||
if hidden := request.POST.get("hidden", None):
|
||||
if hidden == "delete":
|
||||
current_edge.delete()
|
||||
delete_with_log(request, current_edge)
|
||||
return redirect(current_pathway.url)
|
||||
|
||||
if "selected-scenarios" in request.POST:
|
||||
@ -2976,7 +3042,7 @@ def group(request, group_uuid):
|
||||
|
||||
if hidden := request.POST.get("hidden", None):
|
||||
if hidden == "delete":
|
||||
current_group.delete()
|
||||
delete_with_log(request, current_group)
|
||||
return redirect(s.SERVER_URL + "/group")
|
||||
else:
|
||||
return HttpResponseBadRequest()
|
||||
@ -3033,9 +3099,15 @@ def settings(request):
|
||||
new_default = request.POST.get("prediction-setting-new-default", "off") == "on"
|
||||
|
||||
# min 2, max s.DEFAULT_MAX_NUMBER_OF_NODES
|
||||
temp_max_nodes = request.POST.get("prediction-setting-max-nodes")
|
||||
if temp_max_nodes is None or temp_max_nodes == "" or int(temp_max_nodes) == -1:
|
||||
temp_max_nodes = s.DEFAULT_MAX_NUMBER_OF_NODES
|
||||
else:
|
||||
temp_max_nodes = int(request.POST.get("prediction-setting-max-nodes", 1))
|
||||
|
||||
max_nodes = min(
|
||||
max(
|
||||
int(request.POST.get("prediction-setting-max-nodes", 1)),
|
||||
temp_max_nodes,
|
||||
2,
|
||||
),
|
||||
s.DEFAULT_MAX_NUMBER_OF_NODES,
|
||||
@ -3056,6 +3128,7 @@ def settings(request):
|
||||
|
||||
model_uuid = model_url.split("/")[-1]
|
||||
params["model"] = EPModel.objects.get(uuid=model_uuid)
|
||||
# TODO Check if removed if request contains "" or not at all
|
||||
params["model_threshold"] = request.POST.get(
|
||||
"model-based-prediction-setting-threshold", s.DEFAULT_MODEL_THRESHOLD
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user