diff --git a/beat/web/common/serializers.py b/beat/web/common/serializers.py index 44b7b28b5dd6a897cca852507445ad64c9340f8f..e58aca79a5e07b778babd2a00cacd9e2c9853ce2 100644 --- a/beat/web/common/serializers.py +++ b/beat/web/common/serializers.py @@ -343,10 +343,18 @@ class ContributionCreationSerializer(serializers.ModelSerializer): previous_version_id = None if data.has_key('fork_of'): - fork_of_id = self.Meta.beat_core_class.Storage(settings.PREFIX, - data['fork_of']) - if fork_of_id.username is None: - fork_of_id.username = user.username + if self.Meta.beat_core_class is not None: + fork_of_id = self.Meta.beat_core_class.Storage(settings.PREFIX, + data['fork_of']) + if fork_of_id.username is None: + fork_of_id.username = user.username + else: + fork_of_id = MapDot() + fork_elem = json.loads(json.dumps(ast.literal_eval(json.loads(json.dumps(data['fork_of']))))) + fork_of_id["username"] = fork_elem['username'] + fork_of_id["name"] = fork_elem['name'] + fork_of_id["version"] = fork_elem['version'] + data['data'] = json.dumps(ast.literal_eval(json.loads(json.dumps(data['data'])))) else: fork_of_id = None diff --git a/beat/web/plotters/serializers.py b/beat/web/plotters/serializers.py index 2d7457d811827791f7dca374fa5be1671f8e04f0..40b4e64355446f4f00c1993a13cb8a9849b3ef63 100644 --- a/beat/web/plotters/serializers.py +++ b/beat/web/plotters/serializers.py @@ -112,7 +112,7 @@ class PlotterParameterCreationSerializer(ContributionCreationSerializer): class Meta(ContributionCreationSerializer.Meta): model = PlotterParameter - fields = ['name', 'plotter', 'data', 'version', 'previous_version', 'short_description', 'description'] + fields = ['name', 'plotter', 'data', 'version', 'previous_version', 'short_description', 'description', 'fork_of'] #beat_core_class = beat.core.PlotterParameter def create(self, validated_data): @@ -153,6 +153,13 @@ class PlotterParameterCreationSerializer(ContributionCreationSerializer): validated_data['short_description'] = validated_data['previous_version'].short_description validated_data['description'] = validated_data['previous_version'].description + #Create fork + if validated_data.has_key("fork_of"): + #add description/short_description to new version + validated_data['short_description'] = validated_data['fork_of'].short_description + validated_data['description'] = validated_data['fork_of'].description + + plotterparameter = PlotterParameter.objects.create(**validated_data) if plotterparameter is None: raise PlotterParameterCreationFailedException() diff --git a/beat/web/plotters/static/plotters/app/controllers/plotterparameterController.js b/beat/web/plotters/static/plotters/app/controllers/plotterparameterController.js index af17fb8a8e7a0e64fb97427a234947acfdf11e74..4074e32572c87d06e10ac69883b967738e08a91d 100644 --- a/beat/web/plotters/static/plotters/app/controllers/plotterparameterController.js +++ b/beat/web/plotters/static/plotters/app/controllers/plotterparameterController.js @@ -36,6 +36,8 @@ app.controller('plotterparameterController',['$scope', 'plotterFactory', 'plotte $scope.textdata = []; $scope.plotterparams_update = {}; $scope.plotterparams_newversion = {}; + $scope.plotterparams_fork = {}; + $scope.plotterparameter_forking = undefined; $scope.init = function(user, plotterparameter, url_prefix, data_itemcontent_file, data_table_itemcontent_file) { diff --git a/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js b/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js index 073af49f2211bec65420c4f390d6221264161d64..df97c1bd8d187a6328c70a536e8f7654cf82419d 100644 --- a/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js +++ b/beat/web/plotters/static/plotters/app/directives/plotterparameterItemView.js @@ -341,6 +341,73 @@ app.directive("createplotterparameternewversion", function() }; }); +//Directive used to handle save plotterparameter click +app.directive("createplotterparameterfork", function() +{ + return { + link:function(scope, element, attrs) + { + element.bind("click", function() + { + //No plotter is selected + if(attrs.plotter == "None" || attrs.plotter=="") + { + //plotter is selected: parameter tuning + //should actually never fall here + + if($("#plotter-selection :selected").text().length == 0) + { + alert("Please select a plotter first") + } + else + { + scope.plotterparams_update.plotter = scope.plotters.selected.id; + + createPlotterParameter(); + } + } + else + { + scope.plotterparams_fork.plotter = scope.plotters.selected.id; + scope.plotterparams_fork.name = scope.plotterparams_update.name; + scope.plotterparams_newversion.version = "1"; + scope.plotterparams_fork.fork_of = {}; + scope.plotterparams_fork.fork_of['username'] = scope.plotterparameter_user; + scope.plotterparams_fork.fork_of['name'] = scope.plotterparameter_name; + scope.plotterparams_fork.fork_of['version'] = scope.plotterparameter_version; + scope.plotterparams_fork.data = scope.plotterparams_update; + + scope.plotterparameter_forking = true; + + createPlotterParameter(); + } + }); + + function createPlotterParameter() + { + scope.plotterparameterFactory.createPlotterParameter(scope.user, scope.plotterparams_fork, scope.url_prefix) + .success(function (returnedData) + { + + beat.ui.plotterparameter.plotterparameter_created('plotterparameter_created', scope); + }) + .error(function (error) + { + var error_text = ""; + $.each(error, function( key, value ) { + + error_text += key + ": " + value; + }); + scope.status = 'Unable to create plotterparameter:\n' + error_text; + + alert(scope.status); + }); + + } + } + }; +}); + //Directive used to append parameters app.directive("plotparams", function($compile){ diff --git a/beat/web/plotters/templates/plotterparameters/panels/viewer_editor_fork.html b/beat/web/plotters/templates/plotterparameters/panels/viewer_editor_fork.html index 57c69da838cfb4a391508eca35cc337778fe32a3..aeac615ffa3e3c01b3db3719b4f2cbdcb6098820 100644 --- a/beat/web/plotters/templates/plotterparameters/panels/viewer_editor_fork.html +++ b/beat/web/plotters/templates/plotterparameters/panels/viewer_editor_fork.html @@ -38,12 +38,27 @@ </h3> </div><div class="col-sm-4 vertical-center"> <div class="action-buttons pull-right"> - <button id="save" type="submit" class="btn btn-success btn-sm button_save" data-toggle="tooltip" data-placement="bottom" data-plotter="{{plotter}}" data-parameters="{{parameters}}" createplotterparameternewversion><i class="fa fa-save"></i> Save</button> + <button id="save" type="submit" class="btn btn-success btn-sm button_save" data-toggle="tooltip" data-placement="bottom" data-plotter="{{plotter}}" data-parameters="{{parameters}}" createplotterparameterfork><i class="fa fa-save"></i> Save</button> <a id="cancel" class="btn btn-danger btn-sm" onclick="window.history.back();"><i class="fa fa-times fa-lg"></i> Cancel</a> </div> </div> </div> +<div class="row"> + <div class="col-sm-12"> + <div class="panel-group" id="information-accordion" role="tablist" aria-multiselectable="true"> + <div id="settings_name-div" class="section"> + <div class="form-group has-feedback"> + <label class="control-label" for="settings_name">Name:</label> + <input class="form-control input-sm" id="settings_name" class="label" data-placeholder="Start typing a name..." autocomplete="off" autocorrect="off" autocapitalize="off" type="string" key="name" value="{{ plotterparameter.name }}" textinput></input> + <span class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span> + <span class="help">Enter a meaningful name to help you recognize this plotterparameter. Auto-completion will help you in keeping your naming conventions tide. If a chosen name is <span class="text-danger">highlighted in red</span>, it is because it is already being used. In this case, choose another name.</span> + </div> + </div> + </div>{# panel-group #} + </div>{# col-sm-12 #} +</div>{# row #} + <div class="row"> <div class="col-sm-12"> @@ -72,7 +87,7 @@ <div class="panel panel-default step1"> <div class="panel-heading" role="tab" id="info-heading"> <h4 class="panel-title"> - <a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-info" aria-expanded="true" aria-controls="collapse-info">Click the "Save" Button to create a new version of this plotterparameter</a> + <a role="button" data-toggle="collapse" data-parent="#info-heading" href="#collapse-info" aria-expanded="true" aria-controls="collapse-info">Click the "Save" Button to create a fork of this plotterparameter</a> </h4> </div>{# panel-heading #} <div id="collapse-info" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="info-heading"> diff --git a/beat/web/ui/static/ui/js/plotterparameterdialog.js b/beat/web/ui/static/ui/js/plotterparameterdialog.js index b0aad75877808951ec9d7ba276ec5cfe4b6b85b8..f7bbe9b017021ee7aacfdfa0a75979e8f2bc7480 100644 --- a/beat/web/ui/static/ui/js/plotterparameterdialog.js +++ b/beat/web/ui/static/ui/js/plotterparameterdialog.js @@ -110,13 +110,21 @@ beat.ui.plotterparameter.plotterparameter_created = function(dialog_id, scope) $('#' + dialog_id).dialog("close"); $(".explanation_text").show(); num_click = 0; - if(scope.plotterparameter_version == undefined) + if(scope.plotterparameter_forking == undefined) { - window.location = scope.url_prefix + "/" + "plotters/plotterparameter/" + scope.user + "/"+ scope.plotterparams_update.name + "/1"; + if(scope.plotterparameter_version == undefined) + { + window.location = scope.url_prefix + "/" + "plotters/plotterparameter/" + scope.user + "/"+ scope.plotterparams_update.name + "/1"; + } + else + { + window.location = scope.url_prefix + "/" + "plotters/plotterparameter/" + scope.plotterparameter_user + "/"+ scope.plotterparameter_name + "/" + scope.plotterparams_newversion.version; + } } else { - window.location = scope.url_prefix + "/" + "plotters/plotterparameter/" + scope.plotterparameter_user + "/"+ scope.plotterparameter_name + "/" + scope.plotterparams_newversion.version; + scope.plotterparameter_forking = undefined; + window.location = scope.url_prefix + "/" + "plotters/plotterparameter/" + scope.user + "/"+ scope.plotterparams_update.name + "/1"; } } }