Compare commits
92
Commits
master
...
1.3-stable
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f2ebc202d | ||
|
|
d85f8425d9 | ||
|
|
4215198570 | ||
|
|
ed0d0533e7 | ||
|
|
22d639402c | ||
|
|
cda408dd81 | ||
|
|
bec5e4443d | ||
|
|
cb37643ea9 | ||
|
|
3e24f6f110 | ||
|
|
2e6347a2f1 | ||
|
|
8a2a17b8eb | ||
|
|
b24ad1f0bc | ||
|
|
898e10491f | ||
|
|
4a9013917d | ||
|
|
4e64c01a32 | ||
|
|
177ff05b97 | ||
|
|
e41afb4fe9 | ||
|
|
5475e0dcc5 | ||
|
|
985c885f98 | ||
|
|
210419047c | ||
|
|
add23a54b5 | ||
|
|
8f66932a46 | ||
|
|
bddc546bf0 | ||
|
|
5141f1e474 | ||
|
|
94a0d1abf0 | ||
|
|
ee6450f812 | ||
|
|
4b141793ab | ||
|
|
fc584eb3ad | ||
|
|
6f30f85f96 | ||
|
|
8c6f674973 | ||
|
|
0b0f819cfa | ||
|
|
41dba6864a | ||
|
|
4cf38052c2 | ||
|
|
f587807f6b | ||
|
|
f74e4eddba | ||
|
|
39af3f1b79 | ||
|
|
92dde0d75f | ||
|
|
488926276d | ||
|
|
90c6a8579b | ||
|
|
4930b3e8bf | ||
|
|
09ea1fd58d | ||
|
|
8eb4bc9c29 | ||
|
|
ffc6c99ae8 | ||
|
|
294accf197 | ||
|
|
8270de39f0 | ||
|
|
26db0de8cc | ||
|
|
f8875ee513 | ||
|
|
cbd90fdeaf | ||
|
|
d5573e67e9 | ||
|
|
5b0178299b | ||
|
|
e0b4f151a2 | ||
|
|
5581bfa539 | ||
|
|
84c61545a9 | ||
|
|
eb2638a25f | ||
|
|
6d66abe3ac | ||
|
|
6c6519e595 | ||
|
|
55d5e79e5f | ||
|
|
1dcdba7cdc | ||
|
|
3a474ead99 | ||
|
|
9318cd2fbe | ||
|
|
ce67da88c4 | ||
|
|
f5cb899efe | ||
|
|
0efc84dad7 | ||
|
|
e41bec7999 | ||
|
|
2eef4795c0 | ||
|
|
53cc9148d4 | ||
|
|
d8d1895315 | ||
|
|
77b58fc351 | ||
|
|
5e8ee66d69 | ||
|
|
f1c23ac295 | ||
|
|
695596aa8a | ||
|
|
0de2718d97 | ||
|
|
e56dd42e64 | ||
|
|
a0c34ab916 | ||
|
|
c8a6b01e9f | ||
|
|
ff02412e75 | ||
|
|
166c3c15dd | ||
|
|
65a7c7e96c | ||
|
|
9a8cf5fa60 | ||
|
|
bf0008cd4e | ||
|
|
b849b9a47e | ||
|
|
011d9587a5 | ||
|
|
b7d813047b | ||
|
|
08784f551e | ||
|
|
faad143c03 | ||
|
|
08b6d7b654 | ||
|
|
18a30fd942 | ||
|
|
2813b93370 | ||
|
|
930cf0b487 | ||
|
|
27ac3193e3 | ||
|
|
80f5d3d041 | ||
|
|
a3f8fbaee6 |
@@ -73,9 +73,7 @@ class AdminController < ApplicationController
|
|||||||
def info
|
def info
|
||||||
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
|
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
|
||||||
@checklist = [
|
@checklist = [
|
||||||
[:text_default_administrator_account_changed,
|
[:text_default_administrator_account_changed, User.default_admin_account_changed?],
|
||||||
User.find(:first,
|
|
||||||
:conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?],
|
|
||||||
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
|
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
|
||||||
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
|
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
|
||||||
[:text_rmagick_available, Object.const_defined?(:Magick)]
|
[:text_rmagick_available, Object.const_defined?(:Magick)]
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ class AttachmentsController < ApplicationController
|
|||||||
@diff = File.new(@attachment.diskfile, "rb").read
|
@diff = File.new(@attachment.diskfile, "rb").read
|
||||||
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
|
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
|
||||||
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
|
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
|
||||||
|
# Save diff type as user preference
|
||||||
|
if User.current.logged? && @diff_type != User.current.pref[:diff_type]
|
||||||
|
User.current.pref[:diff_type] = @diff_type
|
||||||
|
User.current.preference.save
|
||||||
|
end
|
||||||
render :action => 'diff'
|
render :action => 'diff'
|
||||||
elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte
|
elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte
|
||||||
@content = File.new(@attachment.diskfile, "rb").read
|
@content = File.new(@attachment.diskfile, "rb").read
|
||||||
|
|||||||
@@ -65,7 +65,8 @@ class BoardsController < ApplicationController
|
|||||||
verify :method => :post, :only => [ :destroy ], :redirect_to => { :action => :index }
|
verify :method => :post, :only => [ :destroy ], :redirect_to => { :action => :index }
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@board = Board.new(params[:board])
|
@board = Board.new
|
||||||
|
@board.safe_attributes = params[:board]
|
||||||
@board.project = @project
|
@board.project = @project
|
||||||
if request.post? && @board.save
|
if request.post? && @board.save
|
||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
@@ -74,7 +75,8 @@ class BoardsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
if request.post? && @board.update_attributes(params[:board])
|
@board.safe_attributes = params[:board]
|
||||||
|
if request.post? && @board.save
|
||||||
redirect_to_settings_in_projects
|
redirect_to_settings_in_projects
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ class CommentsController < ApplicationController
|
|||||||
|
|
||||||
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
def create
|
def create
|
||||||
@comment = Comment.new(params[:comment])
|
@comment = Comment.new
|
||||||
|
@comment.safe_attributes = params[:comment]
|
||||||
@comment.author = User.current
|
@comment.author = User.current
|
||||||
if @news.comments << @comment
|
if @news.comments << @comment
|
||||||
flash[:notice] = l(:label_comment_added)
|
flash[:notice] = l(:label_comment_added)
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ class DocumentsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@document = @project.documents.build(params[:document])
|
@document = @project.documents.build
|
||||||
|
@document.safe_attributes = params[:document]
|
||||||
if request.post? and @document.save
|
if request.post? and @document.save
|
||||||
attachments = Attachment.attach_files(@document, params[:attachments])
|
attachments = Attachment.attach_files(@document, params[:attachments])
|
||||||
render_attachment_warning_if_needed(@document)
|
render_attachment_warning_if_needed(@document)
|
||||||
@@ -58,7 +59,8 @@ class DocumentsController < ApplicationController
|
|||||||
|
|
||||||
def edit
|
def edit
|
||||||
@categories = DocumentCategory.active #TODO: use it in the views
|
@categories = DocumentCategory.active #TODO: use it in the views
|
||||||
if request.post? and @document.update_attributes(params[:document])
|
@document.safe_attributes = params[:document]
|
||||||
|
if request.post? and @document.save
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
redirect_to :action => 'show', :id => @document
|
redirect_to :action => 'show', :id => @document
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -39,12 +39,14 @@ class IssueCategoriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@category = @project.issue_categories.build(params[:issue_category])
|
@category = @project.issue_categories.build
|
||||||
|
@category.safe_attributes = params[:issue_category]
|
||||||
end
|
end
|
||||||
|
|
||||||
verify :method => :post, :only => :create
|
verify :method => :post, :only => :create
|
||||||
def create
|
def create
|
||||||
@category = @project.issue_categories.build(params[:issue_category])
|
@category = @project.issue_categories.build
|
||||||
|
@category.safe_attributes = params[:issue_category]
|
||||||
if @category.save
|
if @category.save
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html do
|
format.html do
|
||||||
@@ -75,7 +77,8 @@ class IssueCategoriesController < ApplicationController
|
|||||||
|
|
||||||
verify :method => :put, :only => :update
|
verify :method => :put, :only => :update
|
||||||
def update
|
def update
|
||||||
if @category.update_attributes(params[:issue_category])
|
@category.safe_attributes = params[:issue_category]
|
||||||
|
if @category.save
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {
|
format.html {
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ class MembersController < ApplicationController
|
|||||||
attrs = params[:member].dup
|
attrs = params[:member].dup
|
||||||
if (user_ids = attrs.delete(:user_ids))
|
if (user_ids = attrs.delete(:user_ids))
|
||||||
user_ids.each do |user_id|
|
user_ids.each do |user_id|
|
||||||
members << Member.new(attrs.merge(:user_id => user_id))
|
members << Member.new(:role_ids => params[:member][:role_ids], :user_id => user_id)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
members << Member.new(attrs)
|
members << Member.new(:role_ids => params[:member][:role_ids], :user_id => params[:member][:user_id])
|
||||||
end
|
end
|
||||||
@project.members << members
|
@project.members << members
|
||||||
end
|
end
|
||||||
@@ -64,7 +64,10 @@ class MembersController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
if request.post? and @member.update_attributes(params[:member])
|
if params[:member]
|
||||||
|
@member.role_ids = params[:member][:role_ids]
|
||||||
|
end
|
||||||
|
if request.post? and @member.save
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
|
||||||
format.js {
|
format.js {
|
||||||
@@ -93,7 +96,7 @@ class MembersController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def autocomplete_for_member
|
def autocomplete_for_member
|
||||||
@principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals
|
@principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100)
|
||||||
render :layout => false
|
render :layout => false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -53,13 +53,10 @@ class MessagesController < ApplicationController
|
|||||||
|
|
||||||
# Create a new topic
|
# Create a new topic
|
||||||
def new
|
def new
|
||||||
@message = Message.new(params[:message])
|
@message = Message.new
|
||||||
@message.author = User.current
|
@message.author = User.current
|
||||||
@message.board = @board
|
@message.board = @board
|
||||||
if params[:message] && User.current.allowed_to?(:edit_messages, @project)
|
@message.safe_attributes = params[:message]
|
||||||
@message.locked = params[:message]['locked']
|
|
||||||
@message.sticky = params[:message]['sticky']
|
|
||||||
end
|
|
||||||
if request.post? && @message.save
|
if request.post? && @message.save
|
||||||
call_hook(:controller_messages_new_after_save, { :params => params, :message => @message})
|
call_hook(:controller_messages_new_after_save, { :params => params, :message => @message})
|
||||||
attachments = Attachment.attach_files(@message, params[:attachments])
|
attachments = Attachment.attach_files(@message, params[:attachments])
|
||||||
@@ -70,9 +67,10 @@ class MessagesController < ApplicationController
|
|||||||
|
|
||||||
# Reply to a topic
|
# Reply to a topic
|
||||||
def reply
|
def reply
|
||||||
@reply = Message.new(params[:reply])
|
@reply = Message.new
|
||||||
@reply.author = User.current
|
@reply.author = User.current
|
||||||
@reply.board = @board
|
@reply.board = @board
|
||||||
|
@reply.safe_attributes = params[:reply]
|
||||||
@topic.children << @reply
|
@topic.children << @reply
|
||||||
if !@reply.new_record?
|
if !@reply.new_record?
|
||||||
call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply})
|
call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply})
|
||||||
@@ -85,11 +83,8 @@ class MessagesController < ApplicationController
|
|||||||
# Edit a message
|
# Edit a message
|
||||||
def edit
|
def edit
|
||||||
(render_403; return false) unless @message.editable_by?(User.current)
|
(render_403; return false) unless @message.editable_by?(User.current)
|
||||||
if params[:message]
|
@message.safe_attributes = params[:message]
|
||||||
@message.locked = params[:message]['locked']
|
if request.post? && @message.save
|
||||||
@message.sticky = params[:message]['sticky']
|
|
||||||
end
|
|
||||||
if request.post? && @message.update_attributes(params[:message])
|
|
||||||
attachments = Attachment.attach_files(@message, params[:attachments])
|
attachments = Attachment.attach_files(@message, params[:attachments])
|
||||||
render_attachment_warning_if_needed(@message)
|
render_attachment_warning_if_needed(@message)
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ class NewsController < ApplicationController
|
|||||||
|
|
||||||
def create
|
def create
|
||||||
@news = News.new(:project => @project, :author => User.current)
|
@news = News.new(:project => @project, :author => User.current)
|
||||||
|
@news.safe_attributes = params[:news]
|
||||||
if request.post?
|
if request.post?
|
||||||
@news.attributes = params[:news]
|
|
||||||
if @news.save
|
if @news.save
|
||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
redirect_to :controller => 'news', :action => 'index', :project_id => @project
|
redirect_to :controller => 'news', :action => 'index', :project_id => @project
|
||||||
@@ -82,7 +82,8 @@ class NewsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
if request.put? and @news.update_attributes(params[:news])
|
@news.safe_attributes = params[:news]
|
||||||
|
if request.put? and @news.save
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
redirect_to :action => 'show', :id => @news
|
redirect_to :action => 'show', :id => @news
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ class ProjectsController < ApplicationController
|
|||||||
def new
|
def new
|
||||||
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
|
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
|
||||||
@trackers = Tracker.all
|
@trackers = Tracker.all
|
||||||
@project = Project.new(params[:project])
|
@project = Project.new
|
||||||
|
@project.safe_attributes = params[:project]
|
||||||
end
|
end
|
||||||
|
|
||||||
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ class TimelogController < ApplicationController
|
|||||||
|
|
||||||
def new
|
def new
|
||||||
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
|
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
|
||||||
@time_entry.attributes = params[:time_entry]
|
@time_entry.safe_attributes = params[:time_entry]
|
||||||
|
|
||||||
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
||||||
render :action => 'edit'
|
render :action => 'edit'
|
||||||
@@ -114,7 +114,7 @@ class TimelogController < ApplicationController
|
|||||||
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
def create
|
def create
|
||||||
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
|
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
|
||||||
@time_entry.attributes = params[:time_entry]
|
@time_entry.safe_attributes = params[:time_entry]
|
||||||
|
|
||||||
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
||||||
|
|
||||||
@@ -135,14 +135,14 @@ class TimelogController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
@time_entry.attributes = params[:time_entry]
|
@time_entry.safe_attributes = params[:time_entry]
|
||||||
|
|
||||||
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
||||||
end
|
end
|
||||||
|
|
||||||
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
def update
|
def update
|
||||||
@time_entry.attributes = params[:time_entry]
|
@time_entry.safe_attributes = params[:time_entry]
|
||||||
|
|
||||||
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ class TimelogController < ApplicationController
|
|||||||
unsaved_time_entry_ids = []
|
unsaved_time_entry_ids = []
|
||||||
@time_entries.each do |time_entry|
|
@time_entries.each do |time_entry|
|
||||||
time_entry.reload
|
time_entry.reload
|
||||||
time_entry.attributes = attributes
|
time_entry.safe_attributes = attributes
|
||||||
call_hook(:controller_time_entries_bulk_edit_before_save, { :params => params, :time_entry => time_entry })
|
call_hook(:controller_time_entries_bulk_edit_before_save, { :params => params, :time_entry => time_entry })
|
||||||
unless time_entry.save
|
unless time_entry.save
|
||||||
# Keep unsaved time_entry ids to display them in flash error
|
# Keep unsaved time_entry ids to display them in flash error
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class VersionsController < ApplicationController
|
|||||||
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
|
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
|
||||||
before_filter :authorize
|
before_filter :authorize
|
||||||
|
|
||||||
accept_api_auth :index, :create, :update, :destroy
|
accept_api_auth :index, :show, :create, :update, :destroy
|
||||||
|
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
helper :projects
|
helper :projects
|
||||||
@@ -75,7 +75,7 @@ class VersionsController < ApplicationController
|
|||||||
if params[:version]
|
if params[:version]
|
||||||
attributes = params[:version].dup
|
attributes = params[:version].dup
|
||||||
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
@version.attributes = attributes
|
@version.safe_attributes = attributes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ class VersionsController < ApplicationController
|
|||||||
if params[:version]
|
if params[:version]
|
||||||
attributes = params[:version].dup
|
attributes = params[:version].dup
|
||||||
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
@version.attributes = attributes
|
@version.safe_attributes = attributes
|
||||||
end
|
end
|
||||||
|
|
||||||
if request.post?
|
if request.post?
|
||||||
@@ -124,7 +124,8 @@ class VersionsController < ApplicationController
|
|||||||
if request.put? && params[:version]
|
if request.put? && params[:version]
|
||||||
attributes = params[:version].dup
|
attributes = params[:version].dup
|
||||||
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
|
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
if @version.update_attributes(attributes)
|
@version.safe_attributes = attributes
|
||||||
|
if @version.save
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {
|
format.html {
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class WikisController < ApplicationController
|
|||||||
# Create or update a project's wiki
|
# Create or update a project's wiki
|
||||||
def edit
|
def edit
|
||||||
@wiki = @project.wiki || Wiki.new(:project => @project)
|
@wiki = @project.wiki || Wiki.new(:project => @project)
|
||||||
@wiki.attributes = params[:wiki]
|
@wiki.safe_attributes = params[:wiki]
|
||||||
@wiki.save if request.post?
|
@wiki.save if request.post?
|
||||||
render(:update) {|page| page.replace_html "tab-content-wiki", :partial => 'projects/settings/wiki'}
|
render(:update) {|page| page.replace_html "tab-content-wiki", :partial => 'projects/settings/wiki'}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -490,12 +490,16 @@ module ApplicationHelper
|
|||||||
text = Redmine::WikiFormatting.to_html(Setting.text_formatting, text, :object => obj, :attribute => attr)
|
text = Redmine::WikiFormatting.to_html(Setting.text_formatting, text, :object => obj, :attribute => attr)
|
||||||
|
|
||||||
@parsed_headings = []
|
@parsed_headings = []
|
||||||
|
@heading_anchors = {}
|
||||||
@current_section = 0 if options[:edit_section_links]
|
@current_section = 0 if options[:edit_section_links]
|
||||||
|
|
||||||
|
parse_sections(text, project, obj, attr, only_path, options)
|
||||||
text = parse_non_pre_blocks(text) do |text|
|
text = parse_non_pre_blocks(text) do |text|
|
||||||
[:parse_sections, :parse_inline_attachments, :parse_wiki_links, :parse_redmine_links, :parse_macros, :parse_headings].each do |method_name|
|
[:parse_inline_attachments, :parse_wiki_links, :parse_redmine_links, :parse_macros].each do |method_name|
|
||||||
send method_name, text, project, obj, attr, only_path, options
|
send method_name, text, project, obj, attr, only_path, options
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
parse_headings(text, project, obj, attr, only_path, options)
|
||||||
|
|
||||||
if @parsed_headings.any?
|
if @parsed_headings.any?
|
||||||
replace_toc(text, @parsed_headings)
|
replace_toc(text, @parsed_headings)
|
||||||
@@ -778,6 +782,11 @@ module ApplicationHelper
|
|||||||
anchor = sanitize_anchor_name(item)
|
anchor = sanitize_anchor_name(item)
|
||||||
# used for single-file wiki export
|
# used for single-file wiki export
|
||||||
anchor = "#{obj.page.title}_#{anchor}" if options[:wiki_links] == :anchor && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version))
|
anchor = "#{obj.page.title}_#{anchor}" if options[:wiki_links] == :anchor && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version))
|
||||||
|
@heading_anchors[anchor] ||= 0
|
||||||
|
idx = (@heading_anchors[anchor] += 1)
|
||||||
|
if idx > 1
|
||||||
|
anchor = "#{anchor}-#{idx}"
|
||||||
|
end
|
||||||
@parsed_headings << [level, anchor, item]
|
@parsed_headings << [level, anchor, item]
|
||||||
"<a name=\"#{anchor}\"></a>\n<h#{level} #{attrs}>#{content}<a href=\"##{anchor}\" class=\"wiki-anchor\">¶</a></h#{level}>"
|
"<a name=\"#{anchor}\"></a>\n<h#{level} #{attrs}>#{content}<a href=\"##{anchor}\" class=\"wiki-anchor\">¶</a></h#{level}>"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,22 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
|
# Redmine - project management software
|
||||||
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
module CalendarsHelper
|
module CalendarsHelper
|
||||||
def link_to_previous_month(year, month, options={})
|
def link_to_previous_month(year, month, options={})
|
||||||
target_year, target_month = if month == 1
|
target_year, target_month = if month == 1
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
module IssueMovesHelper
|
module IssueMovesHelper
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
@@ -83,7 +85,8 @@ module QueriesHelper
|
|||||||
else
|
else
|
||||||
# retrieve from session
|
# retrieve from session
|
||||||
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
|
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
|
||||||
@query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
|
@query ||= Query.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
|
||||||
|
@query.project = @project
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Helpers to sort tables using clickable column headers.
|
# Helpers to sort tables using clickable column headers.
|
||||||
#
|
#
|
||||||
# Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
|
# Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
# Redmine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
# Copyright (C) 2006-2011 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Board < ActiveRecord::Base
|
class Board < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
has_many :topics, :class_name => 'Message', :conditions => "#{Message.table_name}.parent_id IS NULL", :order => "#{Message.table_name}.created_on DESC"
|
has_many :topics, :class_name => 'Message', :conditions => "#{Message.table_name}.parent_id IS NULL", :order => "#{Message.table_name}.created_on DESC"
|
||||||
has_many :messages, :dependent => :destroy, :order => "#{Message.table_name}.created_on DESC"
|
has_many :messages, :dependent => :destroy, :order => "#{Message.table_name}.created_on DESC"
|
||||||
@@ -30,6 +31,8 @@ class Board < ActiveRecord::Base
|
|||||||
named_scope :visible, lambda {|*args| { :include => :project,
|
named_scope :visible, lambda {|*args| { :include => :project,
|
||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
||||||
|
|
||||||
|
safe_attributes 'name', 'description', 'move_to'
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_messages, project)
|
!user.nil? && user.allowed_to?(:view_messages, project)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -151,12 +151,16 @@ class Changeset < ActiveRecord::Base
|
|||||||
@long_comments || split_comments.last
|
@long_comments || split_comments.last
|
||||||
end
|
end
|
||||||
|
|
||||||
def text_tag
|
def text_tag(ref_project=nil)
|
||||||
if scmid?
|
tag = if scmid?
|
||||||
"commit:#{scmid}"
|
"commit:#{scmid}"
|
||||||
else
|
else
|
||||||
"r#{revision}"
|
"r#{revision}"
|
||||||
end
|
end
|
||||||
|
if ref_project && project && ref_project != project
|
||||||
|
tag = "#{project.identifier}:#{tag}"
|
||||||
|
end
|
||||||
|
tag
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the previous changeset
|
# Returns the previous changeset
|
||||||
@@ -213,7 +217,7 @@ class Changeset < ActiveRecord::Base
|
|||||||
# don't change the status is the issue is closed
|
# don't change the status is the issue is closed
|
||||||
return if issue.status && issue.status.is_closed?
|
return if issue.status && issue.status.is_closed?
|
||||||
|
|
||||||
journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag))
|
journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag(issue.project)))
|
||||||
issue.status = status
|
issue.status = status
|
||||||
unless Setting.commit_fix_done_ratio.blank?
|
unless Setting.commit_fix_done_ratio.blank?
|
||||||
issue.done_ratio = Setting.commit_fix_done_ratio.to_i
|
issue.done_ratio = Setting.commit_fix_done_ratio.to_i
|
||||||
@@ -232,7 +236,7 @@ class Changeset < ActiveRecord::Base
|
|||||||
:hours => hours,
|
:hours => hours,
|
||||||
:issue => issue,
|
:issue => issue,
|
||||||
:spent_on => commit_date,
|
:spent_on => commit_date,
|
||||||
:comments => l(:text_time_logged_by_changeset, :value => text_tag,
|
:comments => l(:text_time_logged_by_changeset, :value => text_tag(issue.project),
|
||||||
:locale => Setting.default_language)
|
:locale => Setting.default_language)
|
||||||
)
|
)
|
||||||
time_entry.activity = log_time_activity unless log_time_activity.nil?
|
time_entry.activity = log_time_activity unless log_time_activity.nil?
|
||||||
|
|||||||
@@ -16,8 +16,11 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Comment < ActiveRecord::Base
|
class Comment < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :commented, :polymorphic => true, :counter_cache => true
|
belongs_to :commented, :polymorphic => true, :counter_cache => true
|
||||||
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
||||||
|
|
||||||
validates_presence_of :commented, :author, :comments
|
validates_presence_of :commented, :author, :comments
|
||||||
|
|
||||||
|
safe_attributes 'comments'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Document < ActiveRecord::Base
|
class Document < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
|
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
|
||||||
acts_as_attachable :delete_permission => :manage_documents
|
acts_as_attachable :delete_permission => :manage_documents
|
||||||
@@ -32,6 +33,8 @@ class Document < ActiveRecord::Base
|
|||||||
named_scope :visible, lambda {|*args| { :include => :project,
|
named_scope :visible, lambda {|*args| { :include => :project,
|
||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_documents, *args) } }
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_documents, *args) } }
|
||||||
|
|
||||||
|
safe_attributes 'category_id', 'title', 'description'
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_documents, project)
|
!user.nil? && user.allowed_to?(:view_documents, project)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -51,6 +51,14 @@ class Group < Principal
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.human_attribute_name(attribute_key_name)
|
||||||
|
attr_name = attribute_key_name
|
||||||
|
if attr_name == 'lastname'
|
||||||
|
attr_name = "name"
|
||||||
|
end
|
||||||
|
super(attr_name)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Removes references that are not handled by associations
|
# Removes references that are not handled by associations
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class IssueCategory < ActiveRecord::Base
|
class IssueCategory < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id'
|
belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id'
|
||||||
has_many :issues, :foreign_key => 'category_id', :dependent => :nullify
|
has_many :issues, :foreign_key => 'category_id', :dependent => :nullify
|
||||||
@@ -24,7 +25,7 @@ class IssueCategory < ActiveRecord::Base
|
|||||||
validates_uniqueness_of :name, :scope => [:project_id]
|
validates_uniqueness_of :name, :scope => [:project_id]
|
||||||
validates_length_of :name, :maximum => 30
|
validates_length_of :name, :maximum => 30
|
||||||
|
|
||||||
attr_protected :project_id
|
safe_attributes 'name', 'assigned_to_id'
|
||||||
|
|
||||||
named_scope :named, lambda {|arg| { :conditions => ["LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip]}}
|
named_scope :named, lambda {|arg| { :conditions => ["LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip]}}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ class Mailer < ActionMailer::Base
|
|||||||
subject s
|
subject s
|
||||||
body :issue => issue,
|
body :issue => issue,
|
||||||
:journal => journal,
|
:journal => journal,
|
||||||
:issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
|
:issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue, :anchor => "change-#{journal.id}")
|
||||||
|
|
||||||
render_multipart('issue_edit', body)
|
render_multipart('issue_edit', body)
|
||||||
end
|
end
|
||||||
@@ -354,7 +354,7 @@ class Mailer < ActionMailer::Base
|
|||||||
:conditions => s.conditions
|
:conditions => s.conditions
|
||||||
).group_by(&:assigned_to)
|
).group_by(&:assigned_to)
|
||||||
issues_by_assignee.each do |assignee, issues|
|
issues_by_assignee.each do |assignee, issues|
|
||||||
deliver_reminder(assignee, issues, days) if assignee && assignee.active?
|
deliver_reminder(assignee, issues, days) if assignee.is_a?(User) && assignee.active?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+11
-1
@@ -50,7 +50,17 @@ class Member < ActiveRecord::Base
|
|||||||
|
|
||||||
def <=>(member)
|
def <=>(member)
|
||||||
a, b = roles.sort.first, member.roles.sort.first
|
a, b = roles.sort.first, member.roles.sort.first
|
||||||
a == b ? (principal <=> member.principal) : (a <=> b)
|
if a == b
|
||||||
|
if principal
|
||||||
|
principal <=> member.principal
|
||||||
|
else
|
||||||
|
1
|
||||||
|
end
|
||||||
|
elsif a
|
||||||
|
a <=> b
|
||||||
|
else
|
||||||
|
1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def deletable?
|
def deletable?
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Message < ActiveRecord::Base
|
class Message < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :board
|
belongs_to :board
|
||||||
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
||||||
acts_as_tree :counter_cache => :replies_count, :order => "#{Message.table_name}.created_on ASC"
|
acts_as_tree :counter_cache => :replies_count, :order => "#{Message.table_name}.created_on ASC"
|
||||||
@@ -36,7 +37,6 @@ class Message < ActiveRecord::Base
|
|||||||
:author_key => :author_id
|
:author_key => :author_id
|
||||||
acts_as_watchable
|
acts_as_watchable
|
||||||
|
|
||||||
attr_protected :locked, :sticky
|
|
||||||
validates_presence_of :board, :subject, :content
|
validates_presence_of :board, :subject, :content
|
||||||
validates_length_of :subject, :maximum => 255
|
validates_length_of :subject, :maximum => 255
|
||||||
validate :cannot_reply_to_locked_topic, :on => :create
|
validate :cannot_reply_to_locked_topic, :on => :create
|
||||||
@@ -48,6 +48,12 @@ class Message < ActiveRecord::Base
|
|||||||
named_scope :visible, lambda {|*args| { :include => {:board => :project},
|
named_scope :visible, lambda {|*args| { :include => {:board => :project},
|
||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_messages, *args) } }
|
||||||
|
|
||||||
|
safe_attributes 'subject', 'content'
|
||||||
|
safe_attributes 'locked', 'sticky', 'board_id',
|
||||||
|
:if => lambda {|message, user|
|
||||||
|
user.allowed_to?(:edit_messages, message.project)
|
||||||
|
}
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_messages, project)
|
!user.nil? && user.allowed_to?(:view_messages, project)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class News < ActiveRecord::Base
|
class News < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
||||||
has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
|
has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
|
||||||
@@ -37,6 +38,8 @@ class News < ActiveRecord::Base
|
|||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_news, *args)
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_news, *args)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
safe_attributes 'title', 'summary', 'description'
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_news, project)
|
!user.nil? && user.allowed_to?(:view_news, project)
|
||||||
end
|
end
|
||||||
|
|||||||
+13
-1
@@ -32,6 +32,16 @@ class Principal < ActiveRecord::Base
|
|||||||
:order => 'type, login, lastname, firstname, mail'
|
:order => 'type, login, lastname, firstname, mail'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# Principals that are not members of projects
|
||||||
|
named_scope :not_member_of, lambda {|projects|
|
||||||
|
projects = [projects] unless projects.is_a?(Array)
|
||||||
|
if projects.empty?
|
||||||
|
{:conditions => "1=0"}
|
||||||
|
else
|
||||||
|
ids = projects.map(&:id)
|
||||||
|
{:conditions => ["#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]}
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
before_create :set_default_empty_values
|
before_create :set_default_empty_values
|
||||||
|
|
||||||
@@ -40,7 +50,9 @@ class Principal < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def <=>(principal)
|
def <=>(principal)
|
||||||
if self.class.name == principal.class.name
|
if principal.nil?
|
||||||
|
-1
|
||||||
|
elsif self.class.name == principal.class.name
|
||||||
self.to_s.downcase <=> principal.to_s.downcase
|
self.to_s.downcase <=> principal.to_s.downcase
|
||||||
else
|
else
|
||||||
# groups after users
|
# groups after users
|
||||||
|
|||||||
+10
-5
@@ -253,7 +253,7 @@ class Project < ActiveRecord::Base
|
|||||||
|
|
||||||
def to_param
|
def to_param
|
||||||
# id is used for projects with a numeric identifier (compatibility)
|
# id is used for projects with a numeric identifier (compatibility)
|
||||||
@to_param ||= (identifier.to_s =~ %r{^\d*$} ? id : identifier)
|
@to_param ||= (identifier.to_s =~ %r{^\d*$} ? id.to_s : identifier)
|
||||||
end
|
end
|
||||||
|
|
||||||
def active?
|
def active?
|
||||||
@@ -390,16 +390,21 @@ class Project < ActiveRecord::Base
|
|||||||
|
|
||||||
# Returns a scope of the Versions used by the project
|
# Returns a scope of the Versions used by the project
|
||||||
def shared_versions
|
def shared_versions
|
||||||
@shared_versions ||= begin
|
if new_record?
|
||||||
r = root? ? self : root
|
|
||||||
Version.scoped(:include => :project,
|
Version.scoped(:include => :project,
|
||||||
:conditions => "#{Project.table_name}.id = #{id}" +
|
:conditions => "#{Project.table_name}.status = #{Project::STATUS_ACTIVE} AND #{Version.table_name}.sharing = 'system'")
|
||||||
" OR (#{Project.table_name}.status = #{Project::STATUS_ACTIVE} AND (" +
|
else
|
||||||
|
@shared_versions ||= begin
|
||||||
|
r = root? ? self : root
|
||||||
|
Version.scoped(:include => :project,
|
||||||
|
:conditions => "#{Project.table_name}.id = #{id}" +
|
||||||
|
" OR (#{Project.table_name}.status = #{Project::STATUS_ACTIVE} AND (" +
|
||||||
" #{Version.table_name}.sharing = 'system'" +
|
" #{Version.table_name}.sharing = 'system'" +
|
||||||
" OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" +
|
" OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" +
|
||||||
" OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" +
|
" OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" +
|
||||||
" OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" +
|
" OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" +
|
||||||
"))")
|
"))")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -169,6 +169,10 @@ private
|
|||||||
name = name.to_s
|
name = name.to_s
|
||||||
raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
|
raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
|
||||||
setting = find_by_name(name)
|
setting = find_by_name(name)
|
||||||
setting ||= new(:name => name, :value => @@available_settings[name]['default']) if @@available_settings.has_key? name
|
unless setting
|
||||||
|
setting = new(:name => name)
|
||||||
|
setting.value = @@available_settings[name]['default']
|
||||||
|
end
|
||||||
|
setting
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class TimeEntry < ActiveRecord::Base
|
class TimeEntry < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
# could have used polymorphic association
|
# could have used polymorphic association
|
||||||
# project association here allows easy loading of time entries at project level with one database trip
|
# project association here allows easy loading of time entries at project level with one database trip
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
@@ -46,6 +47,8 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_time_entries, *args)
|
:conditions => Project.allowed_to_condition(args.shift || User.current, :view_time_entries, *args)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values'
|
||||||
|
|
||||||
def after_initialize
|
def after_initialize
|
||||||
if new_record? && self.activity.nil?
|
if new_record? && self.activity.nil?
|
||||||
if default_activity = TimeEntryActivity.default
|
if default_activity = TimeEntryActivity.default
|
||||||
|
|||||||
@@ -343,6 +343,11 @@ class User < Principal
|
|||||||
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
|
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns true if the default admin account can no longer be used
|
||||||
|
def self.default_admin_account_changed?
|
||||||
|
!User.active.find_by_login("admin").try(:check_password?, "admin")
|
||||||
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class UserPreference < ActiveRecord::Base
|
|||||||
belongs_to :user
|
belongs_to :user
|
||||||
serialize :others
|
serialize :others
|
||||||
|
|
||||||
attr_protected :others
|
attr_protected :others, :user_id
|
||||||
|
|
||||||
def initialize(attributes = nil)
|
def initialize(attributes = nil)
|
||||||
super
|
super
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Version < ActiveRecord::Base
|
class Version < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
after_update :update_issues_from_sharing_change
|
after_update :update_issues_from_sharing_change
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify
|
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify
|
||||||
@@ -38,6 +39,15 @@ class Version < ActiveRecord::Base
|
|||||||
named_scope :visible, lambda {|*args| { :include => :project,
|
named_scope :visible, lambda {|*args| { :include => :project,
|
||||||
:conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } }
|
:conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } }
|
||||||
|
|
||||||
|
safe_attributes 'name',
|
||||||
|
'description',
|
||||||
|
'effective_date',
|
||||||
|
'due_date',
|
||||||
|
'wiki_page_title',
|
||||||
|
'status',
|
||||||
|
'sharing',
|
||||||
|
'custom_field_values'
|
||||||
|
|
||||||
# Returns true if +user+ or current user is allowed to view the version
|
# Returns true if +user+ or current user is allowed to view the version
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
user.allowed_to?(:view_issues, self.project)
|
user.allowed_to?(:view_issues, self.project)
|
||||||
@@ -56,6 +66,10 @@ class Version < ActiveRecord::Base
|
|||||||
effective_date
|
effective_date
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def due_date=(arg)
|
||||||
|
self.effective_date=(arg)
|
||||||
|
end
|
||||||
|
|
||||||
# Returns the total estimated time for this version
|
# Returns the total estimated time for this version
|
||||||
# (sum of leaves estimated_hours)
|
# (sum of leaves estimated_hours)
|
||||||
def estimated_hours
|
def estimated_hours
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class Wiki < ActiveRecord::Base
|
class Wiki < ActiveRecord::Base
|
||||||
|
include Redmine::SafeAttributes
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
has_many :pages, :class_name => 'WikiPage', :dependent => :destroy, :order => 'title'
|
has_many :pages, :class_name => 'WikiPage', :dependent => :destroy, :order => 'title'
|
||||||
has_many :redirects, :class_name => 'WikiRedirect', :dependent => :delete_all
|
has_many :redirects, :class_name => 'WikiRedirect', :dependent => :delete_all
|
||||||
@@ -25,6 +26,8 @@ class Wiki < ActiveRecord::Base
|
|||||||
validates_presence_of :start_page
|
validates_presence_of :start_page
|
||||||
validates_format_of :start_page, :with => /^[^,\.\/\?\;\|\:]*$/
|
validates_format_of :start_page, :with => /^[^,\.\/\?\;\|\:]*$/
|
||||||
|
|
||||||
|
safe_attributes 'start_page'
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_wiki_pages, project)
|
!user.nil? && user.allowed_to?(:view_wiki_pages, project)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
||||||
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
||||||
l(:label_issue_category_new),
|
l(:label_issue_category_new),
|
||||||
'category[name]',
|
'issue_category[name]',
|
||||||
{:controller => 'issue_categories', :action => 'create', :project_id => @project},
|
{:controller => 'issue_categories', :action => 'create', :project_id => @project},
|
||||||
:title => l(:label_issue_category_new),
|
:title => l(:label_issue_category_new),
|
||||||
:tabindex => 199) if authorize_for('issue_categories', 'new') %></p>
|
:tabindex => 199) if authorize_for('issue_categories', 'new') %></p>
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
<td class="start_date"><%= format_date(relation.other_issue(@issue).start_date) %></td>
|
<td class="start_date"><%= format_date(relation.other_issue(@issue).start_date) %></td>
|
||||||
<td class="due_date"><%= format_date(relation.other_issue(@issue).due_date) %></td>
|
<td class="due_date"><%= format_date(relation.other_issue(@issue).due_date) %></td>
|
||||||
<td class="buttons"><%= link_to_remote(image_tag('link_break.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :id => relation},
|
<td class="buttons"><%= link_to_remote(image_tag('link_break.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :id => relation},
|
||||||
:method => :delete
|
:method => :delete,
|
||||||
|
:confirm => l(:text_are_you_sure)
|
||||||
}, :title => l(:label_relation_delete)) if authorize_for('issue_relations', 'destroy') %></td>
|
}, :title => l(:label_relation_delete)) if authorize_for('issue_relations', 'destroy') %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div class="bgl"><div class="bgr">
|
<div class="bgl"><div class="bgr">
|
||||||
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> © 2006-2011 Jean-Philippe Lang
|
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> © 2006-2012 Jean-Philippe Lang
|
||||||
</div></div>
|
</div></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% principals = Principal.active.find(:all, :limit => 100, :order => 'type, login, lastname ASC') - @project.principals %>
|
<% principals = Principal.active.not_member_of(@project).all(:limit => 100, :order => 'type, login, lastname ASC') %>
|
||||||
|
|
||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
<% if roles.any? && principals.any? %>
|
<% if roles.any? && principals.any? %>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<%= label_tag('repository_scm', l(:label_scm)) %><%= scm_select_tag(@repository) %>
|
<%= label_tag('repository_scm', l(:label_scm)) %><%= scm_select_tag(@repository) %>
|
||||||
<% if @repository && ! @repository.class.scm_available %>
|
<% if @repository && ! @repository.class.scm_available %>
|
||||||
<br />
|
<br />
|
||||||
<em><%= content_tag 'span', l(:text_scm_command_not_available), :class => 'error' %></em>
|
<em class="info error"><%= content_tag 'span', l(:text_scm_command_not_available) %></em>
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
<% button_disabled = true %>
|
<% button_disabled = true %>
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
<%= javascript_include_tag "revision_graph.js" %>
|
<%= javascript_include_tag "revision_graph.js" %>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.onload = function(){
|
Event.observe(window,"load", function(){
|
||||||
branchGraph(document.getElementById("holder"));
|
branchGraph(document.getElementById("holder"));
|
||||||
}
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div id="holder" class="graph"></div>
|
<div id="holder" class="graph"></div>
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
<% show_revision_graph = ( @repository.supports_revision_graph? && path.blank? ) %>
|
||||||
<% form_tag({:controller => 'repositories', :action => 'diff', :id => @project, :path => to_path_param(path)}, :method => :get) do %>
|
<% form_tag({:controller => 'repositories', :action => 'diff', :id => @project, :path => to_path_param(path)}, :method => :get) do %>
|
||||||
<table class="list changesets">
|
<table class="list changesets">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
<% if @repository.supports_revision_graph? %>
|
<% if show_revision_graph %>
|
||||||
<th></th>
|
<th></th>
|
||||||
<% end %>
|
<% end %>
|
||||||
<th>#</th>
|
<th>#</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
<% line_num = 1 %>
|
<% line_num = 1 %>
|
||||||
<% revisions.each do |changeset| %>
|
<% revisions.each do |changeset| %>
|
||||||
<tr class="changeset <%= cycle 'odd', 'even' %>">
|
<tr class="changeset <%= cycle 'odd', 'even' %>">
|
||||||
<% if @repository.supports_revision_graph? %>
|
<% if show_revision_graph %>
|
||||||
<% if line_num == 1 %>
|
<% if line_num == 1 %>
|
||||||
<td class="revision_graph" rowspan="<%= revisions.size %>">
|
<td class="revision_graph" rowspan="<%= revisions.size %>">
|
||||||
<% href_base = Proc.new {|x| url_for(:controller => 'repositories',
|
<% href_base = Proc.new {|x| url_for(:controller => 'repositories',
|
||||||
@@ -39,7 +40,7 @@
|
|||||||
<td class="checkbox"><%= radio_button_tag('rev_to', changeset.identifier, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td>
|
<td class="checkbox"><%= radio_button_tag('rev_to', changeset.identifier, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td>
|
||||||
<td class="committed_on"><%= format_time(changeset.committed_on) %></td>
|
<td class="committed_on"><%= format_time(changeset.committed_on) %></td>
|
||||||
<td class="author"><%= h truncate(changeset.author.to_s, :length => 30) %></td>
|
<td class="author"><%= h truncate(changeset.author.to_s, :length => 30) %></td>
|
||||||
<% if @repository.supports_revision_graph? %>
|
<% if show_revision_graph %>
|
||||||
<td class="comments_nowrap">
|
<td class="comments_nowrap">
|
||||||
<%= textilizable(truncate(truncate_at_line_break(changeset.comments, 0), :length => 90)) %>
|
<%= textilizable(truncate(truncate_at_line_break(changeset.comments, 0), :length => 90)) %>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<% form_tag({:action => 'edit', :tab => 'repositories'}) do %>
|
<% form_tag({:action => 'edit', :tab => 'repositories'}) do %>
|
||||||
|
|
||||||
<fieldset class="box settings enabled_scm">
|
<fieldset class="box settings enabled_scm">
|
||||||
|
<%= hidden_field_tag 'settings[enabled_scm][]', '' %>
|
||||||
<legend><%= l(:setting_enabled_scm) %></legend>
|
<legend><%= l(:setting_enabled_scm) %></legend>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -343,7 +343,7 @@ bg:
|
|||||||
setting_time_format: Формат на часа
|
setting_time_format: Формат на часа
|
||||||
setting_cross_project_issue_relations: Релации на задачи между проекти
|
setting_cross_project_issue_relations: Релации на задачи между проекти
|
||||||
setting_issue_list_default_columns: Показвани колони по подразбиране
|
setting_issue_list_default_columns: Показвани колони по подразбиране
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: Кодова таблица на прикачените файлове и хранилищата
|
||||||
setting_emails_header: Emails header
|
setting_emails_header: Emails header
|
||||||
setting_emails_footer: Подтекст за e-mail
|
setting_emails_footer: Подтекст за e-mail
|
||||||
setting_protocol: Протокол
|
setting_protocol: Протокол
|
||||||
@@ -370,7 +370,7 @@ bg:
|
|||||||
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
|
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
|
||||||
setting_start_of_week: Първи ден на седмицата
|
setting_start_of_week: Първи ден на седмицата
|
||||||
setting_rest_api_enabled: Разрешаване на REST web сървис
|
setting_rest_api_enabled: Разрешаване на REST web сървис
|
||||||
setting_cache_formatted_text: Cache formatted text
|
setting_cache_formatted_text: Кеширане на форматираните текстове
|
||||||
setting_default_notification_option: Подразбиращ се начин за известяване
|
setting_default_notification_option: Подразбиращ се начин за известяване
|
||||||
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
|
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
|
||||||
setting_commit_logtime_activity_id: Дейност при отчитане на работното време
|
setting_commit_logtime_activity_id: Дейност при отчитане на работното време
|
||||||
|
|||||||
+29
-29
@@ -320,7 +320,7 @@ es:
|
|||||||
field_start_date: Fecha de inicio
|
field_start_date: Fecha de inicio
|
||||||
field_start_page: Página principal
|
field_start_page: Página principal
|
||||||
field_status: Estado
|
field_status: Estado
|
||||||
field_subject: Tema
|
field_subject: Asunto
|
||||||
field_subproject: Proyecto secundario
|
field_subproject: Proyecto secundario
|
||||||
field_summary: Resumen
|
field_summary: Resumen
|
||||||
field_time_zone: Zona horaria
|
field_time_zone: Zona horaria
|
||||||
@@ -1012,34 +1012,34 @@ es:
|
|||||||
label_git_report_last_commit: Informar del último commit para ficheros y directorios
|
label_git_report_last_commit: Informar del último commit para ficheros y directorios
|
||||||
text_scm_config: Puede configurar las órdenes de cada scm en configuration/configuration.yml. Por favor, reinicie la aplicación después de editarlo
|
text_scm_config: Puede configurar las órdenes de cada scm en configuration/configuration.yml. Por favor, reinicie la aplicación después de editarlo
|
||||||
text_scm_command_not_available: La orden para el Scm no está disponible. Por favor, compruebe la configuración en el panel de administración.
|
text_scm_command_not_available: La orden para el Scm no está disponible. Por favor, compruebe la configuración en el panel de administración.
|
||||||
notice_issue_successful_create: Issue %{id} created.
|
notice_issue_successful_create: Petición %{id} creada.
|
||||||
label_between: between
|
label_between: entre
|
||||||
setting_issue_group_assignment: Allow issue assignment to groups
|
setting_issue_group_assignment: Permitir asignar peticiones a grupos
|
||||||
label_diff: diff
|
label_diff: diferencias
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
text_git_repository_note: El repositorio es básico y local (p.e. /gitrepo, c:\gitrepo)
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: Dirección de ordenación
|
||||||
description_project_scope: Search scope
|
description_project_scope: Ámbito de búsqueda
|
||||||
description_filter: Filter
|
description_filter: Filtro
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: Configuración de notificaciones por correo
|
||||||
description_date_from: Enter start date
|
description_date_from: Introduzca la fecha de inicio
|
||||||
description_message_content: Message content
|
description_message_content: Contenido del mensaje
|
||||||
description_available_columns: Available Columns
|
description_available_columns: Columnas disponibles
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Elija el rango seleccionando la fecha de inicio y fin
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: Elija la categoría de la petición
|
||||||
description_search: Searchfield
|
description_search: Campo de búsqueda
|
||||||
description_notes: Notes
|
description_notes: Notas
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: Elija el rango en la lista
|
||||||
description_choose_project: Projects
|
description_choose_project: Proyectos
|
||||||
description_date_to: Enter end date
|
description_date_to: Introduzca la fecha fin
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: Atributo de ordenación
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Elija la nueva página padre
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: Columnas seleccionadas
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Padre
|
||||||
label_child_revision: Child
|
label_child_revision: Hijo
|
||||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
||||||
button_edit_section: Edit this section
|
button_edit_section: Edit this section
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: Attachments and repositories encodings
|
||||||
description_all_columns: All Columns
|
description_all_columns: Todas las columnas
|
||||||
button_export: Export
|
button_export: Exportar
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} opciones de exportación"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: Este fichero no se puede adjuntar porque excede el tamaño máximo de fichero (%{max_size})
|
||||||
|
|||||||
@@ -898,7 +898,7 @@ fa:
|
|||||||
text_user_wrote: "%{value} نوشت:"
|
text_user_wrote: "%{value} نوشت:"
|
||||||
text_enumeration_destroy_question: "%{count} داده به این برشمردنی وابسته شدهاند."
|
text_enumeration_destroy_question: "%{count} داده به این برشمردنی وابسته شدهاند."
|
||||||
text_enumeration_category_reassign_to: 'به این برشمردنی وابسته شوند:'
|
text_enumeration_category_reassign_to: 'به این برشمردنی وابسته شوند:'
|
||||||
text_email_delivery_not_configured: "دریافت ایمیل پیکربندی نشده است و آگاهسازیها غیر فعال هستند.\nکارگزار SMTP خود را در config/email.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند."
|
text_email_delivery_not_configured: "دریافت ایمیل پیکربندی نشده است و آگاهسازیها غیر فعال هستند.\nکارگزار SMTP خود را در config/configuration.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند."
|
||||||
text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیامهای انباره نگاشت میشود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت میشوند."
|
text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیامهای انباره نگاشت میشود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت میشوند."
|
||||||
text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.'
|
text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.'
|
||||||
text_custom_field_possible_values_info: 'یک خط برای هر مقدار'
|
text_custom_field_possible_values_info: 'یک خط برای هر مقدار'
|
||||||
|
|||||||
+27
-27
@@ -979,31 +979,31 @@ it:
|
|||||||
label_between: tra
|
label_between: tra
|
||||||
setting_issue_group_assignment: Permetti di assegnare una segnalazione a gruppi
|
setting_issue_group_assignment: Permetti di assegnare una segnalazione a gruppi
|
||||||
label_diff: diff
|
label_diff: diff
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
text_git_repository_note: Il repository è spoglio e locale (e.g. /gitrepo, c:\gitrepo)
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: Ordinamento
|
||||||
description_project_scope: Search scope
|
description_project_scope: Search scope
|
||||||
description_filter: Filter
|
description_filter: Filtro
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: Impostazioni notifica via mail
|
||||||
description_date_from: Enter start date
|
description_date_from: Inserisci la data d'inizio
|
||||||
description_message_content: Message content
|
description_message_content: Contenuto del messaggio
|
||||||
description_available_columns: Available Columns
|
description_available_columns: Colonne disponibili
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Scegli l'intervallo selezionando la data di inizio e di fine
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: Scegli la categoria della segnalazione
|
||||||
description_search: Searchfield
|
description_search: Campo di ricerca
|
||||||
description_notes: Notes
|
description_notes: Note
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: Scegli l'intervallo dalla lista
|
||||||
description_choose_project: Projects
|
description_choose_project: Progetti
|
||||||
description_date_to: Enter end date
|
description_date_to: Inserisci la data di fine
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: Attributo di ordinamento
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Scegli la nuova pagina padre
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: Colonne selezionate
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Padre
|
||||||
label_child_revision: Child
|
label_child_revision: Figlio
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
error_scm_annotate_big_text_file: La nota non può essere salvata, supera la dimensiona massima del campo di testo.
|
||||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
setting_default_issue_start_date_to_creation_date: Usa la data corrente come data d'inizio per le nuove segnalazioni
|
||||||
button_edit_section: Edit this section
|
button_edit_section: Modifica questa sezione
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: Codifica degli allegati e dei repository
|
||||||
description_all_columns: All Columns
|
description_all_columns: Tutte le colonne
|
||||||
button_export: Export
|
button_export: Esporta
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} opzioni per l'export"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: Questo file non può essere caricato in quanto la sua dimensione supera la massima consentita (%{max_size})
|
||||||
|
|||||||
+31
-31
@@ -349,8 +349,8 @@ ja:
|
|||||||
setting_default_language: 既定の言語
|
setting_default_language: 既定の言語
|
||||||
setting_login_required: 認証が必要
|
setting_login_required: 認証が必要
|
||||||
setting_self_registration: ユーザは自分で登録できる
|
setting_self_registration: ユーザは自分で登録できる
|
||||||
setting_attachment_max_size: 添付ファイルの最大サイズ
|
setting_attachment_max_size: 添付ファイルサイズの上限
|
||||||
setting_issues_export_limit: 出力するチケット数の上限
|
setting_issues_export_limit: エクスポートするチケット数の上限
|
||||||
setting_mail_from: 送信元メールアドレス
|
setting_mail_from: 送信元メールアドレス
|
||||||
setting_bcc_recipients: ブラインドカーボンコピーで受信(bcc)
|
setting_bcc_recipients: ブラインドカーボンコピーで受信(bcc)
|
||||||
setting_plain_text_mail: プレインテキストのみ(HTMLなし)
|
setting_plain_text_mail: プレインテキストのみ(HTMLなし)
|
||||||
@@ -376,7 +376,7 @@ ja:
|
|||||||
setting_per_page_options: ページ毎の表示件数
|
setting_per_page_options: ページ毎の表示件数
|
||||||
setting_user_format: ユーザ名の表示書式
|
setting_user_format: ユーザ名の表示書式
|
||||||
setting_activity_days_default: プロジェクトの活動ページに表示される日数
|
setting_activity_days_default: プロジェクトの活動ページに表示される日数
|
||||||
setting_display_subprojects_issues: デフォルトでサブプロジェクトのチケットをメインプロジェクトに表示する
|
setting_display_subprojects_issues: サブプロジェクトのチケットをメインプロジェクトに表示する
|
||||||
setting_enabled_scm: 使用するバージョン管理システム
|
setting_enabled_scm: 使用するバージョン管理システム
|
||||||
setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り取る"
|
setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り取る"
|
||||||
setting_mail_handler_api_enabled: 受信メール用のWebサービスを有効にする
|
setting_mail_handler_api_enabled: 受信メール用のWebサービスを有効にする
|
||||||
@@ -385,7 +385,7 @@ ja:
|
|||||||
setting_gravatar_enabled: Gravatarのアイコンを使用する
|
setting_gravatar_enabled: Gravatarのアイコンを使用する
|
||||||
setting_gravatar_default: デフォルトのGravatarアイコン
|
setting_gravatar_default: デフォルトのGravatarアイコン
|
||||||
setting_diff_max_lines_displayed: 差分の表示行数の上限
|
setting_diff_max_lines_displayed: 差分の表示行数の上限
|
||||||
setting_file_max_size_displayed: テキストファイルのインライン表示行数の上限
|
setting_file_max_size_displayed: 画面表示するテキストファイルサイズの上限
|
||||||
setting_repository_log_display_limit: ファイルのリビジョン表示数の上限
|
setting_repository_log_display_limit: ファイルのリビジョン表示数の上限
|
||||||
setting_openid: OpenIDによるログインと登録
|
setting_openid: OpenIDによるログインと登録
|
||||||
setting_password_min_length: パスワードの最低必要文字数
|
setting_password_min_length: パスワードの最低必要文字数
|
||||||
@@ -439,7 +439,7 @@ ja:
|
|||||||
permission_rename_wiki_pages: Wikiページ名の変更
|
permission_rename_wiki_pages: Wikiページ名の変更
|
||||||
permission_delete_wiki_pages: Wikiページの削除
|
permission_delete_wiki_pages: Wikiページの削除
|
||||||
permission_view_wiki_pages: Wikiの閲覧
|
permission_view_wiki_pages: Wikiの閲覧
|
||||||
permission_export_wiki_pages: Wikiページを他の形式に出力
|
permission_export_wiki_pages: Wikiページを他の形式にエクスポート
|
||||||
permission_view_wiki_edits: Wiki履歴の閲覧
|
permission_view_wiki_edits: Wiki履歴の閲覧
|
||||||
permission_edit_wiki_pages: Wikiページの編集
|
permission_edit_wiki_pages: Wikiページの編集
|
||||||
permission_delete_wiki_pages_attachments: 添付ファイルの削除
|
permission_delete_wiki_pages_attachments: 添付ファイルの削除
|
||||||
@@ -583,7 +583,7 @@ ja:
|
|||||||
label_version_plural: バージョン
|
label_version_plural: バージョン
|
||||||
label_confirmation: 確認
|
label_confirmation: 確認
|
||||||
label_close_versions: 完了したバージョンを終了にする
|
label_close_versions: 完了したバージョンを終了にする
|
||||||
label_export_to: '他の形式に出力:'
|
label_export_to: '他の形式にエクスポート:'
|
||||||
label_read: 読む...
|
label_read: 読む...
|
||||||
label_public_projects: 公開プロジェクト
|
label_public_projects: 公開プロジェクト
|
||||||
label_open_issues: 未完了
|
label_open_issues: 未完了
|
||||||
@@ -680,7 +680,7 @@ ja:
|
|||||||
label_latest_revision_plural: 最新リビジョン
|
label_latest_revision_plural: 最新リビジョン
|
||||||
label_view_revisions: リビジョンを見る
|
label_view_revisions: リビジョンを見る
|
||||||
label_view_all_revisions: すべてのリビジョンを見る
|
label_view_all_revisions: すべてのリビジョンを見る
|
||||||
label_max_size: 最大サイズ
|
label_max_size: サイズの上限
|
||||||
label_sort_highest: 一番上へ
|
label_sort_highest: 一番上へ
|
||||||
label_sort_higher: 上へ
|
label_sort_higher: 上へ
|
||||||
label_sort_lower: 下へ
|
label_sort_lower: 下へ
|
||||||
@@ -878,7 +878,7 @@ ja:
|
|||||||
button_change_password: パスワード変更
|
button_change_password: パスワード変更
|
||||||
button_copy: コピー
|
button_copy: コピー
|
||||||
button_copy_and_follow: コピー後表示
|
button_copy_and_follow: コピー後表示
|
||||||
button_annotate: 注釈
|
button_annotate: アノテート
|
||||||
button_update: 更新
|
button_update: 更新
|
||||||
button_configure: 設定
|
button_configure: 設定
|
||||||
button_quote: 引用
|
button_quote: 引用
|
||||||
@@ -1012,27 +1012,27 @@ ja:
|
|||||||
notice_issue_successful_create: チケット %{id} が作成されました。
|
notice_issue_successful_create: チケット %{id} が作成されました。
|
||||||
label_between: 次の範囲内
|
label_between: 次の範囲内
|
||||||
setting_issue_group_assignment: グループへのチケット割り当てを許可
|
setting_issue_group_assignment: グループへのチケット割り当てを許可
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: 順序
|
||||||
description_project_scope: Search scope
|
description_project_scope: 検索範囲
|
||||||
description_filter: Filter
|
description_filter: Filter
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: メール通知の設定
|
||||||
description_date_from: Enter start date
|
description_date_from: 開始日
|
||||||
description_message_content: Message content
|
description_message_content: 内容
|
||||||
description_available_columns: Available Columns
|
description_available_columns: 利用できる項目
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: 日付で指定
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: 新しいカテゴリを選択してください
|
||||||
description_search: Searchfield
|
description_search: 検索キーワード
|
||||||
description_notes: Notes
|
description_notes: 注記
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: 一覧から選択
|
||||||
description_choose_project: Projects
|
description_choose_project: プロジェクト
|
||||||
description_date_to: Enter end date
|
description_date_to: 終了日
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: 項目
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: 新しい親ページを選択してください
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: 選択された項目
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
error_scm_annotate_big_text_file: テキストファイルサイズの上限を超えているためアノテートできません。
|
||||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
setting_default_issue_start_date_to_creation_date: 現在の日付を新しいチケットの開始日とする
|
||||||
button_edit_section: Edit this section
|
button_edit_section: このセクションを編集
|
||||||
description_all_columns: All Columns
|
description_all_columns: すべての項目
|
||||||
button_export: Export
|
button_export: エクスポート
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} エクスポート設定"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: このファイルはアップロードできません。添付ファイルサイズの上限(%{max_size})を超えています。
|
||||||
|
|||||||
+78
-77
@@ -2,7 +2,8 @@
|
|||||||
# by Kihyun Yoon(ddumbugie@gmail.com),http://plenum.textcube.com/
|
# by Kihyun Yoon(ddumbugie@gmail.com),http://plenum.textcube.com/
|
||||||
# by John Hwang (jhwang@tavon.org),http://github.com/tavon
|
# by John Hwang (jhwang@tavon.org),http://github.com/tavon
|
||||||
# by Yonghwan SO(please insert your email), last update at 2009-09-11
|
# by Yonghwan SO(please insert your email), last update at 2009-09-11
|
||||||
# last update at 2010-09-06 by Kihyun Yoon
|
# by Ki Won Kim(xyz37@naver.com, http://xyz37.blog.me, https://x10.mine.nu/redmine), last update at 2012-02-01
|
||||||
|
# last update at 2012-02-02 by Ki Won Kim
|
||||||
ko:
|
ko:
|
||||||
direction: ltr
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
@@ -176,7 +177,7 @@ ko:
|
|||||||
greater_than_start_date: "는 시작날짜보다 커야 합니다"
|
greater_than_start_date: "는 시작날짜보다 커야 합니다"
|
||||||
not_same_project: "는 같은 프로젝트에 속해 있지 않습니다"
|
not_same_project: "는 같은 프로젝트에 속해 있지 않습니다"
|
||||||
circular_dependency: "이 관계는 순환 의존관계를 만들 수 있습니다"
|
circular_dependency: "이 관계는 순환 의존관계를 만들 수 있습니다"
|
||||||
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
cant_link_an_issue_with_a_descendant: "일감은 그것의 하위 일감과 연결할 수 없습니다."
|
||||||
|
|
||||||
actionview_instancetag_blank_option: 선택하세요
|
actionview_instancetag_blank_option: 선택하세요
|
||||||
|
|
||||||
@@ -287,7 +288,7 @@ ko:
|
|||||||
field_admin: 관리자
|
field_admin: 관리자
|
||||||
field_last_login_on: 마지막 로그인
|
field_last_login_on: 마지막 로그인
|
||||||
field_language: 언어
|
field_language: 언어
|
||||||
field_effective_date: 일자
|
field_effective_date: 날짜
|
||||||
field_password: 비밀번호
|
field_password: 비밀번호
|
||||||
field_new_password: 새 비밀번호
|
field_new_password: 새 비밀번호
|
||||||
field_password_confirmation: 비밀번호 확인
|
field_password_confirmation: 비밀번호 확인
|
||||||
@@ -363,7 +364,7 @@ ko:
|
|||||||
setting_user_format: 사용자 표시 형식
|
setting_user_format: 사용자 표시 형식
|
||||||
setting_activity_days_default: 프로젝트 작업내역에 표시할 기간
|
setting_activity_days_default: 프로젝트 작업내역에 표시할 기간
|
||||||
setting_display_subprojects_issues: 하위 프로젝트의 일감을 함께 표시
|
setting_display_subprojects_issues: 하위 프로젝트의 일감을 함께 표시
|
||||||
setting_enabled_scm: 지원할 SCM
|
setting_enabled_scm: "지원할 SCM(Source Control Management)"
|
||||||
setting_mail_handler_api_enabled: 수신 메일에 WS를 허용
|
setting_mail_handler_api_enabled: 수신 메일에 WS를 허용
|
||||||
setting_mail_handler_api_key: API 키
|
setting_mail_handler_api_key: API 키
|
||||||
setting_sequential_project_identifiers: 프로젝트 식별자를 순차적으로 생성
|
setting_sequential_project_identifiers: 프로젝트 식별자를 순차적으로 생성
|
||||||
@@ -686,10 +687,10 @@ ko:
|
|||||||
label_blocked_by: "다음 일감에게 막혀 있음:"
|
label_blocked_by: "다음 일감에게 막혀 있음:"
|
||||||
label_precedes: "다음에 진행할 일감:"
|
label_precedes: "다음에 진행할 일감:"
|
||||||
label_follows: "다음 일감을 우선 진행:"
|
label_follows: "다음 일감을 우선 진행:"
|
||||||
label_end_to_start: end to start
|
label_end_to_start: "끝에서 시작"
|
||||||
label_end_to_end: end to end
|
label_end_to_end: "끝에서 끝"
|
||||||
label_start_to_start: start to start
|
label_start_to_start: "시작에서 시작"
|
||||||
label_start_to_end: start to end
|
label_start_to_end: "시작에서 끝"
|
||||||
label_stay_logged_in: 로그인 유지
|
label_stay_logged_in: 로그인 유지
|
||||||
label_disabled: 비활성화
|
label_disabled: 비활성화
|
||||||
label_show_completed_versions: 완료된 버전 보기
|
label_show_completed_versions: 완료된 버전 보기
|
||||||
@@ -987,74 +988,74 @@ ko:
|
|||||||
setting_commit_logtime_activity_id: 기록된 시간에 적용할 작업분류
|
setting_commit_logtime_activity_id: 기록된 시간에 적용할 작업분류
|
||||||
text_time_logged_by_changeset: "변경묶음 %{value}에서 적용되었습니다."
|
text_time_logged_by_changeset: "변경묶음 %{value}에서 적용되었습니다."
|
||||||
setting_commit_logtime_enabled: 커밋 시점에 작업 시간 기록 활성화
|
setting_commit_logtime_enabled: 커밋 시점에 작업 시간 기록 활성화
|
||||||
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
|
notice_gantt_chart_truncated: "표시할 수 있는 최대 항목수(%{max})를 초과하여 차트가 잘렸습니다."
|
||||||
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
|
setting_gantt_items_limit: "Gantt 차트에 표시되는 최대 항목수"
|
||||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
field_warn_on_leaving_unsaved: "저장하지 않은 페이지를 빠져나갈 때 나에게 알림"
|
||||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
text_warn_on_leaving_unsaved: "현재 페이지는 저장되지 않은 문자가 있습니다. 이 페이지를 빠져나가면 내용을 잃을것입니다."
|
||||||
label_my_queries: My custom queries
|
label_my_queries: "내 검색 양식"
|
||||||
text_journal_changed_no_detail: "%{label} updated"
|
text_journal_changed_no_detail: "%{label}이 변경되었습니다."
|
||||||
label_news_comment_added: Comment added to a news
|
label_news_comment_added: "뉴스에 설명이 추가되었습니다."
|
||||||
button_expand_all: Expand all
|
button_expand_all: "모두 확장"
|
||||||
button_collapse_all: Collapse all
|
button_collapse_all: "모두 축소"
|
||||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
label_additional_workflow_transitions_for_assignee: "사용자가 작업자일 때 허용되는 추가 상태"
|
||||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
label_additional_workflow_transitions_for_author: "사용자가 저자일 때 허용되는 추가 상태"
|
||||||
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
|
label_bulk_edit_selected_time_entries: "선택된 소요 시간 대량 편집"
|
||||||
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
|
text_time_entries_destroy_confirmation: "선택한 소요 시간 항목을 삭제하시겠습니까?"
|
||||||
label_role_anonymous: Anonymous
|
label_role_anonymous: Anonymous
|
||||||
label_role_non_member: Non member
|
label_role_non_member: Non member
|
||||||
label_issue_note_added: Note added
|
label_issue_note_added: "덧글이 추가되었습니다."
|
||||||
label_issue_status_updated: Status updated
|
label_issue_status_updated: "상태가 변경되었습니다."
|
||||||
label_issue_priority_updated: Priority updated
|
label_issue_priority_updated: "우선 순위가 변경되었습니다."
|
||||||
label_issues_visibility_own: Issues created by or assigned to the user
|
label_issues_visibility_own: "일감을 생성하거나 할당된 사용자"
|
||||||
field_issues_visibility: Issues visibility
|
field_issues_visibility: "일감 보임"
|
||||||
label_issues_visibility_all: All issues
|
label_issues_visibility_all: "모든 일감"
|
||||||
permission_set_own_issues_private: Set own issues public or private
|
permission_set_own_issues_private: "자신의 일감을 공개나 비공개로 설정"
|
||||||
field_is_private: Private
|
field_is_private: "비공개"
|
||||||
permission_set_issues_private: Set issues public or private
|
permission_set_issues_private: "일감을 공개나 비공개로 설정"
|
||||||
label_issues_visibility_public: All non private issues
|
label_issues_visibility_public: "모든 비공개 일감"
|
||||||
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
|
text_issues_destroy_descendants_confirmation: "%{count} 개의 하위 일감을 삭제할 것입니다."
|
||||||
field_commit_logs_encoding: 제출(commit) 기록 인코딩
|
field_commit_logs_encoding: "제출(commit) 기록 인코딩"
|
||||||
field_scm_path_encoding: Path encoding
|
field_scm_path_encoding: "경로 인코딩"
|
||||||
text_scm_path_encoding_note: "Default: UTF-8"
|
text_scm_path_encoding_note: "기본: UTF-8"
|
||||||
field_path_to_repository: Path to repository
|
field_path_to_repository: "저장소 경로"
|
||||||
field_root_directory: Root directory
|
field_root_directory: "루트 경로"
|
||||||
field_cvs_module: Module
|
field_cvs_module: "모듈"
|
||||||
field_cvsroot: CVSROOT
|
field_cvsroot: "CVS 루트"
|
||||||
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
|
text_mercurial_repository_note: "로컬 저장소 (예: /hgrepo, c:\hgrepo)"
|
||||||
text_scm_command: Command
|
text_scm_command: "명령"
|
||||||
text_scm_command_version: Version
|
text_scm_command_version: "버전"
|
||||||
label_git_report_last_commit: Report last commit for files and directories
|
label_git_report_last_commit: "파일이나 폴더의 마지막 제출(commit)을 보고"
|
||||||
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
|
text_scm_config: "SCM 명령을 config/configuration.yml에서 수정할 수 있습니다. 수정후에는 재시작하십시오."
|
||||||
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
|
text_scm_command_not_available: "SCM 명령을 사용할 수 없습니다. 관리 페이지의 설정을 검사하십시오."
|
||||||
notice_issue_successful_create: Issue %{id} created.
|
notice_issue_successful_create: "%{id} 일감이 생성되었습니다."
|
||||||
label_between: between
|
label_between: "사이"
|
||||||
setting_issue_group_assignment: Allow issue assignment to groups
|
setting_issue_group_assignment: "그룹에 일감 할당 허용"
|
||||||
label_diff: diff
|
label_diff: "비교(diff)"
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
text_git_repository_note: "저장소는 노출된 로컬입니다. (예: /gitrepo, c:\gitrepo)"
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: "정렬 방향"
|
||||||
description_project_scope: Search scope
|
description_project_scope: "검색 범위"
|
||||||
description_filter: Filter
|
description_filter: "검색 조건"
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: "메일 알림 설정"
|
||||||
description_date_from: Enter start date
|
description_date_from: "시작 날짜 입력"
|
||||||
description_message_content: Message content
|
description_message_content: "메세지 내용"
|
||||||
description_available_columns: Available Columns
|
description_available_columns: "가능한 컬럼"
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: 시작과 끝 날짜로 범위를 선택하십시오."
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: "일감 범주를 선택하십시오."
|
||||||
description_search: Searchfield
|
description_search: "검색항목"
|
||||||
description_notes: Notes
|
description_notes: "덧글"
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: "목록에서 범위를 선택 하십시오."
|
||||||
description_choose_project: Projects
|
description_choose_project: "프로젝트"
|
||||||
description_date_to: Enter end date
|
description_date_to: "종료 날짜 입력"
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: "정렬 속성"
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: "새로운 상위 페이지를 선택하십시오."
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: "선택된 컬럼"
|
||||||
label_parent_revision: Parent
|
label_parent_revision: "상위"
|
||||||
label_child_revision: Child
|
label_child_revision: "하위"
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
error_scm_annotate_big_text_file: "최대 텍스트 파일 크기를 초과 하면 항목은 이력화 될 수 없습니다."
|
||||||
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
|
setting_default_issue_start_date_to_creation_date: "새로운 일감의 시작 날짜로 오늘 날짜 사용"
|
||||||
button_edit_section: Edit this section
|
button_edit_section: "이 부분 수정"
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: "첨부파일이나 저장소 인코딩"
|
||||||
description_all_columns: All Columns
|
description_all_columns: "모든 컬럼"
|
||||||
button_export: Export
|
button_export: "내보내기"
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "내보내기 옵션: %{export_format}"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: "이 파일은 제한된 크기(%{max_size})를 초과하였기 때문에 업로드 할 수 없습니다."
|
||||||
|
|||||||
@@ -399,7 +399,7 @@ nl:
|
|||||||
label_f_hour_plural: "%{value} uren"
|
label_f_hour_plural: "%{value} uren"
|
||||||
label_feed_plural: Feeds
|
label_feed_plural: Feeds
|
||||||
label_feeds_access_key_created_on: "RSS toegangssleutel %{value} geleden gemaakt."
|
label_feeds_access_key_created_on: "RSS toegangssleutel %{value} geleden gemaakt."
|
||||||
label_file_added: Bericht toegevoegd
|
label_file_added: Bestand toegevoegd
|
||||||
label_file_plural: Bestanden
|
label_file_plural: Bestanden
|
||||||
label_filter_add: Voeg filter toe
|
label_filter_add: Voeg filter toe
|
||||||
label_filter_plural: Filters
|
label_filter_plural: Filters
|
||||||
|
|||||||
+16
-14
@@ -1000,23 +1000,25 @@ pt-BR:
|
|||||||
setting_issue_group_assignment: Allow issue assignment to groups
|
setting_issue_group_assignment: Allow issue assignment to groups
|
||||||
label_diff: diff
|
label_diff: diff
|
||||||
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
|
||||||
|
|
||||||
description_query_sort_criteria_direction: Sort direction
|
description_query_sort_criteria_direction: Sort direction
|
||||||
description_project_scope: Search scope
|
description_project_scope: Escopo da pesquisa
|
||||||
description_filter: Filter
|
description_filter: Filtro
|
||||||
description_user_mail_notification: Mail notification settings
|
description_user_mail_notification: Configuração de notificações por e-mail
|
||||||
description_date_from: Enter start date
|
description_date_from: Digita a data inicial
|
||||||
description_message_content: Message content
|
description_message_content: Conteúdo da mensagem
|
||||||
description_available_columns: Available Columns
|
description_available_columns: Colunas disponíveis
|
||||||
description_date_range_interval: Choose range by selecting start and end date
|
description_date_range_interval: Escolha um período selecionando a data de início e fim
|
||||||
description_issue_category_reassign: Choose issue category
|
description_issue_category_reassign: Escolha uma categoria de tarefas
|
||||||
description_search: Searchfield
|
description_search: Searchfield
|
||||||
description_notes: Notes
|
description_notes: Notas
|
||||||
description_date_range_list: Choose range from list
|
description_date_range_list: Escolha um período a partira da lista
|
||||||
description_choose_project: Projects
|
description_choose_project: Projetos
|
||||||
description_date_to: Enter end date
|
description_date_to: Digite a data final
|
||||||
description_query_sort_criteria_attribute: Sort attribute
|
description_query_sort_criteria_attribute: Sort attribute
|
||||||
description_wiki_subpages_reassign: Choose new parent page
|
description_wiki_subpages_reassign: Escolha uma nova página pai
|
||||||
description_selected_columns: Selected Columns
|
description_selected_columns: Colunas selecionadas
|
||||||
|
|
||||||
label_parent_revision: Parent
|
label_parent_revision: Parent
|
||||||
label_child_revision: Child
|
label_child_revision: Child
|
||||||
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
|
||||||
|
|||||||
@@ -624,7 +624,9 @@ uk:
|
|||||||
default_role_manager: Менеджер
|
default_role_manager: Менеджер
|
||||||
default_role_developer: Розробник
|
default_role_developer: Розробник
|
||||||
default_role_reporter: Репортер
|
default_role_reporter: Репортер
|
||||||
звітів default_tracker_bug: Помилка
|
# default_tracker_bug: Bug
|
||||||
|
# звітів default_tracker_bug: Помилка
|
||||||
|
default_tracker_bug: Помилка
|
||||||
default_tracker_feature: Властивість
|
default_tracker_feature: Властивість
|
||||||
default_tracker_support: Підтримка
|
default_tracker_support: Підтримка
|
||||||
default_issue_status_new: Новий
|
default_issue_status_new: Новий
|
||||||
@@ -663,7 +665,6 @@ uk:
|
|||||||
label_file_added: File added
|
label_file_added: File added
|
||||||
label_more: More
|
label_more: More
|
||||||
field_default_value: Default value
|
field_default_value: Default value
|
||||||
default_tracker_bug: Bug
|
|
||||||
label_scm: SCM
|
label_scm: SCM
|
||||||
label_general: General
|
label_general: General
|
||||||
button_update: Update
|
button_update: Update
|
||||||
|
|||||||
@@ -1002,9 +1002,9 @@ zh:
|
|||||||
label_child_revision: 子修订
|
label_child_revision: 子修订
|
||||||
error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。
|
error_scm_annotate_big_text_file: 输入文本内容超长,无法输入。
|
||||||
setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期
|
setting_default_issue_start_date_to_creation_date: 使用当前日期作为新问题的开始日期
|
||||||
button_edit_section: Edit this section
|
button_edit_section: 编辑此区域
|
||||||
setting_repositories_encodings: Attachments and repositories encodings
|
setting_repositories_encodings: 附件和版本库编码
|
||||||
description_all_columns: All Columns
|
description_all_columns: 所有列
|
||||||
button_export: Export
|
button_export: 导出
|
||||||
label_export_options: "%{export_format} export options"
|
label_export_options: "%{export_format} 导出选项"
|
||||||
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
|
error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size})
|
||||||
|
|||||||
+1
-1
@@ -80,7 +80,7 @@ ActionController::Routing::Routes.draw do |map|
|
|||||||
map.resources :queries, :except => [:show]
|
map.resources :queries, :except => [:show]
|
||||||
|
|
||||||
# Misc issue routes. TODO: move into resources
|
# Misc issue routes. TODO: move into resources
|
||||||
map.auto_complete_issues '/issues/auto_complete', :controller => 'auto_completes', :action => 'issues'
|
map.auto_complete_issues '/issues/auto_complete', :controller => 'auto_completes', :action => 'issues', :conditions => { :method => :get }
|
||||||
map.preview_issue '/issues/preview/:id', :controller => 'previews', :action => 'issue' # TODO: would look nicer as /issues/:id/preview
|
map.preview_issue '/issues/preview/:id', :controller => 'previews', :action => 'issue' # TODO: would look nicer as /issues/:id/preview
|
||||||
map.issues_context_menu '/issues/context_menu', :controller => 'context_menus', :action => 'issues'
|
map.issues_context_menu '/issues/context_menu', :controller => 'context_menus', :action => 'issues'
|
||||||
map.issue_changes '/issues/changes', :controller => 'journals', :action => 'index'
|
map.issue_changes '/issues/changes', :controller => 'journals', :action => 'index'
|
||||||
|
|||||||
+150
-1
@@ -1,9 +1,158 @@
|
|||||||
== Redmine changelog
|
== Redmine changelog
|
||||||
|
|
||||||
Redmine - project management software
|
Redmine - project management software
|
||||||
Copyright (C) 2006-2011 Jean-Philippe Lang
|
Copyright (C) 2006-2012 Jean-Philippe Lang
|
||||||
http://www.redmine.org/
|
http://www.redmine.org/
|
||||||
|
|
||||||
|
== 2012-04-14 v1.3.3
|
||||||
|
|
||||||
|
* Defect #10505: Error when exporting to PDF with NoMethodError (undefined method `downcase' for nil:NilClass)
|
||||||
|
* Defect #10554: Defect symbols when exporting tasks in pdf
|
||||||
|
* Defect #10564: Unable to change locked, sticky flags and board when editing a message
|
||||||
|
* Defect #10591: Dutch "label_file_added" translation is wrong
|
||||||
|
* Defect #10622: "Default administrator account changed" is always true
|
||||||
|
* Patch #10555: rake redmine:send_reminders aborted if issue assigned to group
|
||||||
|
* Patch #10611: Simplified Chinese translations for 1.3-stable
|
||||||
|
|
||||||
|
== 2012-03-11 v1.3.2
|
||||||
|
|
||||||
|
* Defect #8194: {{toc}} uses identical anchors for subsections with the same name
|
||||||
|
* Defect #9143: Partial diff comparison should be done on actual code, not on html
|
||||||
|
* Defect #9523: {{toc}} does not display headers with @ code markup
|
||||||
|
* Defect #9815: Release 1.3.0 does not detect rubytree with rubgems 1.8
|
||||||
|
* Defect #10053: undefined method `<=>' for nil:NilClass when accessing the settings of a project
|
||||||
|
* Defect #10135: ActionView::TemplateError (can't convert Fixnum into String)
|
||||||
|
* Defect #10193: Unappropriate icons in highlighted code block
|
||||||
|
* Defect #10199: No wiki section edit when title contains code
|
||||||
|
* Defect #10218: Error when creating a project with a version custom field
|
||||||
|
* Defect #10241: "get version by ID" fails with "401 not authorized" error when using API access key
|
||||||
|
* Defect #10284: Note added by commit from a subproject does not contain project identifier
|
||||||
|
* Defect #10374: User list is empty when adding users to project / group if remaining users are added late
|
||||||
|
* Defect #10390: Mass assignment security vulnerability
|
||||||
|
* Patch #8413: Confirmation message before deleting a relationship
|
||||||
|
* Patch #10160: Bulgarian translation (r8777)
|
||||||
|
* Patch #10242: Migrate Redmine.pm from Digest::Sha1 to Digest::Sha
|
||||||
|
* Patch #10258: Italian translation for 1.3-stable
|
||||||
|
|
||||||
|
== 2012-02-06 v1.3.1
|
||||||
|
|
||||||
|
* Defect #9775: app/views/repository/_revision_graph.html.erb sets window.onload directly..
|
||||||
|
* Defect #9792: Ruby 1.9: [v1.3.0] Error: incompatible character encodings for it translation on Calendar page
|
||||||
|
* Defect #9793: Bad spacing between numbered list and heading (recently broken).
|
||||||
|
* Defect #9795: Unrelated error message when creating a group with an invalid name
|
||||||
|
* Defect #9832: Revision graph height should depend on height of rows in revisions table
|
||||||
|
* Defect #9937: Repository settings are not saved when all SCM are disabled
|
||||||
|
* Defect #9961: Ukrainian "default_tracker_bug" is wrong
|
||||||
|
* Defect #10013: Rest API - Create Version -> Internal server error 500
|
||||||
|
* Defect #10115: Javascript error - Can't attach more than 1 file on IE 6 and 7
|
||||||
|
* Defect #10130: Broken italic text style in edited comment preview
|
||||||
|
* Defect #10152: Attachment diff type is not saved in user preference
|
||||||
|
* Feature #9943: Arabic translation
|
||||||
|
* Patch #9874: pt-BR translation updates
|
||||||
|
* Patch #9922: Spanish translation updated
|
||||||
|
* Patch #10137: Korean language file ko.yml updated to Redmine 1.3.0
|
||||||
|
|
||||||
|
== 2011-12-10 v1.3.0
|
||||||
|
|
||||||
|
* Defect #2109: Context menu is being submitted twice per right click
|
||||||
|
* Defect #7717: MailHandler user creation for unknown_user impossible due to diverging length-limits of login and email fields
|
||||||
|
* Defect #7917: Creating users via email fails if user real name containes special chars
|
||||||
|
* Defect #7966: MailHandler does not include JournalDetail for attached files
|
||||||
|
* Defect #8368: Bad decimal separator in time entry CSV
|
||||||
|
* Defect #8371: MySQL error when filtering a custom field using the REST api
|
||||||
|
* Defect #8549: Export CSV has character encoding error
|
||||||
|
* Defect #8573: Do not show inactive Enumerations where not needed
|
||||||
|
* Defect #8611: rake/rdoctask is deprecated
|
||||||
|
* Defect #8751: Email notification: bug, when number of recipients more then 8
|
||||||
|
* Defect #8894: Private issues - make it more obvious in the UI?
|
||||||
|
* Defect #8994: Hardcoded French string "anonyme"
|
||||||
|
* Defect #9043: Hardcoded string "diff" in Wiki#show and Repositories_Helper
|
||||||
|
* Defect #9051: wrong "text_issue_added" in russian translation.
|
||||||
|
* Defect #9108: Custom query not saving status filter
|
||||||
|
* Defect #9252: Regression: application title escaped 2 times
|
||||||
|
* Defect #9264: Bad Portuguese translation
|
||||||
|
* Defect #9470: News list is missing Avatars
|
||||||
|
* Defect #9471: Inline markup broken in Wiki link labels
|
||||||
|
* Defect #9489: Label all input field and control tags
|
||||||
|
* Defect #9534: Precedence: bulk email header is non standard and discouraged
|
||||||
|
* Defect #9540: Issue filter by assigned_to_role is not project specific
|
||||||
|
* Defect #9619: Time zone ignored when logging time while editing ticket
|
||||||
|
* Defect #9638: Inconsistent image filename extensions
|
||||||
|
* Defect #9669: Issue list doesn't sort assignees/authors regarding user display format
|
||||||
|
* Defect #9672: Message-quoting in forums module broken
|
||||||
|
* Defect #9719: Filtering by numeric custom field types broken after update to master
|
||||||
|
* Defect #9724: Can't remote add new categories
|
||||||
|
* Defect #9738: Setting of cross-project custom query is not remembered inside project
|
||||||
|
* Defect #9748: Error about configuration.yml validness should mention file path
|
||||||
|
* Feature #69: Textilized description in PDF
|
||||||
|
* Feature #401: Add pdf export for WIKI page
|
||||||
|
* Feature #1567: Make author column sortable and groupable
|
||||||
|
* Feature #2222: Single section edit.
|
||||||
|
* Feature #2269: Default issue start date should become configurable.
|
||||||
|
* Feature #2371: character encoding for attachment file
|
||||||
|
* Feature #2964: Ability to assign issues to groups
|
||||||
|
* Feature #3033: Bug Reporting: Using "Create and continue" should show bug id of saved bug
|
||||||
|
* Feature #3261: support attachment images in PDF export
|
||||||
|
* Feature #4264: Update CodeRay to 1.0 final
|
||||||
|
* Feature #4324: Redmine renames my files, it shouldn't.
|
||||||
|
* Feature #4729: Add Date-Based Filters for Issues List
|
||||||
|
* Feature #4742: CSV export: option to export selected or all columns
|
||||||
|
* Feature #4976: Allow rdm-mailhandler to read the API key from a file
|
||||||
|
* Feature #5501: Git: Mercurial: Adding visual merge/branch history to repository view
|
||||||
|
* Feature #5634: Export issue to PDF does not include Subtasks and Related Issues
|
||||||
|
* Feature #5670: Cancel option for file upload
|
||||||
|
* Feature #5737: Custom Queries available through the REST Api
|
||||||
|
* Feature #6180: Searchable custom fields do not provide adequate operators
|
||||||
|
* Feature #6954: Filter from date to date
|
||||||
|
* Feature #7180: List of statuses in REST API
|
||||||
|
* Feature #7181: List of trackers in REST API
|
||||||
|
* Feature #7366: REST API for Issue Relations
|
||||||
|
* Feature #7403: REST API for Versions
|
||||||
|
* Feature #7671: REST API for reading attachments
|
||||||
|
* Feature #7832: Ability to assign issue categories to groups
|
||||||
|
* Feature #8420: Consider removing #7013 workaround
|
||||||
|
* Feature #9196: Improve logging in MailHandler when user creation fails
|
||||||
|
* Feature #9496: Adds an option in mailhandler to disable server certificate verification
|
||||||
|
* Feature #9553: CRUD operations for "Issue categories" in REST API
|
||||||
|
* Feature #9593: HTML title should be reordered
|
||||||
|
* Feature #9600: Wiki links for news and forums
|
||||||
|
* Feature #9607: Filter for issues without start date (or any another field based on date type)
|
||||||
|
* Feature #9609: Upgrade to Rails 2.3.14
|
||||||
|
* Feature #9612: "side by side" and "inline" patch view for attachments
|
||||||
|
* Feature #9667: Check attachment size before upload
|
||||||
|
* Feature #9690: Link in notification pointing to the actual update
|
||||||
|
* Feature #9720: Add note number for single issue's PDF
|
||||||
|
* Patch #8617: Indent subject of subtask ticket in exported issues PDF
|
||||||
|
* Patch #8778: Traditional Chinese 'issue' translation change
|
||||||
|
* Patch #9053: Fix up Russian translation
|
||||||
|
* Patch #9129: Improve wording of Git repository note at project setting
|
||||||
|
* Patch #9148: Better handling of field_due_date italian translation
|
||||||
|
* Patch #9273: Fix typos in russian localization
|
||||||
|
* Patch #9484: Limit SCM annotate to text files under the maximum file size for viewing
|
||||||
|
* Patch #9659: Indexing rows in auth_sources/index view
|
||||||
|
* Patch #9692: Fix Textilized description in PDF for CodeRay
|
||||||
|
|
||||||
|
== 2011-12-10 v1.2.3
|
||||||
|
|
||||||
|
* Defect #8707: Reposman: wrong constant name
|
||||||
|
* Defect #8809: Table in timelog report overflows
|
||||||
|
* Defect #9055: Version files in Files module cannot be downloaded if issue tracking is disabled
|
||||||
|
* Defect #9137: db:encrypt fails to handle repositories with blank password
|
||||||
|
* Defect #9394: Custom date field only validating on regex and not a valid date
|
||||||
|
* Defect #9405: Any user with :log_time permission can edit time entries via context menu
|
||||||
|
* Defect #9448: The attached images are not shown in documents
|
||||||
|
* Defect #9520: Copied private query not visible after project copy
|
||||||
|
* Defect #9552: Error when reading ciphered text from the database without cipher key configured
|
||||||
|
* Defect #9566: Redmine.pm considers all projects private when login_required is enabled
|
||||||
|
* Defect #9567: Redmine.pm potential security issue with cache credential enabled and subversion
|
||||||
|
* Defect #9577: Deleting a subtasks doesn't update parent's rgt & lft values
|
||||||
|
* Defect #9597: Broken version links in wiki annotate history
|
||||||
|
* Defect #9682: Wiki HTML Export only useful when Access history is accessible
|
||||||
|
* Defect #9737: Custom values deleted before issue submit
|
||||||
|
* Defect #9741: calendar-hr.js (Croatian) is not UTF-8
|
||||||
|
* Patch #9558: Simplified Chinese translation for 1.2.2 updated
|
||||||
|
* Patch #9695: Bulgarian translation (r7942)
|
||||||
|
|
||||||
== 2011-11-11 v1.2.2
|
== 2011-11-11 v1.2.2
|
||||||
|
|
||||||
* Defect #3276: Incorrect handling of anchors in Wiki to HTML export
|
* Defect #3276: Incorrect handling of anchors in Wiki to HTML export
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ use strict;
|
|||||||
use warnings FATAL => 'all', NONFATAL => 'redefine';
|
use warnings FATAL => 'all', NONFATAL => 'redefine';
|
||||||
|
|
||||||
use DBI;
|
use DBI;
|
||||||
use Digest::SHA1;
|
use Digest::SHA;
|
||||||
# optional module for LDAP authentication
|
# optional module for LDAP authentication
|
||||||
my $CanUseLDAPAuth = eval("use Authen::Simple::LDAP; 1");
|
my $CanUseLDAPAuth = eval("use Authen::Simple::LDAP; 1");
|
||||||
|
|
||||||
@@ -327,7 +327,7 @@ sub is_member {
|
|||||||
my $dbh = connect_database($r);
|
my $dbh = connect_database($r);
|
||||||
my $project_id = get_project_identifier($r);
|
my $project_id = get_project_identifier($r);
|
||||||
|
|
||||||
my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
|
my $pass_digest = Digest::SHA::sha1_hex($redmine_pass);
|
||||||
|
|
||||||
my $access_mode = defined $read_only_methods{$r->method} ? "R" : "W";
|
my $access_mode = defined $read_only_methods{$r->method} ? "R" : "W";
|
||||||
|
|
||||||
@@ -346,7 +346,7 @@ sub is_member {
|
|||||||
|
|
||||||
unless ($auth_source_id) {
|
unless ($auth_source_id) {
|
||||||
my $method = $r->method;
|
my $method = $r->method;
|
||||||
my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest);
|
my $salted_password = Digest::SHA::sha1_hex($salt.$pass_digest);
|
||||||
if ($hashed_password eq $salted_password && (($access_mode eq "R" && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
|
if ($hashed_password eq $salted_password && (($access_mode eq "R" && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
|
||||||
$ret = 1;
|
$ret = 1;
|
||||||
last;
|
last;
|
||||||
|
|||||||
+3
-3
@@ -340,9 +340,9 @@ class RedCloth3 < String
|
|||||||
#
|
#
|
||||||
A_HLGN = /(?:(?:<>|<|>|\=|[()]+)+)/
|
A_HLGN = /(?:(?:<>|<|>|\=|[()]+)+)/
|
||||||
A_VLGN = /[\-^~]/
|
A_VLGN = /[\-^~]/
|
||||||
C_CLAS = '(?:\([^)]+\))'
|
C_CLAS = '(?:\([^")]+\))'
|
||||||
C_LNGE = '(?:\[[^\[\]]+\])'
|
C_LNGE = '(?:\[[^"\[\]]+\])'
|
||||||
C_STYL = '(?:\{[^}]+\})'
|
C_STYL = '(?:\{[^"}]+\})'
|
||||||
S_CSPN = '(?:\\\\\d+)'
|
S_CSPN = '(?:\\\\\d+)'
|
||||||
S_RSPN = '(?:/\d+)'
|
S_RSPN = '(?:/\d+)'
|
||||||
A = "(?:#{A_HLGN}?#{A_VLGN}?|#{A_VLGN}?#{A_HLGN}?)"
|
A = "(?:#{A_HLGN}?#{A_VLGN}?|#{A_VLGN}?#{A_HLGN}?)"
|
||||||
|
|||||||
@@ -79,7 +79,13 @@ module Redmine
|
|||||||
private
|
private
|
||||||
|
|
||||||
def load_from_yaml(filename, env)
|
def load_from_yaml(filename, env)
|
||||||
yaml = YAML::load_file(filename)
|
yaml = nil
|
||||||
|
begin
|
||||||
|
yaml = YAML::load_file(filename)
|
||||||
|
rescue ArgumentError
|
||||||
|
$stderr.puts "Your Redmine configuration file located at #{filename} is not a valid YAML file and could not be loaded."
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
conf = {}
|
conf = {}
|
||||||
if yaml.is_a?(Hash)
|
if yaml.is_a?(Hash)
|
||||||
if yaml['default']
|
if yaml['default']
|
||||||
@@ -89,7 +95,7 @@ module Redmine
|
|||||||
conf.merge!(yaml[env])
|
conf.merge!(yaml[env])
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
$stderr.puts "#{filename} is not a valid Redmine configuration file"
|
$stderr.puts "Your Redmine configuration file located at #{filename} is not a valid Redmine configuration file."
|
||||||
exit 1
|
exit 1
|
||||||
end
|
end
|
||||||
conf
|
conf
|
||||||
|
|||||||
@@ -452,12 +452,16 @@ module Redmine
|
|||||||
pdf.SetFontStyle('B',9)
|
pdf.SetFontStyle('B',9)
|
||||||
pdf.RDMCell(190,5, l(:label_history), "B")
|
pdf.RDMCell(190,5, l(:label_history), "B")
|
||||||
pdf.Ln
|
pdf.Ln
|
||||||
|
indice = 0
|
||||||
for journal in issue.journals.find(
|
for journal in issue.journals.find(
|
||||||
:all, :include => [:user, :details],
|
:all, :include => [:user, :details],
|
||||||
:order => "#{Journal.table_name}.created_on ASC")
|
:order => "#{Journal.table_name}.created_on ASC")
|
||||||
|
indice = indice + 1
|
||||||
pdf.SetFontStyle('B',8)
|
pdf.SetFontStyle('B',8)
|
||||||
pdf.RDMCell(190,5,
|
pdf.RDMCell(190,5,
|
||||||
format_time(journal.created_on) + " - " + journal.user.name)
|
"#" + indice.to_s +
|
||||||
|
" - " + format_time(journal.created_on) +
|
||||||
|
" - " + journal.user.name)
|
||||||
pdf.Ln
|
pdf.Ln
|
||||||
pdf.SetFontStyle('I',8)
|
pdf.SetFontStyle('I',8)
|
||||||
for detail in journal.details
|
for detail in journal.details
|
||||||
|
|||||||
+25
-24
@@ -112,11 +112,6 @@ module Redmine
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Escape the HTML for the diff
|
|
||||||
def escapeHTML(line)
|
|
||||||
CGI.escapeHTML(line)
|
|
||||||
end
|
|
||||||
|
|
||||||
def diff_for_added_line
|
def diff_for_added_line
|
||||||
if @type == 'sbs' && @removed > 0 && @added < @removed
|
if @type == 'sbs' && @removed > 0 && @added < @removed
|
||||||
self[-(@removed - @added)]
|
self[-(@removed - @added)]
|
||||||
@@ -130,7 +125,7 @@ module Redmine
|
|||||||
def parse_line(line, type="inline")
|
def parse_line(line, type="inline")
|
||||||
if line[0, 1] == "+"
|
if line[0, 1] == "+"
|
||||||
diff = diff_for_added_line
|
diff = diff_for_added_line
|
||||||
diff.line_right = escapeHTML line[1..-1]
|
diff.line_right = line[1..-1]
|
||||||
diff.nb_line_right = @line_num_r
|
diff.nb_line_right = @line_num_r
|
||||||
diff.type_diff_right = 'diff_in'
|
diff.type_diff_right = 'diff_in'
|
||||||
@line_num_r += 1
|
@line_num_r += 1
|
||||||
@@ -138,7 +133,7 @@ module Redmine
|
|||||||
true
|
true
|
||||||
elsif line[0, 1] == "-"
|
elsif line[0, 1] == "-"
|
||||||
diff = Diff.new
|
diff = Diff.new
|
||||||
diff.line_left = escapeHTML line[1..-1]
|
diff.line_left = line[1..-1]
|
||||||
diff.nb_line_left = @line_num_l
|
diff.nb_line_left = @line_num_l
|
||||||
diff.type_diff_left = 'diff_out'
|
diff.type_diff_left = 'diff_out'
|
||||||
self << diff
|
self << diff
|
||||||
@@ -149,9 +144,9 @@ module Redmine
|
|||||||
write_offsets
|
write_offsets
|
||||||
if line[0, 1] =~ /\s/
|
if line[0, 1] =~ /\s/
|
||||||
diff = Diff.new
|
diff = Diff.new
|
||||||
diff.line_right = escapeHTML line[1..-1]
|
diff.line_right = line[1..-1]
|
||||||
diff.nb_line_right = @line_num_r
|
diff.nb_line_right = @line_num_r
|
||||||
diff.line_left = escapeHTML line[1..-1]
|
diff.line_left = line[1..-1]
|
||||||
diff.nb_line_left = @line_num_l
|
diff.nb_line_left = @line_num_l
|
||||||
self << diff
|
self << diff
|
||||||
@line_num_l += 1
|
@line_num_l += 1
|
||||||
@@ -224,27 +219,15 @@ module Redmine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def html_line_left
|
def html_line_left
|
||||||
if offsets
|
line_to_html(line_left, offsets)
|
||||||
line_left.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
|
|
||||||
else
|
|
||||||
line_left
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def html_line_right
|
def html_line_right
|
||||||
if offsets
|
line_to_html(line_right, offsets)
|
||||||
line_right.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
|
|
||||||
else
|
|
||||||
line_right
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def html_line
|
def html_line
|
||||||
if offsets
|
line_to_html(line, offsets)
|
||||||
line.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
|
|
||||||
else
|
|
||||||
line
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def inspect
|
def inspect
|
||||||
@@ -254,5 +237,23 @@ module Redmine
|
|||||||
puts self.nb_line_right
|
puts self.nb_line_right
|
||||||
puts self.line_right
|
puts self.line_right
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def line_to_html(line, offsets)
|
||||||
|
if offsets
|
||||||
|
s = ''
|
||||||
|
unless offsets.first == 0
|
||||||
|
s << CGI.escapeHTML(line[0..offsets.first-1])
|
||||||
|
end
|
||||||
|
s << '<span>' + CGI.escapeHTML(line[offsets.first..offsets.last]) + '</span>'
|
||||||
|
unless offsets.last == -1
|
||||||
|
s << CGI.escapeHTML(line[offsets.last+1..-1])
|
||||||
|
end
|
||||||
|
s
|
||||||
|
else
|
||||||
|
CGI.escapeHTML(line)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ require 'rexml/document'
|
|||||||
module Redmine
|
module Redmine
|
||||||
module VERSION #:nodoc:
|
module VERSION #:nodoc:
|
||||||
MAJOR = 1
|
MAJOR = 1
|
||||||
MINOR = 2
|
MINOR = 3
|
||||||
TINY = 2
|
TINY = 3
|
||||||
|
|
||||||
# Branch values:
|
# Branch values:
|
||||||
# * official release: nil
|
# * official release: nil
|
||||||
# * stable branch: stable
|
# * stable branch: stable
|
||||||
# * trunk: devel
|
# * trunk: devel
|
||||||
BRANCH = 'devel'
|
BRANCH = 'stable'
|
||||||
|
|
||||||
def self.revision
|
def self.revision
|
||||||
revision = nil
|
revision = nil
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ module Redmine
|
|||||||
end
|
end
|
||||||
|
|
||||||
desc "Displays a list of all available macros, including description if available."
|
desc "Displays a list of all available macros, including description if available."
|
||||||
macro :macro_list do
|
macro :macro_list do |obj, args|
|
||||||
out = ''
|
out = ''
|
||||||
@@available_macros.keys.collect(&:to_s).sort.each do |macro|
|
@@available_macros.keys.collect(&:to_s).sort.each do |macro|
|
||||||
out << content_tag('dt', content_tag('code', macro))
|
out << content_tag('dt', content_tag('code', macro))
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ function addFileField() {
|
|||||||
var fields = $('attachments_fields');
|
var fields = $('attachments_fields');
|
||||||
if (fields.childElements().length >= 10) return false;
|
if (fields.childElements().length >= 10) return false;
|
||||||
fileFieldCount++;
|
fileFieldCount++;
|
||||||
var s = document.createElement("span");
|
var s = new Element('span');
|
||||||
s.update(fields.down('span').innerHTML);
|
s.update(fields.down('span').innerHTML);
|
||||||
s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
|
s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
|
||||||
s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
|
s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
|
||||||
@@ -293,6 +293,7 @@ function observeParentIssueField(url) {
|
|||||||
{ minChars: 3,
|
{ minChars: 3,
|
||||||
frequency: 0.5,
|
frequency: 0.5,
|
||||||
paramName: 'q',
|
paramName: 'q',
|
||||||
|
method: 'get',
|
||||||
updateElement: function(value) {
|
updateElement: function(value) {
|
||||||
document.getElementById('issue_parent_issue_id').value = value.id;
|
document.getElementById('issue_parent_issue_id').value = value.id;
|
||||||
}});
|
}});
|
||||||
@@ -305,6 +306,7 @@ function observeRelatedIssueField(url) {
|
|||||||
{ minChars: 3,
|
{ minChars: 3,
|
||||||
frequency: 0.5,
|
frequency: 0.5,
|
||||||
paramName: 'q',
|
paramName: 'q',
|
||||||
|
method: 'get',
|
||||||
updateElement: function(value) {
|
updateElement: function(value) {
|
||||||
document.getElementById('relation_issue_to_id').value = value.id;
|
document.getElementById('relation_issue_to_id').value = value.id;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
// Calendar AR language
|
||||||
|
// Author: SmartData.com.sa
|
||||||
|
// Encoding: any
|
||||||
|
// Distributed under the same terms as the calendar itself.
|
||||||
|
|
||||||
|
// For translators: please use UTF-8 if possible. We strongly believe that
|
||||||
|
// Unicode is the answer to a real internationalized world. Also please
|
||||||
|
// include your contact information in the header, as can be seen above.
|
||||||
|
|
||||||
|
// full day names
|
||||||
|
Calendar._DN = new Array
|
||||||
|
("الاحد",
|
||||||
|
"الاثنين",
|
||||||
|
"الثلاثاء",
|
||||||
|
"الاربعاء",
|
||||||
|
"الخميس",
|
||||||
|
"الجمعة",
|
||||||
|
"السبت",
|
||||||
|
"الاحد");
|
||||||
|
|
||||||
|
// Please note that the following array of short day names (and the same goes
|
||||||
|
// for short month names, _SMN) isn't absolutely necessary. We give it here
|
||||||
|
// for exemplification on how one can customize the short day names, but if
|
||||||
|
// they are simply the first N letters of the full name you can simply say:
|
||||||
|
//
|
||||||
|
// Calendar._SDN_len = N; // short day name length
|
||||||
|
// Calendar._SMN_len = N; // short month name length
|
||||||
|
//
|
||||||
|
// If N = 3 then this is not needed either since we assume a value of 3 if not
|
||||||
|
// present, to be compatible with translation files that were written before
|
||||||
|
// this feature.
|
||||||
|
|
||||||
|
// short day names
|
||||||
|
Calendar._SDN = new Array
|
||||||
|
("أح",
|
||||||
|
"إث",
|
||||||
|
"ث",
|
||||||
|
"أر",
|
||||||
|
"خ",
|
||||||
|
"ج",
|
||||||
|
"س",
|
||||||
|
"أح");
|
||||||
|
|
||||||
|
// First day of the week. "0" means display Sunday first, "1" means display
|
||||||
|
// Monday first, etc.
|
||||||
|
Calendar._FD = 0;
|
||||||
|
|
||||||
|
// full month names
|
||||||
|
Calendar._MN = new Array
|
||||||
|
("كانون الثاني",
|
||||||
|
"شباط",
|
||||||
|
"حزيران",
|
||||||
|
"آذار",
|
||||||
|
"أيار",
|
||||||
|
"نيسان",
|
||||||
|
"تموز",
|
||||||
|
"آب",
|
||||||
|
"أيلول",
|
||||||
|
"تشرين الاول",
|
||||||
|
"تشرين الثاني",
|
||||||
|
"كانون الاول");
|
||||||
|
|
||||||
|
// short month names
|
||||||
|
Calendar._SMN = new Array
|
||||||
|
("كانون الثاني",
|
||||||
|
"شباط",
|
||||||
|
"حزيران",
|
||||||
|
"آذار",
|
||||||
|
"أيار",
|
||||||
|
"نيسان",
|
||||||
|
"تموز",
|
||||||
|
"آب",
|
||||||
|
"أيلول",
|
||||||
|
"تشرين الاول",
|
||||||
|
"تشرين الثاني",
|
||||||
|
"كانون الاول");
|
||||||
|
|
||||||
|
// tooltips
|
||||||
|
Calendar._TT = {};
|
||||||
|
Calendar._TT["INFO"] = "حول التقويم";
|
||||||
|
|
||||||
|
Calendar._TT["ABOUT"] =
|
||||||
|
"اختيار الوقت والتاريخ\n" +
|
||||||
|
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
|
||||||
|
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
|
||||||
|
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
|
||||||
|
"\n\n" +
|
||||||
|
"اختيار التاريخ:\n" +
|
||||||
|
"- استخدم هذه الازرار \xab, \xbb لاختيار السنة\n" +
|
||||||
|
"- استخدم هذه الازرار " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " لاختيار الشهر\n" +
|
||||||
|
"- استمر في النقر فوق الازرار للتظليل السريع.";
|
||||||
|
Calendar._TT["ABOUT_TIME"] = "\n\n" +
|
||||||
|
"اختيار الوقت:\n" +
|
||||||
|
"- انقر على اي جزء من اجزاء الوقت لزيادته\n" +
|
||||||
|
"- لانقاصهShiftاو انقر مع الضغط على مفتاح \n" +
|
||||||
|
"- او انقر واسحب للتظليل السريع.";
|
||||||
|
|
||||||
|
Calendar._TT["PREV_YEAR"] = "السنة السابقة";
|
||||||
|
Calendar._TT["PREV_MONTH"] = "الشهر السابق";
|
||||||
|
Calendar._TT["GO_TODAY"] = "اذهب لليوم";
|
||||||
|
Calendar._TT["NEXT_MONTH"] = "الشهر القادم";
|
||||||
|
Calendar._TT["NEXT_YEAR"] = "السنة القادمة";
|
||||||
|
Calendar._TT["SEL_DATE"] = "اختر التاريخ";
|
||||||
|
Calendar._TT["DRAG_TO_MOVE"] = "اسحب للتتحرك";
|
||||||
|
Calendar._TT["PART_TODAY"] = "اليوم";
|
||||||
|
|
||||||
|
// the following is to inform that "%s" is to be the first day of week
|
||||||
|
// %s will be replaced with the day name.
|
||||||
|
Calendar._TT["DAY_FIRST"] = " اولا%sاعرض ";
|
||||||
|
|
||||||
|
// This may be locale-dependent. It specifies the week-end days, as an array
|
||||||
|
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
|
||||||
|
// means Monday, etc.
|
||||||
|
Calendar._TT["WEEKEND"] = "5,6";
|
||||||
|
|
||||||
|
Calendar._TT["CLOSE"] = "مغلق";
|
||||||
|
Calendar._TT["TODAY"] = "اليوم";
|
||||||
|
Calendar._TT["TIME_PART"] = "انقر او اسحب لتغير القيمة";
|
||||||
|
|
||||||
|
// date formats
|
||||||
|
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
|
||||||
|
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
|
||||||
|
|
||||||
|
Calendar._TT["WK"] = "رقم الاسبوع";
|
||||||
|
Calendar._TT["TIME"] = "الوقت:";
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user