1
0
mirror of https://github.com/meineerde/redmine.git synced 2026-03-11 11:43:08 +00:00

Merge branch 'master' of git://github.com/edavis10/redmine

This commit is contained in:
Holger Just 2010-08-08 12:23:01 +02:00
commit f8025eca12
82 changed files with 417 additions and 262 deletions

View File

@ -83,9 +83,9 @@ class AccountController < ApplicationController
else
@user = User.new(params[:user])
@user.admin = false
@user.status = User::STATUS_REGISTERED
@user.register
if session[:auth_source_registration]
@user.status = User::STATUS_ACTIVE
@user.activate
@user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save
@ -116,8 +116,8 @@ class AccountController < ApplicationController
token = Token.find_by_action_and_value('register', params[:token])
redirect_to(home_url) && return unless token and !token.expired?
user = token.user
redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
user.status = User::STATUS_ACTIVE
redirect_to(home_url) && return unless user.registered?
user.activate
if user.save
token.destroy
flash[:notice] = l(:notice_account_activated)
@ -170,7 +170,7 @@ class AccountController < ApplicationController
user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password
user.status = User::STATUS_REGISTERED
user.register
case Setting.self_registration
when '1'
@ -241,7 +241,7 @@ class AccountController < ApplicationController
# Pass a block for behavior when a user fails to save
def register_automatically(user, &block)
# Automatic activation
user.status = User::STATUS_ACTIVE
user.activate
user.last_login_on = Time.now
if user.save
self.logged_user = user

View File

@ -218,6 +218,10 @@ class ApplicationController < ActionController::Base
end
end
def back_url
params[:back_url] || request.env['HTTP_REFERER']
end
def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank?

View File

@ -20,7 +20,7 @@ class IssuesController < ApplicationController
default_search_scope :issues
before_filter :find_issue, :only => [:show, :edit, :update, :reply]
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
before_filter :find_issues, :only => [:bulk_edit, :move, :perform_move, :destroy]
before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete]
before_filter :authorize, :except => [:index, :changes, :preview, :context_menu]
before_filter :find_optional_project, :only => [:index, :changes]
@ -264,15 +264,9 @@ class IssuesController < ApplicationController
moved_issues = []
@issues.each do |issue|
issue.reload
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
else
unsaved_issue_ids << issue.id
@ -293,6 +287,11 @@ class IssuesController < ApplicationController
end
render :layout => false if request.xhr?
end
# TODO: more descriptive name? move to separate controller like IssueMovesController?
def perform_move
move
end
def destroy
@hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f
@ -349,7 +348,7 @@ class IssuesController < ApplicationController
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = params[:back_url] || request.env['HTTP_REFERER']
@back = back_url
render :layout => false
end
@ -485,4 +484,14 @@ private
return false
end
end
def extract_changed_attributes_for_move(params)
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
changed_attributes
end
end

View File

@ -103,6 +103,23 @@ module ApplicationHelper
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
end
# Generates a link to a project if active
# Examples:
#
# link_to_project(project) # => link to the specified project overview
# link_to_project(project, :action=>'settings') # => link to project settings
# link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options
# link_to_project(project, {}, :class => "project") # => html options with default url (project overview)
#
def link_to_project(project, options={}, html_options = nil)
if project.active?
url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
link_to(h(project), url, html_options)
else
h(project)
end
end
def toggle_link(name, id, options={})
onclick = "Element.toggle('#{id}'); "
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
@ -368,12 +385,12 @@ module ApplicationHelper
ancestors = (@project.root? ? [] : @project.ancestors.visible)
if ancestors.any?
root = ancestors.shift
b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root')
b << link_to_project(root, {:jump => current_menu_item}, :class => 'root')
if ancestors.size > 2
b << '&#8230;'
ancestors = ancestors[-2, 2]
end
b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') }
b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') }
end
b << h(@project)
b.join(' &#187; ')
@ -393,6 +410,19 @@ module ApplicationHelper
end
end
# Returns the theme, controller name, and action as css classes for the
# HTML body.
def body_css_classes
css = []
if theme = Redmine::Themes.theme(Setting.ui_theme)
css << 'theme-' + theme.name
end
css << 'controller-' + params[:controller]
css << 'action-' + params[:action]
css.join(' ')
end
def accesskey(s)
Redmine::AccessKeys.key_for s
end
@ -592,8 +622,7 @@ module ApplicationHelper
end
when 'project'
if p = Project.visible.find_by_id(oid)
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
end
end
elsif sep == ':'
@ -635,8 +664,7 @@ module ApplicationHelper
end
when 'project'
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
:class => 'project'
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
end
end
end

View File

@ -72,7 +72,7 @@ module ProjectsHelper
end
classes = (ancestors.empty? ? 'root' : 'child')
s << "<li class='#{classes}'><div class='#{classes}'>" +
link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
s << "</div>\n"
ancestors << project

View File

@ -50,7 +50,7 @@ module QueriesHelper
when 'User'
link_to_user value
when 'Project'
link_to(h(value), :controller => 'projects', :action => 'show', :id => value)
link_to_project value
when 'Version'
link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
when 'TrueClass'

View File

@ -80,7 +80,7 @@ class Mailer < ActionMailer::Base
def reminder(user, issues, days)
set_language_if_valid user.language
recipients user.mail
subject l(:mail_subject_reminder, issues.size)
subject l(:mail_subject_reminder, :count => issues.size, :days => days)
body :issues => issues,
:days => days,
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')

View File

@ -187,7 +187,7 @@ class Query < ActiveRecord::Base
if project
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
else
project_ids = User.current.projects.collect(&:id)
project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id)
if project_ids.any?
# members of the user's projects
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
@ -219,6 +219,12 @@ class Query < ActiveRecord::Base
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
# project filter
project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
["#{pre}#{p.name}",p.id.to_s]
end
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
end
@available_filters
end

View File

@ -164,6 +164,30 @@ class User < Principal
self.status == STATUS_LOCKED
end
def activate
self.status = STATUS_ACTIVE
end
def register
self.status = STATUS_REGISTERED
end
def lock
self.status = STATUS_LOCKED
end
def activate!
update_attribute(:status, STATUS_ACTIVE)
end
def register!
update_attribute(:status, STATUS_REGISTERED)
end
def lock!
update_attribute(:status, STATUS_LOCKED)
end
def check_password?(clear_password)
if auth_source_id.present?
auth_source.authenticate(self.login, clear_password)

View File

@ -1,20 +1,5 @@
<div id="admin-menu">
<ul>
<li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %></li>
<li><%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %></li>
<li><%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %></li>
<li><%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %></li>
<li><%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %></li>
<li><%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %></li>
<li><%= link_to l(:label_workflow), {:controller => 'workflows', :action => 'edit'}, :class => 'workflows' %></li>
<li><%= link_to l(:label_custom_field_plural), {:controller => 'custom_fields'}, :class => 'custom_fields' %></li>
<li><%= link_to l(:label_enumerations), {:controller => 'enumerations'}, :class => 'enumerations' %></li>
<li><%= link_to l(:label_settings), {:controller => 'settings'}, :class => 'settings' %></li>
<li><%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'server_authentication' %></li>
<% menu_items_for(:admin_menu) do |item| -%>
<li><%= link_to h(item.caption), item.url, item.html_options %></li>
<% end -%>
<li><%= link_to l(:label_plugins), {:controller => 'admin', :action => 'plugins'}, :class => 'plugins' %></li>
<li><%= link_to l(:label_information_plural), {:controller => 'admin', :action => 'info'}, :class => 'info' %></li>
</ul>
<ul>
<%= render_menu :admin_menu %>
</ul>
</div>

View File

@ -27,7 +27,7 @@
<tbody>
<% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %></td>
<td class="name"><%= link_to_project(project, :action => 'settings') %></td>
<td><%= textilizable project.short_description, :project => project %></td>
<td align="center"><%= checked_image project.is_public? %></td>
<td align="center"><%= format_date(project.created_on) %></td>

View File

@ -14,7 +14,7 @@
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
</td>
<td class="project"><%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %></td>
<td class="project"><%= link_to_project(issue.project) %></td>
<td class="tracker"><%=h issue.tracker %></td>
<td class="subject">
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)

View File

@ -1,6 +1,6 @@
<div class="contextual">
<% if authorize_for('issue_relations', 'new') %>
<%= toggle_link l(:button_add), 'new-relation-form'%>
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
<% end %>
</div>

View File

@ -6,7 +6,7 @@
<% end -%>
</ul>
<% form_tag({}, :id => 'move_form') do %>
<% form_tag({:action => 'perform_move'}, :id => 'move_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular">

View File

@ -19,7 +19,7 @@
<!-- page specific tags -->
<%= yield :header_tags -%>
</head>
<body>
<body class="<%= body_css_classes %>">
<div id="wrapper">
<div id="wrapper2">
<div id="top-menu">

View File

@ -1,4 +1,4 @@
<p><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %>
<p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
<br />

View File

@ -28,7 +28,7 @@
<p class="nodata"><%= l(:label_no_data) %></p>
<% else %>
<% @newss.each do |news| %>
<h3><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %>
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
<p class="author"><%= authoring news.created_on, news.author %></p>

View File

@ -2,14 +2,14 @@
<div class="box">
<!--[form:project]-->
<p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<p><%= f.text_field :name, :required => true, :maxlength => 30 %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<% unless @project.allowed_parents.compact.empty? %>
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
<% end %>
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen?, :maxlength => 20 %>
<% unless @project.identifier_frozen? %>
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
<% end %></p>

View File

@ -14,7 +14,9 @@
<% @user.memberships.each do |membership| %>
<% next if membership.new_record? %>
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
<td class="project"><%=h membership.project %></td>
<td class="project">
<%= link_to_project membership.project %>
</td>
<td class="roles">
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },

View File

@ -24,7 +24,7 @@
<h3><%=l(:label_project_plural)%></h3>
<ul>
<% for membership in @memberships %>
<li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
<li><%= link_to_project(membership.project) %>
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
<% end %>
</ul>

View File

@ -20,7 +20,7 @@
<% for project in @projects %>
<% @project = project %>
<li>
<%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
<%= link_to_project project %> (<%= format_time(project.created_on) %>)
<%= textilizable project.short_description, :project => project %>
</li>
<% end %>

View File

@ -704,7 +704,7 @@ bg:
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM

View File

@ -184,7 +184,7 @@ bs:
mail_body_account_information: Informacija o vašem korisničkom računu
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima"
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
gui_validation_error: 1 greška

View File

@ -166,7 +166,7 @@ ca:
mail_body_account_information: Informació del compte
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies"
mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies"
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
gui_validation_error: 1 error

View File

@ -710,7 +710,7 @@ cs:
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
label_and_its_subprojects: "{{value}} a jeho podprojekty"
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})"
text_user_wrote: "{{value}} napsal:"
label_duplicated_by: duplicated by
setting_enabled_scm: Povoleno SCM

View File

@ -791,7 +791,7 @@ da:
permission_browse_repository: Gennemse repository
permission_manage_repository: Administrér repository
permission_manage_members: Administrér medlemmer
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage"
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage ({{days}})"
permission_add_issue_notes: Tilføj noter
permission_edit_messages: Redigér beskeder
permission_view_issue_watchers: Se liste over overvågere

View File

@ -207,7 +207,7 @@ de:
mail_body_account_information: Ihre Konto-Informationen
mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung"
mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten Tagen abgegeben werden"
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten {{days}} Tagen abgegeben werden"
mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:"
mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt"
mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt."

View File

@ -171,7 +171,7 @@ el:
mail_body_account_information: Πληροφορίες του λογαριασμού σας
mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}"
mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:"
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες ημέρες"
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες {{days}} ημέρες"
mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:"
mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' "
mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}."

View File

@ -180,7 +180,7 @@ en-GB:
mail_body_account_information: Your account information
mail_subject_account_activation_request: "{{value}} account activation request"
mail_body_account_activation_request: "A new user ({{value}}) has registered. The account is pending your approval:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}."

View File

@ -183,7 +183,7 @@ en:
mail_body_account_information: Your account information
mail_subject_account_activation_request: "{{value}} account activation request"
mail_body_account_activation_request: "A new user ({{value}}) has registered. The account is pending your approval:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}."

View File

@ -662,7 +662,7 @@ es:
mail_subject_account_activation_request: "Petición de activación de cuenta {{value}}"
mail_subject_lost_password: "Tu contraseña del {{value}}"
mail_subject_register: "Activación de la cuenta del {{value}}"
mail_subject_reminder: "{{count}} peticion(es) finalizan en los próximos días"
mail_subject_reminder: "{{count}} peticion(es) finalizan en los próximos {{days}} días"
notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse.
notice_account_invalid_creditentials: Usuario o contraseña inválido.
notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.

View File

@ -180,7 +180,7 @@ eu:
mail_body_account_information: Zure kontuaren informazioa
mail_subject_account_activation_request: "{{value}} kontu gaitzeko eskaera"
mail_body_account_activation_request: "Erabiltzaile berri bat ({{value}}) erregistratu da. Kontua zure onarpenaren zain dago:"
mail_subject_reminder: "{{count}} arazo hurrengo egunetan amaitzen d(ir)a"
mail_subject_reminder: "{{count}} arazo hurrengo {{days}} egunetan amaitzen d(ir)a"
mail_body_reminder: "Zuri esleituta dauden {{count}} arazo hurrengo {{days}} egunetan amaitzen d(ir)a:"
mail_subject_wiki_content_added: "'{{page}}' wiki orria gehitu da"
mail_body_wiki_content_added: "{{author}}-(e)k '{{page}}' wiki orria gehitu du."

View File

@ -740,7 +740,7 @@ fi:
text_subprojects_destroy_warning: "Tämän aliprojekti(t): {{value}} tullaan myös poistamaan."
label_and_its_subprojects: "{{value}} ja aliprojektit"
mail_body_reminder: "{{count}} sinulle nimettyä tapahtuma(a) erääntyy {{days}} päivä sisään:"
mail_subject_reminder: "{{count}} tapahtuma(a) erääntyy lähipäivinä"
mail_subject_reminder: "{{count}} tapahtuma(a) erääntyy {{days}} lähipäivinä"
text_user_wrote: "{{value}} kirjoitti:"
label_duplicated_by: kopioinut
setting_enabled_scm: Versionhallinta käytettävissä

View File

@ -200,7 +200,7 @@ fr:
mail_body_account_information: Paramètres de connexion de votre compte
mail_subject_account_activation_request: "Demande d'activation d'un compte {{value}}"
mail_body_account_activation_request: "Un nouvel utilisateur ({{value}}) s'est inscrit. Son compte nécessite votre approbation :"
mail_subject_reminder: "{{count}} demande(s) arrivent à échéance"
mail_subject_reminder: "{{count}} demande(s) arrivent à échéance ({{days}})"
mail_body_reminder: "{{count}} demande(s) qui vous sont assignées arrivent à échéance dans les {{days}} prochains jours :"
mail_subject_wiki_content_added: "Page wiki '{{page}}' ajoutée"
mail_body_wiki_content_added: "La page wiki '{{page}}' a été ajoutée par {{author}}."

View File

@ -639,7 +639,7 @@ gl:
mail_subject_account_activation_request: "Petición de activación de conta {{value}}"
mail_subject_lost_password: "O teu contrasinal de {{value}}"
mail_subject_register: "Activación da conta de {{value}}"
mail_subject_reminder: "{{count}} petición(s) rematarán nos próximos días"
mail_subject_reminder: "{{count}} petición(s) rematarán nos próximos {{days}} días"
notice_account_activated: A súa conta foi activada. Xa pode conectarse.
notice_account_invalid_creditentials: Usuario ou contrasinal inválido.
notice_account_lost_email_sent: Enviouse un correo con instrucións para elixir un novo contrasinal.

View File

@ -192,7 +192,7 @@ he:
mail_body_account_information: פרטי החשבון שלך
mail_subject_account_activation_request: "בקשת הפעלה לחשבון {{value}}"
mail_body_account_activation_request: "משתמש חדש ({{value}}) נרשם. החשבון שלו מחכה לאישור שלך:"
mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים"
mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים ({{days}})"
mail_body_reminder: "{{count}} נושאים שמיועדים אליך מיועדים להגשה בתוך {{days}} ימים:"
mail_subject_wiki_content_added: "דף ה־wiki '{{page}}' נוסף"
mail_body_wiki_content_added: דף ה־wiki '{{page}}' נוסף ע"י {{author}}.

View File

@ -176,7 +176,7 @@ hr:
mail_body_account_information: Vaši korisnički podaci
mail_subject_account_activation_request: "{{value}} predmet za aktivaciju korisničkog računa"
mail_body_account_activation_request: "Novi korisnik ({{value}}) je registriran. Njegov korisnički račun čeka vaše odobrenje:"
mail_subject_reminder: "{{count}} predmet(a) dospijeva sljedećih dana"
mail_subject_reminder: "{{count}} predmet(a) dospijeva sljedećih {{days}} dana"
mail_body_reminder: "{{count}} vama dodijeljen(ih) predmet(a) dospijeva u sljedećih {{days}} dana:"
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}."

View File

@ -737,7 +737,7 @@
enumeration_doc_categories: Dokumentum kategóriák
enumeration_activities: Tevékenységek (idő rögzítés)
mail_body_reminder: "{{count}} neked kiosztott feladat határidős az elkövetkező {{days}} napban:"
mail_subject_reminder: "{{count}} feladat határidős az elkövetkező napokban"
mail_subject_reminder: "{{count}} feladat határidős az elkövetkező {{days}} napokban"
text_user_wrote: "{{value}} írta:"
label_duplicated_by: duplikálta
setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése

View File

@ -177,7 +177,7 @@ id:
mail_body_account_information: Informasi akun anda
mail_subject_account_activation_request: "Permintaan aktivasi akun {{value}} "
mail_body_account_activation_request: "Pengguna baru ({{value}}) sudan didaftarkan. Akun tersebut menunggu persetujuan anda:"
mail_subject_reminder: "{{count}} masalah harus selesai pada hari berikutnya"
mail_subject_reminder: "{{count}} masalah harus selesai pada hari berikutnya ({{days}})"
mail_body_reminder: "{{count}} masalah yang ditugaskan pada anda harus selesai dalam {{days}} hari kedepan:"
mail_subject_wiki_content_added: "'{{page}}' halaman wiki sudah ditambahkan"
mail_body_wiki_content_added: "The '{{page}}' halaman wiki sudah ditambahkan oleh {{author}}."

View File

@ -717,7 +717,7 @@ it:
text_subprojects_destroy_warning: "Anche i suoi sottoprogetti: {{value}} verranno eliminati."
label_and_its_subprojects: "{{value}} ed i suoi sottoprogetti"
mail_body_reminder: "{{count}} segnalazioni che ti sono state assegnate scadranno nei prossimi {{days}} giorni:"
mail_subject_reminder: "{{count}} segnalazioni in scadenza nei prossimi giorni"
mail_subject_reminder: "{{count}} segnalazioni in scadenza nei prossimi {{days}} giorni"
text_user_wrote: "{{value}} ha scritto:"
label_duplicated_by: duplicato da
setting_enabled_scm: SCM abilitato

View File

@ -214,7 +214,7 @@ ja:
mail_body_account_information: アカウント情報
mail_subject_account_activation_request: "{{value}} アカウントの承認要求"
mail_body_account_activation_request: "新しいユーザ {{value}} が登録されました。このアカウントはあなたの承認待ちです:"
mail_subject_reminder: "{{count}}件のチケットが期日間近です"
mail_subject_reminder: "{{count}}件のチケットが{{days}}期日間近です"
mail_body_reminder: "{{count}}件の担当チケットの期日が{{days}}日以内に到来します:"
mail_subject_wiki_content_added: "Wikiページ {{page}} が追加されました"
mail_body_wiki_content_added: "{{author}} によってWikiページ {{page}} が追加されました。"

View File

@ -228,7 +228,7 @@ ko:
mail_subject_account_activation_request: "{{value}} 계정 활성화 요청"
mail_body_account_activation_request: "새 사용자({{value}})가 등록되었습니다. 관리자님의 승인을 기다리고 있습니다.:"
mail_body_reminder: "당신이 맡고 있는 일감 {{count}}개의 완료 기한이 {{days}}일 후 입니다."
mail_subject_reminder: "내일이 만기인 일감 {{count}}개"
mail_subject_reminder: "내일이 만기인 일감 {{count}}개 ({{days}})"
mail_subject_wiki_content_added: "위키페이지 '{{page}}'이(가) 추가되었습니다."
mail_subject_wiki_content_updated: "'위키페이지 {{page}}'이(가) 수정되었습니다."
mail_body_wiki_content_added: "{{author}}이(가) 위키페이지 '{{page}}'을(를) 추가하였습니다."

View File

@ -237,7 +237,7 @@ lt:
mail_body_account_information: Informacija apie Jūsų paskyrą
mail_subject_account_activation_request: "{{value}} paskyros aktyvavimo prašymas"
mail_body_account_activation_request: "Užsiregistravo naujas vartotojas ({{value}}). Jo paskyra laukia jūsų patvirtinimo:"
mail_subject_reminder: "{{count}} darbas(ai) po kelių dienų"
mail_subject_reminder: "{{count}} darbas(ai) po kelių {{days}} dienų"
mail_body_reminder: "{{count}} darbas(ai), kurie yra jums priskirti, baigiasi po {{days}} dienų(os):"
mail_subject_wiki_content_added: "'{{page}}' pridėtas wiki puslapis"
mail_body_wiki_content_added: "The '{{page}}' wiki puslapi pridėjo {{author}}."

View File

@ -172,7 +172,7 @@ lv:
mail_body_account_information: Jūsu konta informācija
mail_subject_account_activation_request: "{{value}} konta aktivizācijas pieprasījums"
mail_body_account_activation_request: "Jauns lietotājs ({{value}}) ir reģistrēts. Lietotāja konts gaida Jūsu apstiprinājumu:"
mail_subject_reminder: "{{count}} uzdevums(i) sagaidāms(i) tuvākajās dienās"
mail_subject_reminder: "{{count}} uzdevums(i) sagaidāms(i) tuvākajās {{days}} dienās"
mail_body_reminder: "{{count}} uzdevums(i), kurš(i) ir nozīmēts(i) Jums, sagaidāms(i) tuvākajās {{days}} dienās:"
mail_subject_wiki_content_added: "'{{page}}' Wiki lapa pievienota"
mail_body_wiki_content_added: "The '{{page}}' Wiki lapu pievienojis {{author}}."

View File

@ -176,7 +176,7 @@ mn:
mail_body_account_information: Таны дансны тухай мэдээлэл
mail_subject_account_activation_request: "{{value}} дансыг идэвхжүүлэх хүсэлт"
mail_body_account_activation_request: "Шинэ хэрэглэгч ({{value}}) бүртгүүлсэн байна. Таны баталгаажуулахыг хүлээж байна:"
mail_subject_reminder: "Дараагийн өдрүүдэд {{count}} асуудлыг шийдэх хэрэгтэй"
mail_subject_reminder: "Дараагийн өдрүүдэд {{count}} асуудлыг шийдэх хэрэгтэй ({{days}})"
mail_body_reminder: "Танд оноогдсон {{count}} асуудлуудыг дараагийн {{days}} өдрүүдэд шийдэх хэрэгтэй:"
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}."

View File

@ -601,7 +601,7 @@ nl:
mail_subject_account_activation_request: "{{value}} accountactivatieverzoek"
mail_subject_lost_password: "uw {{value}} wachtwoord"
mail_subject_register: "uw {{value}} accountactivatie"
mail_subject_reminder: "{{count}} issue(s) die voldaan moeten zijn in de komende dagen."
mail_subject_reminder: "{{count}} issue(s) die voldaan moeten zijn in de komende {{days}} dagen."
notice_account_activated: uw account is geactiveerd. u kunt nu inloggen.
notice_account_invalid_creditentials: Incorrecte gebruikersnaam of wachtwoord
notice_account_lost_email_sent: Er is een e-mail naar u verstuurd met instructies over het kiezen van een nieuw wachtwoord.

View File

@ -163,7 +163,7 @@
mail_body_account_information: Informasjon om din konto
mail_subject_account_activation_request: "{{value}} kontoaktivering"
mail_body_account_activation_request: "En ny bruker ({{value}}) er registrert, og avventer din godkjenning:"
mail_subject_reminder: "{{count}} sak(er) har frist de kommende dagene"
mail_subject_reminder: "{{count}} sak(er) har frist de kommende {{days}} dagene"
mail_body_reminder: "{{count}} sak(er) som er tildelt deg har frist de kommende {{days}} dager:"
gui_validation_error: 1 feil

View File

@ -640,7 +640,7 @@ pl:
mail_subject_account_activation_request: "Zapytanie aktywacyjne konta {{value}}"
mail_subject_lost_password: "Twoje hasło do {{value}}"
mail_subject_register: "Aktywacja konta w {{value}}"
mail_subject_reminder: "Uwaga na terminy, masz zagadnienia do obsłużenia w ciągu następnych {{count}} dni!"
mail_subject_reminder: "Uwaga na terminy, masz zagadnienia do obsłużenia w ciągu następnych {{count}} dni! ({{days}})"
notice_account_activated: Twoje konto zostało aktywowane. Możesz się zalogować.
notice_account_invalid_creditentials: Zły użytkownik lub hasło
notice_account_lost_email_sent: Email z instrukcjami zmiany hasła został wysłany do Ciebie.

View File

@ -196,7 +196,7 @@ pt-BR:
mail_body_account_information: Informações sobre sua conta
mail_subject_account_activation_request: "{{value}} - Requisição de ativação de conta"
mail_body_account_activation_request: "Um novo usuário ({{value}}) se registrou. A conta está aguardando sua aprovação:"
mail_subject_reminder: "{{count}} tarefa(s) com data prevista para os próximos dias"
mail_subject_reminder: "{{count}} tarefa(s) com data prevista para os próximos {{days}} dias"
mail_body_reminder: "{{count}} tarefa(s) para você com data prevista para os próximos {{days}} dias:"
gui_validation_error: 1 erro

View File

@ -181,7 +181,7 @@ pt:
mail_body_account_information: Informação da sua conta
mail_subject_account_activation_request: "Pedido de activação da conta {{value}}"
mail_body_account_activation_request: "Um novo utilizador ({{value}}) registou-se. A sua conta está à espera de aprovação:"
mail_subject_reminder: "{{count}} tarefa(s) para entregar nos próximos dias"
mail_subject_reminder: "{{count}} tarefa(s) para entregar nos próximos {{days}} dias"
mail_body_reminder: "{{count}} tarefa(s) que estão atribuídas a si estão agendadas para estarem completas nos próximos {{days}} dias:"
gui_validation_error: 1 erro

View File

@ -164,7 +164,7 @@ ro:
mail_body_account_information: Informații despre contul dumneavoastră
mail_subject_account_activation_request: "Cerere de activare a contului {{value}}"
mail_body_account_activation_request: "S-a înregistrat un utilizator nou ({{value}}). Contul așteaptă aprobarea dumneavoastră:"
mail_subject_reminder: "{{count}} tichete trebuie rezolvate în următoarele zile"
mail_subject_reminder: "{{count}} tichete trebuie rezolvate în următoarele {{days}} zile"
mail_body_reminder: "{{count}} tichete atribuite dumneavoastră trebuie rezolvate în următoarele {{days}} zile:"
gui_validation_error: o eroare

View File

@ -755,7 +755,7 @@ ru:
mail_subject_account_activation_request: "Запрос на активацию пользователя в системе {{value}}"
mail_subject_lost_password: "Ваш {{value}} пароль"
mail_subject_register: "Активация учетной записи {{value}}"
mail_subject_reminder: "{{count}} назначенных на Вас задач в ближайшие дни"
mail_subject_reminder: "{{count}} назначенных на Вас задач в ближайшие {{days}} дни"
notice_account_activated: Ваша учетная запись активирована. Вы можете войти.
notice_account_invalid_creditentials: Неправильное имя пользователя или пароль

View File

@ -708,7 +708,7 @@ sk:
text_subprojects_destroy_warning: "Jeho podprojekt(y): {{value}} budú takisto vymazané."
label_and_its_subprojects: "{{value}} a jeho podprojekty"
mail_body_reminder: "{{count}} úloha(y), ktorá(é) je(sú) vám priradený(é), ma(jú) byť hotova(é) za {{days}} dní:"
mail_subject_reminder: "{{count}} úloha(y) ma(jú) byť hotova(é) za pár dní"
mail_subject_reminder: "{{count}} úloha(y) ma(jú) byť hotova(é) za pár {{days}} dní"
text_user_wrote: "{{value}} napísal:"
label_duplicated_by: duplikovaný
setting_enabled_scm: Zapnúť SCM

View File

@ -167,7 +167,7 @@ sl:
mail_body_account_information: Informacije o vašem računu
mail_subject_account_activation_request: "{{value}} zahtevek za aktivacijo računa"
mail_body_account_activation_request: "Registriral se je nov uporabnik ({{value}}). Račun čaka na vašo odobritev:"
mail_subject_reminder: "{{count}} zahtevek(zahtevki) zapadejo v naslednjih dneh"
mail_subject_reminder: "{{count}} zahtevek(zahtevki) zapadejo v naslednjih {{days}} dneh"
mail_body_reminder: "{{count}} zahtevek(zahtevki), ki so vam dodeljeni bodo zapadli v naslednjih {{days}} dneh:"
gui_validation_error: 1 napaka

View File

@ -178,7 +178,7 @@ sr-CY:
mail_body_account_information: Информације о вашем налогу
mail_subject_account_activation_request: "Захтев за активацију налога {{value}}"
mail_body_account_activation_request: "Нови корисник ({{value}}) је регистрован. Налог чека на ваше одобрење:"
mail_subject_reminder: "{{count}} проблема доспева наредних дана"
mail_subject_reminder: "{{count}} проблема доспева наредних {{days}} дана"
mail_body_reminder: "{{count}} проблема додељених вама доспева у наредних {{days}} дана:"
mail_subject_wiki_content_added: "'{{page}}' wiki страна је додато"
mail_body_wiki_content_added: "{{author}} је додао '{{page}}' wiki страна."

View File

@ -178,7 +178,7 @@ sr:
mail_body_account_information: Informacije o vašem nalogu
mail_subject_account_activation_request: "Zahtev za aktivaciju naloga {{value}}"
mail_body_account_activation_request: "Novi korisnik ({{value}}) je registrovan. Nalog čeka na vaše odobrenje:"
mail_subject_reminder: "{{count}} problema dospeva narednih dana"
mail_subject_reminder: "{{count}} problema dospeva narednih {{days}} dana"
mail_body_reminder: "{{count}} problema dodeljenih vama dospeva u narednih {{days}} dana:"
mail_subject_wiki_content_added: "'{{page}}' wiki strana je dodato"
mail_body_wiki_content_added: "{{author}} je dodao '{{page}}' wiki strana."

View File

@ -234,7 +234,7 @@ sv:
mail_body_account_information: Din kontoinformation
mail_subject_account_activation_request: "{{value}} begäran om kontoaktivering"
mail_body_account_activation_request: "En ny användare ({{value}}) har registrerat sig och avvaktar ditt godkännande:"
mail_subject_reminder: "{{count}} ärende(n) har deadline under de kommande dagarna"
mail_subject_reminder: "{{count}} ärende(n) har deadline under de kommande {{days}} dagarna"
mail_body_reminder: "{{count}} ärende(n) som är tilldelat dig har deadline under de {{days}} dagarna:"
mail_subject_wiki_content_added: "'{{page}}' wikisida has lagts till"
mail_body_wiki_content_added: The '{{page}}' wikisida has lagts till av {{author}}.

View File

@ -707,7 +707,7 @@ th:
enumeration_activities: กิจกรรม (ใช้ในการติดตามเวลา)
label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM

View File

@ -749,7 +749,7 @@ tr:
text_user_wrote: "{{value}} wrote:"
setting_mail_handler_api_enabled: Enable WS for incoming emails
label_and_its_subprojects: "{{value}} and its subprojects"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
setting_mail_handler_api_key: API key
setting_commit_logs_encoding: Commit messages encoding
general_csv_decimal_separator: '.'

View File

@ -706,7 +706,7 @@ uk:
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next days"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM

View File

@ -226,7 +226,7 @@ vi:
mail_body_account_information: Thông tin về tài khoản
mail_subject_account_activation_request: "{{value}}: Yêu cầu chứng thực tài khoản"
mail_body_account_activation_request: "Người dùng ({{value}}) mới đăng ký và cần bạn xác nhận:"
mail_subject_reminder: "{{count}} vấn đề hết hạn trong các ngày tới"
mail_subject_reminder: "{{count}} vấn đề hết hạn trong các {{days}} ngày tới"
mail_body_reminder: "{{count}} vấn đề gán cho bạn sẽ hết hạn trong {{days}} ngày tới:"
gui_validation_error: 1 lỗi

View File

@ -273,7 +273,7 @@
mail_body_account_information: 您的 Redmine 帳號資訊
mail_subject_account_activation_request: Redmine 帳號啟用需求通知
mail_body_account_activation_request: "有位新用戶 ({{value}}) 已經完成註冊,正等候您的審核:"
mail_subject_reminder: "您有 {{count}} 個項目即將到期"
mail_subject_reminder: "您有 {{count}} 個項目即將到期 ({{days}})"
mail_body_reminder: "{{count}} 個指派給您的項目,將於 {{days}} 天之內到期:"
mail_subject_wiki_content_added: "'{{page}}' wiki 頁面已被新增"
mail_body_wiki_content_added: "The '{{page}}' wiki 頁面已被 {{author}} 新增。"

View File

@ -200,7 +200,7 @@ zh:
mail_body_account_information: 您的帐号信息
mail_subject_account_activation_request: "{{value}}帐号激活请求"
mail_body_account_activation_request: "新用户({{value}})已完成注册,正在等候您的审核:"
mail_subject_reminder: "{{count}} 个问题需要尽快解决"
mail_subject_reminder: "{{count}} 个问题需要尽快解决 ({{days}})"
mail_body_reminder: "指派给您的 {{count}} 个问题需要在 {{days}} 天内完成:"
mail_subject_wiki_content_added: "'{{page}}' wiki页面已添加"
mail_body_wiki_content_added: "'{{page}}' wiki页面已由 {{author}} 添加。"

View File

@ -124,7 +124,7 @@ ActionController::Routing::Routes.draw do |map|
issues_actions.connect 'projects/:project_id/issues/gantt', :controller => 'gantts', :action => 'show'
issues_actions.connect 'projects/:project_id/issues/calendar', :controller => 'calendars', :action => 'show'
issues_actions.connect 'issues/:id/quoted', :action => 'reply', :id => /\d+/
issues_actions.connect 'issues/:id/:action', :action => /edit|move|destroy/, :id => /\d+/
issues_actions.connect 'issues/:id/:action', :action => /edit|perform_move|destroy/, :id => /\d+/
issues_actions.connect 'issues.:format', :action => 'create', :format => /xml/
end
issues_routes.with_options :conditions => {:method => :put} do |issues_actions|

View File

@ -6,151 +6,151 @@ http://www.redmine.org/
== 2010-07-18 v1.0.0 (Release candidate)
#443: Adds context menu to the roadmap issue lists
#443: Subtasking
#741: Description preview while editing an issue
#1131: Add support for alternate (non-LDAP) authentication
#1214: REST API for Issues
#1223: File upload on wiki edit form
#1755: add "blocked by" as a related issues option
#2420: Fetching emails from an POP server
#2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction).
#2924: Make the right click menu more discoverable using a cursor property
#2985: Make syntax highlighting pluggable
#3201: Workflow Check/Uncheck All Rows/Columns
#3359: Update CodeRay 0.9
#3706: Allow assigned_to field configuration on Issue creation by email
#3936: configurable list of models to include in search
#4480: Create a link to the user profile from the administration interface
#4482: Cache textile rendering
#4572: Make it harder to ruin your database
#4573: Move github gems to Gemcutter
#4664: Add pagination to forum threads
#4732: Make login case-insensitive also for PostgreSQL
#4812: Create links to other projects
#4819: Replace images with smushed ones for speed
#4945: Allow custom fields attached to project to be searchable
#5121: Fix issues list layout overflow
#5169: Issue list view hook request
#5208: Aibility to edit wiki sidebar
#5281: Remove empty ul tags in the issue history
#5291: Updated basque translations
#5328: Automatically add "Repository" menu_item after repository creation
#5415: Fewer SQL statements generated for watcher_recipients
#5416: Exclude "fields_for" from overridden methods in TabularFormBuilder
#5573: Allow issue assignment in email
#5595: Allow start date and due dates to be set via incoming email
#5752: The projects view (/projects) renders ul's wrong
#5781: Allow to use more macros on the welcome page and project list
Fixed #1288: Unable to past escaped wiki syntax in an issue description
Fixed #1334: Wiki formatting character *_ and _*
Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively
Fixed #2473: Login and mail should not be case sensitive
Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate
Fixed #3089: Text formatting sometimes breaks when combined
Fixed #3690: Status change info duplicates on the issue screen
Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue
Fixed #3764: ApplicationHelperTest fails with JRuby
Fixed #4265: Unclosed code tags in issue descriptions affects main UI
Fixed #4745: Bug in index.xml.builder (issues)
Fixed #4852: changing user/roles of project member not possible without javascript
Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday
Fixed #4883: Bottom "contextual" placement in issue with associated changeset
Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP
Fixed #4935: Navigation to the Master Timesheet page (time_entries)
Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved
Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html
Fixed #5104: Description of document not wikified on documents index
Fixed #5108: Issue linking fails inside of []s
Fixed #5199: diff code coloring using coderay
Fixed #5233: Add a hook to the issue report (Summary) view
Fixed #5265: timetracking: subtasks time is added to the main task
Fixed #5343: acts_as_event Doesn't Accept Outside URLs
Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in <thead>
Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb
Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting
Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets.
Fixed #5589: "with subproject" malfunction
Fixed #5676: Search for Numeric Value
Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml
Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters
Fixed #5700: TimelogController#destroy assumes success
Fixed #5751: developer role is mispelled
Fixed #5769: Popup Calendar doesn't Advance in Chrome
Fixed #5771: Problem when importing git repository
Fixed #5823: Error in comments in plugin.rb
* #443: Adds context menu to the roadmap issue lists
* #443: Subtasking
* #741: Description preview while editing an issue
* #1131: Add support for alternate (non-LDAP) authentication
* #1214: REST API for Issues
* #1223: File upload on wiki edit form
* #1755: add "blocked by" as a related issues option
* #2420: Fetching emails from an POP server
* #2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction).
* #2924: Make the right click menu more discoverable using a cursor property
* #2985: Make syntax highlighting pluggable
* #3201: Workflow Check/Uncheck All Rows/Columns
* #3359: Update CodeRay 0.9
* #3706: Allow assigned_to field configuration on Issue creation by email
* #3936: configurable list of models to include in search
* #4480: Create a link to the user profile from the administration interface
* #4482: Cache textile rendering
* #4572: Make it harder to ruin your database
* #4573: Move github gems to Gemcutter
* #4664: Add pagination to forum threads
* #4732: Make login case-insensitive also for PostgreSQL
* #4812: Create links to other projects
* #4819: Replace images with smushed ones for speed
* #4945: Allow custom fields attached to project to be searchable
* #5121: Fix issues list layout overflow
* #5169: Issue list view hook request
* #5208: Aibility to edit wiki sidebar
* #5281: Remove empty ul tags in the issue history
* #5291: Updated basque translations
* #5328: Automatically add "Repository" menu_item after repository creation
* #5415: Fewer SQL statements generated for watcher_recipients
* #5416: Exclude "fields_for" from overridden methods in TabularFormBuilder
* #5573: Allow issue assignment in email
* #5595: Allow start date and due dates to be set via incoming email
* #5752: The projects view (/projects) renders ul's wrong
* #5781: Allow to use more macros on the welcome page and project list
* Fixed #1288: Unable to past escaped wiki syntax in an issue description
* Fixed #1334: Wiki formatting character *_ and _*
* Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively
* Fixed #2473: Login and mail should not be case sensitive
* Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate
* Fixed #3089: Text formatting sometimes breaks when combined
* Fixed #3690: Status change info duplicates on the issue screen
* Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue
* Fixed #3764: ApplicationHelperTest fails with JRuby
* Fixed #4265: Unclosed code tags in issue descriptions affects main UI
* Fixed #4745: Bug in index.xml.builder (issues)
* Fixed #4852: changing user/roles of project member not possible without javascript
* Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday
* Fixed #4883: Bottom "contextual" placement in issue with associated changeset
* Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP
* Fixed #4935: Navigation to the Master Timesheet page (time_entries)
* Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved
* Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html
* Fixed #5104: Description of document not wikified on documents index
* Fixed #5108: Issue linking fails inside of []s
* Fixed #5199: diff code coloring using coderay
* Fixed #5233: Add a hook to the issue report (Summary) view
* Fixed #5265: timetracking: subtasks time is added to the main task
* Fixed #5343: acts_as_event Doesn't Accept Outside URLs
* Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in <thead>
* Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb
* Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting
* Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets.
* Fixed #5589: "with subproject" malfunction
* Fixed #5676: Search for Numeric Value
* Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml
* Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters
* Fixed #5700: TimelogController#destroy assumes success
* Fixed #5751: developer role is mispelled
* Fixed #5769: Popup Calendar doesn't Advance in Chrome
* Fixed #5771: Problem when importing git repository
* Fixed #5823: Error in comments in plugin.rb
== 2010-07-07 v0.9.6
Fixed: Redmine.pm access by unauthorized users
* Fixed: Redmine.pm access by unauthorized users
== 2010-06-24 v0.9.5
Linkify folder names on revision view
"fiters" and "options" should be hidden in print view via css
Fixed: NoMethodError when no issue params are submitted
Fixed: projects.atom with required authentication
Fixed: External links not correctly displayed in Wiki TOC
Fixed: Member role forms in project settings are not hidden after member added
Fixed: pre can't be inside p
Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT
Fixed: mail handler fails when the from address is empty
* Linkify folder names on revision view
* "fiters" and "options" should be hidden in print view via css
* Fixed: NoMethodError when no issue params are submitted
* Fixed: projects.atom with required authentication
* Fixed: External links not correctly displayed in Wiki TOC
* Fixed: Member role forms in project settings are not hidden after member added
* Fixed: pre can't be inside p
* Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT
* Fixed: mail handler fails when the from address is empty
== 2010-05-01 v0.9.4
Filters collapsed by default on issues index page for a saved query
Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list)
Fixed: remove "main-menu" div when the menu is empty
Fixed: Code syntax highlighting not working in Document page
Fixed: Git blame/annotate fails on moved files
Fixed: Failing test in test_show_atom
Fixed: Migrate from trac - not displayed Wikis
Fixed: Email notifications on file upload sent to empty recipient list
Fixed: Migrating from trac is not possible, fails to allocate memory
Fixed: Lost password no longer flashes a confirmation message
Fixed: Crash while deleting in-use enumeration
Fixed: Hard coded English string at the selection of issue watchers
Fixed: Bazaar v2.1.0 changed behaviour
Fixed: Roadmap display can raise an exception if no trackers are selected
Fixed: Gravatar breaks layout of "logged in" page
Fixed: Reposman.rb on Windows
Fixed: Possible error 500 while moving an issue to another project with SQLite
Fixed: backslashes in issue description/note should be escaped when quoted
Fixed: Long text in <pre> disrupts Associated revisions
Fixed: Links to missing wiki pages not red on project overview page
Fixed: Cannot delete a project with subprojects that shares versions
Fixed: Update of Subversion changesets broken under Solaris
Fixed: "Move issues" permission not working for Non member
Fixed: Sidebar overlap on Users tab of Group editor
Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
Fixed: Report shows sub-projects for non-members
Fixed: 500 internal error when browsing any Redmine page in epiphany
Fixed: Watchers selection lost when issue creation fails
Fixed: When copying projects, redmine should not generate an email to people who created issues
Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
Fixed: Plugin generators should display help if no parameter is given
* Filters collapsed by default on issues index page for a saved query
* Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list)
* Fixed: remove "main-menu" div when the menu is empty
* Fixed: Code syntax highlighting not working in Document page
* Fixed: Git blame/annotate fails on moved files
* Fixed: Failing test in test_show_atom
* Fixed: Migrate from trac - not displayed Wikis
* Fixed: Email notifications on file upload sent to empty recipient list
* Fixed: Migrating from trac is not possible, fails to allocate memory
* Fixed: Lost password no longer flashes a confirmation message
* Fixed: Crash while deleting in-use enumeration
* Fixed: Hard coded English string at the selection of issue watchers
* Fixed: Bazaar v2.1.0 changed behaviour
* Fixed: Roadmap display can raise an exception if no trackers are selected
* Fixed: Gravatar breaks layout of "logged in" page
* Fixed: Reposman.rb on Windows
* Fixed: Possible error 500 while moving an issue to another project with SQLite
* Fixed: backslashes in issue description/note should be escaped when quoted
* Fixed: Long text in <pre> disrupts Associated revisions
* Fixed: Links to missing wiki pages not red on project overview page
* Fixed: Cannot delete a project with subprojects that shares versions
* Fixed: Update of Subversion changesets broken under Solaris
* Fixed: "Move issues" permission not working for Non member
* Fixed: Sidebar overlap on Users tab of Group editor
* Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
* Fixed: Report shows sub-projects for non-members
* Fixed: 500 internal error when browsing any Redmine page in epiphany
* Fixed: Watchers selection lost when issue creation fails
* Fixed: When copying projects, redmine should not generate an email to people who created issues
* Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
* Fixed: Plugin generators should display help if no parameter is given
== 2010-02-28 v0.9.3
Adds filter for system shared versions on the cross project issue list
Makes project identifiers searchable
Remove invalid utf8 sequences from commit comments and author name
Fixed: Wrong link when "http" not included in project "Homepage" link
Fixed: Escaping in html email templates
Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
Fixed: Deselecting textile text formatting causes interning empty string errors
Fixed: error with postgres when entering a non-numeric id for an issue relation
Fixed: div.task incorrectly wrapping on Gantt Chart
Fixed: Project copy loses wiki pages hierarchy
Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
Fixed: Duplicated project name for subproject version on gantt chart
Fixed: roadmap shows subprojects issues even if subprojects is unchecked
Fixed: IndexError if all the :last menu items are deleted from a menu
Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
* Adds filter for system shared versions on the cross project issue list
* Makes project identifiers searchable
* Remove invalid utf8 sequences from commit comments and author name
* Fixed: Wrong link when "http" not included in project "Homepage" link
* Fixed: Escaping in html email templates
* Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
* Fixed: Deselecting textile text formatting causes interning empty string errors
* Fixed: error with postgres when entering a non-numeric id for an issue relation
* Fixed: div.task incorrectly wrapping on Gantt Chart
* Fixed: Project copy loses wiki pages hierarchy
* Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
* Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
* Fixed: Duplicated project name for subproject version on gantt chart
* Fixed: roadmap shows subprojects issues even if subprojects is unchecked
* Fixed: IndexError if all the :last menu items are deleted from a menu
* Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
== 2010-02-07 v0.9.2

View File

@ -69,7 +69,7 @@ Redmine::AccessControl.map do |map|
map.permission :add_issue_notes, {:issues => [:edit, :update, :reply]}
map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
map.permission :move_issues, {:issues => :move}, :require => :loggedin
map.permission :move_issues, {:issues => [:move, :perform_move]}, :require => :loggedin
map.permission :delete_issues, {:issues => :destroy}, :require => :member
# Queries
map.permission :manage_public_queries, {:queries => [:new, :edit, :destroy]}, :require => :member
@ -157,7 +157,22 @@ Redmine::MenuManager.map :application_menu do |menu|
end
Redmine::MenuManager.map :admin_menu do |menu|
# Empty
menu.push :projects, {:controller => 'admin', :action => 'projects'}, :caption => :label_project_plural
menu.push :users, {:controller => 'users'}, :caption => :label_user_plural
menu.push :groups, {:controller => 'groups'}, :caption => :label_group_plural
menu.push :roles, {:controller => 'roles'}, :caption => :label_role_and_permissions
menu.push :trackers, {:controller => 'trackers'}, :caption => :label_tracker_plural
menu.push :issue_statuses, {:controller => 'issue_statuses'}, :caption => :label_issue_status_plural,
:html => {:class => 'issue_statuses'}
menu.push :workflows, {:controller => 'workflows', :action => 'edit'}, :caption => :label_workflow
menu.push :custom_fields, {:controller => 'custom_fields'}, :caption => :label_custom_field_plural,
:html => {:class => 'custom_fields'}
menu.push :enumerations, {:controller => 'enumerations'}
menu.push :settings, {:controller => 'settings'}
menu.push :ldap_authentication, {:controller => 'ldap_auth_sources', :action => 'index'},
:html => {:class => 'server_authentication'}
menu.push :plugins, {:controller => 'admin', :action => 'plugins'}, :last => true
menu.push :info, {:controller => 'admin', :action => 'info'}, :caption => :label_information_plural, :last => true
end
Redmine::MenuManager.map :project_menu do |menu|

View File

@ -114,12 +114,12 @@ module Redmine
def revisions(path, identifier_from, identifier_to, options={})
revisions = Revisions.new
cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw --date=iso --pretty=fuller"
cmd << " --reverse" if options[:reverse]
cmd << " --all" if options[:all]
cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw --date=iso --pretty=fuller "
cmd << " --reverse " if options[:reverse]
cmd << " --all " if options[:all]
cmd << " -n #{options[:limit]} " if options[:limit]
cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from
cmd << " #{shell_quote identifier_to} " if identifier_to
cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from
cmd << "#{shell_quote identifier_to}" if identifier_to
cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since]
cmd << " -- #{path}" if path && !path.empty?

41
lib/tasks/ci.rake Normal file
View File

@ -0,0 +1,41 @@
desc "Run the Continous Integration tests for Redmine"
task :ci do
# RAILS_ENV and ENV[] can diverge so force them both to test
ENV['RAILS_ENV'] = 'test'
RAILS_ENV = 'test'
Rake::Task["ci:setup"].invoke
Rake::Task["ci:build"].invoke
Rake::Task["ci:teardown"].invoke
end
# Tasks can be hooked into by redefining them in a plugin
namespace :ci do
desc "Setup Redmine for a new build."
task :setup do
Rake::Task["ci:dump_environment"].invoke
Rake::Task["db:create"].invoke
Rake::Task["db:migrate"].invoke
Rake::Task["db:schema:dump"].invoke
end
desc "Build Redmine"
task :build do
Rake::Task["test"].invoke
end
# Use this to cleanup after building or run post-build analysis.
desc "Finish the build"
task :teardown do
end
desc "Dump the environment information to a BUILD_ENVIRONMENT ENV variable for debugging"
task :dump_environment do
ENV['BUILD_ENVIRONMENT'] = ['ruby -v', 'gem -v', 'gem list'].collect do |command|
result = `#{command}`
"$ #{command}\n#{result}"
end.join("\n")
end
end

View File

@ -2,7 +2,17 @@ begin
require 'yard'
YARD::Rake::YardocTask.new do |t|
t.files = ['lib/**/*.rb', 'app/**/*.rb', 'vendor/plugins/**/*.rb']
files = ['lib/**/*.rb', 'app/**/*.rb']
files << Dir['vendor/plugins/**/*.rb'].reject {|f| f.match(/test/) } # Exclude test files
t.files = files
static_files = ['doc/CHANGELOG',
'doc/COPYING',
'doc/INSTALL',
'doc/RUNNING_TESTS',
'doc/UPGRADING'].join(',')
t.options += ['--output-dir', './doc/app', '--files', static_files]
end
rescue LoadError

View File

@ -287,8 +287,8 @@ fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
.buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
div#issue-changesets .changeset { padding: 4px;}
div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
div#issue-changesets div.changeset { padding: 4px;}
div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
div#activity dl, #search-results { margin-left: 2em; }

View File

@ -1,4 +1,4 @@
require 'test_helper'
require File.dirname(__FILE__) + '/../test_helper'
class AuthSourcesControllerTest < ActionController::TestCase
fixtures :all

View File

@ -1,4 +1,4 @@
require 'test_helper'
require File.dirname(__FILE__) + '/../test_helper'
class CalendarsControllerTest < ActionController::TestCase
fixtures :all

View File

@ -1,4 +1,4 @@
require 'test_helper'
require File.dirname(__FILE__) + '/../test_helper'
class GanttsControllerTest < ActionController::TestCase
fixtures :all

View File

@ -1038,22 +1038,22 @@ class IssuesControllerTest < ActionController::TestCase
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
end
def test_move_one_issue_to_another_project
def test_perform_move_one_issue_to_another_project
@request.session[:user_id] = 2
post :move, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
post :perform_move, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
assert_redirected_to :action => 'index', :project_id => 'ecookbook'
assert_equal 2, Issue.find(1).project_id
end
def test_move_one_issue_to_another_project_should_follow_when_needed
def test_perform_move_one_issue_to_another_project_should_follow_when_needed
@request.session[:user_id] = 2
post :move, :id => 1, :new_project_id => 2, :follow => '1'
post :perform_move, :id => 1, :new_project_id => 2, :follow => '1'
assert_redirected_to '/issues/1'
end
def test_bulk_move_to_another_project
def test_bulk_perform_move_to_another_project
@request.session[:user_id] = 2
post :move, :ids => [1, 2], :new_project_id => 2
post :perform_move, :ids => [1, 2], :new_project_id => 2
assert_redirected_to :action => 'index', :project_id => 'ecookbook'
# Issues moved to project 2
assert_equal 2, Issue.find(1).project_id
@ -1063,9 +1063,9 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal 2, Issue.find(2).tracker_id
end
def test_bulk_move_to_another_tracker
def test_bulk_perform_move_to_another_tracker
@request.session[:user_id] = 2
post :move, :ids => [1, 2], :new_tracker_id => 2
post :perform_move, :ids => [1, 2], :new_tracker_id => 2
assert_redirected_to :action => 'index', :project_id => 'ecookbook'
assert_equal 2, Issue.find(1).tracker_id
assert_equal 2, Issue.find(2).tracker_id
@ -1075,19 +1075,19 @@ class IssuesControllerTest < ActionController::TestCase
@request.session[:user_id] = 2
assert_difference 'Issue.count', 2 do
assert_no_difference 'Project.find(1).issues.count' do
post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}
post :perform_move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}
end
end
assert_redirected_to 'projects/ecookbook/issues'
end
context "#move via bulk copy" do
context "#perform_move via bulk copy" do
should "allow not changing the issue's attributes" do
@request.session[:user_id] = 2
issue_before_move = Issue.find(1)
assert_difference 'Issue.count', 1 do
assert_no_difference 'Project.find(1).issues.count' do
post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
post :perform_move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
end
end
issue_after_move = Issue.first(:order => 'id desc', :conditions => {:project_id => 2})
@ -1104,7 +1104,7 @@ class IssuesControllerTest < ActionController::TestCase
@request.session[:user_id] = 2
assert_difference 'Issue.count', 2 do
assert_no_difference 'Project.find(1).issues.count' do
post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31'
post :perform_move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31'
end
end
@ -1122,7 +1122,7 @@ class IssuesControllerTest < ActionController::TestCase
def test_copy_to_another_project_should_follow_when_needed
@request.session[:user_id] = 2
post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1'
post :perform_move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1'
issue = Issue.first(:order => 'id DESC')
assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
end

View File

@ -86,7 +86,7 @@ class RoutingTest < ActionController::IntegrationTest
should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
should_route :get, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
should_route :post, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
should_route :post, "/issues/1/perform_move", :controller => 'issues', :action => 'perform_move', :id => '1'
should_route :post, "/issues/1/quoted", :controller => 'issues', :action => 'reply', :id => '1'

View File

@ -597,4 +597,16 @@ EXPECTED
t = link_to_user(user)
assert_equal ::I18n.t(:label_user_anonymous), t
end
def test_link_to_project
project = Project.find(1)
assert_equal %(<a href="/projects/ecookbook">eCookbook</a>),
link_to_project(project)
assert_equal %(<a href="/projects/ecookbook/settings">eCookbook</a>),
link_to_project(project, :action => 'settings')
assert_equal %(<a href="http://test.host/projects/ecookbook?jump=blah">eCookbook</a>),
link_to_project(project, {:only_path => false, :jump => 'blah'})
assert_equal %(<a href="/projects/ecookbook/settings" class="project">eCookbook</a>),
link_to_project(project, {:action => 'settings'}, :class => "project")
end
end

View File

@ -24,7 +24,7 @@ module RedmineMenuTestHelper
end
end
class Redmine::MenuManager::MenuItemTest < Test::Unit::TestCase
class Redmine::MenuManager::MenuItemTest < ActiveSupport::TestCase
include RedmineMenuTestHelper
Redmine::MenuManager.map :test_menu do |menu|

View File

@ -17,7 +17,7 @@
require File.dirname(__FILE__) + '/../../../test_helper'
class Redmine::MenuManagerTest < Test::Unit::TestCase
class Redmine::MenuManagerTest < ActiveSupport::TestCase
context "MenuManager#map" do
should "be tested"
end
@ -25,8 +25,4 @@ class Redmine::MenuManagerTest < Test::Unit::TestCase
context "MenuManager#items" do
should "be tested"
end
should "be tested" do
assert true
end
end

View File

@ -16,6 +16,10 @@ class GitAdapterTest < ActiveSupport::TestCase
assert_equal 13, @adapter.revisions('',nil,nil,:all => true).length
end
def test_getting_certain_revisions
assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
end
def test_annotate
annotate = @adapter.annotate('sources/watchers_controller.rb')
assert_kind_of Redmine::Scm::Adapters::Annotate, annotate

View File

@ -33,7 +33,7 @@ module RedmineMenuTestHelper
end
end
class RedmineTest < Test::Unit::TestCase
class RedmineTest < ActiveSupport::TestCase
include RedmineMenuTestHelper
def test_top_menu

View File

@ -352,6 +352,7 @@ class MailerTest < ActiveSupport::TestCase
mail = ActionMailer::Base.deliveries.last
assert mail.bcc.include?('dlopper@somenet.foo')
assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
assert_equal '1 issue(s) due in the next 42 days', mail.subject
end
def last_email

View File

@ -33,6 +33,15 @@ class QueryTest < ActiveSupport::TestCase
assert query.available_filters['fixed_version_id'][:values].detect {|v| v.last == '2'}
end
def test_project_filter_in_global_queries
query = Query.new(:project => nil, :name => '_')
project_filter = query.available_filters["project_id"]
assert_not_nil project_filter
project_ids = project_filter[:values].map{|p| p[1]}
assert project_ids.include?("1") #public project
assert !project_ids.include?("2") #private project user cannot see
end
def find_issues_with_query(query)
Issue.find :all,
:include => [ :assigned_to, :status, :tracker, :project, :priority ],
@ -351,4 +360,13 @@ class QueryTest < ActiveSupport::TestCase
assert !q.editable_by?(manager)
assert !q.editable_by?(developer)
end
context "#available_filters" do
should "include users of visible projects in cross-project view" do
query = Query.new(:name => "_")
users = query.available_filters["assigned_to_id"]
assert_not_nil users
assert users[:values].map{|u|u[1]}.include?("3")
end
end
end