From 76453f45a4749bd670ed77bd17e569866e633db7 Mon Sep 17 00:00:00 2001
From: Jaden Diefenbaugh <blakcap@users.noreply.github.com>
Date: Tue, 14 Feb 2017 22:08:12 +0100
Subject: [PATCH] plots finished

---
 beat/web/plotters/views.py                    | 10 ++-
 beat/web/reports/models.py                    | 28 +-----
 .../reports/app/directives/addReportItem.js   | 90 ++++++++++++-------
 .../reports/app/services/reportService.js     | 16 +++-
 4 files changed, 80 insertions(+), 64 deletions(-)

diff --git a/beat/web/plotters/views.py b/beat/web/plotters/views.py
index eab4599a7..578accb4f 100644
--- a/beat/web/plotters/views.py
+++ b/beat/web/plotters/views.py
@@ -206,9 +206,11 @@ def plot(request):
     # Collect the data for the plot, check compatibility
     default = None
     for k, v in experiments.items():
+        xp = v['obj']
+        xp_analyzer = list(xp.analyzers())[0]
+        (analyzer_author, analyzer_name, analyzer_version) = xp_analyzer.split('/')
+
         if v['analyzer'].find('/') >= 0:
-            (analyzer_author, analyzer_name, analyzer_version) = v['analyzer'].split('/')
-            xp = v['obj']
             block = get_object_or_404(Block,
                 experiment=v['obj'],
                 algorithm__author__username=analyzer_author,
@@ -217,8 +219,8 @@ def plot(request):
                 )
         else:
             block = get_object_or_404(Block,
-                experiment=v['obj'],
-                name=v['analyzer'],
+                experiment=xp,
+                name=analyzer_name,
                 )
 
         result = get_object_or_404(Result,
diff --git a/beat/web/reports/models.py b/beat/web/reports/models.py
index 4a2c87c78..cd2222490 100644
--- a/beat/web/reports/models.py
+++ b/beat/web/reports/models.py
@@ -214,7 +214,6 @@ class Report(models.Model):
             }
 
         # Process the list of experiments
-        common_analyzers       = None
         accessible_experiments = []
         inaccessible_experiments = []
 
@@ -229,36 +228,11 @@ class Report(models.Model):
 
             accessible_experiments.append(experiment)
 
-            if self.analyzer is None:
-                if common_analyzers is None:
-                    common_analyzers = map(lambda x: x.algorithm, experiment.blocks.filter(analyzer=True))
-                else:
-                    analyzers = map(lambda x: x.algorithm, experiment.blocks.filter(analyzer=True))
-                    common_analyzers = filter(lambda x: x in analyzers, common_analyzers)
-                    if len(common_analyzers) == 0:
-                        return {
-                            'success': False,
-                            'error': "No common analyzer",
-                        }
-
-
-        # Check that we have common analyzers (if necessary)
-        if (self.analyzer is None) and (common_analyzers is not None):
-            if len(common_analyzers) == 1:
-                self.analyzer = common_analyzers[0]
-                self.save()
-
-            elif len(common_analyzers) > 1:
-                return {
-                    'success': False,
-                    'common_analyzers': map(lambda x: x.fullname(), common_analyzers),
-                }
-
 
         # Add the experiments to the report
         incompatible_experiments = []
         for experiment in accessible_experiments:
-            if len(experiment.blocks.filter(analyzer=True, algorithm=self.analyzer)) >= 1:
+            if len(experiment.blocks.filter(analyzer=True)) >= 1:
                 self.experiments.add(experiment)
             else:
                 incompatible_experiments.append(experiment.fullname())
diff --git a/beat/web/reports/static/reports/app/directives/addReportItem.js b/beat/web/reports/static/reports/app/directives/addReportItem.js
index 3abdd6893..e4f0aac57 100644
--- a/beat/web/reports/static/reports/app/directives/addReportItem.js
+++ b/beat/web/reports/static/reports/app/directives/addReportItem.js
@@ -341,20 +341,42 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi
 
 					});
 
-					//Results block are the same for all experiments from same analyzer.
-					//So just grab information from one of them for smart_selector items
-					let single_experiment = scope.report.experiments[0];
-
-					//create smart_selector items
-					angular.forEach(scope.report_experiments[single_experiment].plottable_blocks, function(value_plottable, key_plottable){
-						let plot_type = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_plottable].type;
-						let item_dict = {};
-						item_dict["identifier"] = value_plottable;
-						item_dict["name"] = value_plottable;
-						item_dict["description"] = plot_type;
+					// get the possible plot data
+					let possiblePlots = ReportService
+					// only look at plots from exps in active group
+					.getGroupExperiments(ReportService.activeGroup)
+					// get the obj with the exp's possible plots
+					.map(expName => Object.entries(scope.report.all_experiments[expName].results.analysis)
+						.filter(([res_name, obj]) => res_name !== 'out_data')
+						.map(([res_name, obj]) => {
+							return {
+								identifier: res_name,
+								name: res_name,
+								description: obj.type
+							};
+						})
+					)
+					// flatten the array of arrays generated above
+					.reduce((a, as) => a.concat(as), [])
+					// only keep plots that are possible from all the entries
+					.reduce((aKeep, v, i, a) => {
+						console.log(v);
+						let plotTypeCount = a.filter(o => o.description === v.description).length;
+						// if every exp couldnt do this plot, dont keep it
+						if(plotTypeCount < ReportService.getGroupExperiments(ReportService.activeGroup).length){
+							console.log(`break less than`);
+							return aKeep;
+						}
+						// if this value is already kept, dont keep it
+						if(aKeep.find(o => o.description === v.description)){
+							console.log(`break already`);
+							console.log(aKeep);
+							return aKeep;
+						}
+						return aKeep.concat(v);
+					}, [])
 
-						next_content_items.push(item_dict);
-					});
+					next_content_items = possiblePlots;
 					break;
 			}
 
@@ -558,9 +580,18 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi
 			let legend_experiments = '';
 			let alias_experiments = [];
 
+			let reportItemGroupExps;
+			let existGroup = ReportService.getReportItemGroup(container.id);
+			if(existGroup){
+				reportItemGroupExps = existGroup.experiments;
+			} else {
+				ReportService.addReportItemToGroup(container.id, ReportService.activeGroup);
+				reportItemGroupExps = ReportService.getReportItemGroup(container.id).experiments;
+			}
+
 			for(let i = 0; i < scope.report.experiments.length; i++){
 				// if this exp isn't in the active group's exp list, dont look at it
-				if(!ReportService.getGroupExperiments(ReportService.activeGroup).includes(scope.report.experiments[i])){
+				if(!reportItemGroupExps.includes(scope.report.experiments[i])){
 					continue;
 				}
 
@@ -575,9 +606,20 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi
 					alias_experiments.push(scope.report_experiments_alias_from_content[scope.report.experiments[i]]);
 			}
 
+			let getAnalyzerFromExpName = (expName) => {
+				if(!scope.report.all_experiments){
+					return null;
+				}
+				let e = scope.report.all_experiments[expName];
+				if(!e){
+					return null;
+				}
+				return e.declaration.analyzers.analysis.algorithm;
+			};
+
 			let request_data = {
 				experiment:   alias_experiments,
-				analyzer:     [scope.report.analyzer],
+				analyzer:     [getAnalyzerFromExpName(reportItemGroupExps[0])],
 				output:       [chart_name],
 				plotter:      set_plotter,
 				legend:       legend_experiments,
@@ -589,19 +631,10 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi
 			base_url = scope.report.url_prefix;
 			//scope.plots_details[container.id];
 
-			let getAnalyzerFromExpName = (expName) => {
-				let e = scope.report.all_experiments[expName];
-				if(!e){
-					return null;
-				}
-				return e.declaration.analyzers.analysis.algorithm;
-			};
-
 			let analyzers = [scope.report.analyzer];
-			if(ReportService.activeGroup){
-				analyzers = ReportService.getGroupExperiments(ReportService.activeGroup)
-				.map(expName => getAnalyzerFromExpName(expName));
-			}
+			analyzers = reportItemGroupExps
+			.map(expName => getAnalyzerFromExpName(expName))
+			.filter(a => a);
 
 			let plot_detail = {};
 			plot_detail["required_plotter"] = required_plotter;
@@ -631,9 +664,6 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi
 			}
 
 			scope.plots_details[container.id]= plot_detail;
-			if(ReportService.activeGroup){
-				ReportService.addReportItemToGroup(container.id, ReportService.activeGroup);
-			}
 
 			if(scope.report.status == "editable" && scope.report.number != scope.report_number){
 				beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0],
diff --git a/beat/web/reports/static/reports/app/services/reportService.js b/beat/web/reports/static/reports/app/services/reportService.js
index 926381fbe..a1ea27a55 100644
--- a/beat/web/reports/static/reports/app/services/reportService.js
+++ b/beat/web/reports/static/reports/app/services/reportService.js
@@ -89,7 +89,13 @@ angular.module('reportApp').factory('ReportService', ['$http', function($http){
 	// }
 	reportServiceInstance.serializeGroups = () => {
 		return groupData
-		.map(g => { return { [g.name]: g.experiments }; })
+		.map(g => { return {
+			[g.name]: {
+				experiments: g.experiments,
+				reportItemIds: g.reportItemIds
+			}
+		};
+		})
 		.reduce((o, g) => Object.assign(o, g), {});
 	};
 
@@ -127,12 +133,16 @@ angular.module('reportApp').factory('ReportService', ['$http', function($http){
 	// 	...
 	// }
 	reportServiceInstance.loadGroups = (data) => {
+		if(!data){
+			return;
+		}
 		// wipe data and load groups
 		groupData.splice(0, groupData.length);
 		Object.entries(data)
-		.forEach(([groupName, expNames]) => {
+		.forEach(([groupName, groupData]) => {
 			let g = reportServiceInstance.createGroup(groupName);
-			expNames.forEach(n => g.addExperiment(n));
+			groupData.experiments.forEach(n => g.addExperiment(n));
+			groupData.reportItemIds.forEach(id => g.addReportItem(id));
 		});
 	};
 
-- 
GitLab