Added UI elements to add/remove Scenarios to various objects (#51)

Fixes #23

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#51
This commit is contained in:
2025-08-21 07:56:44 +12:00
parent a7637d046a
commit ec387cc12e
17 changed files with 305 additions and 4 deletions

View File

@ -534,6 +534,16 @@ class AliasMixin(models.Model):
class ScenarioMixin(models.Model):
scenarios = models.ManyToManyField("epdb.Scenario", verbose_name='Attached Scenarios')
@transaction.atomic
def set_scenarios(self, scenarios: List['Scenario']):
self.scenarios.clear()
self.save()
for s in scenarios:
self.scenarios.add(s)
self.save()
class Meta:
abstract = True

View File

@ -199,6 +199,15 @@ def breadcrumbs(first_level_object=None, second_level_namespace=None, second_lev
return bread
def set_scenarios(current_user, attach_object, scenario_urls: List[str]):
scens = []
for scenario_url in scenario_urls:
package = PackageManager.get_package_by_url(current_user, scenario_url)
scen = Scenario.objects.get(package=package, uuid=scenario_url.split('/')[-1])
scens.append(scen)
attach_object.set_scenarios(scens)
def index(request):
context = get_base_context(request)
context['title'] = 'enviPath - Home'
@ -691,7 +700,8 @@ def package_model(request, package_uuid, model_uuid):
context['breadcrumbs'] = breadcrumbs(current_package, 'model', current_model)
context['model'] = current_model
context['current_object'] = current_model
return render(request, 'objects/model.html', context)
elif request.method == 'POST':
@ -881,6 +891,7 @@ def package_compound(request, package_uuid, compound_uuid):
context['breadcrumbs'] = breadcrumbs(current_package, 'compound', current_compound)
context['compound'] = current_compound
context['current_object'] = current_compound
return render(request, 'objects/compound.html', context)
@ -892,6 +903,12 @@ def package_compound(request, package_uuid, compound_uuid):
else:
return HttpResponseBadRequest()
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_compound, selected_scenarios)
return redirect(current_compound.url)
new_compound_name = request.POST.get('compound-name')
new_compound_description = request.POST.get('compound-description')
@ -965,9 +982,19 @@ def package_compound_structure(request, package_uuid, compound_uuid, structure_u
context['object_type'] = 'compound'
context['compound_structure'] = current_structure
context['current_object'] = current_structure
return render(request, 'objects/compound_structure.html', context)
elif request.method == 'POST':
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_structure, selected_scenarios)
return redirect(current_structure.url)
return HttpResponseBadRequest()
else:
return HttpResponseNotAllowed(['GET', ])
@ -1073,6 +1100,8 @@ def package_rule(request, package_uuid, rule_uuid):
context['breadcrumbs'] = breadcrumbs(current_package, 'rule', current_rule)
context['rule'] = current_rule
context['current_object'] = current_rule
if isinstance(current_rule, SimpleAmbitRule):
return render(request, 'objects/simple_rule.html', context)
else: # isinstance(current_rule, ParallelRule) or isinstance(current_rule, SequentialRule):
@ -1086,6 +1115,12 @@ def package_rule(request, package_uuid, rule_uuid):
else:
return HttpResponseBadRequest()
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_rule, selected_scenarios)
return redirect(current_rule.url)
rule_name = request.POST.get('rule-name', '').strip()
rule_description = request.POST.get('rule-description', '').strip()
@ -1171,6 +1206,7 @@ def package_reaction(request, package_uuid, reaction_uuid):
context['breadcrumbs'] = breadcrumbs(current_package, 'reaction', current_reaction)
context['reaction'] = current_reaction
context['current_object'] = current_reaction
return render(request, 'objects/reaction.html', context)
@ -1182,6 +1218,12 @@ def package_reaction(request, package_uuid, reaction_uuid):
else:
return HttpResponseBadRequest()
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_reaction, selected_scenarios)
return redirect(current_reaction.url)
new_reaction_name = request.POST.get('reaction-name')
new_reaction_description = request.POST.get('reaction-description')
@ -1314,6 +1356,7 @@ def package_pathway(request, package_uuid, pathway_uuid):
context['breadcrumbs'] = breadcrumbs(current_package, 'pathway', current_pathway)
context['pathway'] = current_pathway
context['current_object'] = current_pathway
context['breadcrumbs'] = [
{'Home': s.SERVER_URL},
@ -1334,6 +1377,12 @@ def package_pathway(request, package_uuid, pathway_uuid):
else:
return HttpResponseBadRequest()
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_pathway, selected_scenarios)
return redirect(current_pathway.url)
pathway_name = request.POST.get('pathway-name')
pathway_description = request.POST.get('pathway-description')
@ -1454,6 +1503,8 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid):
]
context['node'] = current_node
context['current_object'] = current_node
context['app_domain_assessment_data'] = json.dumps(current_node.get_app_domain_assessment_data())
return render(request, 'objects/node.html', context)
@ -1471,8 +1522,14 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid):
return redirect(current_pathway.url)
else:
return HttpResponseBadRequest()
else:
return HttpResponseBadRequest()
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_node, selected_scenarios)
return redirect(current_node.url)
return HttpResponseBadRequest()
else:
return HttpResponseNotAllowed(['GET', 'POST'])
@ -1562,6 +1619,7 @@ def package_pathway_edge(request, package_uuid, pathway_uuid, edge_uuid):
context['object_type'] = 'reaction'
context['breadcrumbs'] = breadcrumbs(current_package, 'pathway', current_pathway, 'edge', current_edge)
context['edge'] = current_edge
context['current_object'] = current_edge
return render(request, 'objects/edge.html', context)
@ -1574,6 +1632,14 @@ def package_pathway_edge(request, package_uuid, pathway_uuid, edge_uuid):
current_edge.delete()
return redirect(current_pathway.url)
selected_scenarios = request.POST.getlist('selected-scenarios')
if selected_scenarios:
set_scenarios(current_user, current_edge, selected_scenarios)
return redirect(current_edge.url)
return HttpResponseBadRequest()
else:
return HttpResponseNotAllowed(['GET', 'POST'])
@ -1584,6 +1650,12 @@ def package_scenarios(request, package_uuid):
current_package = PackageManager.get_package_by_id(current_user, package_uuid)
if request.method == 'GET':
if 'application/json' in request.META.get('HTTP_ACCEPT'): #request.headers.get('Accept') == 'application/json':
scens = Scenario.objects.filter(package=current_package).order_by('name')
res = [{'name': s.name, 'url': s.url, 'uuid': s.uuid} for s in scens]
return JsonResponse(res, safe=False)
context = get_base_context(request)
context['title'] = f'enviPath - {current_package.name} - Scenarios'