Project

General

Profile

IssueQuery and Custom Query Sort Order ยป mt_controller.rb

Albert Milani, 2018-11-17 03:06

 
1
class MtController < ApplicationController
2
  unloadable
3
 
4
  before_filter :find_project_by_project_id, :authorize, :get_trackers
5
  menu_item :traceability_matrix
6
  
7
  helper :issues
8
  helper :projects
9
  helper :queries
10
  include QueriesHelper
11
  helper :sort
12
  include SortHelper
13

    
14
  attr_accessor :issue_rows
15
  attr_accessor :issue_cols 
16
  attr_accessor :query_rows
17
  attr_accessor :query_cols
18
  attr_accessor :tracker_rows
19
  attr_accessor :tracker_cols
20
  attr_accessor :issue_pairs
21
  attr_accessor :not_seen_issue_cols
22

    
23

    
24
  def init_macro_context(project)
25
    @project = project
26
  end
27
  
28
  def build_list_of_issues 
29
    @issue_rows = @query_rows.issues().sort {|issue_a, issue_b| issue_a.id <=> issue_b.id}
30
    @issue_cols = @query_cols.issues().sort {|issue_a, issue_b| issue_a.id <=> issue_b.id}
31
    @issue_pairs = {}
32
    @not_seen_issue_cols = {}
33
    
34
    if @issue_rows.empty?
35
      return
36
    end
37
    
38
    if @issue_cols.empty?
39
      return
40
    end
41

    
42
    relations = IssueRelation.where("issue_from_id IN (:ids) OR issue_to_id IN (:ids)", :ids => @issue_rows.map(&:id)).all
43

    
44
    Issue.load_relations(@issue_cols)
45

    
46
    @not_seen_issue_cols = @issue_cols.dup
47
    relations.each do |relation|
48
      if @not_seen_issue_cols.include?relation.issue_to
49
        @issue_pairs[relation.issue_from] ||= {}
50
        @issue_pairs[relation.issue_from][relation.issue_to] ||= []
51
        @issue_pairs[relation.issue_from][relation.issue_to] << true
52
        @not_seen_issue_cols.delete relation.issue_to
53
      elsif @not_seen_issue_cols.include?relation.issue_from
54
        @issue_pairs[relation.issue_to] ||= {}
55
        @issue_pairs[relation.issue_to][relation.issue_from] ||= []
56
        @issue_pairs[relation.issue_to][relation.issue_from] << true
57
        @not_seen_issue_cols.delete relation.issue_from
58
      else
59
      end
60
    end
61

    
62
    relations = IssueRelation.where("issue_from_id IN (:ids) OR issue_to_id IN (:ids)", :ids => @issue_cols.map(&:id)).all
63

    
64
    issue_rows_copy = @issue_rows.dup
65
    relations.each do |relation|
66
      if issue_rows_copy.include?relation.issue_from
67
        @issue_pairs[relation.issue_from] ||= {}
68
        @issue_pairs[relation.issue_from][relation.issue_to] ||= []
69
        @issue_pairs[relation.issue_from][relation.issue_to] << true
70
        issue_rows_copy.delete relation.issue_to
71
      elsif issue_rows_copy.include?relation.issue_to
72
        @issue_pairs[relation.issue_to] ||= {}
73
        @issue_pairs[relation.issue_to][relation.issue_from] ||= []
74
        @issue_pairs[relation.issue_to][relation.issue_from] << true
75
        issue_rows_copy.delete relation.issue_from
76
      else
77
      end
78
    end
79

    
80
    return 
81
    
82
  end
83
  
84
  def get_trackers(query_rows_id=Setting.plugin_traceability_matrix['tracker0'],
85
                   query_cols_id=Setting.plugin_traceability_matrix['tracker1'])
86
    @tracker_rows = nil
87
    @query_rows = IssueQuery.find_by_id(query_rows_id)
88
    if @project.nil?
89
      @query_rows.project = Project.find_by_id(@query_rows.project_id)
90
    else
91
      @query_rows.project = @project
92
    end
93
    @query_rows.filters.each do |name, options|
94
      if (name == "tracker_id")
95
        tracker_id = options[:values].first
96
         @tracker_rows = Tracker.find_by_id(tracker_id)
97
      end
98
      
99
    end
100
    @tracker_cols = nil
101
    @query_cols = IssueQuery.find_by_id(query_cols_id)
102
    if @project.nil?
103
      @query_cols.project = Project.find_by_id(@query_cols.project_id)
104
    else
105
      @query_cols.project = @project
106
    end
107
    @query_cols.filters.each do |name, options|
108
      if (name == "tracker_id")
109
        tracker_id_ = options[:values].first
110
         @tracker_cols = Tracker.find_by_id(tracker_id_)
111
      end
112
    end   
113

    
114
  rescue ActiveRecord::RecordNotFound
115
    flash[:error] = l(:'traceability_matrix.setup')
116
    render
117
  end
118
end
119

    
120

    
    (1-1/1)