forked from enviPath/enviPy
Copy Objects between Packages (#59)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#59
This commit is contained in:
@ -13,7 +13,7 @@ from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from utilities.chem import FormatConverter, IndigoUtils
|
||||
from utilities.decorators import package_permission_required
|
||||
from .logic import GroupManager, PackageManager, UserManager, SettingManager, SearchManager
|
||||
from .logic import GroupManager, PackageManager, UserManager, SettingManager, SearchManager, EPDBURLParser
|
||||
from .models import Package, GroupPackagePermission, Group, CompoundStructure, Compound, Reaction, Rule, Pathway, Node, \
|
||||
EPModel, EnviFormer, MLRelativeReasoning, RuleBaseRelativeReasoning, Scenario, SimpleAmbitRule, APIToken, \
|
||||
UserPackagePermission, Permission, License, User, Edge
|
||||
@ -211,6 +211,32 @@ def set_scenarios(current_user, attach_object, scenario_urls: List[str]):
|
||||
|
||||
attach_object.set_scenarios(scens)
|
||||
|
||||
|
||||
def copy_object(current_user, target_package: 'Package', source_object_url: str):
|
||||
# Ensures that source is readable
|
||||
source_package = PackageManager.get_package_by_url(current_user, source_object_url)
|
||||
|
||||
parser = EPDBURLParser(source_object_url)
|
||||
|
||||
# if the url won't contain a package or is a plain package
|
||||
if not parser.contains_package_url():
|
||||
raise ValueError(f"Object {source_object_url} can't be copied!")
|
||||
|
||||
# Gets the most specific object
|
||||
source_object = parser.get_object()
|
||||
|
||||
if hasattr(source_object, 'copy'):
|
||||
mapping = dict()
|
||||
copy = source_object.copy(target_package, mapping)
|
||||
|
||||
if s.DEBUG:
|
||||
for k, v in mapping.items():
|
||||
logger.debug(f"Mapping {k.url} to {v.url}")
|
||||
|
||||
return copy
|
||||
|
||||
raise ValueError(f"Object {source_object} can't be copied!")
|
||||
|
||||
def index(request):
|
||||
context = get_base_context(request)
|
||||
context['title'] = 'enviPath - Home'
|
||||
@ -764,6 +790,14 @@ def package(request, package_uuid):
|
||||
for g in Group.objects.filter(public=True):
|
||||
PackageManager.update_permissions(current_user, current_package, g, Permission.READ[0])
|
||||
return redirect(current_package.url)
|
||||
elif hidden == 'copy':
|
||||
object_to_copy = request.POST.get('object_to_copy')
|
||||
|
||||
if not object_to_copy:
|
||||
return error(request, 'Invalid target package.', 'Please select a target package.')
|
||||
|
||||
copied_object = copy_object(current_user, current_package, object_to_copy)
|
||||
return JsonResponse({'success': copied_object.url})
|
||||
else:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user