From f37089f54784da4b457ed19d588e137078977089 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 9 Jul 2006 16:30:01 +0000 Subject: [PATCH] v0.2.0 git-svn-id: http://redmine.rubyforge.org/svn/trunk@7 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- redmine/app/controllers/account_controller.rb | 70 +++++----- redmine/app/controllers/admin_controller.rb | 35 ++--- redmine/app/controllers/application.rb | 104 ++++++++------- redmine/app/controllers/help_controller.rb | 44 ++++--- .../app/controllers/projects_controller.rb | 80 ++++++------ redmine/app/controllers/roles_controller.rb | 6 +- redmine/app/controllers/users_controller.rb | 90 ++++++------- .../app/controllers/versions_controller.rb | 3 + redmine/app/helpers/application_helper.rb | 2 +- redmine/app/helpers/search_filter_helper.rb | 65 +++++----- redmine/app/models/attachment.rb | 2 +- redmine/app/models/enumeration.rb | 1 + redmine/app/models/issue_category.rb | 5 +- redmine/app/models/issue_status.rb | 36 +++--- redmine/app/models/permission.rb | 2 +- redmine/app/models/project.rb | 20 +-- redmine/app/models/tracker.rb | 3 + redmine/app/models/user.rb | 90 ++++++------- redmine/app/models/version.rb | 11 +- redmine/app/models/workflow.rb | 9 +- redmine/app/views/account/login.rhtml | 8 +- redmine/app/views/account/my_account.rhtml | 11 +- redmine/app/views/admin/info.rhtml | 10 +- redmine/app/views/admin/projects.rhtml | 27 ++-- redmine/app/views/custom_fields/list.rhtml | 2 +- redmine/app/views/documents/show.rhtml | 6 +- redmine/app/views/issue_statuses/_form.rhtml | 4 +- redmine/app/views/issue_statuses/list.rhtml | 6 +- redmine/app/views/issues/show.rhtml | 4 +- redmine/app/views/layouts/base.rhtml | 2 +- redmine/app/views/news/show.rhtml | 2 +- redmine/app/views/projects/_form.rhtml | 16 ++- redmine/app/views/projects/changelog.rhtml | 2 +- redmine/app/views/projects/list.rhtml | 10 +- redmine/app/views/projects/list_files.rhtml | 11 +- redmine/app/views/projects/list_issues.rhtml | 16 ++- redmine/app/views/projects/show.rhtml | 15 ++- redmine/app/views/roles/list.rhtml | 2 +- redmine/app/views/trackers/list.rhtml | 2 +- redmine/app/views/users/_form.rhtml | 9 +- redmine/app/views/users/list.rhtml | 20 +-- redmine/app/views/versions/_form.rhtml | 6 +- redmine/app/views/welcome/index.rhtml | 4 +- redmine/config/database.yml | 46 +++++-- redmine/config/environment.rb | 2 +- .../config/environments/development_oracle.rb | 19 +++ .../environments/development_sqlserver.rb | 19 +++ redmine/config/environments/test_oracle.rb | 15 +++ redmine/config/environments/test_pgsql.rb | 15 +++ redmine/config/environments/test_sqlserver.rb | 15 +++ redmine/config/help.yml | 79 +++++++++--- redmine/db/migrate/001_setup.rb | 73 +++++++---- .../db/migrate/002_default_configuration.rb | 21 ++- redmine/doc/CHANGELOG | 17 ++- redmine/doc/INSTALL | 16 ++- redmine/doc/README | 8 +- redmine/lang/fr_FR.rb | 12 +- redmine/public/manual/administration.html | 121 ------------------ redmine/public/manual/fr/ch01.html | 3 + redmine/public/manual/fr/ch01s01.html | 3 + redmine/public/manual/fr/ch01s02.html | 3 + redmine/public/manual/fr/ch01s03.html | 3 + redmine/public/manual/fr/ch01s04.html | 3 + redmine/public/manual/fr/ch01s05.html | 3 + redmine/public/manual/fr/ch01s06.html | 3 + redmine/public/manual/fr/ch01s07.html | 3 + redmine/public/manual/fr/ch01s08.html | 3 + redmine/public/manual/fr/ch01s09.html | 3 + redmine/public/manual/fr/ch02.html | 3 + redmine/public/manual/fr/ch02s01.html | 3 + redmine/public/manual/fr/ch02s02.html | 3 + redmine/public/manual/fr/ch02s03.html | 3 + redmine/public/manual/fr/ch02s04.html | 3 + redmine/public/manual/fr/ch02s05.html | 3 + redmine/public/manual/fr/ch02s06.html | 3 + redmine/public/manual/fr/ch02s07.html | 3 + redmine/public/manual/fr/ch02s08.html | 3 + redmine/public/manual/fr/html.css | 55 ++++++++ redmine/public/manual/fr/index.html | 3 + .../manual/fr/resources/issues_list.png | Bin 0 -> 8233 bytes .../{images => fr/resources}/users_list.png | Bin .../public/manual/fr/resources/workflow.png | Bin 0 -> 6503 bytes redmine/public/manual/images/issues_list.png | Bin 8055 -> 0 bytes redmine/public/manual/images/users_edit.png | Bin 2700 -> 0 bytes redmine/public/manual/images/workflow.png | Bin 4967 -> 0 bytes redmine/public/manual/index.html | 64 --------- redmine/public/manual/projects.html | 109 ---------------- redmine/public/manual/stylesheets/help.css | 70 ---------- redmine/public/stylesheets/application.css | 13 +- redmine/test/fixtures/attachments.yml | 5 - redmine/test/fixtures/custom_fields.yml | 5 - redmine/test/fixtures/documents.yml | 5 - redmine/test/fixtures/enumerations.yml | 5 - redmine/test/fixtures/issue_categories.yml | 5 - redmine/test/fixtures/issue_custom_fields.yml | 5 - redmine/test/fixtures/issue_custom_values.yml | 5 - redmine/test/fixtures/issue_histories.yml | 5 - redmine/test/fixtures/issue_statuses.yml | 5 - redmine/test/fixtures/issues.yml | 5 - redmine/test/fixtures/mailer/issue_closed | 3 - redmine/test/fixtures/members.yml | 5 - redmine/test/fixtures/news.yml | 5 - redmine/test/fixtures/permissions.yml | 5 - redmine/test/fixtures/projects.yml | 25 +++- redmine/test/fixtures/roles.yml | 9 +- redmine/test/fixtures/trackers.yml | 5 - redmine/test/fixtures/users.yml | 18 ++- redmine/test/fixtures/versions.yml | 5 - redmine/test/fixtures/workflow.yml | 5 - .../functional/account_controller_test.rb | 18 --- .../test/functional/admin_controller_test.rb | 18 --- .../custom_fields_controller_test.rb | 88 ------------- .../functional/documents_controller_test.rb | 88 ------------- .../enumerations_controller_test.rb | 88 ------------- .../test/functional/help_controller_test.rb | 18 --- .../issue_categories_controller_test.rb | 88 ------------- .../issue_statuses_controller_test.rb | 88 ------------- .../test/functional/issues_controller_test.rb | 88 ------------- .../functional/members_controller_test.rb | 88 ------------- .../test/functional/news_controller_test.rb | 88 ------------- .../functional/projects_controller_test.rb | 75 +++-------- .../functional/reports_controller_test.rb | 18 --- .../test/functional/roles_controller_test.rb | 88 ------------- .../functional/trackers_controller_test.rb | 88 ------------- .../test/functional/users_controller_test.rb | 88 ------------- .../functional/versions_controller_test.rb | 88 ------------- .../functional/welcome_controller_test.rb | 18 --- redmine/test/integration/account_test.rb | 76 +++++++++++ redmine/test/integration/admin_test.rb | 61 +++++++++ redmine/test/test_helper.rb | 29 ++++- redmine/test/unit/attachment_test.rb | 10 -- redmine/test/unit/custom_field_test.rb | 10 -- redmine/test/unit/document_test.rb | 10 -- redmine/test/unit/enumeration_test.rb | 10 -- redmine/test/unit/issue_category_test.rb | 10 -- redmine/test/unit/issue_custom_field_test.rb | 10 -- redmine/test/unit/issue_custom_value_test.rb | 10 -- redmine/test/unit/issue_history_test.rb | 10 -- redmine/test/unit/issue_status_test.rb | 10 -- redmine/test/unit/issue_test.rb | 10 -- redmine/test/unit/mailer_test.rb | 35 ----- redmine/test/unit/member_test.rb | 10 -- redmine/test/unit/news_test.rb | 10 -- redmine/test/unit/packages_test.rb | 10 -- redmine/test/unit/permission_test.rb | 10 -- redmine/test/unit/project_test.rb | 71 +++++++++- redmine/test/unit/role_test.rb | 10 -- redmine/test/unit/tracker_test.rb | 10 -- redmine/test/unit/user_test.rb | 58 ++++++++- redmine/test/unit/version_test.rb | 10 -- redmine/test/unit/workflow_test.rb | 10 -- 151 files changed, 1232 insertions(+), 2356 deletions(-) create mode 100644 redmine/config/environments/development_oracle.rb create mode 100644 redmine/config/environments/development_sqlserver.rb create mode 100644 redmine/config/environments/test_oracle.rb create mode 100644 redmine/config/environments/test_pgsql.rb create mode 100644 redmine/config/environments/test_sqlserver.rb delete mode 100644 redmine/public/manual/administration.html create mode 100644 redmine/public/manual/fr/ch01.html create mode 100644 redmine/public/manual/fr/ch01s01.html create mode 100644 redmine/public/manual/fr/ch01s02.html create mode 100644 redmine/public/manual/fr/ch01s03.html create mode 100644 redmine/public/manual/fr/ch01s04.html create mode 100644 redmine/public/manual/fr/ch01s05.html create mode 100644 redmine/public/manual/fr/ch01s06.html create mode 100644 redmine/public/manual/fr/ch01s07.html create mode 100644 redmine/public/manual/fr/ch01s08.html create mode 100644 redmine/public/manual/fr/ch01s09.html create mode 100644 redmine/public/manual/fr/ch02.html create mode 100644 redmine/public/manual/fr/ch02s01.html create mode 100644 redmine/public/manual/fr/ch02s02.html create mode 100644 redmine/public/manual/fr/ch02s03.html create mode 100644 redmine/public/manual/fr/ch02s04.html create mode 100644 redmine/public/manual/fr/ch02s05.html create mode 100644 redmine/public/manual/fr/ch02s06.html create mode 100644 redmine/public/manual/fr/ch02s07.html create mode 100644 redmine/public/manual/fr/ch02s08.html create mode 100644 redmine/public/manual/fr/html.css create mode 100644 redmine/public/manual/fr/index.html create mode 100644 redmine/public/manual/fr/resources/issues_list.png rename redmine/public/manual/{images => fr/resources}/users_list.png (100%) create mode 100644 redmine/public/manual/fr/resources/workflow.png delete mode 100644 redmine/public/manual/images/issues_list.png delete mode 100644 redmine/public/manual/images/users_edit.png delete mode 100644 redmine/public/manual/images/workflow.png delete mode 100644 redmine/public/manual/index.html delete mode 100644 redmine/public/manual/projects.html delete mode 100644 redmine/public/manual/stylesheets/help.css delete mode 100644 redmine/test/fixtures/attachments.yml delete mode 100644 redmine/test/fixtures/custom_fields.yml delete mode 100644 redmine/test/fixtures/documents.yml delete mode 100644 redmine/test/fixtures/enumerations.yml delete mode 100644 redmine/test/fixtures/issue_categories.yml delete mode 100644 redmine/test/fixtures/issue_custom_fields.yml delete mode 100644 redmine/test/fixtures/issue_custom_values.yml delete mode 100644 redmine/test/fixtures/issue_histories.yml delete mode 100644 redmine/test/fixtures/issue_statuses.yml delete mode 100644 redmine/test/fixtures/issues.yml delete mode 100644 redmine/test/fixtures/mailer/issue_closed delete mode 100644 redmine/test/fixtures/members.yml delete mode 100644 redmine/test/fixtures/news.yml delete mode 100644 redmine/test/fixtures/permissions.yml delete mode 100644 redmine/test/fixtures/trackers.yml delete mode 100644 redmine/test/fixtures/versions.yml delete mode 100644 redmine/test/fixtures/workflow.yml delete mode 100644 redmine/test/functional/account_controller_test.rb delete mode 100644 redmine/test/functional/admin_controller_test.rb delete mode 100644 redmine/test/functional/custom_fields_controller_test.rb delete mode 100644 redmine/test/functional/documents_controller_test.rb delete mode 100644 redmine/test/functional/enumerations_controller_test.rb delete mode 100644 redmine/test/functional/help_controller_test.rb delete mode 100644 redmine/test/functional/issue_categories_controller_test.rb delete mode 100644 redmine/test/functional/issue_statuses_controller_test.rb delete mode 100644 redmine/test/functional/issues_controller_test.rb delete mode 100644 redmine/test/functional/members_controller_test.rb delete mode 100644 redmine/test/functional/news_controller_test.rb delete mode 100644 redmine/test/functional/reports_controller_test.rb delete mode 100644 redmine/test/functional/roles_controller_test.rb delete mode 100644 redmine/test/functional/trackers_controller_test.rb delete mode 100644 redmine/test/functional/users_controller_test.rb delete mode 100644 redmine/test/functional/versions_controller_test.rb delete mode 100644 redmine/test/functional/welcome_controller_test.rb create mode 100644 redmine/test/integration/account_test.rb create mode 100644 redmine/test/integration/admin_test.rb delete mode 100644 redmine/test/unit/attachment_test.rb delete mode 100644 redmine/test/unit/custom_field_test.rb delete mode 100644 redmine/test/unit/document_test.rb delete mode 100644 redmine/test/unit/enumeration_test.rb delete mode 100644 redmine/test/unit/issue_category_test.rb delete mode 100644 redmine/test/unit/issue_custom_field_test.rb delete mode 100644 redmine/test/unit/issue_custom_value_test.rb delete mode 100644 redmine/test/unit/issue_history_test.rb delete mode 100644 redmine/test/unit/issue_status_test.rb delete mode 100644 redmine/test/unit/issue_test.rb delete mode 100644 redmine/test/unit/mailer_test.rb delete mode 100644 redmine/test/unit/member_test.rb delete mode 100644 redmine/test/unit/news_test.rb delete mode 100644 redmine/test/unit/packages_test.rb delete mode 100644 redmine/test/unit/permission_test.rb delete mode 100644 redmine/test/unit/role_test.rb delete mode 100644 redmine/test/unit/tracker_test.rb delete mode 100644 redmine/test/unit/version_test.rb delete mode 100644 redmine/test/unit/workflow_test.rb diff --git a/redmine/app/controllers/account_controller.rb b/redmine/app/controllers/account_controller.rb index d5c98f58c..54e0ef704 100644 --- a/redmine/app/controllers/account_controller.rb +++ b/redmine/app/controllers/account_controller.rb @@ -16,31 +16,30 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class AccountController < ApplicationController - layout 'base' + layout 'base' + # prevents login action to be filtered by check_if_login_required application scope filter skip_before_filter :check_if_login_required, :only => :login - before_filter :require_login, :except => [:show, :login] + before_filter :require_login, :except => [:show, :login] - def show - @user = User.find(params[:id]) - end - - # Login request and validation - def login - if request.get? - session[:user] = nil - @user = User.new - else - @user = User.new(params[:user]) - logged_in_user = @user.try_to_login - if logged_in_user - session[:user] = logged_in_user - redirect_back_or_default :controller => 'account', :action => 'my_page' - else - flash[:notice] = _('Invalid user/password') - end - end - end + def show + @user = User.find(params[:id]) + end + + # Login request and validation + def login + if request.get? + session[:user] = nil + else + logged_in_user = User.try_to_login(params[:login], params[:password]) + if logged_in_user + session[:user] = logged_in_user + redirect_back_or_default :controller => 'account', :action => 'my_page' + else + flash[:notice] = _('Invalid user/password') + end + end + end # Log out current user and redirect to welcome page def logout @@ -64,20 +63,15 @@ class AccountController < ApplicationController end end - # Change current user's password - def change_password - @user = User.find(session[:user].id) - if @user.check_password?(@params[:old_password]) - if @params[:new_password] == @params[:new_password_confirmation] - if @user.change_password(@params[:old_password], @params[:new_password]) - flash[:notice] = 'Password was successfully updated.' - end - else - flash[:notice] = 'Password confirmation doesn\'t match!' - end - else - flash[:notice] = 'Wrong password' - end - render :action => 'my_account' - end + # Change current user's password + def change_password + @user = User.find(session[:user].id) + if @user.check_password?(@params[:password]) + @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] + flash[:notice] = 'Password was successfully updated.' if @user.save + else + flash[:notice] = 'Wrong password' + end + render :action => 'my_account' + end end diff --git a/redmine/app/controllers/admin_controller.rb b/redmine/app/controllers/admin_controller.rb index fa34baff1..68d08137d 100644 --- a/redmine/app/controllers/admin_controller.rb +++ b/redmine/app/controllers/admin_controller.rb @@ -16,26 +16,32 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class AdminController < ApplicationController - layout 'base' - before_filter :require_admin - - helper :sort - include SortHelper + layout 'base' + before_filter :require_admin - def index - end + helper :sort + include SortHelper + + def index + end def projects - sort_init 'projects.name', 'asc' - sort_update - @project_pages, @projects = paginate :projects, :per_page => 15, :order => sort_clause + sort_init 'name', 'asc' + sort_update + @project_count = Project.count + @project_pages = Paginator.new self, @project_count, + 15, + @params['page'] + @projects = Project.find :all, :order => sort_clause, + :limit => @project_pages.items_per_page, + :offset => @project_pages.current.offset end - + def mail_options - @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || [] + @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || [] if request.post? @actions.each { |a| - a.mail_enabled = params[:action_ids].include? a.id.to_s + a.mail_enabled = (params[:action_ids] || []).include? a.id.to_s a.save } flash[:notice] = "Mail options were successfully updated." @@ -44,6 +50,5 @@ class AdminController < ApplicationController def info @adapter_name = ActiveRecord::Base.connection.adapter_name - end - + end end diff --git a/redmine/app/controllers/application.rb b/redmine/app/controllers/application.rb index a9dd6b80e..9cc37cfa9 100644 --- a/redmine/app/controllers/application.rb +++ b/redmine/app/controllers/application.rb @@ -24,63 +24,73 @@ class ApplicationController < ActionController::Base end def set_localization - Localization.lang = session[:user].nil? ? RDM_DEFAULT_LANG : (session[:user].language || RDM_DEFAULT_LANG) + Localization.lang = begin + if session[:user] + session[:user].language + elsif request.env['HTTP_ACCEPT_LANGUAGE'] + accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first + if Localization.langs.collect{ |l| l[1] }.include? accept_lang + accept_lang + end + end + rescue + nil + end || RDM_DEFAULT_LANG end - def require_login - unless session[:user] - store_location - redirect_to(:controller => "account", :action => "login") - end - end + def require_login + unless session[:user] + store_location + redirect_to(:controller => "account", :action => "login") + end + end - def require_admin - if session[:user].nil? - store_location - redirect_to(:controller => "account", :action => "login") - else - unless session[:user].admin? - flash[:notice] = "Acces not allowed" - redirect_to(:controller => "projects", :action => "list") - end - end - end + def require_admin + if session[:user].nil? + store_location + redirect_to(:controller => "account", :action => "login") + else + unless session[:user].admin? + flash[:notice] = "Acces not allowed" + redirect_to(:controller => "projects", :action => "list") + end + end + end - # authorizes the user for the requested action. - def authorize + # authorizes the user for the requested action. + def authorize # check if action is allowed on public projects - if @project.public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ] + if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ] return true end - # if user is not logged in, he is redirect to login form - unless session[:user] - store_location - redirect_to(:controller => "account", :action => "login") - return false - end - # check if user is authorized + # if user not logged in, redirect to login form + unless session[:user] + store_location + redirect_to(:controller => "account", :action => "login") + return false + end + # if logged in, check if authorized if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) ) return true - end + end flash[:notice] = "Acces denied" redirect_to(:controller => "") - return false - end + false + end - # store current uri in the session. - # we can return to this location by calling redirect_back_or_default - def store_location - session[:return_to] = @request.request_uri - end - - # move to the last store_location call or to the passed default one - def redirect_back_or_default(default) - if session[:return_to].nil? - redirect_to default - else - redirect_to_url session[:return_to] - session[:return_to] = nil - end - end - + # store current uri in session. + # return to this location by calling redirect_back_or_default + def store_location + session[:return_to] = @request.request_uri + end + + # move to the last store_location call or to the passed default one + def redirect_back_or_default(default) + if session[:return_to].nil? + redirect_to default + else + redirect_to_url session[:return_to] + session[:return_to] = nil + end + end end \ No newline at end of file diff --git a/redmine/app/controllers/help_controller.rb b/redmine/app/controllers/help_controller.rb index 4b555d599..e51d077a1 100644 --- a/redmine/app/controllers/help_controller.rb +++ b/redmine/app/controllers/help_controller.rb @@ -16,28 +16,32 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class HelpController < ApplicationController - - skip_before_filter :check_if_login_required - before_filter :load_help_config - def index - if @params[:ctrl] and @help_config[@params[:ctrl]] - if @params[:page] and @help_config[@params[:ctrl]][@params[:page]] - template = @help_config[@params[:ctrl]][@params[:page]] - else - template = @help_config[@params[:ctrl]]['index'] - end - end - - if template - redirect_to "/manual/#{template}" - else - redirect_to "/manual/" + skip_before_filter :check_if_login_required + before_filter :load_help_config + + # displays help page for the requested controller/action + def index + # select help page to display + if @params[:ctrl] and @help_config['pages'][@params[:ctrl]] + if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]] + template = @help_config['pages'][@params[:ctrl]][@params[:page]] + else + template = @help_config['pages'][@params[:ctrl]]['index'] + end end - end + # choose language according to available help translations + lang = (@help_config['langs'].include? Localization.lang) ? Localization.lang : @help_config['langs'].first + + if template + redirect_to "/manual/#{lang}/#{template}" + else + redirect_to "/manual/#{lang}/" + end + end private - def load_help_config - @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml")) - end + def load_help_config + @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml")) + end end diff --git a/redmine/app/controllers/projects_controller.rb b/redmine/app/controllers/projects_controller.rb index a9737aa1c..2bef221b1 100644 --- a/redmine/app/controllers/projects_controller.rb +++ b/redmine/app/controllers/projects_controller.rb @@ -32,58 +32,62 @@ class ProjectsController < ApplicationController render :action => 'list' end - # Lists public projects - def list - sort_init 'projects.name', 'asc' - sort_update - @project_count = Project.count(["public=?", true]) - @project_pages = Paginator.new self, @project_count, + # Lists public projects + def list + sort_init 'name', 'asc' + sort_update + @project_count = Project.count(["is_public=?", true]) + @project_pages = Paginator.new self, @project_count, 15, @params['page'] - @projects = Project.find :all, :order => sort_clause, - :conditions => ["public=?", true], + @projects = Project.find :all, :order => sort_clause, + :conditions => ["is_public=?", true], :limit => @project_pages.items_per_page, :offset => @project_pages.current.offset end # Add a new project - def add - @custom_fields = CustomField::find_all - @project = Project.new(params[:project]) - if request.post? - @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids] - if @project.save - flash[:notice] = 'Project was successfully created.' - redirect_to :controller => 'admin', :action => 'projects' - end - end - end + def add + @custom_fields = CustomField::find_all + @root_projects = Project::find(:all, :conditions => "parent_id is null") + @project = Project.new(params[:project]) + if request.post? + @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids] + if @project.save + flash[:notice] = 'Project was successfully created.' + redirect_to :controller => 'admin', :action => 'projects' + end + end + end - # Show @project - def show - @members = @project.members.find(:all, :include => [:user, :role]) - end + # Show @project + def show + @members = @project.members.find(:all, :include => [:user, :role]) + @subprojects = @project.children if @project.children_count > 0 + @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC") + end def settings - @custom_fields = CustomField::find_all - @issue_category ||= IssueCategory.new + @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id]) + @custom_fields = CustomField::find_all + @issue_category ||= IssueCategory.new @member ||= @project.members.new @roles = Role.find_all @users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user } end - # Edit @project - def edit - if request.post? - @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids] - if @project.update_attributes(params[:project]) - flash[:notice] = 'Project was successfully updated.' - redirect_to :action => 'settings', :id => @project + # Edit @project + def edit + if request.post? + @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids] + if @project.update_attributes(params[:project]) + flash[:notice] = 'Project was successfully updated.' + redirect_to :action => 'settings', :id => @project else settings render :action => 'settings' - end - end + end + end end # Delete @project @@ -181,7 +185,7 @@ class ProjectsController < ApplicationController end end - # Show issues list of @project + # Show filtered/sorted issues list of @project def list_issues sort_init 'issues.id', 'desc' sort_update @@ -189,10 +193,10 @@ class ProjectsController < ApplicationController search_filter_init_list_issues search_filter_update if params[:set_filter] or request.post? - @issue_count = Issue.count(:include => :status, :conditions => search_filter_clause) + @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause) @issue_pages = Paginator.new self, @issue_count, 15, @params['page'] @issues = Issue.find :all, :order => sort_clause, - :include => [ :author, :status, :tracker ], + :include => [ :author, :status, :tracker, :project ], :conditions => search_filter_clause, :limit => @issue_pages.items_per_page, :offset => @issue_pages.current.offset @@ -206,7 +210,7 @@ class ProjectsController < ApplicationController search_filter_init_list_issues @issues = Issue.find :all, :order => sort_clause, - :include => [ :author, :status, :tracker ], + :include => [ :author, :status, :tracker, :project ], :conditions => search_filter_clause export = StringIO.new diff --git a/redmine/app/controllers/roles_controller.rb b/redmine/app/controllers/roles_controller.rb index 6e4fc74e0..657f62e05 100644 --- a/redmine/app/controllers/roles_controller.rb +++ b/redmine/app/controllers/roles_controller.rb @@ -62,9 +62,6 @@ class RolesController < ApplicationController end def workflow - @roles = Role.find_all - @trackers = Tracker.find_all - @statuses = IssueStatus.find_all @role = Role.find_by_id(params[:role_id]) @tracker = Tracker.find_by_id(params[:tracker_id]) @@ -80,5 +77,8 @@ class RolesController < ApplicationController flash[:notice] = 'Workflow was successfully updated.' end end + @roles = Role.find_all + @trackers = Tracker.find_all + @statuses = IssueStatus.find(:all, :include => :workflows) end end diff --git a/redmine/app/controllers/users_controller.rb b/redmine/app/controllers/users_controller.rb index 64c9fd311..3a6042718 100644 --- a/redmine/app/controllers/users_controller.rb +++ b/redmine/app/controllers/users_controller.rb @@ -16,58 +16,62 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class UsersController < ApplicationController - layout 'base' - before_filter :require_admin - - helper :sort - include SortHelper - - def index - list - render :action => 'list' - end + layout 'base' + before_filter :require_admin + + helper :sort + include SortHelper - def list - sort_init 'users.login', 'asc' - sort_update - @user_count = User.count - @user_pages = Paginator.new self, @user_count, + def index + list + render :action => 'list' + end + + def list + sort_init 'login', 'asc' + sort_update + @user_count = User.count + @user_pages = Paginator.new self, @user_count, 15, @params['page'] - @users = User.find :all, :order => sort_clause, + @users = User.find :all,:order => sort_clause, :limit => @user_pages.items_per_page, :offset => @user_pages.current.offset - end + end - def add - if request.get? - @user = User.new - else - @user = User.new(params[:user]) - @user.admin = params[:user][:admin] - if @user.save - flash[:notice] = 'User was successfully created.' - redirect_to :action => 'list' - end - end - end + def add + if request.get? + @user = User.new + else + @user = User.new(params[:user]) + @user.admin = params[:user][:admin] || false + @user.login = params[:user][:login] + @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] + if @user.save + flash[:notice] = 'User was successfully created.' + redirect_to :action => 'list' + end + end + end - def edit - @user = User.find(params[:id]) - if request.post? - @user.admin = params[:user][:admin] if params[:user][:admin] - if @user.update_attributes(params[:user]) - flash[:notice] = 'User was successfully updated.' - redirect_to :action => 'list' - end - end - end + def edit + @user = User.find(params[:id]) + if request.post? + @user.admin = params[:user][:admin] if params[:user][:admin] + @user.login = params[:user][:login] if params[:user][:login] + @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? + if @user.update_attributes(params[:user]) + flash[:notice] = 'User was successfully updated.' + redirect_to :action => 'list' + end + end + end - def destroy - User.find(params[:id]).destroy - redirect_to :action => 'list' + def destroy + User.find(params[:id]).destroy + redirect_to :action => 'list' rescue flash[:notice] = "Unable to delete user" redirect_to :action => 'list' - end + end end diff --git a/redmine/app/controllers/versions_controller.rb b/redmine/app/controllers/versions_controller.rb index c4fd241a8..c462867c8 100644 --- a/redmine/app/controllers/versions_controller.rb +++ b/redmine/app/controllers/versions_controller.rb @@ -38,6 +38,9 @@ class VersionsController < ApplicationController @attachment = @version.attachments.find(params[:attachment_id]) @attachment.increment_download send_file @attachment.diskfile, :filename => @attachment.filename + rescue + flash[:notice]="Requested file doesn't exist or has been deleted." + redirect_to :controller => 'projects', :action => 'list_files', :id => @project end def destroy_file diff --git a/redmine/app/helpers/application_helper.rb b/redmine/app/helpers/application_helper.rb index 4a50b949a..de53f2ad6 100644 --- a/redmine/app/helpers/application_helper.rb +++ b/redmine/app/helpers/application_helper.rb @@ -27,7 +27,7 @@ module ApplicationHelper def authorize_for(controller, action) # check if action is allowed on public projects - if @project.public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] + if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] return true end # check if user is authorized diff --git a/redmine/app/helpers/search_filter_helper.rb b/redmine/app/helpers/search_filter_helper.rb index 7acc8b284..0999dfbcc 100644 --- a/redmine/app/helpers/search_filter_helper.rb +++ b/redmine/app/helpers/search_filter_helper.rb @@ -18,68 +18,73 @@ module SearchFilterHelper def search_filter_criteria(name, options = {}) - session[:search_filter] ||= {} - session[:search_filter][name] ||= {} - unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions] - session[:search_filter][name][:options] = [] - session[:search_filter][name][:conditions] = {} - yield.each { |c| - session[:search_filter][name][:options] << [c[0], c[1].to_s] - session[:search_filter][name][:conditions].store(c[1].to_s, c[2]) - } - end + @search_filter ||= {} + @search_filter[name] ||= {} + @search_filter[name][:options] = [] + @search_filter[name][:conditions] = {} + yield.each { |c| + @search_filter[name][:options] << [c[0], c[1].to_s] + @search_filter[name][:conditions].store(c[1].to_s, c[2]) + } end def search_filter_update - session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field] } + @search_filter.each_key {|field| session[:search_filter][field] = params[field] } end def search_filter_clause - clause = ["issues.project_id=?", @project.id] - session[:search_filter].each { |k, v| - v[:value] ||= v[:options][0][1] - if (!v[:conditions][v[:value]][0].empty?) - clause[0] = clause[0] + " AND " + v[:conditions][v[:value]][0] - clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil? + clause = ["1=1"] + @search_filter.each { |k, v| + filter_value = session[:search_filter][k] || v[:options][0][1] + if v[:conditions][filter_value] + clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first + clause += v[:conditions][filter_value][1..-1] end } clause end - def search_filter_tag(criteria) + def search_filter_tag(criteria, options = {}) + options[:name] = criteria content_tag("select", - options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]), - :name => criteria + options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]), + options ) end def search_filter_init_list_issues search_filter_criteria('status_id') { - [ ["[Open]", "O", ["issue_statuses.is_closed=?", false]], - ["[All]", "A", ["", false]] + [ [_('[Open]'), "O", ["issue_statuses.is_closed=?", false]], + [_('[All]'), "A", nil] ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] } } search_filter_criteria('tracker_id') { - [ ["[All]", "A", ["", false]] + [ [_('[All]'), "A", nil] ] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] } } search_filter_criteria('priority_id') { - [ ["[All]", "A", ["", false]] + [ [_('[All]'), "A", nil] ] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] } } search_filter_criteria('category_id') { - [ ["[All]", "A", ["", false]], - ["[None]", "N", ["issues.category_id is null"]] + [ [_('[All]'), "A", nil], + [_('[None]'), "N", ["issues.category_id is null"]] ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] } } search_filter_criteria('assigned_to_id') { - [ ["[All]", "A", ["", false]], - ["[Nobody]", "N", ["issues.assigned_to_id is null"]] - ] + User.find(:all).collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } - } + [ [_('[All]'), "A", nil], + [_('[None]'), "N", ["issues.assigned_to_id is null"]] + ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } + } + + search_filter_criteria('subproject_id') { + [ [_('[None]'), "N", ["issues.project_id=?", @project.id]], + [_('[All]'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]] + ] + } end end \ No newline at end of file diff --git a/redmine/app/models/attachment.rb b/redmine/app/models/attachment.rb index bc1ff5d87..1e5bd22b4 100644 --- a/redmine/app/models/attachment.rb +++ b/redmine/app/models/attachment.rb @@ -30,7 +30,7 @@ class Attachment < ActiveRecord::Base self.filename = sanitize_filename(@temp_file.original_filename) self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename self.content_type = @temp_file.content_type - self.size = @temp_file.size + self.filesize = @temp_file.size end end end diff --git a/redmine/app/models/enumeration.rb b/redmine/app/models/enumeration.rb index d93db4445..7f985d2f8 100644 --- a/redmine/app/models/enumeration.rb +++ b/redmine/app/models/enumeration.rb @@ -19,6 +19,7 @@ class Enumeration < ActiveRecord::Base before_destroy :check_integrity validates_presence_of :opt, :name + validates_uniqueness_of :name, :scope => [:opt] OPTIONS = [ ["Issue priorities", "IPRI"], diff --git a/redmine/app/models/issue_category.rb b/redmine/app/models/issue_category.rb index b7d4e2623..74adb8f52 100644 --- a/redmine/app/models/issue_category.rb +++ b/redmine/app/models/issue_category.rb @@ -17,9 +17,10 @@ class IssueCategory < ActiveRecord::Base before_destroy :check_integrity - belongs_to :project - + belongs_to :project + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:project_id] private def check_integrity diff --git a/redmine/app/models/issue_status.rb b/redmine/app/models/issue_status.rb index ff34cb666..ef9862092 100644 --- a/redmine/app/models/issue_status.rb +++ b/redmine/app/models/issue_status.rb @@ -17,24 +17,26 @@ class IssueStatus < ActiveRecord::Base before_destroy :check_integrity - has_many :workflows, :foreign_key => "old_status_id" - - validates_presence_of :name - validates_uniqueness_of :name + has_many :workflows, :foreign_key => "old_status_id" - # Returns the default status for new issues - def self.default - find(:first, :conditions =>["is_default=?", true]) - end - - # Returns an array of all statuses the given role can switch to - def new_statuses_allowed_to(role, tracker) - statuses = [] - for workflow in self.workflows.find(:all, :include => :new_status) - statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id - end unless role.nil? - statuses - end + validates_presence_of :name + validates_uniqueness_of :name + validates_length_of :html_color, :is=>6 + validates_format_of :html_color, :with => /^[a-f0-9]*$/i + + # Returns the default status for new issues + def self.default + find(:first, :conditions =>["is_default=?", true]) + end + + # Returns an array of all statuses the given role can switch to + def new_statuses_allowed_to(role, tracker) + statuses = [] + for workflow in self.workflows + statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id + end unless role.nil? or tracker.nil? + statuses + end def name _ self.attributes['name'] diff --git a/redmine/app/models/permission.rb b/redmine/app/models/permission.rb index f66214119..e05ca0fba 100644 --- a/redmine/app/models/permission.rb +++ b/redmine/app/models/permission.rb @@ -43,7 +43,7 @@ class Permission < ActiveRecord::Base end def self.allowed_to_public(action) - @@cached_perms_for_public ||= find(:all, :conditions => ["public=?", true]).collect {|p| "#{p.controller}/#{p.action}"} + @@cached_perms_for_public ||= find(:all, :conditions => ["is_public=?", true]).collect {|p| "#{p.controller}/#{p.action}"} @@cached_perms_for_public.include? action end diff --git a/redmine/app/models/project.rb b/redmine/app/models/project.rb index 7c50ee8cb..e5b5779cb 100644 --- a/redmine/app/models/project.rb +++ b/redmine/app/models/project.rb @@ -16,29 +16,33 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Project < ActiveRecord::Base - has_many :versions, :dependent => true, :order => "versions.date DESC" + has_many :versions, :dependent => true, :order => "versions.effective_date DESC" has_many :members, :dependent => true + has_many :users, :through => :members has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status has_many :documents, :dependent => true - has_many :news, :dependent => true, :order => "news.created_on DESC", :include => :author + has_many :news, :dependent => true, :include => :author has_many :issue_categories, :dependent => true has_and_belongs_to_many :custom_fields + acts_as_tree :order => "name", :counter_cache => true validates_presence_of :name, :descr + validates_uniqueness_of :name # returns 5 last created projects def self.latest find(:all, :limit => 5, :order => "created_on DESC") end - # Returns current version of the project - def current_version - versions.find(:first, :conditions => [ "date <= ?", Date.today ], :order => "date DESC, id DESC") - end - # Returns an array of all custom fields enabled for project issues # (explictly associated custom fields and custom fields enabled for all projects) def custom_fields_for_issues (CustomField.for_all + custom_fields).uniq - end + end + +protected + def validate + errors.add(parent_id, " must be a root project") if parent and parent.parent + errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0 + end end diff --git a/redmine/app/models/tracker.rb b/redmine/app/models/tracker.rb index 6b123d79c..4283f471d 100644 --- a/redmine/app/models/tracker.rb +++ b/redmine/app/models/tracker.rb @@ -20,6 +20,9 @@ class Tracker < ActiveRecord::Base has_many :issues has_many :workflows, :dependent => true + validates_presence_of :name + validates_uniqueness_of :name + def name _ self.attributes['name'] end diff --git a/redmine/app/models/user.rb b/redmine/app/models/user.rb index 1bc1b5802..e0adbb0df 100644 --- a/redmine/app/models/user.rb +++ b/redmine/app/models/user.rb @@ -18,58 +18,46 @@ require "digest/sha1" class User < ActiveRecord::Base - has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true + has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true - attr_accessor :password - attr_accessor :last_before_login_on - # Prevents unauthorized assignments - attr_protected :admin + attr_accessor :password, :password_confirmation + attr_accessor :last_before_login_on + # Prevents unauthorized assignments + attr_protected :login, :admin, :password, :password_confirmation, :hashed_password - validates_presence_of :login, :firstname, :lastname, :mail - validates_uniqueness_of :login, :mail - - # Login must contain lettres, numbers, underscores only - validates_format_of :login, :with => /^[a-z0-9_]+$/i - validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i - - def before_create - self.hashed_password = User.hash_password(self.password) - end - - def after_create - @password = nil - end + validates_presence_of :login, :firstname, :lastname, :mail + validates_uniqueness_of :login, :mail + # Login must contain lettres, numbers, underscores only + validates_format_of :login, :with => /^[a-z0-9_]+$/i + validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i + # Password length between 4 and 12 + validates_length_of :password, :in => 4..12, :allow_nil => true + validates_confirmation_of :password, :allow_nil => true - # Returns the user that matches user's login and password - def try_to_login - @user = User.login(self.login, self.password) - unless @user.nil? - @user.last_before_login_on = @user.last_login_on - @user.update_attribute(:last_login_on, DateTime.now) - end - @user - end + def before_save + # update hashed_password if password was set + self.hashed_password = User.hash_password(self.password) if self.password + end - # Return user's full name for display - def display_name - firstname + " " + lastname #+ (self.admin ? " (Admin)" : "" ) - end + # Returns the user that matches provided login and password, or nil + def self.try_to_login(login, password) + user = find(:first, :conditions => ["login=? and hashed_password=? and locked=?", login, User.hash_password(password), false]) + if user + user.last_before_login_on = user.last_login_on + user.update_attribute(:last_login_on, Time.now) + end + user + end + + # Return user's full name for display + def display_name + firstname + " " + lastname + end + + def check_password?(clear_password) + User.hash_password(clear_password) == self.hashed_password + end - # Returns the user that matches the given login and password - def self.login(login, password) - hashed_password = hash_password(password || "") - find(:first, - :conditions => ["login = ? and hashed_password = ? and locked = ?", login, hashed_password, false]) - end - - def check_password?(clear_password) - User.hash_password(clear_password) == self.hashed_password - end - - def change_password(current_password, new_password) - self.hashed_password = User.hash_password(new_password) - save - end def role_for_project(project_id) @role_for_projects ||= @@ -82,8 +70,8 @@ class User < ActiveRecord::Base end private - # Return password digest - def self.hash_password(clear_password) - Digest::SHA1.hexdigest(clear_password) - end + # Return password digest + def self.hash_password(clear_password) + Digest::SHA1.hexdigest(clear_password || "") + end end diff --git a/redmine/app/models/version.rb b/redmine/app/models/version.rb index 02dee15c8..70bd6e1c3 100644 --- a/redmine/app/models/version.rb +++ b/redmine/app/models/version.rb @@ -16,12 +16,13 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Version < ActiveRecord::Base - before_destroy :check_integrity - belongs_to :project - has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' + before_destroy :check_integrity + belongs_to :project + has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' has_many :attachments, :as => :container, :dependent => true - - validates_presence_of :name, :descr + + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:project_id] private def check_integrity diff --git a/redmine/app/models/workflow.rb b/redmine/app/models/workflow.rb index 212e33350..22c873fc7 100644 --- a/redmine/app/models/workflow.rb +++ b/redmine/app/models/workflow.rb @@ -16,10 +16,9 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Workflow < ActiveRecord::Base + belongs_to :role + belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id' + belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id' - belongs_to :role - belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id' - belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id' - - validates_presence_of :role, :old_status, :new_status + validates_presence_of :role, :old_status, :new_status end diff --git a/redmine/app/views/account/login.rhtml b/redmine/app/views/account/login.rhtml index cc360ebac..bc2b5a562 100644 --- a/redmine/app/views/account/login.rhtml +++ b/redmine/app/views/account/login.rhtml @@ -1,12 +1,12 @@
-

<%=_ 'Please login' %>

+

<%=_('Please login') %>

<%= start_form_tag :action=> "login" %> -


-

+


+<%= text_field_tag 'login', nil, :size => 25 %>


-

+<%= password_field_tag 'password', nil, :size => 25 %>

<%= end_form_tag %> diff --git a/redmine/app/views/account/my_account.rhtml b/redmine/app/views/account/my_account.rhtml index 34ae4885f..7248f0e4a 100644 --- a/redmine/app/views/account/my_account.rhtml +++ b/redmine/app/views/account/my_account.rhtml @@ -3,13 +3,14 @@

<%=_('Login')%>: <%= @user.login %>
<%=_('Created on')%>: <%= format_time(@user.created_on) %>, <%=_('Last update')%>: <%= format_time(@user.updated_on) %>

+ +<%= error_messages_for 'user' %>

<%=_('Information')%>

  <%= start_form_tag :action => 'my_account' %> - <%= error_messages_for 'user' %>


@@ -39,14 +40,14 @@   <%= start_form_tag :action => 'change_password' %> -


- <%= password_field_tag 'old_password' %>

+


+ <%= password_field_tag 'password', nil, :size => 25 %>


- <%= password_field_tag 'new_password' %>

+ <%= password_field_tag 'new_password', nil, :size => 25 %>


- <%= password_field_tag 'new_password_confirmation' %>

+ <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %>

<%= submit_tag _('Save') %>
<%= end_form_tag %> diff --git a/redmine/app/views/admin/info.rhtml b/redmine/app/views/admin/info.rhtml index c73f59c25..c987805c9 100644 --- a/redmine/app/views/admin/info.rhtml +++ b/redmine/app/views/admin/info.rhtml @@ -1,4 +1,10 @@

<%=_('Information')%>

-<%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %>
-<%=_('Database')%>: <%= @adapter_name %> \ No newline at end of file +

<%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %>

+ +Environment: +
    +<% Rails::Info.properties.each do |name, value| %> +
  • <%= name %>: <%= value %>
  • +<% end %> +
\ No newline at end of file diff --git a/redmine/app/views/admin/projects.rhtml b/redmine/app/views/admin/projects.rhtml index dd3953518..bcb940b4d 100644 --- a/redmine/app/views/admin/projects.rhtml +++ b/redmine/app/views/admin/projects.rhtml @@ -2,20 +2,20 @@ - <%= sort_header_tag('projects.name', :caption => _('Project')) %> + <%= sort_header_tag('name', :caption => _('Project')) %> - - <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %> + + + <%= sort_header_tag('created_on', :caption => _('Created on')) %> -<% odd_or_even = 1 - for project in @projects - odd_or_even = 1 - odd_or_even %> - +<% for project in @projects %> + ">
<%=_('Description')%><%=_('Public')%><%=_('Public')%><%=_('Subprojects')%>
<%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %> <%= project.descr %> - <%= image_tag 'true' if project.public? %> + <%= image_tag 'true' if project.is_public? %> + <%= project.projects_count %> <%= format_date(project.created_on) %> <%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %> @@ -26,10 +26,7 @@ <% end %>
-<%= link_to ('« ' + _('Previous')), { :page => @project_pages.current.previous } if @project_pages.current.previous %> -<%= pagination_links(@project_pages) %> -<%= link_to (_('Next') + ' »'), { :page => @project_pages.current.next } if @project_pages.current.next %> - -
- -<%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %> \ No newline at end of file +

<%= pagination_links_full @project_pages %> +[ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]

+ +

<%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %>

\ No newline at end of file diff --git a/redmine/app/views/custom_fields/list.rhtml b/redmine/app/views/custom_fields/list.rhtml index 0e29a5b37..2e654072f 100644 --- a/redmine/app/views/custom_fields/list.rhtml +++ b/redmine/app/views/custom_fields/list.rhtml @@ -10,7 +10,7 @@ <% for custom_field in @custom_fields %> - + "> <%= link_to custom_field.name, :action => 'edit', :id => custom_field %> <%= CustomField::TYPES[custom_field.typ][0] %> <%= image_tag 'true' if custom_field.is_required? %> diff --git a/redmine/app/views/documents/show.rhtml b/redmine/app/views/documents/show.rhtml index bc9557e55..8e09bb2f5 100644 --- a/redmine/app/views/documents/show.rhtml +++ b/redmine/app/views/documents/show.rhtml @@ -24,14 +24,16 @@ <%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %> <%= format_date(attachment.created_on) %> <%= attachment.author.display_name %> - <%= human_size(attachment.size) %>
<%= attachment.downloads %> <%=_('download')%>(s) + <%= human_size(attachment.filesize) %>
<%= attachment.downloads %> <%=_('download')%>(s) + <% if authorize_for('documents', 'destroy_attachment') %> <%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %> <%= submit_tag _('Delete'), :class => "button-small" %> <%= end_form_tag %> - <% end %> + <% end %> + <% end %>
diff --git a/redmine/app/views/issue_statuses/_form.rhtml b/redmine/app/views/issue_statuses/_form.rhtml index 5f4b9ce3d..7c4d63674 100644 --- a/redmine/app/views/issue_statuses/_form.rhtml +++ b/redmine/app/views/issue_statuses/_form.rhtml @@ -1,7 +1,7 @@ <%= error_messages_for 'issue_status' %> -


+

*
<%= text_field 'issue_status', 'name' %>

<%= check_box 'issue_status', 'is_closed' %> @@ -11,7 +11,7 @@

-#<%= text_field 'issue_status', 'html_color', :size => 6 %>

+#<%= text_field 'issue_status', 'html_color', :maxlength => 6 %> *

diff --git a/redmine/app/views/issue_statuses/list.rhtml b/redmine/app/views/issue_statuses/list.rhtml index 050e08f0f..8c0532263 100644 --- a/redmine/app/views/issue_statuses/list.rhtml +++ b/redmine/app/views/issue_statuses/list.rhtml @@ -10,10 +10,10 @@ <% for status in @issue_statuses %> - + "> <%= link_to status.name, :action => 'edit', :id => status %> - <%= image_tag 'true' if status.is_default %> - <%= image_tag 'true' if status.is_closed %> + <%= image_tag 'true' if status.is_default? %> + <%= image_tag 'true' if status.is_closed? %>   <%= start_form_tag :action => 'destroy', :id => status %> diff --git a/redmine/app/views/issues/show.rhtml b/redmine/app/views/issues/show.rhtml index 1c20c92dd..58c9b3579 100644 --- a/redmine/app/views/issues/show.rhtml +++ b/redmine/app/views/issues/show.rhtml @@ -10,7 +10,7 @@

<%=_('Assigned to')%>: <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %>

<%=_('Subject')%>: <%= @issue.subject %>

-

<%=_('Description')%>: <%= @issue.descr %>

+

<%=_('Description')%>: <%= simple_format auto_link @issue.descr %>

<%=_('Created on')%>: <%= format_date(@issue.created_on) %>

<% if authorize_for('issues', 'edit') %> @@ -65,7 +65,7 @@ <% for attachment in @issue.attachments %> - + <% if authorize_for('issues', 'destroy_attachment') %> diff --git a/redmine/app/views/layouts/base.rhtml b/redmine/app/views/layouts/base.rhtml index 731632fa4..21bb036d3 100644 --- a/redmine/app/views/layouts/base.rhtml +++ b/redmine/app/views/layouts/base.rhtml @@ -81,7 +81,7 @@ diff --git a/redmine/app/views/news/show.rhtml b/redmine/app/views/news/show.rhtml index 30aa2cda9..d6773cda9 100644 --- a/redmine/app/views/news/show.rhtml +++ b/redmine/app/views/news/show.rhtml @@ -6,5 +6,5 @@ <%=_('Date')%>: <%= format_time(@news.created_on) %>

-<%= @news.descr %> +<%= simple_format auto_link @news.descr %> diff --git a/redmine/app/views/projects/_form.rhtml b/redmine/app/views/projects/_form.rhtml index 2d38117a4..89f58354e 100644 --- a/redmine/app/views/projects/_form.rhtml +++ b/redmine/app/views/projects/_form.rhtml @@ -4,15 +4,23 @@


<%= text_field 'project', 'name' %>

+<% if session[:user].admin %> +


+

+<% end %> +


-<%= text_field 'project', 'descr', :size => 60 %>

+<%= text_area 'project', 'descr', :cols => 60, :rows => 3 %>


<%= text_field 'project', 'homepage', :size => 40 %>

-

<%= check_box 'project', 'public' %> -

- +

<%= check_box 'project', 'is_public' %> +

+
<%=_('Custom fields')%> <% for custom_field in @custom_fields %> <% fixed_issues.each do |version, issues| %> -

<%= version.name %> - <%= format_date(version.date) %>
+

<%= version.name %> - <%= format_date(version.effective_date) %>
<%=h version.descr %>

    <% issues.each do |i| %> diff --git a/redmine/app/views/projects/list.rhtml b/redmine/app/views/projects/list.rhtml index 2b2ac2d13..bee507af6 100644 --- a/redmine/app/views/projects/list.rhtml +++ b/redmine/app/views/projects/list.rhtml @@ -2,15 +2,13 @@
<%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.size) %>)<%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>) <%= format_date(attachment.created_on) %> <%= attachment.author.display_name %>
- <%= sort_header_tag('projects.name', :caption => _('Project')) %> + <%= sort_header_tag('name', :caption => _('Project')) %> - <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %> + <%= sort_header_tag('created_on', :caption => _('Created on')) %> -<% odd_or_even = 1 - for project in @projects - odd_or_even = 1 - odd_or_even %> - +<% for project in @projects %> + "> - <% odd_or_even = 1 - for file in version.attachments - odd_or_even = 1 - odd_or_even %> - + <% for file in version.attachments %> + "> - + <% if delete_allowed %> @@ -35,7 +33,8 @@ <% end %> - <% end %> + <% end + reset_cycle %> <% end %>
Description
<%= link_to project.name, :action => 'show', :id => project %> <%= project.descr %> <%= format_date(project.created_on) %> diff --git a/redmine/app/views/projects/list_files.rhtml b/redmine/app/views/projects/list_files.rhtml index 217e679b5..ced6400ba 100644 --- a/redmine/app/views/projects/list_files.rhtml +++ b/redmine/app/views/projects/list_files.rhtml @@ -17,14 +17,12 @@
<%= image_tag 'package' %> <%= version.name %>
<%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %> <%= format_date(file.created_on) %><%= human_size(file.size) %><%= human_size(file.filesize) %> <%= file.downloads %> <%= file.digest %>
diff --git a/redmine/app/views/projects/list_issues.rhtml b/redmine/app/views/projects/list_issues.rhtml index c01358efd..7e32fb257 100644 --- a/redmine/app/views/projects/list_issues.rhtml +++ b/redmine/app/views/projects/list_issues.rhtml @@ -3,17 +3,19 @@
- - - - - + + + + + + + diff --git a/redmine/app/views/projects/show.rhtml b/redmine/app/views/projects/show.rhtml index 3f10654f5..4fdbe51b4 100644 --- a/redmine/app/views/projects/show.rhtml +++ b/redmine/app/views/projects/show.rhtml @@ -13,8 +13,8 @@ <% for tracker in Tracker.find_all %>
  • <%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project, :set_filter => 1, - "issues.tracker_id" => tracker.id %>: - <%= tracker.issues.count(["project_id=?", @project.id]) %> <%=_('open')%> + "tracker_id" => tracker.id %>: + <%= Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %> <%=_('open')%>
  • <% end %> @@ -32,9 +32,18 @@ <% end %> + <% if @subprojects %> +
    +

    <%= image_tag "projects" %> <%=_('Subprojects')%>

    + <% for subproject in @subprojects %> + <%= link_to subproject.name, :action => 'show', :id => subproject %>
    + <% end %> +
    + <% end %> +

    <%=_('Latest news')%>

    - <% for news in @project.news %> + <% for news in @news %>

    <%= news.title %> (<%= link_to_user news.author %> <%= format_time(news.created_on) %>)
    <%= news.shortdescr %> diff --git a/redmine/app/views/roles/list.rhtml b/redmine/app/views/roles/list.rhtml index 146e45886..eb1a9ecc2 100644 --- a/redmine/app/views/roles/list.rhtml +++ b/redmine/app/views/roles/list.rhtml @@ -7,7 +7,7 @@ <% for role in @roles %> -

    + "> <% for tracker in @trackers %> - + ">
    <%=_('Status')%>:
    <%= search_filter_tag("status_id") %>
    <%=_('Tracker')%>:
    <%= search_filter_tag("tracker_id") %>
    <%=_('Priority')%>:
    <%= search_filter_tag("priority_id") %>
    <%=_('Category')%>:
    <%= search_filter_tag("category_id") %>
    <%=_('Assigned to')%>:
    <%= search_filter_tag("assigned_to_id") %>
    <%=_('Status')%>:
    <%= search_filter_tag 'status_id', :class => 'select-small' %>
    <%=_('Tracker')%>:
    <%= search_filter_tag 'tracker_id', :class => 'select-small' %>
    <%=_('Priority')%>:
    <%= search_filter_tag 'priority_id', :class => 'select-small' %>
    <%=_('Category')%>:
    <%= search_filter_tag 'category_id', :class => 'select-small' %>
    <%=_('Assigned to')%>:
    <%= search_filter_tag 'assigned_to_id', :class => 'select-small' %>
    <%=_('Subprojects')%>:
    <%= search_filter_tag 'subproject_id', :class => 'select-small' %>
    - <%= submit_tag _('Apply filter') %> + <%= submit_tag _('Apply filter'), :class => 'button-small' %> <%= end_form_tag %> <%= start_form_tag %> - <%= submit_tag _('Reset') %> + <%= submit_tag _('Reset'), :class => 'button-small' %> <%= end_form_tag %>
    <%= link_to role.name, :action => 'edit', :id => role %> <%= start_form_tag :action => 'destroy', :id => role %> diff --git a/redmine/app/views/trackers/list.rhtml b/redmine/app/views/trackers/list.rhtml index 3622a40f9..8b03a1413 100644 --- a/redmine/app/views/trackers/list.rhtml +++ b/redmine/app/views/trackers/list.rhtml @@ -7,7 +7,7 @@
    <%= link_to tracker.name, :action => 'edit', :id => tracker %> <%= start_form_tag :action => 'destroy', :id => tracker %> diff --git a/redmine/app/views/users/_form.rhtml b/redmine/app/views/users/_form.rhtml index 92f1e0e5a..6574cb026 100644 --- a/redmine/app/views/users/_form.rhtml +++ b/redmine/app/views/users/_form.rhtml @@ -2,10 +2,13 @@


    -<%= text_field 'user', 'login' %>

    +<%= text_field 'user', 'login', :size => 25 %>

    -


    -<%= password_field 'user', 'password' %>

    +


    +<%= password_field_tag 'password', nil, :size => 25 %>

    + +


    +<%= password_field_tag 'password_confirmation', nil, :size => 25 %>


    <%= text_field 'user', 'firstname' %>

    diff --git a/redmine/app/views/users/list.rhtml b/redmine/app/views/users/list.rhtml index b1bf937aa..3e3c21659 100644 --- a/redmine/app/views/users/list.rhtml +++ b/redmine/app/views/users/list.rhtml @@ -2,18 +2,18 @@ - <%= sort_header_tag('users.login', :caption => _('Login')) %> - <%= sort_header_tag('users.firstname', :caption => _('Firstname')) %> - <%= sort_header_tag('users.lastname', :caption => _('Lastname')) %> + <%= sort_header_tag('login', :caption => _('Login')) %> + <%= sort_header_tag('firstname', :caption => _('Firstname')) %> + <%= sort_header_tag('lastname', :caption => _('Lastname')) %> - <%= sort_header_tag('users.admin', :caption => _('Admin')) %> - <%= sort_header_tag('users.locked', :caption => _('Locked')) %> - <%= sort_header_tag('users.created_on', :caption => _('Created on')) %> - <%= sort_header_tag('users.last_login_on', :caption => _('Last login')) %> + <%= sort_header_tag('admin', :caption => _('Admin')) %> + <%= sort_header_tag('locked', :caption => _('Locked')) %> + <%= sort_header_tag('created_on', :caption => _('Created on')) %> + <%= sort_header_tag('last_login_on', :caption => _('Last login')) %> <% for user in @users %> - + "> @@ -25,10 +25,10 @@
    <%=_('Mail')%>
    <%= link_to user.login, :action => 'edit', :id => user %> <%= user.firstname %> <%= user.lastname %> <%= start_form_tag :action => 'edit', :id => user %> <% if user.locked? %> - <%= hidden_field_tag 'user[locked]', false %> + <%= hidden_field_tag 'user[locked]', 0 %> <%= submit_tag _('Unlock'), :class => "button-small" %> <% else %> - <%= hidden_field_tag 'user[locked]', true %> + <%= hidden_field_tag 'user[locked]', 1 %> <%= submit_tag _('Lock'), :class => "button-small" %> <% end %> <%= end_form_tag %> diff --git a/redmine/app/views/versions/_form.rhtml b/redmine/app/views/versions/_form.rhtml index 189e106cc..71c761e3d 100644 --- a/redmine/app/views/versions/_form.rhtml +++ b/redmine/app/views/versions/_form.rhtml @@ -1,13 +1,13 @@ <%= error_messages_for 'version' %> -


    +

    *
    <%= text_field 'version', 'name', :size => 20 %>


    <%= text_field 'version', 'descr', :size => 60 %>

    -


    -<%= date_select 'version', 'date' %>

    +


    +<%= date_select 'version', 'effective_date' %>

    diff --git a/redmine/app/views/welcome/index.rhtml b/redmine/app/views/welcome/index.rhtml index cbffa82ed..89a18f105 100644 --- a/redmine/app/views/welcome/index.rhtml +++ b/redmine/app/views/welcome/index.rhtml @@ -2,7 +2,7 @@

    <%=_('Welcome')%> !

    -

    Latest news

    +

    <%=_('Latest news')%>

    <% for news in @news %>

    <%= news.title %> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)
    @@ -16,7 +16,7 @@

    -

    Latest projects

    +

    <%=_('Latest projects')%>

      <% for project in @projects %>
    • diff --git a/redmine/config/database.yml b/redmine/config/database.yml index f65dc8cbb..cfb6f13df 100644 --- a/redmine/config/database.yml +++ b/redmine/config/database.yml @@ -5,6 +5,14 @@ # (on OS X: gem install mysql -- --include=/usr/local/lib) # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.0/en/old-client.html + +production: + adapter: mysql + database: redmine + host: localhost + username: root + password: + development: adapter: mysql database: redmine_development @@ -18,6 +26,17 @@ development_pgsql: host: localhost username: postgres password: "postgres" + +development_oracle: + adapter: oci + host: 192.168.0.14 + username: rails + password: "rails" + +development_sqlserver: + adapter: sqlserver + host: localhost,1157 + database: redmine test: adapter: mysql @@ -25,15 +44,26 @@ test: host: localhost username: root password: - + +test_pgsql: + adapter: postgresql + database: redmine + host: localhost + username: postgres + password: "postgres" + +test_oracle: + adapter: oci + host: 192.168.0.14 + username: rails_test + password: "rails" + +test_sqlserver: + adapter: sqlserver + host: localhost,1157 + database: redmine_test + demo: adapter: sqlite3 dbfile: db/redmine_demo.db -production: - adapter: mysql - database: redmine - host: localhost - username: root - password: - \ No newline at end of file diff --git a/redmine/config/environment.rb b/redmine/config/environment.rb index de12e7c34..acba82e7b 100644 --- a/redmine/config/environment.rb +++ b/redmine/config/environment.rb @@ -73,7 +73,7 @@ end # application name RDM_APP_NAME = "redMine" # application version -RDM_APP_VERSION = "0.1.0" +RDM_APP_VERSION = "0.2.0" # application host name RDM_HOST_NAME = "somenet.foo" # file storage path diff --git a/redmine/config/environments/development_oracle.rb b/redmine/config/environments/development_oracle.rb new file mode 100644 index 000000000..04b779200 --- /dev/null +++ b/redmine/config/environments/development_oracle.rb @@ -0,0 +1,19 @@ +# Settings specified here will take precedence over those in config/environment.rb + +# In the development environment your application's code is reloaded on +# every request. This slows down response time but is perfect for development +# since you don't have to restart the webserver when you make code changes. +config.cache_classes = false + +# Log error messages when you accidentally call methods on nil. +config.whiny_nils = true + +# Enable the breakpoint server that script/breakpointer connects to +config.breakpoint_server = true + +# Show full error reports and disable caching +config.action_controller.consider_all_requests_local = true +config.action_controller.perform_caching = false + +# Don't care if the mailer can't send +config.action_mailer.raise_delivery_errors = false diff --git a/redmine/config/environments/development_sqlserver.rb b/redmine/config/environments/development_sqlserver.rb new file mode 100644 index 000000000..04b779200 --- /dev/null +++ b/redmine/config/environments/development_sqlserver.rb @@ -0,0 +1,19 @@ +# Settings specified here will take precedence over those in config/environment.rb + +# In the development environment your application's code is reloaded on +# every request. This slows down response time but is perfect for development +# since you don't have to restart the webserver when you make code changes. +config.cache_classes = false + +# Log error messages when you accidentally call methods on nil. +config.whiny_nils = true + +# Enable the breakpoint server that script/breakpointer connects to +config.breakpoint_server = true + +# Show full error reports and disable caching +config.action_controller.consider_all_requests_local = true +config.action_controller.perform_caching = false + +# Don't care if the mailer can't send +config.action_mailer.raise_delivery_errors = false diff --git a/redmine/config/environments/test_oracle.rb b/redmine/config/environments/test_oracle.rb new file mode 100644 index 000000000..0b34ef19a --- /dev/null +++ b/redmine/config/environments/test_oracle.rb @@ -0,0 +1,15 @@ +# Settings specified here will take precedence over those in config/environment.rb + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! +config.cache_classes = true + +# Log error messages when you accidentally call methods on nil. +config.whiny_nils = true + +# Show full error reports and disable caching +config.action_controller.consider_all_requests_local = true +config.action_controller.perform_caching = false + diff --git a/redmine/config/environments/test_pgsql.rb b/redmine/config/environments/test_pgsql.rb new file mode 100644 index 000000000..0b34ef19a --- /dev/null +++ b/redmine/config/environments/test_pgsql.rb @@ -0,0 +1,15 @@ +# Settings specified here will take precedence over those in config/environment.rb + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! +config.cache_classes = true + +# Log error messages when you accidentally call methods on nil. +config.whiny_nils = true + +# Show full error reports and disable caching +config.action_controller.consider_all_requests_local = true +config.action_controller.perform_caching = false + diff --git a/redmine/config/environments/test_sqlserver.rb b/redmine/config/environments/test_sqlserver.rb new file mode 100644 index 000000000..0b34ef19a --- /dev/null +++ b/redmine/config/environments/test_sqlserver.rb @@ -0,0 +1,15 @@ +# Settings specified here will take precedence over those in config/environment.rb + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! +config.cache_classes = true + +# Log error messages when you accidentally call methods on nil. +config.whiny_nils = true + +# Show full error reports and disable caching +config.action_controller.consider_all_requests_local = true +config.action_controller.perform_caching = false + diff --git a/redmine/config/help.yml b/redmine/config/help.yml index a48798e03..362165bf6 100644 --- a/redmine/config/help.yml +++ b/redmine/config/help.yml @@ -1,21 +1,62 @@ -# administration -admin: - index: administration.html - mail_options: administration.html#mail_notifications - info: administration.html#app_info -users: - index: administration.html#users -roles: - index: administration.html#roles - workflow: administration.html#workflow -trackers: - index: administration.html#trackers -issue_statuses: - index: administration.html#issue_statuses +# redMine - project management software +# Copyright (C) 2006 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. -# projects -projects: - add: projects.html#settings +# available languages for help pages +langs: + - fr - -# issues \ No newline at end of file +# mapping between controller/action and help pages +# if action is not defined here, 'index' page will be displayed +pages: + # administration + admin: + index: ch01.html + mail_options: ch01s08.html + info: ch01s09.html + users: + index: ch01s01.html + roles: + index: ch01s02.html + workflow: ch01s06.html + trackers: + index: ch01s03.html + issue_statuses: + index: ch01s05.html + # projects + projects: + index: ch02.html + add: ch02s08.html + show: ch02s01.html + add_document: ch02s06.html + list_documents: ch02s06.html + add_issue: ch02s02.html + list_issues: ch02s02.html + add_news: ch02s05.html + list_news: ch02s05.html + add_file: ch02s07.html + list_files: ch02s07.html + changelog: ch02s04.html + issues: + index: ch02s02.html + documents: + index: ch02s06.html + news: + index: ch02s05.html + versions: + index: ch02s08.html + reports: + index: ch02s03.html \ No newline at end of file diff --git a/redmine/db/migrate/001_setup.rb b/redmine/db/migrate/001_setup.rb index c075c89f5..17487fcc5 100644 --- a/redmine/db/migrate/001_setup.rb +++ b/redmine/db/migrate/001_setup.rb @@ -1,3 +1,20 @@ +# redMine - project management software +# Copyright (C) 2006 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. + class Setup < ActiveRecord::Migration def self.up create_table "attachments", :force => true do |t| @@ -5,8 +22,8 @@ class Setup < ActiveRecord::Migration t.column "container_type", :string, :limit => 30, :default => "", :null => false t.column "filename", :string, :default => "", :null => false t.column "disk_filename", :string, :default => "", :null => false - t.column "size", :integer, :default => 0, :null => false - t.column "content_type", :string, :limit => 60, :default => "", :null => false + t.column "filesize", :integer, :default => 0, :null => false + t.column "content_type", :string, :limit => 60, :default => "" t.column "digest", :string, :limit => 40, :default => "", :null => false t.column "downloads", :integer, :default => 0, :null => false t.column "author_id", :integer, :default => 0, :null => false @@ -18,8 +35,8 @@ class Setup < ActiveRecord::Migration t.column "typ", :integer, :default => 0, :null => false t.column "is_required", :boolean, :default => false, :null => false t.column "is_for_all", :boolean, :default => false, :null => false - t.column "possible_values", :text, :default => "", :null => false - t.column "regexp", :string, :default => "", :null => false + t.column "possible_values", :text, :default => "" + t.column "regexp", :string, :default => "" t.column "min_length", :integer, :default => 0, :null => false t.column "max_length", :integer, :default => 0, :null => false end @@ -59,7 +76,7 @@ class Setup < ActiveRecord::Migration t.column "issue_id", :integer, :default => 0, :null => false t.column "status_id", :integer, :default => 0, :null => false t.column "author_id", :integer, :default => 0, :null => false - t.column "notes", :text, :default => "", :null => false + t.column "notes", :text, :default => "" t.column "created_on", :timestamp end @@ -99,7 +116,7 @@ class Setup < ActiveRecord::Migration create_table "news", :force => true do |t| t.column "project_id", :integer t.column "title", :string, :limit => 60, :default => "", :null => false - t.column "shortdescr", :string, :default => "", :null => false + t.column "shortdescr", :string, :default => "" t.column "descr", :text, :default => "", :null => false t.column "author_id", :integer, :default => 0, :null => false t.column "created_on", :timestamp @@ -109,7 +126,7 @@ class Setup < ActiveRecord::Migration t.column "controller", :string, :limit => 30, :default => "", :null => false t.column "action", :string, :limit => 30, :default => "", :null => false t.column "descr", :string, :limit => 60, :default => "", :null => false - t.column "public", :boolean, :default => false, :null => false + t.column "is_public", :boolean, :default => false, :null => false t.column "sort", :integer, :default => 0, :null => false t.column "mail_option", :boolean, :default => false, :null => false t.column "mail_enabled", :boolean, :default => false, :null => false @@ -125,8 +142,10 @@ class Setup < ActiveRecord::Migration create_table "projects", :force => true do |t| t.column "name", :string, :limit => 30, :default => "", :null => false t.column "descr", :string, :default => "", :null => false - t.column "homepage", :string, :limit => 60, :default => "", :null => false - t.column "public", :boolean, :default => true, :null => false + t.column "homepage", :string, :limit => 60, :default => "" + t.column "is_public", :boolean, :default => true, :null => false + t.column "parent_id", :integer + t.column "projects_count", :integer, :default => 0 t.column "created_on", :timestamp t.column "updated_on", :timestamp end @@ -158,8 +177,8 @@ class Setup < ActiveRecord::Migration create_table "versions", :force => true do |t| t.column "project_id", :integer, :default => 0, :null => false t.column "name", :string, :limit => 30, :default => "", :null => false - t.column "descr", :string, :default => "", :null => false - t.column "date", :date, :null => false + t.column "descr", :string, :default => "" + t.column "effective_date", :date, :null => false t.column "created_on", :timestamp t.column "updated_on", :timestamp end @@ -172,13 +191,13 @@ class Setup < ActiveRecord::Migration end # project - Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :public => true - Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :public => true - Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :public => true + Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :is_public => true + Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :is_public => true + Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :is_public => true Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150 Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151 # members - Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :public => true + Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :is_public => true Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220 Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221 Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222 @@ -191,9 +210,9 @@ class Setup < ActiveRecord::Migration Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421 Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422 # issues - Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :public => true - Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :public => true - Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :public => true + Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :is_public => true + Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :is_public => true + Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :is_public => true Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1 Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055 Permission.create :controller => "issues", :action => "change_status", :descr => "Change status", :sort => 1060, :mail_option => 1, :mail_enabled => 1 @@ -201,28 +220,30 @@ class Setup < ActiveRecord::Migration Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070 Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075 # news - Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :public => true - Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :public => true + Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :is_public => true + Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :is_public => true Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120 Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121 Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122 # documents - Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :public => true - Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :public => true - Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :public => true + Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :is_public => true + Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :is_public => true + Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :is_public => true Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220 Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221 Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222 Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223 Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224 # files - Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :public => true - Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :public => true + Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :is_public => true + Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :is_public => true Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320 Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322 # create default administrator account - user = User.create :login => "admin", :password => "admin", :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en" + user = User.create :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en" + user.login = "admin" + user.password = "admin" user.admin = true user.save diff --git a/redmine/db/migrate/002_default_configuration.rb b/redmine/db/migrate/002_default_configuration.rb index 8f851dfbc..794a96b26 100644 --- a/redmine/db/migrate/002_default_configuration.rb +++ b/redmine/db/migrate/002_default_configuration.rb @@ -1,12 +1,29 @@ +# redMine - project management software +# Copyright (C) 2006 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. + class DefaultConfiguration < ActiveRecord::Migration def self.up # roles r = Role.create(:name => "Manager") r.permissions = Permission.find(:all) r = Role.create :name => "Developer" - r.permissions = Permission.find([1, 2, 3, 6, 10, 11, 12, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]) + r.permissions = Permission.find(:all) r = Role.create :name => "Reporter" - r.permissions = Permission.find([1, 2, 3, 6, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 38, 39]) + r.permissions = Permission.find(:all) # trackers Tracker.create(:name => "Bug", :is_in_chlog => true) Tracker.create(:name => "Feature request", :is_in_chlog => true) diff --git a/redmine/doc/CHANGELOG b/redmine/doc/CHANGELOG index bae2e1bda..a6964124d 100644 --- a/redmine/doc/CHANGELOG +++ b/redmine/doc/CHANGELOG @@ -2,13 +2,22 @@ redMine - project management software Copyright (C) 2006 Jean-Philippe Lang -http://redmine.sourceforge.net/ +http://redmine.org/ -== xx/xx/2006 +== 07/09/2006 - v0.2.0 -* More filter options in issues list -* Issues list exportable to CSV +* new databases supported: Oracle, PostgreSQL, SQL Server +* projects/subprojects hierarchy (1 level of subprojects only) +* environment information display in admin/info +* more filter options in issues list (rev6) +* default language based on browser settings (Accept-Language HTTP header) +* issues list exportable to CSV (rev6) +* simple_format and auto_link on long text fields +* more data validations +* Fixed: error when all mail notifications are unchecked in admin/mail_options +* Fixed: all project news are displayed on project summary +* Fixed: Can't change user password in users/edit * Fixed: Error on tables creation with PostgreSQL (rev5) * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5) diff --git a/redmine/doc/INSTALL b/redmine/doc/INSTALL index 72a993687..e263a66ed 100644 --- a/redmine/doc/INSTALL +++ b/redmine/doc/INSTALL @@ -2,15 +2,23 @@ redMine - project management software Copyright (C) 2006 Jean-Philippe Lang -http://redmine.sourceforge.net/ +http://redmine.org/ == Requirements * Ruby on Rails 1.1 -* Any database supported by Rails (developped using MySQL 5) +* a database (see compatibility below) * (recommended) Apache/Lighttpd with FCGI support +Supported databases: + +* MySQL (tested with MySQL 5) +* PostgreSQL (tested with PostgreSQL 8.1) +* Oracle (tested with Oracle 10g) +* SQL Server (tested with SQL Server 2005) +* SQLite (tested with SQLite 3) + == Installation @@ -20,9 +28,9 @@ http://redmine.sourceforge.net/ 2. Create an empty database: "redmine" for example 3. Configure database parameters in config/database.yml - for "production" environment + for "production" environment (default database is MySQL) -4. Create database structure. Under application main directory: +4. Create the database structure. Under application main directory: rake migrate RAILS_ENV="production" It will create tables and default configuration data diff --git a/redmine/doc/README b/redmine/doc/README index 1c794e45b..874ac76a7 100644 --- a/redmine/doc/README +++ b/redmine/doc/README @@ -2,7 +2,7 @@ redMine - project management software Copyright (C) 2006 Jean-Philippe Lang -http://redmine.sourceforge.net/ +http://redmine.org/ == License @@ -34,6 +34,12 @@ redMine is a project management software written using Ruby on Rails. * multilanguage support +== User documentation + +User documentation for redMine is written using DocBook XML format. +It's also avaible as HTML files in /public/manual (contextual help) + + == Versioning redMine versioning scheme is major.minor.revision diff --git a/redmine/lang/fr_FR.rb b/redmine/lang/fr_FR.rb index 5dc7a59e0..0a7ce01ab 100644 --- a/redmine/lang/fr_FR.rb +++ b/redmine/lang/fr_FR.rb @@ -10,7 +10,11 @@ Localization.define('fr', 'Français') do |l| l.store 'Resolved', 'Résolue' l.store 'Closed', 'Fermée' l.store 'Rejected', 'Rejetée' - l.store 'Feedback', 'Commentaire' + l.store 'Feedback', 'Commentaire' + # filters + l.store '[All]', '[Tous]' + l.store '[Open]', '[Ouvert]' + l.store '[None]', '[Aucun]' # issue priorities l.store 'Issue priorities', 'Priorités des demandes' @@ -53,6 +57,9 @@ Localization.define('fr', 'Français') do |l| l.store 'Reported issues', 'Demandes soumises' l.store 'Assigned to me', 'Demandes qui me sont assignées' + # ./script/../config/../app/views/account/login.rhtml + l.store 'Please login', 'Identification' + # ./script/../config/../app/views/account/show.rhtml l.store 'Registered on', 'Inscrit le' l.store 'Projects', 'Projets' @@ -231,6 +238,7 @@ Localization.define('fr', 'Français') do |l| l.store 'New file', 'Nouveau fichier' # ./script/../config/../app/views/projects/list_issues.rhtml + l.store 'Subprojects', 'Sous-projets' l.store 'Apply filter', 'Appliquer' l.store 'Reset', 'Annuler' l.store 'Report an issue', 'Nouvelle demande' @@ -311,6 +319,6 @@ Localization.define('fr', 'Français') do |l| # ./script/../config/../app/views/versions/_form.rhtml # ./script/../config/../app/views/welcome/index.rhtml - + l.store 'Latest projects', 'Derniers projets' end diff --git a/redmine/public/manual/administration.html b/redmine/public/manual/administration.html deleted file mode 100644 index 22016c4d6..000000000 --- a/redmine/public/manual/administration.html +++ /dev/null @@ -1,121 +0,0 @@ - - - -redMine - Aide en ligne - - - - - - - -

      [ Index ]

      -

      Administration

      -Sommaire: -
        -
      1. Utilisateurs
      2. -
      3. Rôles et permissions
      4. -
      5. Trackers
      6. -
      7. Champs personnalisés
      8. -
      9. Statuts de demande
      10. -
      11. Workflow
      12. -
      13. Listes de valeurs
      14. -
      15. Notifications par mail
      16. -
      17. Informations
      18. -
      - - -

      1. Utilisateurs

      -

      Ces écrans vous permettent de gérer les utilisateurs de l'application.

      -

      1.1 Liste des utilisateurs

      -

      -Liste des utilisateurs
      -

      1.2 Création ou modification d'un utilisateur

      -
        -
      • Administrateur: déclare l'utilisateur comme administrateur de l'application.
      • -
      • Notifications par mail: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur
      • -
      • Verrouillé: désactive le compte de l'utilisateur
      • -
      -

      En mode modification, laissez le champ Password vide pour laisser le mot de passe de l'utilisateur inchangé.

      -

      Un utilisateur déclaré comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.

      - - -

      2. Rôles et permissions

      -

      Les rôles permettent de définir les permissions des différents membres d'un projet.
      -Chaque membre d'un projet dispose d'un rôle unique au sein d'un projet. -Un utilisateur peut avoir différents rôles au sein de différents projets.

      -

      Sur l'écran d'édition du rôle, cochez les actions que vous souhaitez autoriser pour le rôle.

      - - -

      3. Trackers

      -

      Les trackers permettent de typer les demandes et de définir des workflows spécifiques pour chacun de ces types.

      - -

      4. Champs personnalisés

      -

      Les champs personnalisés vous permettent d'ajouter des informations supplémentaires sur les demandes.

      -Un champ personnalisé peut être de l'un des types suivants: -
        -
      • Integer: entier positif ou négatif
      • -
      • String: chaîne de caractère
      • -
      • Date: date
      • -
      • Boolean: booléen (case à cocher)
      • -
      • List: valeur à sélectionnée parmi une liste prédéfinie (liste déroulante)
      • -
      -Des éléments de validation peuvent être définis: -
        -
      • Required: champ dont la saisie est obligatoire sur les demandes
      • -
      • For all projects: champ automatiquement associé à l'ensemble des projets
      • -
      • Min - max length: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)
      • -
      • Regular expression: expression régulière permettant de valider la valeur saisie
      • -
      • Possible values (only for lists): valeurs possibles pour les champs de type "List". Les valeurs sont séparées par le caractère |
      • -
      -

      Si l'option For all projects n'est pas activée, chaque projet pourra ou non utilisé le champ personnalisé pour ses demandes -(voir Project settings).

      - - -

      5. Statuts des demandes

      -

      Cet écran vous permet de définir les différents statuts possibles des demandes.

      -
        -
      • Closed: indique que le statut correspond à une demande considérée comme fermée
      • -
      • Default: statut appliqué par défaut aux nouvelles demandes (seul un statut peut être déclaré comme statut par défaut)
      • -
      • HTML color: code de couleur HTML représentant le statut à l'affichage
      • -
      - - -

      6. Workflow

      -

      Le workflow permet de définir quels changements les différents membres d'un projet sont autorisés à effectuer sur le statut des demandes, en fonction de leur type.

      -

      Sélectionnez le rôle et le type de demande pour lesquels vous souhaitez modifier le workflow, puis cliquez sur Edit. -L'écran vous permet alors de modifier, pour le rôle et le type de demande choisi, les changements autorisés.

      -

      Les lignes représentent les statuts initiaux des demandes. Les colonnes représentent les statuts autorisés à être appliqués.

      -

      Dans l'exemple ci-dessous, les demandes de type Bug au statut New pourront être passées au statut Assigned ou Resolved par le rôle Développeur.
      -Celles au statut Assigned pourront être passées au statut Resolved.
      -Le statut de toutes les autres demandes de type Bug ne pourra pas être modifié par le Développeur.

      -

      -Exemple de configuration d'un workflow
      -

      Remarque: pour qu'un rôle puisse changer le statut des demandes, la permission "Changer le statut des demandes" doit lui être explicitement donnée indépendemment de la configuration du workflow (voir Roles et permissions). - - -

      7. Listes de valeurs

      -

      Les listes de valeurs utilisées par l'application (exemple: les priorités des demandes) peuvent être personnalisées en fonction de vos besoins.
      -Cet écran vous permet de définir les valeurs possibles pour chacune des listes suivantes:

      -
        -
      • Priorités des demandes
      • -
      • Catégories de documents
      • -
      - - -

      8. Notifications par mail

      -

      Cet écran vous permet de sélectionner les actions qui donneront lieu à une notification par mail aux membres du projet.

      -

      Remarque: l'envoi de mails doit être activé dans la configuration de l'application si souhaitez effectuer des notifications.

      - - -

      9. Informations

      -

      Affiche des informations relatives à l'application

      -
        -
      • Version: version de l'application
      • -
      • Database: type de base de données utilisée
      • -
      - - - - - diff --git a/redmine/public/manual/fr/ch01.html b/redmine/public/manual/fr/ch01.html new file mode 100644 index 000000000..b5f1129df --- /dev/null +++ b/redmine/public/manual/fr/ch01.html @@ -0,0 +1,3 @@ + + + Chapter 1. Administration \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s01.html b/redmine/public/manual/fr/ch01s01.html new file mode 100644 index 000000000..f2ac52c76 --- /dev/null +++ b/redmine/public/manual/fr/ch01s01.html @@ -0,0 +1,3 @@ + + + 1. Utilisateurs

      1. Utilisateurs

      Ces écrans vous permettent de gérer les utilisateurs de l'application.

      1.1. Liste des utilisateurs

      Les boutons Lock/Unlock vous permettent de vérouiller/dévérouiller les comptes utilisateurs.

      Un utilisateur dont le compte est vérouillé ne peut plus s'identifier pour accéder à l'application.

      1.2. Création ou modification d'un utilisateur

      En mode modification, laissez le champ Password vide pour laisser le mot de passe de l'utilisateur inchangé.

      Un utilisateur déclaré comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.

      • Administrateur: déclare l'utilisateur comme administrateur de l'application.

      • Notifications par mail: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur

      • Vérouillé: désactive le compte de l'utilisateur

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s02.html b/redmine/public/manual/fr/ch01s02.html new file mode 100644 index 000000000..c0251d97c --- /dev/null +++ b/redmine/public/manual/fr/ch01s02.html @@ -0,0 +1,3 @@ + + + 2. Rôles et permissions

      2. Rôles et permissions

      Les rôles permettent de définir les permissions des différents membres d'un projet. Chaque membre d'un projet dispose d'un rôle unique au sein d'un projet. Un utilisateur peut avoir différents rôles au sein de différents projets.

      Sur l'écran d'édition du rôle, cochez les actions que vous souhaitez autoriser pour le rôle.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s03.html b/redmine/public/manual/fr/ch01s03.html new file mode 100644 index 000000000..07ce84f65 --- /dev/null +++ b/redmine/public/manual/fr/ch01s03.html @@ -0,0 +1,3 @@ + + + 3. Trackers

      3. Trackers

      Les trackers permettent de typer les demandes et de définir des workflows spécifiques pour chacun de ces types.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s04.html b/redmine/public/manual/fr/ch01s04.html new file mode 100644 index 000000000..3882317e2 --- /dev/null +++ b/redmine/public/manual/fr/ch01s04.html @@ -0,0 +1,3 @@ + + + 4. Champs personnalisés

      4. Champs personnalisés

      Les champs personnalisés vous permettent d'ajouter des informations supplémentaires sur les demandes. Un champ personnalisé peut être de l'un des types suivants:

      • Integer: entier positif ou négatif

      • String: chaîne de caractère

      • Date: date

      • Boolean: booléen (case à cocher)

      • List: valeur à sélectionnée parmi une liste prédéfinie (liste déroulante)

      Des éléments de validation peuvent être définis:

      • Obligatoire: champ dont la saisie est obligatoire sur les demandes

      • Pour tous les projects: champ automatiquement associé à l'ensemble des projets

      • Min - max length: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)

      • Expression régulière: expression régulière permettant de valider la valeur saisie

      • Valeurs possibles: valeurs possibles pour les champs de type "Liste". Les valeurs sont séparées par le caractère |

      Si l'option Pour tous les projets n'est pas activée, chaque projet pourra choisir d'utiliser ou non le champ pour ses demandes.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s05.html b/redmine/public/manual/fr/ch01s05.html new file mode 100644 index 000000000..46ede48dc --- /dev/null +++ b/redmine/public/manual/fr/ch01s05.html @@ -0,0 +1,3 @@ + + + 5. Statut des demandes

      5. Statut des demandes

      Ces écrans vous permettent de définir les différents statuts possibles des demandes.

      • Demande fermée: indique que le statut correspond à une demande considérée comme fermée

      • Statut par défaut: statut appliqué par défaut aux nouvelles demandes (seul un statut peut être déclaré comme statut par défaut)

      • Couleur: code couleur HTML (6 caractères) représentant le statut à l'affichage

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s06.html b/redmine/public/manual/fr/ch01s06.html new file mode 100644 index 000000000..daf622cd3 --- /dev/null +++ b/redmine/public/manual/fr/ch01s06.html @@ -0,0 +1,3 @@ + + + 6. Workflow

      6. Workflow

      Le workflow permet de définir les changements que les différents membres d'un projet sont autorisés à effectuer sur les demandes, en fonction de leur type.

      Sélectionnez le rôle et le tracker pour lesquels vous souhaitez modifier le workflow, puis cliquez sur Edit. L'écran vous permet alors de modifier, pour le rôle et le tracker choisi, les changements autorisés. Les lignes représentent les statuts initiaux des demandes. Les colonnes représentent les statuts autorisés à être appliqués.

      Remarque: pour qu'un rôle puisse changer le statut des demandes, la permission doit lui être explicitement donnée indépendemment de la configuration du workflow.

      Dans l'exemple ci-dessus, les demandes de type Bug au statut Nouveau pourront être passées au statut Assignée ou Résolue par le rôle Développeur. Celles au statut Assignée pourront être passées au statut Résolue. Le statut de toutes les autres demandes de type Bug ne pourra pas être modifié par le Développeur.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s07.html b/redmine/public/manual/fr/ch01s07.html new file mode 100644 index 000000000..d6763da77 --- /dev/null +++ b/redmine/public/manual/fr/ch01s07.html @@ -0,0 +1,3 @@ + + + 7. Listes de valeurs

      7. Listes de valeurs

      Les listes de valeurs utilisées par l'application (exemple: les priorités des demandes) peuvent être personnalisées. Cet écran vous permet de définir les valeurs possibles pour chacune des listes suivantes:

      • Priorités des demandes

      • Catégories de documents

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s08.html b/redmine/public/manual/fr/ch01s08.html new file mode 100644 index 000000000..7b44c92c0 --- /dev/null +++ b/redmine/public/manual/fr/ch01s08.html @@ -0,0 +1,3 @@ + + + 8. Notifications par mail

      8. Notifications par mail

      Cet écran vous permet de sélectionner les actions qui donneront lieu à une notification par mail aux membres du projet.

      Remarque: l'envoi de mails doit être activé dans la configuration de l'application si souhaitez effectuer des notifications.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch01s09.html b/redmine/public/manual/fr/ch01s09.html new file mode 100644 index 000000000..7093b94c6 --- /dev/null +++ b/redmine/public/manual/fr/ch01s09.html @@ -0,0 +1,3 @@ + + + 9. Informations

      9. Informations

      Affiche des informations relatives à l'application et à son environnement.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02.html b/redmine/public/manual/fr/ch02.html new file mode 100644 index 000000000..06e1456e1 --- /dev/null +++ b/redmine/public/manual/fr/ch02.html @@ -0,0 +1,3 @@ + + + Chapter 2. Projets \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s01.html b/redmine/public/manual/fr/ch02s01.html new file mode 100644 index 000000000..0893ab8d8 --- /dev/null +++ b/redmine/public/manual/fr/ch02s01.html @@ -0,0 +1,3 @@ + + + 1. Aperçu du projet

      1. Aperçu du projet

      L'aperçu vous présente les informations générales relatives au projet, les principaux membres, les dernières annonces, ainsi qu'une synthèse du nombre de demandes ouvertes par tracker.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s02.html b/redmine/public/manual/fr/ch02s02.html new file mode 100644 index 000000000..a016c41ce --- /dev/null +++ b/redmine/public/manual/fr/ch02s02.html @@ -0,0 +1,3 @@ + + + 2. Gestion des demandes

      2. Gestion des demandes

      2.1. Liste des demandes

      Par défaut, l'ensemble des demandes ouvertes du projet sont affichées. Différents filtres vous permettent de sélectionner les demandes à afficher. Si le projet comporte des sous-projets, vous avez la possibilité d'afficher également les demandes relatives aux sous-projets (non affichées par défaut).

      Une fois appliqué, un filtre reste valable durant toute votre session. Vous pouvez le redéfinir, ou le supprimer en cliquant sur Annuler.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s03.html b/redmine/public/manual/fr/ch02s03.html new file mode 100644 index 000000000..cd97fb8de --- /dev/null +++ b/redmine/public/manual/fr/ch02s03.html @@ -0,0 +1,3 @@ + + + 3. Rapports

      3. Rapports

      Cet écran présente la synthèse du nombre de demandes par statut et selon différents critères (tracker, priorité, catégorie). Des liens directs permettent d'accéder à la liste détaillée des demandes pour chaque critère.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s04.html b/redmine/public/manual/fr/ch02s04.html new file mode 100644 index 000000000..6d20bbb87 --- /dev/null +++ b/redmine/public/manual/fr/ch02s04.html @@ -0,0 +1,3 @@ + + + 4. Historique

      4. Historique

      Cette page présente l'ensemble des demandes résolues dans chacune des versions du projet. Certains types de demande peuvent être exclus de cet affichage.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s05.html b/redmine/public/manual/fr/ch02s05.html new file mode 100644 index 000000000..4fb95b49f --- /dev/null +++ b/redmine/public/manual/fr/ch02s05.html @@ -0,0 +1,3 @@ + + + 5. Annonces

      5. Annonces

      Les nouvelles vous permettent d'informer les utilisateurs sur l'activité du projet.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s06.html b/redmine/public/manual/fr/ch02s06.html new file mode 100644 index 000000000..98c03c78f --- /dev/null +++ b/redmine/public/manual/fr/ch02s06.html @@ -0,0 +1,3 @@ + + + 6. Documents

      6. Documents

      Les documents sont groupés par catégories (voir Listes de valeurs). Un document peut contenir plusieurs fichiers (exemple: révisions ou versions successives).

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s07.html b/redmine/public/manual/fr/ch02s07.html new file mode 100644 index 000000000..221e83371 --- /dev/null +++ b/redmine/public/manual/fr/ch02s07.html @@ -0,0 +1,3 @@ + + + 7. Fichiers

      7. Fichiers

      Ce module vous permet de publier les différents fichiers (sources, binaires, ...) pour chaque version de l'application.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/ch02s08.html b/redmine/public/manual/fr/ch02s08.html new file mode 100644 index 000000000..37657dcd4 --- /dev/null +++ b/redmine/public/manual/fr/ch02s08.html @@ -0,0 +1,3 @@ + + + 8. Configuration du projet

      8. Configuration du projet

      8.1. Propriétés du projet

      • Public: si le projet est public, il sera visible (consultation des demandes, des documents, ...) pour l'ensemble des utilisateurs, y compris ceux qui ne sont pas membres du projet. Si le projet n'est pas public, seuls les membres du projet y ont accès, en fonction de leur rôle.

      • Champs personnalisés: sélectionner les champs personnalisés que vous souhaitez utiliser au sein du projet. Seul l'administrateur peut ajouter de nouveaux champs personnalisés.

      8.2. Membres

      Cet écran vous permet de définir les membres du projet ainsi que leurs rôles respectifs. Un utilisateur ne peut avoir qu'un rôle au sein d'un projet donné. Le rôle d'un membre détermine les permissions dont il bénéficie sur le projet.

      8.3. Versions

      Les versions vous permettent de suivre les changements survenus tout au long du projet. A la fermeture d'une demande, vous pouvez par exemple indiquer quelle version la prend en compte. Vous pouvez par ailleurs publier les différentes versions de l'application (voir Fichiers).

      8.4. Catégories des demandes

      Les catégories de demande vous permettent de typer les demandes. Les catégories peuvent par exemple correspondre aux différents modules du projet.

      \ No newline at end of file diff --git a/redmine/public/manual/fr/html.css b/redmine/public/manual/fr/html.css new file mode 100644 index 000000000..c1b2a6fca --- /dev/null +++ b/redmine/public/manual/fr/html.css @@ -0,0 +1,55 @@ +body { + background: #FFFFFF; + font: 0.8em Verdana,Tahoma,Arial,sans-serif; +} + +h1, h2, h3, h4, h5 { + color: #800000; + font-family: sans-serif; +} + +table { + font-size: 1em; +} + +a{ +color:#467aa7; +font-weight:bold; +text-decoration:none; +background-color:inherit; +} + +a:hover{ + color: #800000; + text-decoration:underline; + background-color:inherit; +} + +a img{border:none;} + +.screenshot { + text-align: center; +} + +.guilabel { + font-weight: bold; +} + +span.term { + font-weight: bold; +} + +div.sidebar { + background: #F0F0F0; + border: 1px solid gray; + padding: 5px; + margin: 20px; +} + +pre.programlisting { + background: #F0F0F0; + border: 1px solid gray; + padding: 2px; + font-size: 10pt; + white-space: pre; +} diff --git a/redmine/public/manual/fr/index.html b/redmine/public/manual/fr/index.html new file mode 100644 index 000000000..1f485fe80 --- /dev/null +++ b/redmine/public/manual/fr/index.html @@ -0,0 +1,3 @@ + + + Documentation redMine \ No newline at end of file diff --git a/redmine/public/manual/fr/resources/issues_list.png b/redmine/public/manual/fr/resources/issues_list.png new file mode 100644 index 0000000000000000000000000000000000000000..47eab0fca46c570c533b8851aa0323e70e90b6e9 GIT binary patch literal 8233 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 OKv`b>d6}$P;C}&szoDA| literal 0 HcmV?d00001 diff --git a/redmine/public/manual/images/users_list.png b/redmine/public/manual/fr/resources/users_list.png similarity index 100% rename from redmine/public/manual/images/users_list.png rename to redmine/public/manual/fr/resources/users_list.png diff --git a/redmine/public/manual/fr/resources/workflow.png b/redmine/public/manual/fr/resources/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..04e79d61e35880369b75e2a38fd631a9537d6637 GIT binary patch literal 6503 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 literal 0 HcmV?d00001 diff --git a/redmine/public/manual/images/issues_list.png b/redmine/public/manual/images/issues_list.png deleted file mode 100644 index 2fa6dc1b630e4b6f7696cf71451bc7b3bc9d6e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8055 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 diff --git a/redmine/public/manual/images/users_edit.png b/redmine/public/manual/images/users_edit.png deleted file mode 100644 index 3a4797e9d30d697a2710f82eaf31cdbb543478a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2700 zcmb7GdpHy7AD^RXwbY!7m0>ugl$mmw<=&8T>0(S+?ha0oL}ZrxDwjHiBos%SC5)&k ziLlewwit6Q*SU_|HkQlI)bIKI-FcqR`+nc|`+UFe`#zud^M0TA=4pFt*{yrG0ssJ6 zn-iF`63Ybuqz;09k&HZ!oRX3lM3^Nm?0BfJXIMb+CAee2MPGnVz(oXH2L%tj8gL1I z1c}s#>*%777@&_Dzz-pHkjQG4`vH>7&0#inmYcaUzixwV4RsCOSZqtk370DX0QlF9 zCe`*iW>wodxl)V15VVuOJT^77YCy4lwB~^kH8j()8Gc;iYio`=lVZt;qSh0MoI2h8dS9HQc_TX zc*B#RatS|!uAAy7ri-U$2OOLZs-&##se|+4DH_32NC!`0WMpj!;%t^l$&AMNY%$ci zMX>=XUw8mF_)vDATwwxpWkTflBhQ@K!tC=P()K@ZIY&269 z=hB_gSm8gmm&7Qz`%*+M(z0EQ_U{~fn&Of}@DEGY=y;-_TfU`nenJuJveX$$yE|v> zMVgxcHId*OD50n2p3YD@>F7(l{6myjwQE#2ee~?UGbZD2kc1oOre>wwtH$HAb5=)8d}mXTSHpNPm=-K%-YTaQseOQ-|(@ ze-q?9<8kL;1&kUN0lgzOwbWSQa7tc4@owYY7olbKx;v?Y58OGu?M;J?eE|UdLCe8kAZk~Ld-91&Fj&_K#Hw4saj#fNpo9_ zo1i4sjoHsZ2#;e{ze3MQrOVdAo8%pR^LO1UIG3U%n?mL%UI?s)pqslW?L+ua(YL(# zzdNOSl!Zt*ZB;o5EE@i}gK+r*#0#v3%KzmEtWbS}8AabcIWJ6hWe7PB|w5y&-G8yQ8@ zuD!3HzG@SK08!e^U`}o-rC%tgRl{dMoSv>kyT;E+g^^DtS1SI(M8A0dB62XuVaYUv z{yLVSQNz=(=aF=+_|t|9D>G!dMvIOZ72}r%dmlK(4qw+J7rrhJyIzQXJ>TVcw|U?J_a9b&N$nKX9#?)RQq9%9 z*l=kzx%3qt3ZkoVeT-Ttx*Ie)Z(yQ#HG#LrBD6T_>)0l_Sn8aI zauW;~^~F=gQ`>Czh(xrC$kzA0QBGc9UUrdNJL<4# z=Aaml*D&I~=!yPRA{Fqs(70I9O8d7S>E@Gbm30H{;?x~q#Ju=^Q_)3MziIv&fjXty zp|v!>Xw_OZC5;&y%d%^0U$9H(tfq>0h3}PhjW2O7Nn1~BITsyckQlqnTs|fwF8qlk z=Eb65EXNU9Gi;FpOxgf1-fpx0kPTcqJiR{jWp>u5tnWtO*4EGkYu$=^>(y1B0dZ}% z8s0bLT`>*M!)apmq9!Qdq+*KjV?ka(gz@?F}h9Y@xmiyj5z1CyQ4 zpfKfyDxwHV$H((e`@(R?{W8hpfA_86y7VL5uH^HwE2HYlCi(c|F;Qg};N0Yp8Jf7) zCHQ@IHGWe;r=NXVW=;{^l)xRxO9~25G-|uZtl{}BX`1Tcb|&&3PWPveeP$`W%#v() zzP&GF;d)rM^2lFDE2la9Y1aNKIk%%#+=p46!lW`{5cj3ISF)eAKj`}QrXYXrpQtlY z_CA~~bj`W}-70Rc>01u6DpL##&)f0pO@3cf>0k}>t0Ps`UAQN&K+pDr?~GO_zfm>w zt#=Oo_O_3uKtn%n9Q0_Ac}jLQyhTM~K^A;dH)kXDDS-w_^7#YUSlVOCEIi`=1#RQc A=l}o! diff --git a/redmine/public/manual/images/workflow.png b/redmine/public/manual/images/workflow.png deleted file mode 100644 index 26071cadea608cf0bc95ca302d293c911e14a267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4967 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 diff --git a/redmine/public/manual/index.html b/redmine/public/manual/index.html deleted file mode 100644 index 3f0cb1e6f..000000000 --- a/redmine/public/manual/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -redMine - Aide en ligne - - - - - - - -

      Aide

      - -

      Documentation en ligne redMine

      - -Sommaire: - - - - \ No newline at end of file diff --git a/redmine/public/manual/projects.html b/redmine/public/manual/projects.html deleted file mode 100644 index 13922f69d..000000000 --- a/redmine/public/manual/projects.html +++ /dev/null @@ -1,109 +0,0 @@ - - - -redMine - Aide en ligne - - - - - - - -

      [ Index ]

      -

      Projets

      -Sommaire: -
        -
      1. Aperçu
      2. -
      3. Demandes -
          -
        • Liste des demandes
        • -
        • Nouvelle demande
        • -
        • Changer le statut d'une demande
        • -
        -
      4. -
      5. Rapports
      6. -
      7. Annonces
      8. -
      9. Historique
      10. -
      11. Documents
      12. -
      13. Membres
      14. -
      15. Fichiers
      16. -
      17. Configuration
      18. -
          -
        • Projet
        • -
        • Membres
        • -
        • Versions
        • -
        • Catégories de demande
        • -
        -
      - - -

      1. Aperçu

      -

      L'aperçu vous présente les informations générales relatives au projet, les principaux membres, les dernières annonces, ainsi qu'une synthèse du nombre de demandes ouvertes par tracker. - - -

      2. Demandes

      -

      2.1 Liste des demandes

      -Par défaut, l'ensemble des demandes sont affichées. Vous pouvez utiliser les différents filtres pour limiter l'affichage à certaines demandes seulement.
      -Lorsque vous appliquez un filtre, il reste en place durant toute votre session. Vous pouvez le redéfinir, ou le supprimer en cliquant sur Annuler. -

      -Liste des demandes
      - -

      2.2 Nouvelle demande

      -

      TODO

      - -

      2.3 Changer le statut d'une demande

      -

      TODO

      - - -

      3. Rapports

      -

      Synthèse du nombre de demandes par statut et selon différents critères (tracker, priorité, catégorie). -Des liens directs permettent d'accéder à la liste détaillée des demandes pour chaque critère.

      - - -

      4. Annonces

      -

      Les nouvelles vous permettent d'informer les utilisateurs sur l'activité du projet.

      - - -

      5. Historique

      -

      Cette page présente l'ensemble des demandes résolues dans chacune des versions du projet. -Certains types de demande peuvent être exclus de cet affichage (voir Trackers).

      - - -

      6. Documents

      -

      Les documents sont groupés par catégories (voir Listes de valeurs).
      -Un document peut contenir plusieurs fichiers (exemple: révisions ou versions successives)

      - - -

      7. Membres

      -

      Affichage de l'ensemble des membres du projet, par rôle

      - - -

      8. Fichiers

      -

      Ce module vous permet de publier les fichiers de l'application (sources, binaires, ...) pour chaque version de l'application .

      - -

      9. Configuration

      -

      9.1 Projet

      -
        -
      • Public: si le projet est public, il sera visible (consultation des demandes, des documents, ...) pour l'ensemble des utilisateurs, y compris ceux qui ne sont pas membres du projet.
        - Si le projet n'est pas public, seuls les membres du projet y ont accès, en fonction de leur rôle.
      • -
      • Champs personnalisés: sélectionner les champs personnalisés que vous souhaitez utiliser au sein du projet.
        - Seul l'administrateur peut ajouter de nouveaux champs personnalisés.
      • -
      -

      9.2 Membres

      -

      Cette section vous permet de définir les membres du projet ainsi que leurs rôles respectifs.
      -Un utilisateur ne peut avoir qu'un rôle au sein d'un projet donné. Le rôle d'un membre détermine les permissions dont il bénéficie sur le projet.

      - -

      9.3 Versions

      -

      Les versions vous permettent de suivre les changements survenus tout au long du projet. -A la fermeture d'une demande, vous pouvez indiquer quelle version la prend en compte.
      -Vous pouvez par ailleurs publier les différentes versions de l'application (voir Fichiers). -

      - - -

      9.4 Catégories de demande

      -

      Les catégories de demande vous permettent de typer les demandes. Les catégories peuvent par exemple correspondre aux modules de l'application.

      - - - - - diff --git a/redmine/public/manual/stylesheets/help.css b/redmine/public/manual/stylesheets/help.css deleted file mode 100644 index f67bc72bf..000000000 --- a/redmine/public/manual/stylesheets/help.css +++ /dev/null @@ -1,70 +0,0 @@ -/* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */ - -/**************** Body and tag styles ****************/ - - - -body{ -font:76% Verdana,Tahoma,Arial,sans-serif; -line-height:1.4em; -color:#303030; -margin: 20px; -} - -a{ -color:#467aa7; -font-weight:bold; -text-decoration:none; -background-color:inherit; -} - -a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;} -a img{border:none;} - -p{padding:0 0 0.2em 0;} -p form{margin-top:0; margin-bottom:20px;} - -h1 { -display:block; - -font-size:1.7em; -font-weight:normal; -letter-spacing:-1px; -color:#505050; -background-color:inherit; -} - -h2 { -display:block; -margin: 30px 0 0 0; -font-size:1.5em; -font-weight:normal; -letter-spacing:-1px; -color:#505050; -background-color:inherit; -} - -hr { border:0px; border-bottom:1px dashed #000000; } - - -/**************** Misc classes and styles ****************/ - -.splitcontentleft{float:left; width:49%;} -.splitcontentright{float:right; width:49%;} -.clear{clear:both;} -.small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;} -.hide{display:none;} -.textcenter{text-align:center;} -.textright{text-align:right;} -.important{color:#f02025; background-color:inherit; } - -.box{ -margin:0 0 20px 0; -padding:10px; -border:1px solid #c0c0c0; -background-color:#fafbfc; -color:#505050; -line-height:1.5em; -} - - diff --git a/redmine/public/stylesheets/application.css b/redmine/public/stylesheets/application.css index ac6610520..43f2bac51 100644 --- a/redmine/public/stylesheets/application.css +++ b/redmine/public/stylesheets/application.css @@ -189,11 +189,20 @@ input.button-small font-size: 0.8em; } +select.select-small +{ + font-size: 0.8em; +} + label { font-weight: bold; font-size: 1em; } +fieldset { + border:1px solid #7F9DB9; +} + .required { color: #bb0000; } @@ -220,10 +229,10 @@ tr.ListHead a { text-decoration:underline; } -tr.ListLine0 { +tr.odd { background-color: #C1E2F7; } -tr.ListLine1 { +tr.even { background-color:#CEE1ED; } diff --git a/redmine/test/fixtures/attachments.yml b/redmine/test/fixtures/attachments.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/attachments.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/custom_fields.yml b/redmine/test/fixtures/custom_fields.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/custom_fields.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/documents.yml b/redmine/test/fixtures/documents.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/documents.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/enumerations.yml b/redmine/test/fixtures/enumerations.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/enumerations.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issue_categories.yml b/redmine/test/fixtures/issue_categories.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issue_categories.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issue_custom_fields.yml b/redmine/test/fixtures/issue_custom_fields.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issue_custom_fields.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issue_custom_values.yml b/redmine/test/fixtures/issue_custom_values.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issue_custom_values.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issue_histories.yml b/redmine/test/fixtures/issue_histories.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issue_histories.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issue_statuses.yml b/redmine/test/fixtures/issue_statuses.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issue_statuses.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/issues.yml b/redmine/test/fixtures/issues.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/issues.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/mailer/issue_closed b/redmine/test/fixtures/mailer/issue_closed deleted file mode 100644 index bb5e51d95..000000000 --- a/redmine/test/fixtures/mailer/issue_closed +++ /dev/null @@ -1,3 +0,0 @@ -Mailer#issue_closed - -Find me in app/views/mailer/issue_closed.rhtml diff --git a/redmine/test/fixtures/members.yml b/redmine/test/fixtures/members.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/members.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/news.yml b/redmine/test/fixtures/news.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/news.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/permissions.yml b/redmine/test/fixtures/permissions.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/permissions.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/projects.yml b/redmine/test/fixtures/projects.yml index 8794d28ae..0358c5f7b 100644 --- a/redmine/test/fixtures/projects.yml +++ b/redmine/test/fixtures/projects.yml @@ -1,5 +1,26 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: +ecookbook: id: 1 -another: + name: eCookbook + descr: Recipes management application + homepage: http://ecookbook.somenet.foo/ + projects_count: 1 + created_on: 2005-01-01 01:00:00 + updated_on: 2005-01-01 01:00:00 +onlinestore: id: 2 + name: OnlineStore + descr: E-commerce web site + is_public: false + projects_count: 0 + created_on: 2005-01-01 01:00:00 + updated_on: 2005-01-01 01:00:00 +tracker: + id: 3 + name: tracker + descr: bug tracker + is_public: true + projects_count: 0 + parent_id: 1 + created_on: 2005-01-01 01:00:00 + updated_on: 2005-01-01 01:00:00 \ No newline at end of file diff --git a/redmine/test/fixtures/roles.yml b/redmine/test/fixtures/roles.yml index 8794d28ae..ce676309e 100644 --- a/redmine/test/fixtures/roles.yml +++ b/redmine/test/fixtures/roles.yml @@ -1,5 +1,10 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: +manager: id: 1 -another: + name: manager +developer: id: 2 + name: developer +reporter: + id: 3 + name: reporter diff --git a/redmine/test/fixtures/trackers.yml b/redmine/test/fixtures/trackers.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/trackers.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/users.yml b/redmine/test/fixtures/users.yml index 8794d28ae..1d6ca5c00 100644 --- a/redmine/test/fixtures/users.yml +++ b/redmine/test/fixtures/users.yml @@ -1,5 +1,19 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: +admin: id: 1 -another: + login: admin + firstname: admin + lastname: admin + mail: admin@somenet.foo + hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997 + admin: true + language: en +paulochon: id: 2 + login: plochon + firstname: Paul + lastname: Ochon + mail: plochon@somenet.foo + hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997 + admin: false + language: en \ No newline at end of file diff --git a/redmine/test/fixtures/versions.yml b/redmine/test/fixtures/versions.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/versions.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/fixtures/workflow.yml b/redmine/test/fixtures/workflow.yml deleted file mode 100644 index 8794d28ae..000000000 --- a/redmine/test/fixtures/workflow.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/redmine/test/functional/account_controller_test.rb b/redmine/test/functional/account_controller_test.rb deleted file mode 100644 index 537eb8ffc..000000000 --- a/redmine/test/functional/account_controller_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'account_controller' - -# Re-raise errors caught by the controller. -class AccountController; def rescue_action(e) raise e end; end - -class AccountControllerTest < Test::Unit::TestCase - def setup - @controller = AccountController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/functional/admin_controller_test.rb b/redmine/test/functional/admin_controller_test.rb deleted file mode 100644 index e44ac9423..000000000 --- a/redmine/test/functional/admin_controller_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'admin_controller' - -# Re-raise errors caught by the controller. -class AdminController; def rescue_action(e) raise e end; end - -class AdminControllerTest < Test::Unit::TestCase - def setup - @controller = AdminController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/functional/custom_fields_controller_test.rb b/redmine/test/functional/custom_fields_controller_test.rb deleted file mode 100644 index f86e32569..000000000 --- a/redmine/test/functional/custom_fields_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'custom_fields_controller' - -# Re-raise errors caught by the controller. -class CustomFieldsController; def rescue_action(e) raise e end; end - -class CustomFieldsControllerTest < Test::Unit::TestCase - fixtures :custom_fields - - def setup - @controller = CustomFieldsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:custom_fields) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:custom_field) - assert assigns(:custom_field).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:custom_field) - end - - def test_create - num_custom_fields = CustomField.count - - post :create, :custom_field => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_custom_fields + 1, CustomField.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:custom_field) - assert assigns(:custom_field).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil CustomField.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - CustomField.find(1) - } - end -end diff --git a/redmine/test/functional/documents_controller_test.rb b/redmine/test/functional/documents_controller_test.rb deleted file mode 100644 index c9bd463d3..000000000 --- a/redmine/test/functional/documents_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'documents_controller' - -# Re-raise errors caught by the controller. -class DocumentsController; def rescue_action(e) raise e end; end - -class DocumentsControllerTest < Test::Unit::TestCase - fixtures :documents - - def setup - @controller = DocumentsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:documents) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:document) - assert assigns(:document).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:document) - end - - def test_create - num_documents = Document.count - - post :create, :document => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_documents + 1, Document.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:document) - assert assigns(:document).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Document.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Document.find(1) - } - end -end diff --git a/redmine/test/functional/enumerations_controller_test.rb b/redmine/test/functional/enumerations_controller_test.rb deleted file mode 100644 index e9f4b7660..000000000 --- a/redmine/test/functional/enumerations_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'enumerations_controller' - -# Re-raise errors caught by the controller. -class EnumerationsController; def rescue_action(e) raise e end; end - -class EnumerationsControllerTest < Test::Unit::TestCase - fixtures :enumerations - - def setup - @controller = EnumerationsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:enumerations) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:enumeration) - assert assigns(:enumeration).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:enumeration) - end - - def test_create - num_enumerations = Enumeration.count - - post :create, :enumeration => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_enumerations + 1, Enumeration.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:enumeration) - assert assigns(:enumeration).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Enumeration.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Enumeration.find(1) - } - end -end diff --git a/redmine/test/functional/help_controller_test.rb b/redmine/test/functional/help_controller_test.rb deleted file mode 100644 index 291838b8f..000000000 --- a/redmine/test/functional/help_controller_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'help_controller' - -# Re-raise errors caught by the controller. -class HelpController; def rescue_action(e) raise e end; end - -class HelpControllerTest < Test::Unit::TestCase - def setup - @controller = HelpController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/functional/issue_categories_controller_test.rb b/redmine/test/functional/issue_categories_controller_test.rb deleted file mode 100644 index 4ea4e1c55..000000000 --- a/redmine/test/functional/issue_categories_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'issue_categories_controller' - -# Re-raise errors caught by the controller. -class IssueCategoriesController; def rescue_action(e) raise e end; end - -class IssueCategoriesControllerTest < Test::Unit::TestCase - fixtures :issue_categories - - def setup - @controller = IssueCategoriesController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:issue_categories) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:issue_category) - assert assigns(:issue_category).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:issue_category) - end - - def test_create - num_issue_categories = IssueCategory.count - - post :create, :issue_category => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_issue_categories + 1, IssueCategory.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:issue_category) - assert assigns(:issue_category).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil IssueCategory.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - IssueCategory.find(1) - } - end -end diff --git a/redmine/test/functional/issue_statuses_controller_test.rb b/redmine/test/functional/issue_statuses_controller_test.rb deleted file mode 100644 index 17f11ef55..000000000 --- a/redmine/test/functional/issue_statuses_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'issue_statuses_controller' - -# Re-raise errors caught by the controller. -class IssueStatusesController; def rescue_action(e) raise e end; end - -class IssueStatusesControllerTest < Test::Unit::TestCase - fixtures :issue_statuses - - def setup - @controller = IssueStatusesController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:issue_statuses) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:issue_status) - assert assigns(:issue_status).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:issue_status) - end - - def test_create - num_issue_statuses = IssueStatus.count - - post :create, :issue_status => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_issue_statuses + 1, IssueStatus.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:issue_status) - assert assigns(:issue_status).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil IssueStatus.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - IssueStatus.find(1) - } - end -end diff --git a/redmine/test/functional/issues_controller_test.rb b/redmine/test/functional/issues_controller_test.rb deleted file mode 100644 index 1be41f86a..000000000 --- a/redmine/test/functional/issues_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'issues_controller' - -# Re-raise errors caught by the controller. -class IssuesController; def rescue_action(e) raise e end; end - -class IssuesControllerTest < Test::Unit::TestCase - fixtures :issues - - def setup - @controller = IssuesController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:issues) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:issue) - assert assigns(:issue).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:issue) - end - - def test_create - num_issues = Issue.count - - post :create, :issue => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_issues + 1, Issue.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:issue) - assert assigns(:issue).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Issue.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Issue.find(1) - } - end -end diff --git a/redmine/test/functional/members_controller_test.rb b/redmine/test/functional/members_controller_test.rb deleted file mode 100644 index 5f47c358d..000000000 --- a/redmine/test/functional/members_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'members_controller' - -# Re-raise errors caught by the controller. -class MembersController; def rescue_action(e) raise e end; end - -class MembersControllerTest < Test::Unit::TestCase - fixtures :members - - def setup - @controller = MembersController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:members) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:member) - assert assigns(:member).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:member) - end - - def test_create - num_members = Member.count - - post :create, :member => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_members + 1, Member.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:member) - assert assigns(:member).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Member.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Member.find(1) - } - end -end diff --git a/redmine/test/functional/news_controller_test.rb b/redmine/test/functional/news_controller_test.rb deleted file mode 100644 index b360c6cb3..000000000 --- a/redmine/test/functional/news_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'news_controller' - -# Re-raise errors caught by the controller. -class NewsController; def rescue_action(e) raise e end; end - -class NewsControllerTest < Test::Unit::TestCase - fixtures :news - - def setup - @controller = NewsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:news) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:news) - assert assigns(:news).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:news) - end - - def test_create - num_news = News.count - - post :create, :news => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_news + 1, News.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:news) - assert assigns(:news).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil News.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - News.find(1) - } - end -end diff --git a/redmine/test/functional/projects_controller_test.rb b/redmine/test/functional/projects_controller_test.rb index 8da34ec7e..23776ed90 100644 --- a/redmine/test/functional/projects_controller_test.rb +++ b/redmine/test/functional/projects_controller_test.rb @@ -1,3 +1,20 @@ +# redMine - project management software +# Copyright (C) 2006 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. + require File.dirname(__FILE__) + '/../test_helper' require 'projects_controller' @@ -27,62 +44,4 @@ class ProjectsControllerTest < Test::Unit::TestCase assert_not_nil assigns(:projects) end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:project) - assert assigns(:project).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:project) - end - - def test_create - num_projects = Project.count - - post :create, :project => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_projects + 1, Project.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:project) - assert assigns(:project).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Project.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Project.find(1) - } - end end diff --git a/redmine/test/functional/reports_controller_test.rb b/redmine/test/functional/reports_controller_test.rb deleted file mode 100644 index 4b52ffab3..000000000 --- a/redmine/test/functional/reports_controller_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'reports_controller' - -# Re-raise errors caught by the controller. -class ReportsController; def rescue_action(e) raise e end; end - -class ReportsControllerTest < Test::Unit::TestCase - def setup - @controller = ReportsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/functional/roles_controller_test.rb b/redmine/test/functional/roles_controller_test.rb deleted file mode 100644 index 299aef211..000000000 --- a/redmine/test/functional/roles_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'roles_controller' - -# Re-raise errors caught by the controller. -class RolesController; def rescue_action(e) raise e end; end - -class RolesControllerTest < Test::Unit::TestCase - fixtures :roles - - def setup - @controller = RolesController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:roles) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:role) - assert assigns(:role).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:role) - end - - def test_create - num_roles = Role.count - - post :create, :role => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_roles + 1, Role.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:role) - assert assigns(:role).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Role.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Role.find(1) - } - end -end diff --git a/redmine/test/functional/trackers_controller_test.rb b/redmine/test/functional/trackers_controller_test.rb deleted file mode 100644 index 75063c6c5..000000000 --- a/redmine/test/functional/trackers_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'trackers_controller' - -# Re-raise errors caught by the controller. -class TrackersController; def rescue_action(e) raise e end; end - -class TrackersControllerTest < Test::Unit::TestCase - fixtures :trackers - - def setup - @controller = TrackersController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:trackers) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:tracker) - assert assigns(:tracker).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:tracker) - end - - def test_create - num_trackers = Tracker.count - - post :create, :tracker => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_trackers + 1, Tracker.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:tracker) - assert assigns(:tracker).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Tracker.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Tracker.find(1) - } - end -end diff --git a/redmine/test/functional/users_controller_test.rb b/redmine/test/functional/users_controller_test.rb deleted file mode 100644 index f1e22817b..000000000 --- a/redmine/test/functional/users_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'users_controller' - -# Re-raise errors caught by the controller. -class UsersController; def rescue_action(e) raise e end; end - -class UsersControllerTest < Test::Unit::TestCase - fixtures :users - - def setup - @controller = UsersController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:users) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:user) - assert assigns(:user).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:user) - end - - def test_create - num_users = User.count - - post :create, :user => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_users + 1, User.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:user) - assert assigns(:user).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil User.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - User.find(1) - } - end -end diff --git a/redmine/test/functional/versions_controller_test.rb b/redmine/test/functional/versions_controller_test.rb deleted file mode 100644 index 85b2ef76c..000000000 --- a/redmine/test/functional/versions_controller_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'versions_controller' - -# Re-raise errors caught by the controller. -class VersionsController; def rescue_action(e) raise e end; end - -class VersionsControllerTest < Test::Unit::TestCase - fixtures :versions - - def setup - @controller = VersionsController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_index - get :index - assert_response :success - assert_template 'list' - end - - def test_list - get :list - - assert_response :success - assert_template 'list' - - assert_not_nil assigns(:versions) - end - - def test_show - get :show, :id => 1 - - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:version) - assert assigns(:version).valid? - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:version) - end - - def test_create - num_versions = Version.count - - post :create, :version => {} - - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_equal num_versions + 1, Version.count - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:version) - assert assigns(:version).valid? - end - - def test_update - post :update, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'show', :id => 1 - end - - def test_destroy - assert_not_nil Version.find(1) - - post :destroy, :id => 1 - assert_response :redirect - assert_redirected_to :action => 'list' - - assert_raise(ActiveRecord::RecordNotFound) { - Version.find(1) - } - end -end diff --git a/redmine/test/functional/welcome_controller_test.rb b/redmine/test/functional/welcome_controller_test.rb deleted file mode 100644 index d773945e1..000000000 --- a/redmine/test/functional/welcome_controller_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'welcome_controller' - -# Re-raise errors caught by the controller. -class WelcomeController; def rescue_action(e) raise e end; end - -class WelcomeControllerTest < Test::Unit::TestCase - def setup - @controller = WelcomeController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/integration/account_test.rb b/redmine/test/integration/account_test.rb new file mode 100644 index 000000000..7652d4a5b --- /dev/null +++ b/redmine/test/integration/account_test.rb @@ -0,0 +1,76 @@ +# redMine - project management software +# Copyright (C) 2006 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. + +require "#{File.dirname(__FILE__)}/../test_helper" + +class AccountTest < ActionController::IntegrationTest + fixtures :users + + # Replace this with your real tests. + def test_login + get "account/my_page" + assert_redirected_to "account/login" + log_user('plochon', 'admin') + + get "account/my_account" + assert_response :success + assert_template "account/my_account" + end + + def test_change_password + log_user('plochon', 'admin') + get "account/my_account" + assert_response :success + assert_template "account/my_account" + + post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello2" + assert_response :success + assert_tag :tag => "div", :attributes => { :class => "errorExplanation" } + + post "account/change_password", :password => 'admiN', :new_password => "hello", :new_password_confirmation => "hello" + assert_response :success + assert_equal 'Wrong password', flash[:notice] + + post "account/change_password", :password => 'admin', :new_password => "hello", :new_password_confirmation => "hello" + assert_response :success + log_user('plochon', 'hello') + end + + def test_my_account + log_user('plochon', 'admin') + get "account/my_account" + assert_response :success + assert_template "account/my_account" + + post "account/my_account", :user => {:firstname => "Joe", :login => "root", :admin => 1} + assert_response :success + assert_template "account/my_account" + user = User.find(2) + assert_equal "Joe", user.firstname + assert_equal "plochon", user.login + assert_equal false, user.admin? + + log_user('plochon', 'admin') + end + + def test_my_page + log_user('plochon', 'admin') + get "account/my_page" + assert_response :success + assert_template "account/my_page" + end +end diff --git a/redmine/test/integration/admin_test.rb b/redmine/test/integration/admin_test.rb new file mode 100644 index 000000000..3b01d28dd --- /dev/null +++ b/redmine/test/integration/admin_test.rb @@ -0,0 +1,61 @@ +# redMine - project management software +# Copyright (C) 2006 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. + +require "#{File.dirname(__FILE__)}/../test_helper" + +class AdminTest < ActionController::IntegrationTest + fixtures :users + + def test_add_user + log_user("admin", "admin") + get "/users/add" + assert_response :success + assert_template "users/add" + post "/users/add", :user => { :login => "jsmith", :firstname => "John", :lastname => "Smith", :mail => "jsmith@somenet.foo", :language => "en" }, :password => "jsmith09", :password_confirmation => "jsmith09" + assert_redirected_to "users/list" + + user = User.find_by_login("jsmith") + assert_kind_of User, user + logged_user = User.try_to_login("jsmith", "jsmith09") + assert_kind_of User, logged_user + assert_equal "John", logged_user.firstname + + post "users/edit", :id => user.id, :user => { :locked => 1 } + assert_redirected_to "users/list" + locked_user = User.try_to_login("jsmith", "jsmith09") + assert_equal nil, locked_user + end + + def test_add_project + log_user("admin", "admin") + get "projects/add" + assert_response :success + assert_template "projects/add" + post "projects/add", :project => { :name => "blog", :descr => "weblog", :is_public => 1} + assert_redirected_to "admin/projects" + assert_equal 'Project was successfully created.', flash[:notice] + + project = Project.find_by_name("blog") + assert_kind_of Project, project + assert_equal "weblog", project.descr + assert_equal true, project.is_public? + + get "admin/projects" + assert_response :success + assert_template "admin/projects" + end +end diff --git a/redmine/test/test_helper.rb b/redmine/test/test_helper.rb index a299c7f6d..edc7c5c4e 100644 --- a/redmine/test/test_helper.rb +++ b/redmine/test/test_helper.rb @@ -1,4 +1,21 @@ -ENV["RAILS_ENV"] = "test" +# redMine - project management software +# Copyright (C) 2006 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. + +ENV["RAILS_ENV"] ||= "test" require File.expand_path(File.dirname(__FILE__) + "/../config/environment") require 'test_help' @@ -25,4 +42,14 @@ class Test::Unit::TestCase self.use_instantiated_fixtures = false # Add more helper methods to be used by all tests here... + + def log_user(login, password) + get "/account/login" + assert_equal nil, session[:user] + assert_response :success + assert_template "account/login" + post "/account/login", :login => login, :password => password + assert_redirected_to "account/my_page" + assert_equal login, session[:user].login + end end diff --git a/redmine/test/unit/attachment_test.rb b/redmine/test/unit/attachment_test.rb deleted file mode 100644 index 6f66833d3..000000000 --- a/redmine/test/unit/attachment_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class AttachmentTest < Test::Unit::TestCase - fixtures :attachments - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/custom_field_test.rb b/redmine/test/unit/custom_field_test.rb deleted file mode 100644 index 886bd517f..000000000 --- a/redmine/test/unit/custom_field_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class CustomFieldTest < Test::Unit::TestCase - fixtures :custom_fields - - # Replace this with your real tests. - def test_truth - assert_kind_of CustomField, custom_fields(:first) - end -end diff --git a/redmine/test/unit/document_test.rb b/redmine/test/unit/document_test.rb deleted file mode 100644 index acd96ddba..000000000 --- a/redmine/test/unit/document_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class DocumentTest < Test::Unit::TestCase - fixtures :documents - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/enumeration_test.rb b/redmine/test/unit/enumeration_test.rb deleted file mode 100644 index ea8c01405..000000000 --- a/redmine/test/unit/enumeration_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class EnumerationTest < Test::Unit::TestCase - fixtures :enumerations - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/issue_category_test.rb b/redmine/test/unit/issue_category_test.rb deleted file mode 100644 index 6f5051be9..000000000 --- a/redmine/test/unit/issue_category_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueCategoryTest < Test::Unit::TestCase - fixtures :issue_categories - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/issue_custom_field_test.rb b/redmine/test/unit/issue_custom_field_test.rb deleted file mode 100644 index 2adee1061..000000000 --- a/redmine/test/unit/issue_custom_field_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueCustomFieldTest < Test::Unit::TestCase - fixtures :issue_custom_fields - - # Replace this with your real tests. - def test_truth - assert_kind_of IssueCustomField, issue_custom_fields(:first) - end -end diff --git a/redmine/test/unit/issue_custom_value_test.rb b/redmine/test/unit/issue_custom_value_test.rb deleted file mode 100644 index 09c0551b6..000000000 --- a/redmine/test/unit/issue_custom_value_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueCustomValueTest < Test::Unit::TestCase - fixtures :issue_custom_values - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/issue_history_test.rb b/redmine/test/unit/issue_history_test.rb deleted file mode 100644 index 3da38e73c..000000000 --- a/redmine/test/unit/issue_history_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueHistoryTest < Test::Unit::TestCase - fixtures :issue_histories - - # Replace this with your real tests. - def test_truth - assert_kind_of IssueHistory, issue_histories(:first) - end -end diff --git a/redmine/test/unit/issue_status_test.rb b/redmine/test/unit/issue_status_test.rb deleted file mode 100644 index 8e7c0b97b..000000000 --- a/redmine/test/unit/issue_status_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueStatusTest < Test::Unit::TestCase - fixtures :issue_statuses - - # Replace this with your real tests. - def test_truth - assert_kind_of IssueStatus, issue_statuses(:first) - end -end diff --git a/redmine/test/unit/issue_test.rb b/redmine/test/unit/issue_test.rb deleted file mode 100644 index 3b318778e..000000000 --- a/redmine/test/unit/issue_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class IssueTest < Test::Unit::TestCase - fixtures :issues - - # Replace this with your real tests. - def test_truth - assert_kind_of Issue, issues(:first) - end -end diff --git a/redmine/test/unit/mailer_test.rb b/redmine/test/unit/mailer_test.rb deleted file mode 100644 index 70615d712..000000000 --- a/redmine/test/unit/mailer_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'mailer' - -class MailerTest < Test::Unit::TestCase - FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures' - CHARSET = "utf-8" - - include ActionMailer::Quoting - - def setup - ActionMailer::Base.delivery_method = :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries = [] - - @expected = TMail::Mail.new - @expected.set_content_type "text", "plain", { "charset" => CHARSET } - end - - def test_issue_closed - @expected.subject = 'Mailer#issue_closed' - @expected.body = read_fixture('issue_closed') - @expected.date = Time.now - - assert_equal @expected.encoded, Mailer.create_issue_closed(@expected.date).encoded - end - - private - def read_fixture(action) - IO.readlines("#{FIXTURES_PATH}/mailer/#{action}") - end - - def encode(subject) - quoted_printable(subject, CHARSET) - end -end diff --git a/redmine/test/unit/member_test.rb b/redmine/test/unit/member_test.rb deleted file mode 100644 index 443c096ec..000000000 --- a/redmine/test/unit/member_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class MemberTest < Test::Unit::TestCase - fixtures :members - - # Replace this with your real tests. - def test_truth - assert_kind_of Member, members(:first) - end -end diff --git a/redmine/test/unit/news_test.rb b/redmine/test/unit/news_test.rb deleted file mode 100644 index db9b3ab0d..000000000 --- a/redmine/test/unit/news_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class NewsTest < Test::Unit::TestCase - fixtures :news - - # Replace this with your real tests. - def test_truth - assert_kind_of News, news(:first) - end -end diff --git a/redmine/test/unit/packages_test.rb b/redmine/test/unit/packages_test.rb deleted file mode 100644 index a5ebcdf1b..000000000 --- a/redmine/test/unit/packages_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class PackagesTest < Test::Unit::TestCase - fixtures :packages - - # Replace this with your real tests. - def test_truth - assert_kind_of Packages, packages(:first) - end -end diff --git a/redmine/test/unit/permission_test.rb b/redmine/test/unit/permission_test.rb deleted file mode 100644 index 306c2e61c..000000000 --- a/redmine/test/unit/permission_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class PermissionTest < Test::Unit::TestCase - fixtures :permissions - - # Replace this with your real tests. - def test_truth - assert_kind_of Permission, permissions(:first) - end -end diff --git a/redmine/test/unit/project_test.rb b/redmine/test/unit/project_test.rb index 8a9912576..9bafe9c92 100644 --- a/redmine/test/unit/project_test.rb +++ b/redmine/test/unit/project_test.rb @@ -1,10 +1,77 @@ +# redMine - project management software +# Copyright (C) 2006 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. + require File.dirname(__FILE__) + '/../test_helper' class ProjectTest < Test::Unit::TestCase fixtures :projects - # Replace this with your real tests. + def setup + @project = projects(:ecookbook) + end + def test_truth - assert_kind_of Project, projects(:first) + assert_kind_of Project, @project + assert_equal "eCookbook", @project.name + end + + def test_update + assert_equal "eCookbook", @project.name + @project.name = "eCook" + assert @project.save, @project.errors.full_messages.join("; ") + @project.reload + assert_equal "eCook", @project.name + end + + def test_validate + @project.name = "" + assert !@project.save + assert_equal 1, @project.errors.count + assert_equal "can't be blank", @project.errors.on(:name) + end + + def test_public_projects + public_projects = Project.find(:all, :conditions => ["is_public=?", true]) + assert_equal 2, public_projects.length + assert_equal true, public_projects[0].is_public? + end + + def test_destroy + @project.destroy + assert_raise(ActiveRecord::RecordNotFound) { Project.find(@project.id) } + end + + def test_subproject_ok + sub = Project.find(2) + sub.parent = Project.find(1) + assert sub.save + assert_equal 1, sub.parent.id + assert_equal 2, Project.find(1).projects_count + end + + def test_subproject_invalid + sub = Project.find(2) + sub.parent = projects(:tracker) + assert !sub.save + end + + def test_subproject_invalid_2 + sub = Project.find(1) + sub.parent = projects(:onlinestore) + assert !sub.save end end diff --git a/redmine/test/unit/role_test.rb b/redmine/test/unit/role_test.rb deleted file mode 100644 index 90565ae80..000000000 --- a/redmine/test/unit/role_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class RoleTest < Test::Unit::TestCase - fixtures :roles - - # Replace this with your real tests. - def test_truth - assert_kind_of Role, roles(:first) - end -end diff --git a/redmine/test/unit/tracker_test.rb b/redmine/test/unit/tracker_test.rb deleted file mode 100644 index f738f288b..000000000 --- a/redmine/test/unit/tracker_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class TrackerTest < Test::Unit::TestCase - fixtures :trackers - - # Replace this with your real tests. - def test_truth - assert true - end -end diff --git a/redmine/test/unit/user_test.rb b/redmine/test/unit/user_test.rb index d6a2a2245..df255ae8e 100644 --- a/redmine/test/unit/user_test.rb +++ b/redmine/test/unit/user_test.rb @@ -1,10 +1,64 @@ +# redMine - project management software +# Copyright (C) 2006 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. + require File.dirname(__FILE__) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users - # Replace this with your real tests. def test_truth - assert_kind_of User, users(:first) + assert_kind_of User, users(:paulochon) + end + + def test_update + user = User.find(1) + assert_equal "admin", user.login + user.login = "john" + assert user.save, user.errors.full_messages.join("; ") + user.reload + assert_equal "john", user.login + end + + def test_validate + user = User.find(1) + user.login = "" + assert !user.save + assert_equal 2, user.errors.count + end + + def test_password + user = User.try_to_login("admin", "admin") + assert_kind_of User, user + assert_equal "admin", user.login + user.password = "hello" + assert user.save + + user = User.try_to_login("admin", "hello") + assert_kind_of User, user + assert_equal "admin", user.login + assert_equal User.hash_password("hello"), user.hashed_password + end + + def test_lock + user = User.find(1) + user.locked = true + assert user.save + + user = User.try_to_login("admin", "admin") + assert_equal nil, user end end diff --git a/redmine/test/unit/version_test.rb b/redmine/test/unit/version_test.rb deleted file mode 100644 index 91c52d4a0..000000000 --- a/redmine/test/unit/version_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class VersionTest < Test::Unit::TestCase - fixtures :versions - - # Replace this with your real tests. - def test_truth - assert_kind_of Version, versions(:first) - end -end diff --git a/redmine/test/unit/workflow_test.rb b/redmine/test/unit/workflow_test.rb deleted file mode 100644 index ff88a9763..000000000 --- a/redmine/test/unit/workflow_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class WorkflowTest < Test::Unit::TestCase - fixtures :workflows - - # Replace this with your real tests. - def test_truth - assert_kind_of Workflow, workflows(:first) - end -end