Patch #2540 » pt-br_2286.patch
app/helpers/issues_helper.rb (cópia de trabalho) | ||
---|---|---|
5 | 5 |
# modify it under the terms of the GNU General Public License |
6 | 6 |
# as published by the Free Software Foundation; either version 2 |
7 | 7 |
# of the License, or (at your option) any later version. |
8 |
#
|
|
8 |
# |
|
9 | 9 |
# This program is distributed in the hope that it will be useful, |
10 | 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | 12 |
# GNU General Public License for more details. |
13 |
#
|
|
13 |
# |
|
14 | 14 |
# You should have received a copy of the GNU General Public License |
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
... | ... | |
25 | 25 |
@cached_label_due_date ||= l(:field_due_date) |
26 | 26 |
@cached_label_assigned_to ||= l(:field_assigned_to) |
27 | 27 |
@cached_label_priority ||= l(:field_priority) |
28 |
|
|
28 | ||
29 | 29 |
link_to_issue(issue) + ": #{h(issue.subject)}<br /><br />" + |
30 | 30 |
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + |
31 | 31 |
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + |
32 | 32 |
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" + |
33 | 33 |
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}" |
34 | 34 |
end |
35 |
|
|
35 | ||
36 | 36 |
# Returns a string of css classes that apply to the given issue |
37 | 37 |
def css_issue_classes(issue) |
38 | 38 |
s = "issue status-#{issue.status.position} priority-#{issue.priority.position}" |
... | ... | |
40 | 40 |
s << ' overdue' if issue.overdue? |
41 | 41 |
s |
42 | 42 |
end |
43 |
|
|
43 | ||
44 | 44 |
def sidebar_queries |
45 | 45 |
unless @sidebar_queries |
46 | 46 |
# User can see public queries and his own queries |
47 | 47 |
visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)]) |
48 | 48 |
# Project specific queries and global queries |
49 | 49 |
visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id]) |
50 |
@sidebar_queries = Query.find(:all,
|
|
50 |
@sidebar_queries = Query.find(:all, |
|
51 | 51 |
:order => "name ASC", |
52 | 52 |
:conditions => visible.conditions) |
53 | 53 |
end |
... | ... | |
57 | 57 |
def show_detail(detail, no_html=false) |
58 | 58 |
case detail.property |
59 | 59 |
when 'attr' |
60 |
label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym)
|
|
60 |
label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym) |
|
61 | 61 |
case detail.prop_key |
62 | 62 |
when 'due_date', 'start_date' |
63 | 63 |
value = format_date(detail.value.to_date) if detail.value |
... | ... | |
102 | 102 |
label ||= detail.prop_key |
103 | 103 |
value ||= detail.value |
104 | 104 |
old_value ||= detail.old_value |
105 |
|
|
105 | ||
106 | 106 |
unless no_html |
107 | 107 |
label = content_tag('strong', label) |
108 | 108 |
old_value = content_tag("i", h(old_value)) if detail.old_value |
... | ... | |
114 | 114 |
value = content_tag("i", h(value)) if value |
115 | 115 |
end |
116 | 116 |
end |
117 |
|
|
117 | ||
118 | 118 |
if !detail.value.blank? |
119 | 119 |
case detail.property |
120 | 120 |
when 'attr', 'cf' |
... | ... | |
135 | 135 |
end |
136 | 136 |
end |
137 | 137 |
end |
138 |
|
|
138 | ||
139 | 139 |
def issues_to_csv(issues, project = nil) |
140 |
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
|
|
140 |
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') |
|
141 | 141 |
decimal_separator = l(:general_csv_decimal_separator) |
142 | 142 |
export = StringIO.new |
143 | 143 |
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv| |
144 | 144 |
# csv header fields |
145 | 145 |
headers = [ "#", |
146 |
l(:field_status),
|
|
146 |
l(:field_status), |
|
147 | 147 |
l(:field_project), |
148 | 148 |
l(:field_tracker), |
149 | 149 |
l(:field_priority), |
... | ... | |
169 | 169 |
# csv lines |
170 | 170 |
issues.each do |issue| |
171 | 171 |
fields = [issue.id, |
172 |
issue.status.name,
|
|
172 |
issue.status.name, |
|
173 | 173 |
issue.project.name, |
174 |
issue.tracker.name,
|
|
174 |
issue.tracker.name, |
|
175 | 175 |
issue.priority.name, |
176 | 176 |
issue.subject, |
177 | 177 |
issue.assigned_to, |
... | ... | |
182 | 182 |
format_date(issue.due_date), |
183 | 183 |
issue.done_ratio, |
184 | 184 |
issue.estimated_hours.to_s.gsub('.', decimal_separator), |
185 |
format_time(issue.created_on),
|
|
185 |
format_time(issue.created_on), |
|
186 | 186 |
format_time(issue.updated_on) |
187 | 187 |
] |
188 | 188 |
custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) } |
app/helpers/application_helper.rb (cópia de trabalho) | ||
---|---|---|
106 | 106 |
@time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format) |
107 | 107 |
include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format) |
108 | 108 |
end |
109 |
|
|
109 | ||
110 | 110 |
def format_activity_title(text) |
111 | 111 |
h(truncate_single_line(text, 100)) |
112 | 112 |
end |
113 |
|
|
113 | ||
114 | 114 |
def format_activity_day(date) |
115 | 115 |
date == Date.today ? l(:label_today).titleize : format_date(date) |
116 | 116 |
end |
117 |
|
|
117 | ||
118 | 118 |
def format_activity_description(text) |
119 | 119 |
h(truncate(text.to_s, 250).gsub(%r{<(pre|code)>.*$}m, '...')) |
120 | 120 |
end |
... | ... | |
147 | 147 |
end |
148 | 148 |
content |
149 | 149 |
end |
150 |
|
|
150 | ||
151 | 151 |
# Renders flash messages |
152 | 152 |
def render_flash_messages |
153 | 153 |
s = '' |
... | ... | |
168 | 168 | |
169 | 169 |
def authoring(created, author, options={}) |
170 | 170 |
time_tag = @project.nil? ? content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created)) : |
171 |
link_to(distance_of_time_in_words(Time.now, created),
|
|
171 |
link_to(distance_of_time_in_words(Time.now, created), |
|
172 | 172 |
{:controller => 'projects', :action => 'activity', :id => @project, :from => created.to_date}, |
173 | 173 |
:title => format_time(created)) |
174 | 174 |
author_tag = (author.is_a?(User) && !author.anonymous?) ? link_to(h(author), :controller => 'account', :action => 'show', :id => author) : h(author || 'Anonymous') |
app/controllers/projects_controller.rb (cópia de trabalho) | ||
---|---|---|
5 | 5 |
# modify it under the terms of the GNU General Public License |
6 | 6 |
# as published by the Free Software Foundation; either version 2 |
7 | 7 |
# of the License, or (at your option) any later version. |
8 |
#
|
|
8 |
# |
|
9 | 9 |
# This program is distributed in the hope that it will be useful, |
10 | 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | 12 |
# GNU General Public License for more details. |
13 |
#
|
|
13 |
# |
|
14 | 14 |
# You should have received a copy of the GNU General Public License |
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
... | ... | |
22 | 22 |
menu_item :files, :only => [:list_files, :add_file] |
23 | 23 |
menu_item :settings, :only => :settings |
24 | 24 |
menu_item :issues, :only => [:changelog] |
25 |
|
|
25 | ||
26 | 26 |
before_filter :find_project, :except => [ :index, :list, :add, :activity ] |
27 | 27 |
before_filter :find_optional_project, :only => :activity |
28 | 28 |
before_filter :authorize, :except => [ :index, :list, :add, :archive, :unarchive, :destroy, :activity ] |
29 | 29 |
before_filter :require_admin, :only => [ :add, :archive, :unarchive, :destroy ] |
30 | 30 |
accept_key_auth :activity |
31 |
|
|
31 | ||
32 | 32 |
helper :sort |
33 | 33 |
include SortHelper |
34 | 34 |
helper :custom_fields |
35 |
include CustomFieldsHelper
|
|
35 |
include CustomFieldsHelper |
|
36 | 36 |
helper :issues |
37 | 37 |
helper IssuesHelper |
38 | 38 |
helper :queries |
... | ... | |
40 | 40 |
helper :repositories |
41 | 41 |
include RepositoriesHelper |
42 | 42 |
include ProjectsHelper |
43 |
|
|
43 | ||
44 | 44 |
# Lists visible projects |
45 | 45 |
def index |
46 | 46 |
projects = Project.find :all, |
47 | 47 |
:conditions => Project.visible_by(User.current), |
48 | 48 |
:include => :parent |
49 | 49 |
respond_to do |format| |
50 |
format.html {
|
|
50 |
format.html { |
|
51 | 51 |
@project_tree = projects.group_by {|p| p.parent || p} |
52 |
@project_tree.keys.each {|p| @project_tree[p] -= [p]}
|
|
52 |
@project_tree.keys.each {|p| @project_tree[p] -= [p]} |
|
53 | 53 |
} |
54 | 54 |
format.atom { |
55 |
render_feed(projects.sort_by(&:created_on).reverse.slice(0, Setting.feeds_limit.to_i),
|
|
55 |
render_feed(projects.sort_by(&:created_on).reverse.slice(0, Setting.feeds_limit.to_i), |
|
56 | 56 |
:title => "#{Setting.app_title}: #{l(:label_project_latest)}") |
57 | 57 |
} |
58 | 58 |
end |
59 | 59 |
end |
60 |
|
|
60 | ||
61 | 61 |
# Add a new project |
62 | 62 |
def add |
63 | 63 |
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") |
... | ... | |
76 | 76 |
if @project.save |
77 | 77 |
flash[:notice] = l(:notice_successful_create) |
78 | 78 |
redirect_to :controller => 'admin', :action => 'projects' |
79 |
end
|
|
80 |
end
|
|
79 |
end |
|
80 |
end |
|
81 | 81 |
end |
82 |
|
|
82 | ||
83 | 83 |
# Show @project |
84 | 84 |
def show |
85 | 85 |
if params[:jump] |
86 | 86 |
# try to redirect to the requested menu item |
87 | 87 |
redirect_to_project_menu_item(@project, params[:jump]) && return |
88 | 88 |
end |
89 |
|
|
89 | ||
90 | 90 |
@members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role} |
91 | 91 |
@subprojects = @project.children.find(:all, :conditions => Project.visible_by(User.current)) |
92 | 92 |
@news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC") |
93 | 93 |
@trackers = @project.rolled_up_trackers |
94 |
|
|
94 | ||
95 | 95 |
cond = @project.project_condition(Setting.display_subprojects_issues?) |
96 | 96 |
Issue.visible_by(User.current) do |
97 | 97 |
@open_issues_by_tracker = Issue.count(:group => :tracker, |
... | ... | |
102 | 102 |
:conditions => cond) |
103 | 103 |
end |
104 | 104 |
TimeEntry.visible_by(User.current) do |
105 |
@total_hours = TimeEntry.sum(:hours,
|
|
105 |
@total_hours = TimeEntry.sum(:hours, |
|
106 | 106 |
:include => :project, |
107 | 107 |
:conditions => cond).to_f |
108 | 108 |
end |
... | ... | |
120 | 120 |
@repository ||= @project.repository |
121 | 121 |
@wiki ||= @project.wiki |
122 | 122 |
end |
123 |
|
|
123 | ||
124 | 124 |
# Edit @project |
125 | 125 |
def edit |
126 | 126 |
if request.post? |
... | ... | |
134 | 134 |
end |
135 | 135 |
end |
136 | 136 |
end |
137 |
|
|
137 | ||
138 | 138 |
def modules |
139 | 139 |
@project.enabled_module_names = params[:enabled_modules] |
140 | 140 |
redirect_to :action => 'settings', :id => @project, :tab => 'modules' |
... | ... | |
144 | 144 |
@project.archive if request.post? && @project.active? |
145 | 145 |
redirect_to :controller => 'admin', :action => 'projects' |
146 | 146 |
end |
147 |
|
|
147 | ||
148 | 148 |
def unarchive |
149 | 149 |
@project.unarchive if request.post? && !@project.active? |
150 | 150 |
redirect_to :controller => 'admin', :action => 'projects' |
151 | 151 |
end |
152 |
|
|
152 | ||
153 | 153 |
# Delete @project |
154 | 154 |
def destroy |
155 | 155 |
@project_to_destroy = @project |
... | ... | |
160 | 160 |
# hide project in layout |
161 | 161 |
@project = nil |
162 | 162 |
end |
163 |
|
|
163 | ||
164 | 164 |
# Add a new issue category to @project |
165 | 165 |
def add_issue_category |
166 | 166 |
@category = @project.issue_categories.build(params[:category]) |
... | ... | |
179 | 179 |
end |
180 | 180 |
end |
181 | 181 |
end |
182 |
|
|
182 | ||
183 | 183 |
# Add a new version to @project |
184 | 184 |
def add_version |
185 | 185 |
@version = @project.versions.build(params[:version]) |
... | ... | |
201 | 201 |
end |
202 | 202 |
@versions = @project.versions.sort |
203 | 203 |
end |
204 |
|
|
204 | ||
205 | 205 |
def list_files |
206 | 206 |
sort_init 'filename', 'asc' |
207 | 207 |
sort_update 'filename' => "#{Attachment.table_name}.filename", |
208 | 208 |
'created_on' => "#{Attachment.table_name}.created_on", |
209 | 209 |
'size' => "#{Attachment.table_name}.filesize", |
210 | 210 |
'downloads' => "#{Attachment.table_name}.downloads" |
211 |
|
|
211 | ||
212 | 212 |
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)] |
213 | 213 |
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse |
214 | 214 |
render :layout => !request.xhr? |
215 | 215 |
end |
216 |
|
|
216 | ||
217 | 217 |
# Show changelog for @project |
218 | 218 |
def changelog |
219 | 219 |
@trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position') |
220 |
retrieve_selected_tracker_ids(@trackers)
|
|
220 |
retrieve_selected_tracker_ids(@trackers) |
|
221 | 221 |
@versions = @project.versions.sort |
222 | 222 |
end |
223 | 223 | |
... | ... | |
227 | 227 |
@versions = @project.versions.sort |
228 | 228 |
@versions = @versions.select {|v| !v.completed? } unless params[:completed] |
229 | 229 |
end |
230 |
|
|
230 | ||
231 | 231 |
def activity |
232 | 232 |
@days = Setting.activity_days_default.to_i |
233 |
|
|
233 | ||
234 | 234 |
if params[:from] |
235 | 235 |
begin; @date_to = params[:from].to_date + 1; rescue; end |
236 | 236 |
end |
... | ... | |
239 | 239 |
@date_from = @date_to - @days |
240 | 240 |
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') |
241 | 241 |
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id])) |
242 |
|
|
243 |
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
|
|
242 | ||
243 |
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project, |
|
244 | 244 |
:with_subprojects => @with_subprojects, |
245 | 245 |
:author => @author) |
246 | 246 |
@activity.scope_select {|t| !params["show_#{t}"].nil?} |
247 | 247 |
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty? |
248 | 248 | |
249 | 249 |
events = @activity.events(@date_from, @date_to) |
250 |
|
|
250 | ||
251 | 251 |
respond_to do |format| |
252 |
format.html {
|
|
252 |
format.html { |
|
253 | 253 |
@events_by_day = events.group_by(&:event_date) |
254 | 254 |
render :layout => false if request.xhr? |
255 | 255 |
} |
... | ... | |
263 | 263 |
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}") |
264 | 264 |
} |
265 | 265 |
end |
266 |
|
|
266 | ||
267 | 267 |
rescue ActiveRecord::RecordNotFound |
268 | 268 |
render_404 |
269 | 269 |
end |
270 |
|
|
270 | ||
271 | 271 |
private |
272 | 272 |
# Find project of id params[:id] |
273 | 273 |
# if not found, redirect to project list |
... | ... | |
277 | 277 |
rescue ActiveRecord::RecordNotFound |
278 | 278 |
render_404 |
279 | 279 |
end |
280 |
|
|
280 | ||
281 | 281 |
def find_optional_project |
282 | 282 |
return true unless params[:id] |
283 | 283 |
@project = Project.find(params[:id]) |
app/controllers/issue_categories_controller.rb (cópia de trabalho) | ||
---|---|---|
5 | 5 |
# modify it under the terms of the GNU General Public License |
6 | 6 |
# as published by the Free Software Foundation; either version 2 |
7 | 7 |
# of the License, or (at your option) any later version. |
8 |
#
|
|
8 |
# |
|
9 | 9 |
# This program is distributed in the hope that it will be useful, |
10 | 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | 12 |
# GNU General Public License for more details. |
13 |
#
|
|
13 |
# |
|
14 | 14 |
# You should have received a copy of the GNU General Public License |
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
... | ... | |
18 | 18 |
class IssueCategoriesController < ApplicationController |
19 | 19 |
menu_item :settings |
20 | 20 |
before_filter :find_project, :authorize |
21 |
|
|
21 | ||
22 | 22 |
verify :method => :post, :only => :destroy |
23 | 23 | |
24 | 24 |
def edit |
... | ... | |
48 | 48 |
@project = @category.project |
49 | 49 |
rescue ActiveRecord::RecordNotFound |
50 | 50 |
render_404 |
51 |
end
|
|
51 |
end |
|
52 | 52 |
end |
lang/pt-br.yml (cópia de trabalho) | ||
---|---|---|
699 | 699 |
setting_diff_max_lines_displayed: Número máximo de linhas exibidas no diff |
700 | 700 |
text_plugin_assets_writable: Diretório de plugins gravável |
701 | 701 |
warning_attachments_not_saved: "%d arquivo(s) não puderam ser salvo(s)." |
702 |
button_create_and_continue: Create and continue |
|
703 |
text_custom_field_possible_values_info: 'One line for each value' |
|
704 |
label_display: Display |
|
705 |
field_editable: Editable |
|
702 |
button_create_and_continue: Criar e continuar |
|
703 |
text_custom_field_possible_values_info: 'Uma linha para cada valor' |
|
704 |
label_display: Exibição |
|
705 |
field_editable: Editável |