Project

General

Profile

Proposal #610 » wiki_extensions_ref_issue.rb

wiki_extensions_ref_issue.rb - Tomohisa Kusukawa, 10/20/2010 10:47 PM

 
1
require 'redmine'
2

    
3
module WikiExtensionsRefIssue
4
  Redmine::WikiFormatting::Macros.register do
5
    desc "Displays a list of referer issues."
6
    macro :ref_issue do |obj, args|
7
      # Wikiページ名および別名をtitlesに取得
8
      titles = [ obj.page.title ]; #本名
9
      redirects = WikiRedirect.find(:all, :conditions=>["redirects_to=:s", {:s=>obj.page.title}]); #別名query
10
      redirects.each do |redirect|
11
        titles.push(redirect.title); #別名
12
      end
13
      
14
      # 本Wikiページへの参照を持つIssueをdispIssuesに取得
15
      dispIssues = {};
16
      titles.each do |title|
17
        # ページ名を説明に含むIssueを抽出
18
        issues = Issue.find(:all, :conditions=>["description~*:s", {:s=>title}]);
19
        issues.each do |issue|
20
          # Issueの説明に含まれるWikiへの参照[[*]]を抽出
21
          refs = issue.description.scan(/\[\[(.*)\]\]/);
22
          refs.each do |ref|
23
            # 各Wiki参照が当該Wikiページであることを判定
24
            ref = ref.shift;
25
            if ref=~/^(.*)\|(.*)$/ then
26
              # リンク表示文字列指定の場合は文字列指定を削除
27
              ref=$1;
28
            end
29
            if ref=~/^(.*)\:(.*)$/ then
30
              # プロジェクト指定の場合
31
              refPrj=$1;
32
              refTitle=$2;
33
            else
34
              # プロジェクト指定が無い場合
35
              refPrj=issue.project.identifier;
36
              refTitle=ref;
37
            end
38
            if refPrj==obj.project.identifier || refPrj==obj.project.name then
39
              # プロジェクトが一致
40
              if refTitle.downcase==title.downcase then
41
                # 且つ Wikiタイトルが一致ならば
42
                dispIssues[issue.id] = issue; # そのIssueを表示する
43
              end
44
            end
45
          end
46
        end
47
      end
48
      
49
      # チケットリスト表示HTMLの作成
50
      disp = '<table>';
51
      # ヘッダ行
52
      disp << '<tr><th>No.</th>';
53
      args.each do |colum|
54
        # パラメータから表示列を取得
55
        disp << "<th>#{colum}</th>";
56
      end
57
      disp << '</tr>';
58
      
59
      # Issueの内容を表示
60
      dispIssues.sort.each do |key, issue|
61
        disp << '<tr>';
62
        # Issue番号
63
        disp << '<td>';
64
        disp << link_to("##{issue.id}",
65
                        {:controller => "issues", :action => "show", :id => issue}, 
66
                        :class => issue.css_classes);
67
        disp << '</td>';
68
        # パラメータに応じて列表示を構成
69
        args.each do |colum|
70
          case colum
71
          when 'project'
72
            disp << '<td>' << issue.project.name << '</td>';
73
          when 'tracker'
74
            disp << '<td>' << issue.tracker.name << '</td>';
75
          when 'subject'
76
            disp << '<td>';
77
            disp << link_to("#{issue.subject}",
78
                            {:controller => "issues", :action => "show", :id => issue}, 
79
                            :class => issue.css_classes) << '</td>';
80
            disp << '</td>';
81
          when 'status'
82
            disp << '<td>' << issue.status.name << '</td>';
83
          when 'author'
84
            disp << '<td>';
85
            disp << link_to_user(issue.author) if issue.author;
86
            disp << '</td>';
87
          when 'assigned_to'
88
            disp << '<td>';
89
            disp << link_to_user(issue.assigned_to) if issue.assigned_to;
90
            disp << '</td>';
91
          when 'created_on'
92
            disp << '<td>' << format_date(issue.created_on).to_s << '</td>';
93
          when 'updated_on'
94
            disp << '<td>' << format_date(issue.updated_on).to_s << '</td>';
95
          end
96
        end
97
        disp << "</tr>";
98
      end
99
      disp << '</table>';
100
      return disp;
101
    end
102
  end
103
end
    (1-1/1)