[Feature] Legacy Package Import (#106)

Fixes #105

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#106
This commit is contained in:
2025-09-11 01:18:04 +12:00
parent 31783306e2
commit 62e6448448
6 changed files with 100 additions and 34 deletions

View File

@ -491,7 +491,7 @@ class PackageManager(object):
@staticmethod
@transaction.atomic
def import_package(data: dict, owner: User, keep_ids=False, add_import_timestamp=True):
def import_package(data: dict, owner: User, keep_ids=False, add_import_timestamp=True, trust_reviewed=False):
from uuid import UUID, uuid4
from datetime import datetime
from collections import defaultdict
@ -507,7 +507,11 @@ class PackageManager(object):
else:
pack.name = data['name']
pack.reviewed = True if data['reviewStatus'] == 'reviewed' else False
if trust_reviewed:
pack.reviewed = True if data['reviewStatus'] == 'reviewed' else False
else:
pack.reviewed = False
pack.description = data['description']
pack.save()

View File

@ -58,7 +58,7 @@ class Command(BaseCommand):
return anon, admin, g, jebus
def import_package(self, data, owner):
return PackageManager.import_package(data, owner, keep_ids=True, add_import_timestamp=False)
return PackageManager.import_package(data, owner, keep_ids=True, add_import_timestamp=False, trust_reviewed=True)
def create_default_setting(self, owner, packages):
s = SettingManager.create_setting(

View File

@ -280,10 +280,24 @@ def packages(request):
return render(request, 'collections/objects_list.html', context)
elif request.method == 'POST':
hidden = request.POST.get('hidden', None)
if hidden is not None:
pass
if hidden := request.POST.get('hidden', None):
if hidden == 'import-legacy-package-json':
f = request.FILES['file']
try:
file_data = f.read().decode("utf-8")
data = json.loads(file_data)
pack = PackageManager.import_package(data, current_user)
return redirect(pack.url)
except UnicodeDecodeError:
return error(request, 'Invalid encoding.', f'Invalid encoding, must be UTF-8')
else:
return HttpResponseBadRequest()
else:
package_name = request.POST.get('package-name')
package_description = request.POST.get('package-description', s.DEFAULT_VALUES['description'])
@ -784,6 +798,7 @@ def package(request, package_uuid):
current_package = PackageManager.get_package_by_id(current_user, package_uuid)
if request.method == 'GET':
context = get_base_context(request)
context['title'] = f'enviPath - {current_package.name}'

View File

@ -1,4 +1,8 @@
<li>
<a role="button" data-toggle="modal" data-target="#new_package_modal">
<span class="glyphicon glyphicon-plus"></span>New Package</a>
<span class="glyphicon glyphicon-plus"></span> New Package</a>
</li>
<li>
<a role="button" data-toggle="modal" data-target="#import_legacy_package_modal">
<span class="glyphicon glyphicon-import"></span> Import Package (Legacy)</a>
</li>

View File

@ -18,33 +18,34 @@
</div>
{% endif %}
{% block action_modals %}
{% if object_type == 'package' %}
{% include "modals/collections/new_package_modal.html" %}
{% elif object_type == 'compound' %}
{% include "modals/collections/new_compound_modal.html" %}
{% elif object_type == 'rule' %}
{% include "modals/collections/new_rule_modal.html" %}
{% elif object_type == 'reaction' %}
{% include "modals/collections/new_reaction_modal.html" %}
{% elif object_type == 'pathway' %}
{# {% include "modals/collections/new_pathway_modal.html" %} #}
{% elif object_type == 'node' %}
{% include "modals/collections/new_node_modal.html" %}
{% elif object_type == 'edge' %}
{% include "modals/collections/new_edge_modal.html" %}
{% elif object_type == 'scenario' %}
{% include "modals/collections/new_scenario_modal.html" %}
{% elif object_type == 'model' %}
{% include "modals/collections/new_model_modal.html" %}
{% elif object_type == 'setting' %}
{#{% include "modals/collections/new_setting_modal.html" %}#}
{% elif object_type == 'user' %}
<div></div>
{% elif object_type == 'group' %}
{% include "modals/collections/new_group_modal.html" %}
{% endif %}
{% endblock action_modals %}
{% block action_modals %}
{% if object_type == 'package' %}
{% include "modals/collections/new_package_modal.html" %}
{% include "modals/collections/import_legacy_package_modal.html" %}
{% elif object_type == 'compound' %}
{% include "modals/collections/new_compound_modal.html" %}
{% elif object_type == 'rule' %}
{% include "modals/collections/new_rule_modal.html" %}
{% elif object_type == 'reaction' %}
{% include "modals/collections/new_reaction_modal.html" %}
{% elif object_type == 'pathway' %}
{# {% include "modals/collections/new_pathway_modal.html" %} #}
{% elif object_type == 'node' %}
{% include "modals/collections/new_node_modal.html" %}
{% elif object_type == 'edge' %}
{% include "modals/collections/new_edge_modal.html" %}
{% elif object_type == 'scenario' %}
{% include "modals/collections/new_scenario_modal.html" %}
{% elif object_type == 'model' %}
{% include "modals/collections/new_model_modal.html" %}
{% elif object_type == 'setting' %}
{#{% include "modals/collections/new_setting_modal.html" %}#}
{% elif object_type == 'user' %}
<div></div>
{% elif object_type == 'group' %}
{% include "modals/collections/new_group_modal.html" %}
{% endif %}
{% endblock action_modals %}
<div class="panel-group" id="reviewListAccordion">
<div class="panel panel-default">

View File

@ -0,0 +1,42 @@
<div class="modal fade" tabindex="-1" id="import_legacy_package_modal" role="dialog"
aria-labelledby="import_legacy_package_modal" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span>
<span class="sr-only">Close</span>
</button>
<h4 class="modal-title">Import Package from legacy System</h4>
</div>
<div class="modal-body">
<p>Create a Package based on the JSON Export of the legacy system.</p>
<form id="import-legacy-package-modal-form" accept-charset="UTF-8" data-remote="true" method="post"
enctype="multipart/form-data">
{% csrf_token %}
<p>
<label class="btn btn-primary" for="jsonFile">
<input id="jsonFile" name="file" type="file" style="display:none;"
onchange="$('#upload-file-info').html(this.files[0].name)">
Choose JSON File
</label>
<span class="label label-info" id="upload-file-info"></span>
<input type="hidden" value="import-legacy-package-json" name="hidden" readonly="">
</p>
</form>
</div>
<div class="modal-footer">
<a id="import-legacy-package-modal-form-submit" class="btn btn-primary" href="#">Submit</a>
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
</div>
</div>
</div>
</div>
<script>
$(function () {
$('#import-legacy-package-modal-form-submit').on('click', function (e) {
e.preventDefault();
$('#import-legacy-package-modal-form').submit();
});
});
</script>