diff --git a/workflows/management/commands/export_package.py b/workflows/management/commands/export_package.py index 2690978e1dd42e1ef60cba9ce3229e4297d55309..b72995e51f475415995e518c35f823631c6d6be7 100755 --- a/workflows/management/commands/export_package.py +++ b/workflows/management/commands/export_package.py @@ -7,6 +7,7 @@ import uuid import os import sys from django.conf import settings +from django.core.management.color import color_style import json def add_category(category,categories): @@ -71,6 +72,9 @@ def serialize_category(c): return data def export_package(package_name,writer): + + style = color_style() + if 'workflows.'+package_name not in settings.INSTALLED_APPS: raise CommandError("Package not found in INSTALLED_APPS.") @@ -89,6 +93,7 @@ def export_package(package_name,writer): package_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),'../../'+package_name+"/package_data/") ensure_dir(package_directory) widgets_directory = os.path.join(package_directory,"widgets") + deprecated_widgets_directory = os.path.join(package_directory,"deprecated_widgets") ensure_dir(widgets_directory) categories_directory = os.path.join(package_directory,"categories") ensure_dir(categories_directory) @@ -102,6 +107,9 @@ def export_package(package_name,writer): for aw in aws: aw.update_uid() + if os.path.isfile(os.path.join(deprecated_widgets_directory,aw.uid+'.json')): + writer.write(style.ERROR(" - Deprecated widget "+str(aw)+" found! Please import package to remove it. This widget has NOT been exported.\n")) + continue add_category(aw.category,categories) serialized_widget = serialize_widget(aw) diff --git a/workflows/management/commands/import_package.py b/workflows/management/commands/import_package.py index 7c42da39f1263ddd2b30e7c3dc8b699a7599f3b1..8c4190f00f898d1c870116f58adc4806fb8d9008 100755 --- a/workflows/management/commands/import_package.py +++ b/workflows/management/commands/import_package.py @@ -1,6 +1,6 @@ from unicodedata import category from django.core.management.base import BaseCommand, CommandError -from workflows.models import Category, AbstractWidget, AbstractInput, AbstractOutput, AbstractOption +from workflows.models import Category, AbstractWidget, AbstractInput, AbstractOutput, AbstractOption, Widget from django.core import serializers from optparse import make_option import uuid @@ -9,6 +9,7 @@ import sys from django.conf import settings import json from .export_package import serialize_category, serialize_widget +from django.core.management.color import color_style def parsewidgetdata(widget_data): widget = None @@ -29,13 +30,19 @@ def parsewidgetdata(widget_data): return widget, inputs, outputs, options def import_package(package_name,writer): + style = color_style() package_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),'../../'+package_name+"/package_data/") widgets_directory = os.path.join(package_directory,"widgets") + deprecated_widgets_directory = os.path.join(package_directory,"deprecated_widgets") categories_directory = os.path.join(package_directory,"categories") if not os.path.exists(package_directory) or not os.path.exists(widgets_directory) or not os.path.exists(categories_directory): raise CommandError("Cannot find package data. Are you sure this package has been exported already?") + try: + deprecated_widgets_files = os.listdir(deprecated_widgets_directory) + except: + deprecated_widgets_files = [] widget_files = os.listdir(widgets_directory) category_files = os.listdir(categories_directory) @@ -153,6 +160,24 @@ def import_package(package_name,writer): stale_os.delete() writer.write(" - Removing stale options\n") + if deprecated_widgets_files: + for deprecated_widget_file in deprecated_widgets_files: + wfilepath = os.path.join(deprecated_widgets_directory,deprecated_widget_file) + w_file = open(wfilepath,'r') + w_data = json.loads(w_file.read()) + w_file.close() + widget, inputs, outputs, options = parsewidgetdata(w_data) + created = False + try: + aw = AbstractWidget.objects.get(uid=widget['fields']['uid'],package=package_name) + if Widget.objects.filter(abstract_widget=aw).count()==0: + writer.write(' - Removing widget '+str(widget['fields']['name'])+'\n') + aw.delete() + else: + writer.write(style.ERROR(' - The widget '+str(widget['fields']['name'])+' is still used in workflows. It was not removed, but it is deprecated!\n')) + except AbstractWidget.DoesNotExist: + pass + if not global_change: #writer.write(" No changes detected in the widgets.\n") pass