1
1
class SmashTagsController < ApplicationController
2
2
3
- before_action :find_project_by_project_id
4
- before_action :authorize
3
+ before_action :find_optional_project_and_authorize
5
4
6
- accept_api_auth :index
5
+ accept_api_auth :project_tags , :global_tags
7
6
8
- def index
7
+ def project_tags
8
+ smash_tags = build_tags
9
+ respond_to do |format |
10
+ format . api { render json : smash_tags }
11
+ end
12
+ end
13
+
14
+ def global_tags
15
+ smash_tags = build_tags
16
+ respond_to do |format |
17
+ format . api { render json : smash_tags }
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def find_optional_project_and_authorize
24
+ if params [ :project_id ]
25
+ @project = Project . find params [ :project_id ]
26
+ authorize
27
+ else
28
+ authorize_global
29
+ end
30
+ end
31
+
32
+ def enabled_project_ids
33
+ EnabledModule . where ( name : [ 'issue_tracking' , 'gtt' , 'gtt_smash' ] ) .
34
+ group ( :project_id ) .
35
+ count ( 'project_id' ) .
36
+ keep_if { |k , v | v == 3 } . keys
37
+ end
38
+
39
+ def valid_project_ids
40
+ project_ids = [ ]
41
+ Project . where ( status : "#{ Project ::STATUS_ACTIVE } " ) .
42
+ where ( id : enabled_project_ids ( ) ) .
43
+ where ( id : User . current . visible_project_ids ) . sort . each { |project |
44
+ if User . current . allowed_to? ( :add_issues , project ) and
45
+ User . current . allowed_to? ( :view_gtt_smash , project )
46
+ project_ids . append ( project . id )
47
+ end
48
+ }
49
+ return project_ids
50
+ end
51
+
52
+ def valid_tracker_project_ids
53
+ tracker_project_ids = { }
54
+ valid_project_ids = valid_project_ids ( )
55
+ project_ids = [ ]
56
+ if @project . present? and valid_project_ids . include? ( @project . id )
57
+ project_ids . append ( @project . id )
58
+ else
59
+ project_ids . concat ( valid_project_ids )
60
+ end
61
+ Project . where ( id : project_ids ) . each { |project |
62
+ project . trackers . each { |tracker |
63
+ if tracker_project_ids . has_key? ( tracker . id )
64
+ tracker_project_ids [ tracker . id ] . append ( project . id )
65
+ else
66
+ tracker_project_ids [ tracker . id ] = [ project . id ]
67
+ end
68
+ }
69
+ }
70
+ return tracker_project_ids
71
+ end
72
+
73
+ # SMASH (Geopaparazzi) form spec: https://www.geopaparazzi.org/geopaparazzi/index.html#_using_form_based_notes
74
+ def build_tags
9
75
smash_tags = [ ]
10
76
# Issue priorities
11
77
priorities = [ ]
12
78
default_priority = nil
13
- # SMASH (Geopaparazzi) form spec: https://www.geopaparazzi.org/geopaparazzi/index.html#_using_form_based_notes
14
79
IssuePriority . active . each do |priority |
15
80
priorities . append ( {
16
81
item : priority . name
@@ -21,24 +86,39 @@ def index
21
86
end
22
87
# Issue categories
23
88
categories = [ ]
24
- @project . issue_categories . each do |category |
25
- categories . append ( {
26
- item : category . name
27
- } )
89
+ if @project . present?
90
+ @project . issue_categories . each do |category |
91
+ categories . append ( {
92
+ item : category . name
93
+ } )
94
+ end
28
95
end
29
96
# Versions
30
97
versions = [ ]
31
98
default_version = nil
32
- @project . versions . each do |version |
33
- versions . append ( {
34
- item : version . name
35
- } )
36
- end
37
- if @project . default_version . present?
38
- default_version = @project . default_version . name
99
+ if @project . present?
100
+ @project . versions . each do |version |
101
+ versions . append ( {
102
+ item : version . name
103
+ } )
104
+ end
105
+ if @project . default_version . present?
106
+ default_version = @project . default_version . name
107
+ end
39
108
end
40
109
# Trackers
41
- @project . trackers . sort . each do |tracker |
110
+ tracker_project_ids = valid_tracker_project_ids ( )
111
+ Tracker . where ( id : tracker_project_ids . keys ) . sort . each do |tracker |
112
+ # Projects
113
+ project_ids = tracker_project_ids [ tracker . id ]
114
+ projects = [ ]
115
+ if @project . blank? and project_ids . present?
116
+ Project . where ( id : project_ids ) . sort . each { |project |
117
+ projects . append ( {
118
+ item : project . name
119
+ } )
120
+ }
121
+ end
42
122
section = {
43
123
sectionname : tracker . name ,
44
124
sectiondescription : tracker . description ,
@@ -49,8 +129,10 @@ def index
49
129
# Core fields (undisablable)
50
130
{
51
131
key : "project_id" ,
52
- value : @project . id . to_s ,
53
- type : "hidden" ,
132
+ label : l ( :field_project ) ,
133
+ value : @project . present? ? @project . id . to_s : "" ,
134
+ values : @project . present? ? nil : { items : projects } ,
135
+ type : @project . present? ? "hidden" : "stringcombo" ,
54
136
mandatory : "yes"
55
137
} ,
56
138
{
@@ -90,7 +172,7 @@ def index
90
172
if tracker . core_fields . present?
91
173
# assigned_to_id (don't support)
92
174
# category_id
93
- if tracker . core_fields . include? ( "category_id" )
175
+ if tracker . core_fields . include? ( "category_id" ) and categories . present?
94
176
formitems . append ( {
95
177
key : "category_id" ,
96
178
label : l ( :field_category ) ,
@@ -103,7 +185,7 @@ def index
103
185
} )
104
186
end
105
187
# fixed_version_id
106
- if tracker . core_fields . include? ( "fixed_version_id" )
188
+ if tracker . core_fields . include? ( "fixed_version_id" ) and versions . present?
107
189
formitems . append ( {
108
190
key : "fixed_version_id" ,
109
191
label : l ( :field_version ) ,
@@ -235,8 +317,6 @@ def index
235
317
end
236
318
smash_tags . append ( section )
237
319
end
238
- respond_to do |format |
239
- format . api { render json : smash_tags }
240
- end
320
+ return smash_tags
241
321
end
242
322
end
0 commit comments