# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class AccountController < ApplicationController\r
- layout 'base' \r
+ layout 'base' \r
+ \r
# prevents login action to be filtered by check_if_login_required application scope filter\r
skip_before_filter :check_if_login_required, :only => :login\r
- before_filter :require_login, :except => [:show, :login]\r
+ before_filter :require_login, :except => [:show, :login]\r
\r
- def show\r
- @user = User.find(params[:id])\r
- end\r
- \r
- # Login request and validation\r
- def login\r
- if request.get?\r
- session[:user] = nil\r
- @user = User.new\r
- else\r
- @user = User.new(params[:user])\r
- logged_in_user = @user.try_to_login\r
- if logged_in_user\r
- session[:user] = logged_in_user\r
- redirect_back_or_default :controller => 'account', :action => 'my_page'\r
- else\r
- flash[:notice] = _('Invalid user/password')\r
- end\r
- end\r
- end\r
+ def show\r
+ @user = User.find(params[:id])\r
+ end\r
+\r
+ # Login request and validation\r
+ def login\r
+ if request.get?\r
+ session[:user] = nil\r
+ else\r
+ logged_in_user = User.try_to_login(params[:login], params[:password])\r
+ if logged_in_user\r
+ session[:user] = logged_in_user\r
+ redirect_back_or_default :controller => 'account', :action => 'my_page'\r
+ else\r
+ flash[:notice] = _('Invalid user/password')\r
+ end\r
+ end\r
+ end\r
\r
# Log out current user and redirect to welcome page\r
def logout\r
end\r
end\r
\r
- # Change current user's password\r
- def change_password\r
- @user = User.find(session[:user].id) \r
- if @user.check_password?(@params[:old_password]) \r
- if @params[:new_password] == @params[:new_password_confirmation]\r
- if @user.change_password(@params[:old_password], @params[:new_password])\r
- flash[:notice] = 'Password was successfully updated.'\r
- end\r
- else\r
- flash[:notice] = 'Password confirmation doesn\'t match!'\r
- end\r
- else\r
- flash[:notice] = 'Wrong password'\r
- end\r
- render :action => 'my_account'\r
- end
+ # Change current user's password\r
+ def change_password\r
+ @user = User.find(session[:user].id)\r
+ if @user.check_password?(@params[:password])\r
+ @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]\r
+ flash[:notice] = 'Password was successfully updated.' if @user.save\r
+ else\r
+ flash[:notice] = 'Wrong password'\r
+ end\r
+ render :action => 'my_account'\r
+ end
end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class AdminController < ApplicationController\r
- layout 'base' \r
- before_filter :require_admin\r
- \r
- helper :sort\r
- include SortHelper \r
+ layout 'base' \r
+ before_filter :require_admin\r
+\r
+ helper :sort\r
+ include SortHelper \r
\r
- def index \r
- end\r
+ def index \r
+ end\r
\r
def projects\r
- sort_init 'projects.name', 'asc'\r
- sort_update \r
- @project_pages, @projects = paginate :projects, :per_page => 15, :order => sort_clause\r
+ sort_init 'name', 'asc'\r
+ sort_update \r
+ @project_count = Project.count \r
+ @project_pages = Paginator.new self, @project_count,\r
+ 15,\r
+ @params['page'] \r
+ @projects = Project.find :all, :order => sort_clause,\r
+ :limit => @project_pages.items_per_page,\r
+ :offset => @project_pages.current.offset \r
end\r
- \r
+\r
def mail_options\r
- @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []\r
+ @actions = Permission.find(:all, :conditions => ["mail_option=?", true]) || []\r
if request.post?\r
@actions.each { |a|\r
- a.mail_enabled = params[:action_ids].include? a.id.to_s \r
+ a.mail_enabled = (params[:action_ids] || []).include? a.id.to_s \r
a.save\r
}\r
flash[:notice] = "Mail options were successfully updated."\r
\r
def info\r
@adapter_name = ActiveRecord::Base.connection.adapter_name\r
- end\r
- \r
+ end \r
end
end \r
\r
def set_localization\r
- Localization.lang = session[:user].nil? ? RDM_DEFAULT_LANG : (session[:user].language || RDM_DEFAULT_LANG)\r
+ Localization.lang = begin\r
+ if session[:user]\r
+ session[:user].language\r
+ elsif request.env['HTTP_ACCEPT_LANGUAGE']\r
+ accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first\r
+ if Localization.langs.collect{ |l| l[1] }.include? accept_lang\r
+ accept_lang\r
+ end\r
+ end\r
+ rescue\r
+ nil\r
+ end || RDM_DEFAULT_LANG\r
end\r
\r
- def require_login\r
- unless session[:user]\r
- store_location\r
- redirect_to(:controller => "account", :action => "login")\r
- end\r
- end\r
+ def require_login\r
+ unless session[:user]\r
+ store_location\r
+ redirect_to(:controller => "account", :action => "login")\r
+ end\r
+ end\r
\r
- def require_admin\r
- if session[:user].nil?\r
- store_location\r
- redirect_to(:controller => "account", :action => "login")\r
- else\r
- unless session[:user].admin?\r
- flash[:notice] = "Acces not allowed"\r
- redirect_to(:controller => "projects", :action => "list")\r
- end\r
- end\r
- end\r
+ def require_admin\r
+ if session[:user].nil?\r
+ store_location\r
+ redirect_to(:controller => "account", :action => "login")\r
+ else\r
+ unless session[:user].admin?\r
+ flash[:notice] = "Acces not allowed"\r
+ redirect_to(:controller => "projects", :action => "list")\r
+ end\r
+ end\r
+ end\r
\r
- # authorizes the user for the requested action.\r
- def authorize\r
+ # authorizes the user for the requested action.\r
+ def authorize\r
# check if action is allowed on public projects\r
- if @project.public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]\r
+ if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ @params[:controller], @params[:action] ]\r
return true\r
end \r
- # if user is not logged in, he is redirect to login form\r
- unless session[:user]\r
- store_location\r
- redirect_to(:controller => "account", :action => "login")\r
- return false\r
- end\r
- # check if user is authorized \r
+ # if user not logged in, redirect to login form\r
+ unless session[:user]\r
+ store_location\r
+ redirect_to(:controller => "account", :action => "login")\r
+ return false\r
+ end\r
+ # if logged in, check if authorized \r
if session[:user].admin? or Permission.allowed_to_role( "%s/%s" % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id) ) \r
return true \r
- end \r
+ end \r
flash[:notice] = "Acces denied"\r
redirect_to(:controller => "")\r
- return false\r
- end\r
+ false\r
+ end\r
\r
- # 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\r
-
+ # 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
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class HelpController < ApplicationController\r
- \r
+\r
skip_before_filter :check_if_login_required\r
- before_filter :load_help_config\r
+ before_filter :load_help_config\r
\r
- def index \r
- if @params[:ctrl] and @help_config[@params[:ctrl]]\r
- if @params[:page] and @help_config[@params[:ctrl]][@params[:page]]\r
- template = @help_config[@params[:ctrl]][@params[:page]]\r
- else\r
- template = @help_config[@params[:ctrl]]['index']\r
- end\r
- end\r
- \r
+ # displays help page for the requested controller/action\r
+ def index \r
+ # select help page to display\r
+ if @params[:ctrl] and @help_config['pages'][@params[:ctrl]]\r
+ if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]]\r
+ template = @help_config['pages'][@params[:ctrl]][@params[:page]]\r
+ else\r
+ template = @help_config['pages'][@params[:ctrl]]['index']\r
+ end\r
+ end\r
+ # choose language according to available help translations\r
+ lang = (@help_config['langs'].include? Localization.lang) ? Localization.lang : @help_config['langs'].first\r
+ \r
if template\r
- redirect_to "/manual/#{template}"\r
+ redirect_to "/manual/#{lang}/#{template}"\r
else\r
- redirect_to "/manual/"\r
+ redirect_to "/manual/#{lang}/"\r
end\r
- end\r
+ end\r
\r
private\r
- def load_help_config\r
- @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))\r
- end
+ def load_help_config\r
+ @help_config = YAML::load(File.open("#{RAILS_ROOT}/config/help.yml"))\r
+ end
end
render :action => 'list'
end
\r
- # Lists public projects
- def list\r
- sort_init 'projects.name', 'asc'\r
- sort_update \r
- @project_count = Project.count(["public=?", true]) \r
- @project_pages = Paginator.new self, @project_count,\r
+ # Lists public projects
+ def list\r
+ sort_init 'name', 'asc'\r
+ sort_update \r
+ @project_count = Project.count(["is_public=?", true]) \r
+ @project_pages = Paginator.new self, @project_count,\r
15,\r
@params['page'] \r
- @projects = Project.find :all, :order => sort_clause,\r
- :conditions => ["public=?", true],\r
+ @projects = Project.find :all, :order => sort_clause,\r
+ :conditions => ["is_public=?", true],\r
:limit => @project_pages.items_per_page,\r
:offset => @project_pages.current.offset
end\r
\r
# Add a new project
- def add\r
- @custom_fields = CustomField::find_all\r
- @project = Project.new(params[:project])\r
- if request.post?\r
- @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 \r
- end \r
- end\r
+ def add\r
+ @custom_fields = CustomField::find_all\r
+ @root_projects = Project::find(:all, :conditions => "parent_id is null")\r
+ @project = Project.new(params[:project])\r
+ if request.post?\r
+ @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'\r
+ end \r
+ end \r
+ end\r
\r
- # Show @project
- def show\r
- @members = @project.members.find(:all, :include => [:user, :role])
- end
+ # Show @project\r
+ def show\r
+ @members = @project.members.find(:all, :include => [:user, :role])\r
+ @subprojects = @project.children if @project.children_count > 0\r
+ @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "news.created_on DESC")
+ end
\r
def settings\r
- @custom_fields = CustomField::find_all\r
- @issue_category ||= IssueCategory.new\r
+ @root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])\r
+ @custom_fields = CustomField::find_all\r
+ @issue_category ||= IssueCategory.new\r
@member ||= @project.members.new\r
@roles = Role.find_all\r
@users = User.find_all - @project.members.find(:all, :include => :user).collect{|m| m.user }\r
end\r
\r
- # Edit @project\r
- def edit\r
- if request.post?\r
- @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]\r
- if @project.update_attributes(params[:project])
- flash[:notice] = 'Project was successfully updated.'
- redirect_to :action => 'settings', :id => @project\r
+ # Edit @project\r
+ def edit\r
+ if request.post?\r
+ @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]\r
+ if @project.update_attributes(params[:project])
+ flash[:notice] = 'Project was successfully updated.'
+ redirect_to :action => 'settings', :id => @project\r
else\r
settings\r
render :action => 'settings'\r
- end\r
- end
+ end\r
+ end
end\r
\r
# Delete @project
end \r
end\r
\r
- # Show issues list of @project\r
+ # Show filtered/sorted issues list of @project\r
def list_issues\r
sort_init 'issues.id', 'desc'\r
sort_update\r
search_filter_init_list_issues\r
search_filter_update if params[:set_filter] or request.post?\r
\r
- @issue_count = Issue.count(:include => :status, :conditions => search_filter_clause) \r
+ @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause) \r
@issue_pages = Paginator.new self, @issue_count, 15, @params['page'] \r
@issues = Issue.find :all, :order => sort_clause,\r
- :include => [ :author, :status, :tracker ],\r
+ :include => [ :author, :status, :tracker, :project ],\r
:conditions => search_filter_clause,\r
:limit => @issue_pages.items_per_page,\r
:offset => @issue_pages.current.offset \r
search_filter_init_list_issues\r
\r
@issues = Issue.find :all, :order => sort_clause,\r
- :include => [ :author, :status, :tracker ],\r
+ :include => [ :author, :status, :tracker, :project ],\r
:conditions => search_filter_clause \r
\r
export = StringIO.new\r
end\r
\r
def workflow\r
- @roles = Role.find_all\r
- @trackers = Tracker.find_all\r
- @statuses = IssueStatus.find_all\r
\r
@role = Role.find_by_id(params[:role_id])\r
@tracker = Tracker.find_by_id(params[:tracker_id]) \r
flash[:notice] = 'Workflow was successfully updated.'\r
end\r
end\r
+ @roles = Role.find_all\r
+ @trackers = Tracker.find_all\r
+ @statuses = IssueStatus.find(:all, :include => :workflows)\r
end
end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class UsersController < ApplicationController\r
- layout 'base' \r
- before_filter :require_admin\r
- \r
- helper :sort\r
- include SortHelper\r
-
- def index
- list
- render :action => 'list'
- end
+ layout 'base' \r
+ before_filter :require_admin\r
+\r
+ helper :sort\r
+ include SortHelper\r
+
+ def index
+ list
+ render :action => 'list'
+ end
- def list\r
- sort_init 'users.login', 'asc'\r
- sort_update\r
- @user_count = User.count \r
- @user_pages = Paginator.new self, @user_count,\r
+ def list\r
+ sort_init 'login', 'asc'\r
+ sort_update\r
+ @user_count = User.count \r
+ @user_pages = Paginator.new self, @user_count,\r
15,\r
@params['page'] \r
- @users = User.find :all, :order => sort_clause,\r
+ @users = User.find :all,:order => sort_clause,\r
:limit => @user_pages.items_per_page,\r
:offset => @user_pages.current.offset
- end
+ end
- def add
- if request.get?\r
- @user = User.new\r
- else
- @user = User.new(params[:user])\r
- @user.admin = params[:user][:admin]
- if @user.save
- flash[:notice] = 'User was successfully created.'
- redirect_to :action => 'list'
- end\r
- end
- end
+ def add
+ if request.get?\r
+ @user = User.new\r
+ else
+ @user = User.new(params[:user])\r
+ @user.admin = params[:user][:admin] || false\r
+ @user.login = params[:user][:login]\r
+ @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]\r
+ if @user.save
+ flash[:notice] = 'User was successfully created.'
+ redirect_to :action => 'list'
+ end\r
+ end
+ end
- def edit
- @user = User.find(params[:id])
- if request.post?\r
- @user.admin = params[:user][:admin] if params[:user][:admin]\r
- if @user.update_attributes(params[:user])
- flash[:notice] = 'User was successfully updated.'
- redirect_to :action => 'list'
- end\r
- end
- end
+ def edit
+ @user = User.find(params[:id])
+ if request.post?\r
+ @user.admin = params[:user][:admin] if params[:user][:admin]\r
+ @user.login = params[:user][:login] if params[:user][:login]\r
+ @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty?\r
+ if @user.update_attributes(params[:user])
+ flash[:notice] = 'User was successfully updated.'
+ redirect_to :action => 'list'
+ end\r
+ end
+ end
- def destroy
- User.find(params[:id]).destroy
- redirect_to :action => 'list'\r
+ def destroy
+ User.find(params[:id]).destroy
+ redirect_to :action => 'list'\r
rescue\r
flash[:notice] = "Unable to delete user"\r
redirect_to :action => 'list'
- end \r
+ end \r
end
@attachment = @version.attachments.find(params[:attachment_id])\r
@attachment.increment_download\r
send_file @attachment.diskfile, :filename => @attachment.filename\r
+ rescue\r
+ flash[:notice]="Requested file doesn't exist or has been deleted."\r
+ redirect_to :controller => 'projects', :action => 'list_files', :id => @project\r
end \r
\r
def destroy_file\r
\r
def authorize_for(controller, action) \r
# check if action is allowed on public projects\r
- if @project.public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]\r
+ if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ]\r
return true\r
end \r
# check if user is authorized \r
module SearchFilterHelper\r
\r
def search_filter_criteria(name, options = {})\r
- session[:search_filter] ||= {}\r
- session[:search_filter][name] ||= {}\r
- unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions]\r
- session[:search_filter][name][:options] = []\r
- session[:search_filter][name][:conditions] = {}\r
- yield.each { |c|\r
- session[:search_filter][name][:options] << [c[0], c[1].to_s]\r
- session[:search_filter][name][:conditions].store(c[1].to_s, c[2])\r
- }\r
- end\r
+ @search_filter ||= {}\r
+ @search_filter[name] ||= {}\r
+ @search_filter[name][:options] = []\r
+ @search_filter[name][:conditions] = {}\r
+ yield.each { |c|\r
+ @search_filter[name][:options] << [c[0], c[1].to_s]\r
+ @search_filter[name][:conditions].store(c[1].to_s, c[2])\r
+ }\r
end\r
\r
def search_filter_update\r
- session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field] }\r
+ @search_filter.each_key {|field| session[:search_filter][field] = params[field] }\r
end\r
\r
def search_filter_clause\r
- clause = ["issues.project_id=?", @project.id]\r
- session[:search_filter].each { |k, v|\r
- v[:value] ||= v[:options][0][1]\r
- if (!v[:conditions][v[:value]][0].empty?)\r
- clause[0] = clause[0] + " AND " + v[:conditions][v[:value]][0]\r
- clause << v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil?\r
+ clause = ["1=1"]\r
+ @search_filter.each { |k, v|\r
+ filter_value = session[:search_filter][k] || v[:options][0][1]\r
+ if v[:conditions][filter_value]\r
+ clause[0] = clause[0] + " AND " + v[:conditions][filter_value].first\r
+ clause += v[:conditions][filter_value][1..-1]\r
end \r
}\r
clause\r
end\r
\r
- def search_filter_tag(criteria)\r
+ def search_filter_tag(criteria, options = {})\r
+ options[:name] = criteria\r
content_tag("select", \r
- options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]),\r
- :name => criteria\r
+ options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),\r
+ options\r
)\r
end\r
\r
def search_filter_init_list_issues\r
search_filter_criteria('status_id') { \r
- [ ["[Open]", "O", ["issue_statuses.is_closed=?", false]],\r
- ["[All]", "A", ["", false]]\r
+ [ [_('[Open]'), "O", ["issue_statuses.is_closed=?", false]],\r
+ [_('[All]'), "A", nil]\r
] + IssueStatus.find(:all).collect {|s| [s.name, s.id, ["issues.status_id=?", s.id]] } \r
}\r
\r
search_filter_criteria('tracker_id') { \r
- [ ["[All]", "A", ["", false]]\r
+ [ [_('[All]'), "A", nil]\r
] + Tracker.find(:all).collect {|s| [s.name, s.id, ["issues.tracker_id=?", s.id]] } \r
}\r
\r
search_filter_criteria('priority_id') { \r
- [ ["[All]", "A", ["", false]]\r
+ [ [_('[All]'), "A", nil]\r
] + Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect {|s| [s.name, s.id, ["issues.priority_id=?", s.id]] } \r
}\r
\r
search_filter_criteria('category_id') { \r
- [ ["[All]", "A", ["", false]],\r
- ["[None]", "N", ["issues.category_id is null"]]\r
+ [ [_('[All]'), "A", nil],\r
+ [_('[None]'), "N", ["issues.category_id is null"]]\r
] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, ["issues.category_id=?", s.id]] } \r
} \r
\r
search_filter_criteria('assigned_to_id') { \r
- [ ["[All]", "A", ["", false]],\r
- ["[Nobody]", "N", ["issues.assigned_to_id is null"]]\r
- ] + User.find(:all).collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } \r
- } \r
+ [ [_('[All]'), "A", nil],\r
+ [_('[None]'), "N", ["issues.assigned_to_id is null"]]\r
+ ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.assigned_to_id=?", s.id]] } \r
+ }\r
+\r
+ search_filter_criteria('subproject_id') { \r
+ [ [_('[None]'), "N", ["issues.project_id=?", @project.id]],\r
+ [_('[All]'), "A", ["(issues.project_id=? or projects.parent_id=?)", @project.id, @project.id]]\r
+ ] \r
+ } \r
end\r
end
\ No newline at end of file
self.filename = sanitize_filename(@temp_file.original_filename)\r
self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename\r
self.content_type = @temp_file.content_type\r
- self.size = @temp_file.size\r
+ self.filesize = @temp_file.size\r
end\r
end\r
end\r
before_destroy :check_integrity\r
\r
validates_presence_of :opt, :name\r
+ validates_uniqueness_of :name, :scope => [:opt]\r
\r
OPTIONS = [\r
["Issue priorities", "IPRI"],\r
\r
class IssueCategory < ActiveRecord::Base\r
before_destroy :check_integrity \r
- belongs_to :project\r
- \r
+ belongs_to :project\r
+\r
validates_presence_of :name\r
+ validates_uniqueness_of :name, :scope => [:project_id]\r
\r
private\r
def check_integrity\r
\r
class IssueStatus < ActiveRecord::Base\r
before_destroy :check_integrity \r
- has_many :workflows, :foreign_key => "old_status_id"\r
- \r
- validates_presence_of :name\r
- validates_uniqueness_of :name\r
+ has_many :workflows, :foreign_key => "old_status_id"\r
\r
- # Returns the default status for new issues\r
- def self.default\r
- find(:first, :conditions =>["is_default=?", true])\r
- end\r
- \r
- # Returns an array of all statuses the given role can switch to\r
- def new_statuses_allowed_to(role, tracker)\r
- statuses = []\r
- for workflow in self.workflows.find(:all, :include => :new_status)\r
- statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id\r
- end unless role.nil?\r
- statuses\r
- end\r
+ validates_presence_of :name\r
+ validates_uniqueness_of :name\r
+ validates_length_of :html_color, :is=>6\r
+ validates_format_of :html_color, :with => /^[a-f0-9]*$/i\r
+\r
+ # Returns the default status for new issues\r
+ def self.default\r
+ find(:first, :conditions =>["is_default=?", true])\r
+ end\r
+\r
+ # Returns an array of all statuses the given role can switch to\r
+ def new_statuses_allowed_to(role, tracker)\r
+ statuses = []\r
+ for workflow in self.workflows\r
+ statuses << workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id\r
+ end unless role.nil? or tracker.nil?\r
+ statuses\r
+ end\r
\r
def name\r
_ self.attributes['name']\r
end\r
\r
def self.allowed_to_public(action)\r
- @@cached_perms_for_public ||= find(:all, :conditions => ["public=?", true]).collect {|p| "#{p.controller}/#{p.action}"}\r
+ @@cached_perms_for_public ||= find(:all, :conditions => ["is_public=?", true]).collect {|p| "#{p.controller}/#{p.action}"}\r
@@cached_perms_for_public.include? action\r
end\r
\r
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class Project < ActiveRecord::Base\r
- has_many :versions, :dependent => true, :order => "versions.date DESC"\r
+ has_many :versions, :dependent => true, :order => "versions.effective_date DESC"\r
has_many :members, :dependent => true\r
+ has_many :users, :through => :members\r
has_many :issues, :dependent => true, :order => "issues.created_on DESC", :include => :status\r
has_many :documents, :dependent => true\r
- has_many :news, :dependent => true, :order => "news.created_on DESC", :include => :author\r
+ has_many :news, :dependent => true, :include => :author\r
has_many :issue_categories, :dependent => true\r
has_and_belongs_to_many :custom_fields\r
+ acts_as_tree :order => "name", :counter_cache => true\r
\r
validates_presence_of :name, :descr\r
+ validates_uniqueness_of :name\r
\r
# returns 5 last created projects\r
def self.latest\r
find(:all, :limit => 5, :order => "created_on DESC") \r
end \r
\r
- # Returns current version of the project\r
- def current_version\r
- versions.find(:first, :conditions => [ "date <= ?", Date.today ], :order => "date DESC, id DESC")\r
- end\r
- \r
# Returns an array of all custom fields enabled for project issues\r
# (explictly associated custom fields and custom fields enabled for all projects)\r
def custom_fields_for_issues\r
(CustomField.for_all + custom_fields).uniq\r
- end
+ end\r
+ \r
+protected\r
+ def validate\r
+ errors.add(parent_id, " must be a root project") if parent and parent.parent\r
+ errors.add_to_base("A project with subprojects can't be a subproject") if parent and projects_count > 0\r
+ end
end
has_many :issues\r
has_many :workflows, :dependent => true\r
\r
+ validates_presence_of :name\r
+ validates_uniqueness_of :name\r
+ \r
def name\r
_ self.attributes['name']\r
end\r
require "digest/sha1"\r
\r
class User < ActiveRecord::Base\r
- has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true\r
+ has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :dependent => true\r
\r
- attr_accessor :password\r
- attr_accessor :last_before_login_on\r
- # Prevents unauthorized assignments\r
- attr_protected :admin\r
+ attr_accessor :password, :password_confirmation\r
+ attr_accessor :last_before_login_on\r
+ # Prevents unauthorized assignments\r
+ attr_protected :login, :admin, :password, :password_confirmation, :hashed_password\r
\r
- validates_presence_of :login, :firstname, :lastname, :mail\r
- validates_uniqueness_of :login, :mail\r
- \r
- # Login must contain lettres, numbers, underscores only\r
- validates_format_of :login, :with => /^[a-z0-9_]+$/i\r
- validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i\r
+ validates_presence_of :login, :firstname, :lastname, :mail\r
+ validates_uniqueness_of :login, :mail \r
+ # Login must contain lettres, numbers, underscores only\r
+ validates_format_of :login, :with => /^[a-z0-9_]+$/i\r
+ validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i\r
+ # Password length between 4 and 12\r
+ validates_length_of :password, :in => 4..12, :allow_nil => true\r
+ validates_confirmation_of :password, :allow_nil => true\r
+\r
+ def before_save\r
+ # update hashed_password if password was set\r
+ self.hashed_password = User.hash_password(self.password) if self.password\r
+ end\r
\r
- def before_create\r
- self.hashed_password = User.hash_password(self.password)\r
- end\r
+ # Returns the user that matches provided login and password, or nil\r
+ def self.try_to_login(login, password)\r
+ user = find(:first, :conditions => ["login=? and hashed_password=? and locked=?", login, User.hash_password(password), false])\r
+ if user\r
+ user.last_before_login_on = user.last_login_on\r
+ user.update_attribute(:last_login_on, Time.now)\r
+ end\r
+ user\r
+ end\r
\r
- def after_create\r
- @password = nil\r
- end\r
+ # Return user's full name for display\r
+ def display_name\r
+ firstname + " " + lastname\r
+ end\r
\r
- # Returns the user that matches user's login and password\r
- def try_to_login\r
- @user = User.login(self.login, self.password)\r
- unless @user.nil? \r
- @user.last_before_login_on = @user.last_login_on\r
- @user.update_attribute(:last_login_on, DateTime.now)\r
- end\r
- @user\r
- end\r
- \r
- # Return user's full name for display\r
- def display_name\r
- firstname + " " + lastname #+ (self.admin ? " (Admin)" : "" )\r
- end\r
+ def check_password?(clear_password)\r
+ User.hash_password(clear_password) == self.hashed_password\r
+ end\r
\r
- # Returns the user that matches the given login and password\r
- def self.login(login, password)\r
- hashed_password = hash_password(password || "")\r
- find(:first,\r
- :conditions => ["login = ? and hashed_password = ? and locked = ?", login, hashed_password, false])\r
- end\r
- \r
- def check_password?(clear_password)\r
- User.hash_password(clear_password) == self.hashed_password\r
- end\r
- \r
- def change_password(current_password, new_password)\r
- self.hashed_password = User.hash_password(new_password)\r
- save\r
- end\r
\r
def role_for_project(project_id)\r
@role_for_projects ||=\r
end\r
\r
private\r
- # Return password digest\r
- def self.hash_password(clear_password)\r
- Digest::SHA1.hexdigest(clear_password)\r
- end
+ # Return password digest\r
+ def self.hash_password(clear_password)\r
+ Digest::SHA1.hexdigest(clear_password || "")\r
+ end
end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class Version < ActiveRecord::Base\r
- before_destroy :check_integrity \r
- belongs_to :project\r
- has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'\r
+ before_destroy :check_integrity\r
+ belongs_to :project\r
+ has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'\r
has_many :attachments, :as => :container, :dependent => true\r
- \r
- validates_presence_of :name, :descr\r
+\r
+ validates_presence_of :name\r
+ validates_uniqueness_of :name, :scope => [:project_id]\r
\r
private\r
def check_integrity\r
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
class Workflow < ActiveRecord::Base\r
+ belongs_to :role\r
+ belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id'\r
+ belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id'\r
\r
- belongs_to :role\r
- belongs_to :old_status, :class_name => 'IssueStatus', :foreign_key => 'old_status_id'\r
- belongs_to :new_status, :class_name => 'IssueStatus', :foreign_key => 'new_status_id'\r
-\r
- validates_presence_of :role, :old_status, :new_status\r
+ validates_presence_of :role, :old_status, :new_status\r
end
<div class="box">\r
-<h2><%=_ 'Please login' %></h2>
+<h2><%=_('Please login') %></h2>
\r
<%= start_form_tag :action=> "login" %>
-<p><label for="user_login"><%=_ 'Login' %>:</label><br/>
-<input type="text" name="user[login]" id="user_login" size="30" /></p>
+<p><label for="login"><%=_ 'Login' %>:</label><br/>
+<%= text_field_tag 'login', nil, :size => 25 %></p>
<p><label for="user_password"><%=_ 'Password' %>:</label><br/>
-<input type="password" name="user[password]" id="user_password" size="30"/></p>
+<%= password_field_tag 'password', nil, :size => 25 %></p>
<p><input type="submit" name="login" value="<%=_ 'Log in' %> »" class="primary" /></p>
<%= end_form_tag %>
<p><%=_('Login')%>: <strong><%= @user.login %></strong><br />\r
<%=_('Created on')%>: <%= format_time(@user.created_on) %>,\r
<%=_('Last update')%>: <%= format_time(@user.updated_on) %></p>\r
+
+<%= error_messages_for 'user' %>
\r
<div class="splitcontentleft">\r
<div class="box">\r
<h3><%=_('Information')%></h3>\r
<%= start_form_tag :action => 'my_account' %>
- <%= error_messages_for 'user' %>
\r
<!--[form:user]-->
<p><label for="user_firstname"><%=_('Firstname')%> <span class="required">*</span></label><br/>
<%= start_form_tag :action => 'change_password' %>
\r
- <p><label for="old_password"><%=_('Password')%> <span class="required">*</span></label><br/>
- <%= password_field_tag 'old_password' %></p>
+ <p><label for="password"><%=_('Password')%> <span class="required">*</span></label><br/>
+ <%= password_field_tag 'password', nil, :size => 25 %></p>
\r
<p><label for="new_password"><%=_('New password')%> <span class="required">*</span></label><br/>
- <%= password_field_tag 'new_password' %></p>\r
+ <%= password_field_tag 'new_password', nil, :size => 25 %></p>\r
\r
<p><label for="new_password_confirmation"><%=_('Confirmation')%> <span class="required">*</span></label><br/>
- <%= password_field_tag 'new_password_confirmation' %></p>\r
+ <%= password_field_tag 'new_password_confirmation', nil, :size => 25 %></p>\r
<center><%= submit_tag _('Save') %></center>
<%= end_form_tag %>\r
<h2><%=_('Information')%></h2>\r
\r
-<%=_('Version')%>: <%= RDM_APP_NAME %> <%= RDM_APP_VERSION %><br />\r
-<%=_('Database')%>: <%= @adapter_name %>
\ No newline at end of file
+<p><%=_('Version')%>: <strong><%= RDM_APP_NAME %> <%= RDM_APP_VERSION %></strong></p>\r
+\r
+Environment:\r
+<ul>\r
+<% Rails::Info.properties.each do |name, value| %>\r
+<li><%= name %>: <%= value %></li>\r
+<% end %>\r
+</ul>
\ No newline at end of file
<table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
<tr class="ListHead">
- <%= sort_header_tag('projects.name', :caption => _('Project')) %>\r
+ <%= sort_header_tag('name', :caption => _('Project')) %>\r
<th><%=_('Description')%></th>\r
- <th><%=_('Public')%></th>\r
- <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>\r
+ <th><%=_('Public')%></th>
+ <th><%=_('Subprojects')%></th>\r
+ <%= sort_header_tag('created_on', :caption => _('Created on')) %>\r
<th></th>
</tr>
-<% odd_or_even = 1\r
- for project in @projects\r
- odd_or_even = 1 - odd_or_even %>
- <tr class="ListLine<%= odd_or_even %>">\r
+<% for project in @projects %>
+ <tr class="<%= cycle("odd", "even") %>">\r
<td><%= link_to project.name, :controller => 'projects', :action => 'settings', :id => project %>\r
<td><%= project.descr %>\r
- <td align="center"><%= image_tag 'true' if project.public? %>\r
+ <td align="center"><%= image_tag 'true' if project.is_public? %>
+ <td align="center"><%= project.projects_count %>\r
<td align="center"><%= format_date(project.created_on) %>\r
<td align="center">\r
<%= start_form_tag({:controller => 'projects', :action => 'destroy', :id => project}) %>\r
<% end %>
</table>
-<%= link_to ('« ' + _('Previous')), { :page => @project_pages.current.previous } if @project_pages.current.previous %>\r
-<%= pagination_links(@project_pages) %>
-<%= link_to (_('Next') + ' »'), { :page => @project_pages.current.next } if @project_pages.current.next %>\r
-\r
-<br />\r
-\r
-<%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %>
\ No newline at end of file
+<p><%= pagination_links_full @project_pages %>
+[ <%= @project_pages.current.first_item %> - <%= @project_pages.current.last_item %> / <%= @project_count %> ]</p>\r
+
+<p><%= link_to ('» ' + _('New project')), :controller => 'projects', :action => 'add' %></p>
\ No newline at end of file
<th></th>\r
</tr>
<% for custom_field in @custom_fields %>
- <tr style="background-color:#CEE1ED">\r
+ <tr class="<%= cycle("odd", "even") %>">\r
<td><%= link_to custom_field.name, :action => 'edit', :id => custom_field %></td>\r
<td align="center"><%= CustomField::TYPES[custom_field.typ][0] %></td>\r
<td align="center"><%= image_tag 'true' if custom_field.is_required? %></td>\r
<td><%= link_to attachment.filename, :action => 'download', :id => @document, :attachment_id => attachment %></td>\r
<td align="center"><%= format_date(attachment.created_on) %></td>
<td align="center"><%= attachment.author.display_name %></td>
- <td><%= human_size(attachment.size) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td>\r
+ <td><%= human_size(attachment.filesize) %><br /><%= attachment.downloads %> <%=_('download')%>(s)</td>\r
+ \r
<% if authorize_for('documents', 'destroy_attachment') %>\r
<td align="center">\r
<%= start_form_tag :action => 'destroy_attachment', :id => @document, :attachment_id => attachment %>\r
<%= submit_tag _('Delete'), :class => "button-small" %>\r
<%= end_form_tag %>
</tr>\r
- <% end %>
+ <% end %>\r
+
<% end %>
</table>\r
<br />\r
<%= error_messages_for 'issue_status' %>
<!--[form:issue_status]-->
-<p><label for="issue_status_name"><%=_('Name')%></label><br/>
+<p><label for="issue_status_name"><%=_('Name')%></label> <span class="required">*</span><br/>
<%= text_field 'issue_status', 'name' %></p>
<p><%= check_box 'issue_status', 'is_closed' %>\r
<label for="issue_status_is_default"><%=_('Default status')%></label></p>\r
\r
<p><label for="issue_status_html_color"><%=_('Color')%></label>
-#<%= text_field 'issue_status', 'html_color', :size => 6 %></p>\r
+#<%= text_field 'issue_status', 'html_color', :maxlength => 6 %> <span class="required">*</span></p>\r
<!--[eoform:issue_status]-->
</tr>
<% for status in @issue_statuses %>
- <tr style="background-color:#CEE1ED">
+ <tr class="<%= cycle("odd", "even") %>">
<td><%= link_to status.name, :action => 'edit', :id => status %></td>\r
- <td align="center"><%= image_tag 'true' if status.is_default %></td>\r
- <td align="center"><%= image_tag 'true' if status.is_closed %></td>
+ <td align="center"><%= image_tag 'true' if status.is_default? %></td>\r
+ <td align="center"><%= image_tag 'true' if status.is_closed? %></td>
<td bgcolor="#<%= status.html_color %>"> </td> \r
<td align="center">\r
<%= start_form_tag :action => 'destroy', :id => status %>\r
<p><b><%=_('Assigned to')%>:</b> <%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %></p>\r
\r
<p><b><%=_('Subject')%>:</b> <%= @issue.subject %></p>\r
-<p><b><%=_('Description')%>:</b> <%= @issue.descr %></p>\r
+<p><b><%=_('Description')%>:</b> <%= simple_format auto_link @issue.descr %></p>\r
<p><b><%=_('Created on')%>:</b> <%= format_date(@issue.created_on) %></p>\r
\r
<% if authorize_for('issues', 'edit') %>\r
<table width="100%">\r
<% for attachment in @issue.attachments %>\r
<tr>\r
-<td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.size) %>)</td>\r
+<td><%= link_to attachment.filename, :action => 'download', :id => @issue, :attachment_id => attachment %> (<%= human_size(attachment.filesize) %>)</td>\r
<td><%= format_date(attachment.created_on) %></td>\r
<td><%= attachment.author.display_name %></td>\r
<% if authorize_for('issues', 'destroy_attachment') %>\r
</div>\r
\r
<div id="footer">\r
- <p><a href="http://redmine.sourceforge.net/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %></p>\r
+ <p><a href="http://redmine.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %></p>\r
</div>\r
\r
</div>\r
<b><%=_('Date')%></b>: <%= format_time(@news.created_on) %>\r
</p>\r
\r
-<%= @news.descr %>
+<%= simple_format auto_link @news.descr %>
<p><label for="project_name"><%=_('Name')%> <span class="required">*</span></label><br/>
<%= text_field 'project', 'name' %></p>
+<% if session[:user].admin %>
+<p><label for="project_parent_id"><%=_('Subproject of')%></label><br/>
+<select name="project[parent_id]">
+<option value=""></option>
+<%= options_from_collection_for_select @root_projects, "id", "name", @project.parent_id %>
+</select></p>
+<% end %>
+
<p><label for="project_descr"><%=_('Description')%> <span class="required">*</span></label><br/>
-<%= text_field 'project', 'descr', :size => 60 %></p>
+<%= text_area 'project', 'descr', :cols => 60, :rows => 3 %></p>
\r
<p><label for="project_homepage"><%=_('Homepage')%></label><br/>
<%= text_field 'project', 'homepage', :size => 40 %></p>
-<p><%= check_box 'project', 'public' %>\r
-<label for="project_public"><%=_('Public')%></label></p>
-\r
+<p><%= check_box 'project', 'is_public' %>\r
+<label for="project_is_public"><%=_('Public')%></label></p>
+
<fieldset><legend><%=_('Custom fields')%></legend>\r
<% for custom_field in @custom_fields %>\r
<input type="checkbox"\r
\r
<% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %>\r
<% fixed_issues.each do |version, issues| %>\r
- <p><strong><%= version.name %></strong> - <%= format_date(version.date) %><br />\r
+ <p><strong><%= version.name %></strong> - <%= format_date(version.effective_date) %><br />\r
<%=h version.descr %></p>\r
<ul> \r
<% issues.each do |i| %>\r
<table width="100%" cellspacing="1" cellpadding="2" class="listTableContent">
<tr class="ListHead">
- <%= sort_header_tag('projects.name', :caption => _('Project')) %>\r
+ <%= sort_header_tag('name', :caption => _('Project')) %>\r
<th>Description</th>\r
- <%= sort_header_tag('projects.created_on', :caption => _('Created on')) %>
+ <%= sort_header_tag('created_on', :caption => _('Created on')) %>
</tr>
-<% odd_or_even = 1\r
- for project in @projects\r
- odd_or_even = 1 - odd_or_even %>
- <tr class="ListLine<%= odd_or_even %>">\r
+<% for project in @projects %>
+ <tr class="<%= cycle("odd", "even") %>">\r
<td><%= link_to project.name, :action => 'show', :id => project %>\r
<td><%= project.descr %>\r
<td align="center"><%= format_date(project.created_on) %>\r
<tr>\r
<td colspan="7"><%= image_tag 'package' %> <b><%= version.name %></b></td>\r
</tr>\r
- <% odd_or_even = 1\r
- for file in version.attachments\r
- odd_or_even = 1 - odd_or_even %>
- <tr class="ListLine<%= odd_or_even %>">\r
+ <% for file in version.attachments %>
+ <tr class="<%= cycle("odd", "even") %>">\r
<td></td>\r
<td><%= link_to file.filename, :controller => 'versions', :action => 'download', :id => version, :attachment_id => file %></td>\r
<td align="center"><%= format_date(file.created_on) %></td>\r
- <td align="center"><%= human_size(file.size) %></td>\r
+ <td align="center"><%= human_size(file.filesize) %></td>\r
<td align="center"><%= file.downloads %></td>
<td align="center"><small><%= file.digest %></small></td>\r
<% if delete_allowed %>\r
</td>\r
<% end %>
</tr>
- <% end %>\r
+ <% end\r
+ reset_cycle %>\r
<% end %>\r
</table>\r
\r
<form method="post" class="noborder">\r
<table cellpadding=2>\r
<tr>\r
- <td><%=_('Status')%>:<br /><%= search_filter_tag("status_id") %></td>\r
- <td><%=_('Tracker')%>:<br /><%= search_filter_tag("tracker_id") %></td>\r
- <td><%=_('Priority')%>:<br /><%= search_filter_tag("priority_id") %></td>\r
- <td><%=_('Category')%>:<br /><%= search_filter_tag("category_id") %></td>\r
- <td><%=_('Assigned to')%>:<br /><%= search_filter_tag("assigned_to_id") %></td>\r
+ <td><small><%=_('Status')%>:</small><br /><%= search_filter_tag 'status_id', :class => 'select-small' %></td>\r
+ <td><small><%=_('Tracker')%>:</small><br /><%= search_filter_tag 'tracker_id', :class => 'select-small' %></td>\r
+ <td><small><%=_('Priority')%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>\r
+ <td><small><%=_('Category')%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>\r
+ <td><small><%=_('Assigned to')%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>\r
+ <td><small><%=_('Subprojects')%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>\r
+\r
<td valign="bottom">\r
- <%= submit_tag _('Apply filter') %>\r
+ <%= submit_tag _('Apply filter'), :class => 'button-small' %>\r
<%= end_form_tag %>\r
\r
<%= start_form_tag %>\r
- <%= submit_tag _('Reset') %>\r
+ <%= submit_tag _('Reset'), :class => 'button-small' %>\r
<%= end_form_tag %>\r
</td>\r
</tr>\r
<% for tracker in Tracker.find_all %> \r
<li><%= link_to tracker.name, :controller => 'projects', :action => 'list_issues', :id => @project, \r
:set_filter => 1, \r
- "issues.tracker_id" => tracker.id %>:\r
- <%= tracker.issues.count(["project_id=?", @project.id]) %> <%=_('open')%>\r
+ "tracker_id" => tracker.id %>:\r
+ <%= Issue.count(:conditions => ["project_id=? and tracker_id=? and issue_statuses.is_closed=?", @project.id, tracker.id, false], :include => :status) %> <%=_('open')%>\r
</li>\r
<% end %>\r
</ul>
<% end %> \r
</div>\r
\r
+ <% if @subprojects %>\r
+ <div class="box">\r
+ <h3><%= image_tag "projects" %> <%=_('Subprojects')%></h3> \r
+ <% for subproject in @subprojects %>\r
+ <%= link_to subproject.name, :action => 'show', :id => subproject %><br /> \r
+ <% end %> \r
+ </div>\r
+ <% end %>\r
+ \r
<div class="box">\r
<h3><%=_('Latest news')%></h3> \r
- <% for news in @project.news %>\r
+ <% for news in @news %>\r
<p>\r
<b><%= news.title %></b> <small>(<%= link_to_user news.author %> <%= format_time(news.created_on) %>)</small><br />\r
<%= news.shortdescr %>\r
</tr>
<% for role in @roles %>
- <tr style="background-color:#CEE1ED">
+ <tr class="<%= cycle("odd", "even") %>">
<td><%= link_to role.name, :action => 'edit', :id => role %></td>
<td align="center">\r
<%= start_form_tag :action => 'destroy', :id => role %>\r
</tr>
<% for tracker in @trackers %>
- <tr style="background-color:#CEE1ED">
+ <tr class="<%= cycle("odd", "even") %>">
<td><%= link_to tracker.name, :action => 'edit', :id => tracker %></td>
<td align="center">\r
<%= start_form_tag :action => 'destroy', :id => tracker %>\r
<!--[form:user]-->
<p><label for="user_login"><%=_('Login')%></label><br/>
-<%= text_field 'user', 'login' %></p>
+<%= text_field 'user', 'login', :size => 25 %></p>
\r
-<p><label for="user_password"><%=_('Password')%></label><br/>
-<%= password_field 'user', 'password' %></p>
+<p><label for="password"><%=_('Password')%></label><br/>
+<%= password_field_tag 'password', nil, :size => 25 %></p>
+
+<p><label for="password_confirmation"><%=_('Confirmation')%></label><br/>
+<%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
<p><label for="user_firstname"><%=_('Firstname')%></label><br/>
<%= text_field 'user', 'firstname' %></p>
\r
<table border="0" cellspacing="1" cellpadding="2" class="listTableContent"> \r
<tr class="ListHead">
- <%= sort_header_tag('users.login', :caption => _('Login')) %>\r
- <%= sort_header_tag('users.firstname', :caption => _('Firstname')) %>\r
- <%= sort_header_tag('users.lastname', :caption => _('Lastname')) %>\r
+ <%= sort_header_tag('login', :caption => _('Login')) %>\r
+ <%= sort_header_tag('firstname', :caption => _('Firstname')) %>\r
+ <%= sort_header_tag('lastname', :caption => _('Lastname')) %>\r
<th><%=_('Mail')%></th>\r
- <%= sort_header_tag('users.admin', :caption => _('Admin')) %>\r
- <%= sort_header_tag('users.locked', :caption => _('Locked')) %>\r
- <%= sort_header_tag('users.created_on', :caption => _('Created on')) %>\r
- <%= sort_header_tag('users.last_login_on', :caption => _('Last login')) %>\r
+ <%= sort_header_tag('admin', :caption => _('Admin')) %>\r
+ <%= sort_header_tag('locked', :caption => _('Locked')) %>\r
+ <%= sort_header_tag('created_on', :caption => _('Created on')) %>\r
+ <%= sort_header_tag('last_login_on', :caption => _('Last login')) %>\r
<th></th>\r
</tr>
<% for user in @users %>
- <tr style="background-color:#CEE1ED">\r
+ <tr class="<%= cycle("odd", "even") %>">\r
<td><%= link_to user.login, :action => 'edit', :id => user %></td>\r
<td><%= user.firstname %></td>\r
<td><%= user.lastname %></td>\r
<td align="center">\r
<%= start_form_tag :action => 'edit', :id => user %>\r
<% if user.locked? %>\r
- <%= hidden_field_tag 'user[locked]', false %>\r
+ <%= hidden_field_tag 'user[locked]', 0 %>\r
<%= submit_tag _('Unlock'), :class => "button-small" %>\r
<% else %>\r
- <%= hidden_field_tag 'user[locked]', true %>\r
+ <%= hidden_field_tag 'user[locked]', 1 %>\r
<%= submit_tag _('Lock'), :class => "button-small" %>\r
<% end %>\r
<%= end_form_tag %> \r
<%= error_messages_for 'version' %>
<!--[form:version]-->
-<p><label for="version_name"><%=_('Version')%></label><br/>
+<p><label for="version_name"><%=_('Version')%></label> <span class="required">*</span><br/>
<%= text_field 'version', 'name', :size => 20 %></p>
<p><label for="version_descr"><%=_('Description')%></label><br/>
<%= text_field 'version', 'descr', :size => 60 %></p>
\r
-<p><label for="version_date"><%=_('Date')%></label><br/>
-<%= date_select 'version', 'date' %></p>
+<p><label for="version_effective_date"><%=_('Date')%></label><br/>
+<%= date_select 'version', 'effective_date' %></p>
<!--[eoform:version]-->
<h2><%=_('Welcome')%> !</h2>\r
\r
<div class="box">\r
- <h3>Latest news</h3>
+ <h3><%=_('Latest news')%></h3>
<% for news in @news %>\r
<p>\r
<b><%= news.title %></b> (<%= link_to_user news.author %> <%= format_time(news.created_on) %> - <%= news.project.name %>)<br />\r
\r
<div class="splitcontentright">\r
<div class="box">\r
- <h3>Latest projects</h3>\r
+ <h3><%=_('Latest projects')%></h3>\r
<ul>
<% for project in @projects %>\r
<li>\r
# (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\r
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
\r
test:
adapter: mysql
host: localhost
username: root
password:
-\r
+
+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
+ \r
demo:
adapter: sqlite3\r
dbfile: db/redmine_demo.db\r
-production:
- adapter: mysql
- database: redmine\r
- host: localhost
- username: root
- password:
-
\ No newline at end of file
# application name\r
RDM_APP_NAME = "redMine" \r
# application version\r
-RDM_APP_VERSION = "0.1.0" \r
+RDM_APP_VERSION = "0.2.0" \r
# application host name\r
RDM_HOST_NAME = "somenet.foo"\r
# file storage path\r
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
-# administration\r
-admin:\r
- index: administration.html\r
- mail_options: administration.html#mail_notifications\r
- info: administration.html#app_info\r
-users:\r
- index: administration.html#users\r
-roles:\r
- index: administration.html#roles\r
- workflow: administration.html#workflow\r
-trackers:\r
- index: administration.html#trackers\r
-issue_statuses:\r
- index: administration.html#issue_statuses \r
+# redMine - project management software\r
+# Copyright (C) 2006 Jean-Philippe Lang\r
+#\r
+# This program is free software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 2\r
+# of the License, or (at your option) any later version.\r
+# \r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+# GNU General Public License for more details.\r
+# \r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
\r
-# projects\r
-projects:\r
- add: projects.html#settings\r
+# available languages for help pages\r
+langs:\r
+ - fr\r
\r
-\r
-# issues
\ No newline at end of file
+# mapping between controller/action and help pages\r
+# if action is not defined here, 'index' page will be displayed\r
+pages:\r
+ # administration\r
+ admin:\r
+ index: ch01.html\r
+ mail_options: ch01s08.html\r
+ info: ch01s09.html\r
+ users:\r
+ index: ch01s01.html\r
+ roles:\r
+ index: ch01s02.html\r
+ workflow: ch01s06.html\r
+ trackers:\r
+ index: ch01s03.html\r
+ issue_statuses:\r
+ index: ch01s05.html\r
+ # projects\r
+ projects:\r
+ index: ch02.html\r
+ add: ch02s08.html\r
+ show: ch02s01.html\r
+ add_document: ch02s06.html\r
+ list_documents: ch02s06.html\r
+ add_issue: ch02s02.html\r
+ list_issues: ch02s02.html\r
+ add_news: ch02s05.html\r
+ list_news: ch02s05.html\r
+ add_file: ch02s07.html\r
+ list_files: ch02s07.html\r
+ changelog: ch02s04.html\r
+ issues:\r
+ index: ch02s02.html\r
+ documents:\r
+ index: ch02s06.html\r
+ news:\r
+ index: ch02s05.html\r
+ versions:\r
+ index: ch02s08.html\r
+ reports:\r
+ index: ch02s03.html
\ No newline at end of file
+# 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\r
create_table "attachments", :force => true do |t|\r
t.column "container_type", :string, :limit => 30, :default => "", :null => false\r
t.column "filename", :string, :default => "", :null => false\r
t.column "disk_filename", :string, :default => "", :null => false\r
- t.column "size", :integer, :default => 0, :null => false\r
- t.column "content_type", :string, :limit => 60, :default => "", :null => false\r
+ t.column "filesize", :integer, :default => 0, :null => false\r
+ t.column "content_type", :string, :limit => 60, :default => ""\r
t.column "digest", :string, :limit => 40, :default => "", :null => false\r
t.column "downloads", :integer, :default => 0, :null => false\r
t.column "author_id", :integer, :default => 0, :null => false\r
t.column "typ", :integer, :default => 0, :null => false\r
t.column "is_required", :boolean, :default => false, :null => false\r
t.column "is_for_all", :boolean, :default => false, :null => false\r
- t.column "possible_values", :text, :default => "", :null => false\r
- t.column "regexp", :string, :default => "", :null => false\r
+ t.column "possible_values", :text, :default => ""\r
+ t.column "regexp", :string, :default => ""\r
t.column "min_length", :integer, :default => 0, :null => false\r
t.column "max_length", :integer, :default => 0, :null => false\r
end\r
t.column "issue_id", :integer, :default => 0, :null => false\r
t.column "status_id", :integer, :default => 0, :null => false\r
t.column "author_id", :integer, :default => 0, :null => false\r
- t.column "notes", :text, :default => "", :null => false\r
+ t.column "notes", :text, :default => ""\r
t.column "created_on", :timestamp\r
end\r
\r
create_table "news", :force => true do |t|\r
t.column "project_id", :integer\r
t.column "title", :string, :limit => 60, :default => "", :null => false\r
- t.column "shortdescr", :string, :default => "", :null => false\r
+ t.column "shortdescr", :string, :default => ""\r
t.column "descr", :text, :default => "", :null => false\r
t.column "author_id", :integer, :default => 0, :null => false\r
t.column "created_on", :timestamp\r
t.column "controller", :string, :limit => 30, :default => "", :null => false\r
t.column "action", :string, :limit => 30, :default => "", :null => false\r
t.column "descr", :string, :limit => 60, :default => "", :null => false\r
- t.column "public", :boolean, :default => false, :null => false\r
+ t.column "is_public", :boolean, :default => false, :null => false\r
t.column "sort", :integer, :default => 0, :null => false\r
t.column "mail_option", :boolean, :default => false, :null => false\r
t.column "mail_enabled", :boolean, :default => false, :null => false\r
create_table "projects", :force => true do |t|\r
t.column "name", :string, :limit => 30, :default => "", :null => false\r
t.column "descr", :string, :default => "", :null => false\r
- t.column "homepage", :string, :limit => 60, :default => "", :null => false\r
- t.column "public", :boolean, :default => true, :null => false\r
+ t.column "homepage", :string, :limit => 60, :default => ""\r
+ t.column "is_public", :boolean, :default => true, :null => false
+ t.column "parent_id", :integer
+ t.column "projects_count", :integer, :default => 0\r
t.column "created_on", :timestamp\r
t.column "updated_on", :timestamp\r
end\r
create_table "versions", :force => true do |t|\r
t.column "project_id", :integer, :default => 0, :null => false\r
t.column "name", :string, :limit => 30, :default => "", :null => false\r
- t.column "descr", :string, :default => "", :null => false\r
- t.column "date", :date, :null => false\r
+ t.column "descr", :string, :default => ""\r
+ t.column "effective_date", :date, :null => false\r
t.column "created_on", :timestamp\r
t.column "updated_on", :timestamp\r
end\r
end\r
\r
# project\r
- Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :public => true\r
- Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :public => true\r
- Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :public => true\r
+ Permission.create :controller => "projects", :action => "show", :descr => "Overview", :sort => 100, :is_public => true\r
+ Permission.create :controller => "projects", :action => "changelog", :descr => "View change log", :sort => 105, :is_public => true\r
+ Permission.create :controller => "reports", :action => "issue_report", :descr => "View reports", :sort => 110, :is_public => true\r
Permission.create :controller => "projects", :action => "settings", :descr => "Settings", :sort => 150\r
Permission.create :controller => "projects", :action => "edit", :descr => "Edit", :sort => 151\r
# members\r
- Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :public => true\r
+ Permission.create :controller => "projects", :action => "list_members", :descr => "View list", :sort => 200, :is_public => true\r
Permission.create :controller => "projects", :action => "add_member", :descr => "New member", :sort => 220\r
Permission.create :controller => "members", :action => "edit", :descr => "Edit", :sort => 221\r
Permission.create :controller => "members", :action => "destroy", :descr => "Delete", :sort => 222\r
Permission.create :controller => "issue_categories", :action => "edit", :descr => "Edit", :sort => 421\r
Permission.create :controller => "issue_categories", :action => "destroy", :descr => "Delete", :sort => 422\r
# issues\r
- Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :public => true\r
- Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :public => true\r
- Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :public => true\r
+ Permission.create :controller => "projects", :action => "list_issues", :descr => "View list", :sort => 1000, :is_public => true\r
+ Permission.create :controller => "issues", :action => "show", :descr => "View", :sort => 1005, :is_public => true\r
+ Permission.create :controller => "issues", :action => "download", :descr => "Download file", :sort => 1010, :is_public => true\r
Permission.create :controller => "projects", :action => "add_issue", :descr => "Report an issue", :sort => 1050, :mail_option => 1, :mail_enabled => 1\r
Permission.create :controller => "issues", :action => "edit", :descr => "Edit", :sort => 1055\r
Permission.create :controller => "issues", :action => "change_status", :descr => "Change status", :sort => 1060, :mail_option => 1, :mail_enabled => 1\r
Permission.create :controller => "issues", :action => "add_attachment", :descr => "Add file", :sort => 1070\r
Permission.create :controller => "issues", :action => "destroy_attachment", :descr => "Delete file", :sort => 1075\r
# news\r
- Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :public => true\r
- Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :public => true\r
+ Permission.create :controller => "projects", :action => "list_news", :descr => "View list", :sort => 1100, :is_public => true\r
+ Permission.create :controller => "news", :action => "show", :descr => "View", :sort => 1101, :is_public => true\r
Permission.create :controller => "projects", :action => "add_news", :descr => "Add", :sort => 1120\r
Permission.create :controller => "news", :action => "edit", :descr => "Edit", :sort => 1121\r
Permission.create :controller => "news", :action => "destroy", :descr => "Delete", :sort => 1122\r
# documents
- Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :public => true\r
- Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :public => true\r
- Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :public => true\r
+ Permission.create :controller => "projects", :action => "list_documents", :descr => "View list", :sort => 1200, :is_public => true\r
+ Permission.create :controller => "documents", :action => "show", :descr => "View", :sort => 1201, :is_public => true\r
+ Permission.create :controller => "documents", :action => "download", :descr => "Download", :sort => 1202, :is_public => true\r
Permission.create :controller => "projects", :action => "add_document", :descr => "Add", :sort => 1220\r
Permission.create :controller => "documents", :action => "edit", :descr => "Edit", :sort => 1221\r
Permission.create :controller => "documents", :action => "destroy", :descr => "Delete", :sort => 1222\r
Permission.create :controller => "documents", :action => "add_attachment", :descr => "Add file", :sort => 1223\r
Permission.create :controller => "documents", :action => "destroy_attachment", :descr => "Delete file", :sort => 1224\r
# files\r
- Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :public => true\r
- Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :public => true\r
+ Permission.create :controller => "projects", :action => "list_files", :descr => "View list", :sort => 1300, :is_public => true\r
+ Permission.create :controller => "versions", :action => "download", :descr => "Download", :sort => 1301, :is_public => true\r
Permission.create :controller => "projects", :action => "add_file", :descr => "Add", :sort => 1320\r
Permission.create :controller => "versions", :action => "destroy_file", :descr => "Delete", :sort => 1322\r
\r
# create default administrator account\r
- user = User.create :login => "admin", :password => "admin", :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en"\r
+ user = User.create :firstname => "redMine", :lastname => "Admin", :mail => "admin@somenet.foo", :mail_notification => true, :language => "en"
+ user.login = "admin"
+ user.password = "admin"\r
user.admin = true\r
user.save\r
\r
+# 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\r
# roles\r
r = Role.create(:name => "Manager")\r
r.permissions = Permission.find(:all)\r
r = Role.create :name => "Developer"\r
- 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
+ r.permissions = Permission.find(:all)\r
r = Role.create :name => "Reporter"\r
- r.permissions = Permission.find([1, 2, 3, 6, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 38, 39])\r
+ r.permissions = Permission.find(:all)\r
# trackers\r
Tracker.create(:name => "Bug", :is_in_chlog => true)\r
Tracker.create(:name => "Feature request", :is_in_chlog => true)\r
\r
redMine - project management software\r
Copyright (C) 2006 Jean-Philippe Lang\r
-http://redmine.sourceforge.net/\r
+http://redmine.org/\r
\r
\r
-== xx/xx/2006\r
+== 07/09/2006 - v0.2.0\r
\r
-* More filter options in issues list\r
-* Issues list exportable to CSV\r
+* new databases supported: Oracle, PostgreSQL, SQL Server\r
+* projects/subprojects hierarchy (1 level of subprojects only)\r
+* environment information display in admin/info\r
+* more filter options in issues list (rev6)\r
+* default language based on browser settings (Accept-Language HTTP header)\r
+* issues list exportable to CSV (rev6)\r
+* simple_format and auto_link on long text fields\r
+* more data validations\r
+* Fixed: error when all mail notifications are unchecked in admin/mail_options\r
+* Fixed: all project news are displayed on project summary\r
+* Fixed: Can't change user password in users/edit\r
* Fixed: Error on tables creation with PostgreSQL (rev5)\r
* Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)\r
\r
\r
redMine - project management software\r
Copyright (C) 2006 Jean-Philippe Lang\r
-http://redmine.sourceforge.net/\r
+http://redmine.org/\r
\r
\r
== Requirements\r
\r
* Ruby on Rails 1.1\r
-* Any database supported by Rails (developped using MySQL 5)\r
+* a database (see compatibility below)\r
* (recommended) Apache/Lighttpd with FCGI support \r
\r
+Supported databases:\r
+\r
+* MySQL (tested with MySQL 5)\r
+* PostgreSQL (tested with PostgreSQL 8.1)\r
+* Oracle (tested with Oracle 10g)\r
+* SQL Server (tested with SQL Server 2005)\r
+* SQLite (tested with SQLite 3)\r
+\r
\r
== Installation\r
\r
2. Create an empty database: "redmine" for example\r
\r
3. Configure database parameters in config/database.yml\r
- for "production" environment\r
+ for "production" environment (default database is MySQL)\r
\r
-4. Create database structure. Under application main directory:\r
+4. Create the database structure. Under application main directory:\r
rake migrate RAILS_ENV="production"\r
It will create tables and default configuration data\r
\r
\r
redMine - project management software\r
Copyright (C) 2006 Jean-Philippe Lang\r
-http://redmine.sourceforge.net/\r
+http://redmine.org/\r
\r
== License\r
\r
* multilanguage support\r
\r
\r
+== User documentation\r
+\r
+User documentation for redMine is written using DocBook XML format.\r
+It's also avaible as HTML files in /public/manual (contextual help)\r
+\r
+\r
== Versioning\r
\r
redMine versioning scheme is major.minor.revision\r
l.store 'Resolved', 'Résolue'\r
l.store 'Closed', 'Fermée'\r
l.store 'Rejected', 'Rejetée'\r
- l.store 'Feedback', 'Commentaire' \r
+ l.store 'Feedback', 'Commentaire' \r
+ # filters\r
+ l.store '[All]', '[Tous]'\r
+ l.store '[Open]', '[Ouvert]'\r
+ l.store '[None]', '[Aucun]'\r
\r
# issue priorities\r
l.store 'Issue priorities', 'Priorités des demandes'\r
l.store 'Reported issues', 'Demandes soumises'\r
l.store 'Assigned to me', 'Demandes qui me sont assignées'\r
\r
+ # ./script/../config/../app/views/account/login.rhtml\r
+ l.store 'Please login', 'Identification'\r
+\r
# ./script/../config/../app/views/account/show.rhtml\r
l.store 'Registered on', 'Inscrit le'\r
l.store 'Projects', 'Projets'\r
l.store 'New file', 'Nouveau fichier'\r
\r
# ./script/../config/../app/views/projects/list_issues.rhtml\r
+ l.store 'Subprojects', 'Sous-projets'\r
l.store 'Apply filter', 'Appliquer'\r
l.store 'Reset', 'Annuler'\r
l.store 'Report an issue', 'Nouvelle demande'\r
# ./script/../config/../app/views/versions/_form.rhtml\r
\r
# ./script/../config/../app/views/welcome/index.rhtml\r
- \r
+ l.store 'Latest projects', 'Derniers projets'\r
\r
end \r
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-\r
-<head>\r
-<title>redMine - Aide en ligne</title>\r
-<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
-<meta name="description" content="redMine" />\r
-<meta name="keywords" content="issue,bug,tracker" />\r
-<link href="stylesheets/help.css" rel="stylesheet" type="text/css" />\r
-</head>\r
-\r
-<body>\r
-<p align="right">[ <a href="index.html">Index</a> ]</p>\r
-<h1>Administration</h1>\r
-Sommaire:\r
-<ol>\r
- <li><a href="administration.html#users">Utilisateurs</a></li>\r
- <li><a href="administration.html#roles">Rôles et permissions</a></li>\r
- <li><a href="administration.html#trackers">Trackers</a></li>\r
- <li><a href="administration.html#custom_fields">Champs personnalisés</a></li>\r
- <li><a href="administration.html#issue_statuses">Statuts de demande</a></li>\r
- <li><a href="administration.html#workflow">Workflow</a></li>\r
- <li><a href="administration.html#enumerations">Listes de valeurs</a></li>\r
- <li><a href="administration.html#mail_notifications">Notifications par mail</a></li>\r
- <li><a href="administration.html#app_info">Informations</a></li>\r
-</ol>\r
- \r
-\r
-<h2><a name="users"></a>1. Utilisateurs</h2>\r
-<p>Ces écrans vous permettent de gérer les utilisateurs de l'application.</p>\r
-<h3>1.1 Liste des utilisateurs</h3>\r
-<center><img src="images/users_list.png"><br />\r
-<i><small>Liste des utilisateurs</small></i></center>\r
-<h3>1.2 Création ou modification d'un utilisateur</h3>\r
-<ul>\r
- <li><b>Administrateur</b>: déclare l'utilisateur comme administrateur de l'application.</li>\r
- <li><b>Notifications par mail</b>: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur</li>\r
- <li><b>Verrouillé</b>: désactive le compte de l'utilisateur</li>\r
-</ul>\r
-<p>En mode modification, laissez le champ <b>Password</b> vide pour laisser le mot de passe de l'utilisateur inchangé.</p>\r
-<p>Un utilisateur déclaré comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.</p>\r
-\r
-\r
-<h2><a name="roles"></a>2. Rôles et permissions</h2>\r
-<p>Les rôles permettent de définir les permissions des différents membres d'un projet.<br />\r
-Chaque membre d'un projet dispose d'un rôle unique au sein d'un projet.\r
-Un utilisateur peut avoir différents rôles au sein de différents projets.</p>\r
-<p>Sur l'écran d'édition du rôle, cochez les actions que vous souhaitez autoriser pour le rôle.</p>\r
-\r
-\r
-<h2><a name="trackers"></a>3. Trackers</h2>\r
-<p>Les trackers permettent de typer les demandes et de définir des workflows spécifiques pour chacun de ces types.</p>\r
-\r
-<h2><a name="custom_fields"></a>4. Champs personnalisés</h2>\r
-<p>Les champs personnalisés vous permettent d'ajouter des informations supplémentaires sur les demandes.</p>\r
-Un champ personnalisé peut être de l'un des types suivants:\r
-<ul>\r
- <li><b>Integer</b>: entier positif ou négatif</li>\r
- <li><b>String</b>: chaîne de caractère</li>\r
- <li><b>Date</b>: date</li>\r
- <li><b>Boolean</b>: booléen (case à cocher)</li>\r
- <li><b>List</b>: valeur à sélectionnée parmi une liste prédéfinie (liste déroulante)</li>\r
-</ul>\r
-Des éléments de validation peuvent être définis:\r
-<ul>\r
- <li><b>Required</b>: champ dont la saisie est obligatoire sur les demandes</li>\r
- <li><b>For all projects</b>: champ automatiquement associé à l'ensemble des projets</li>\r
- <li><b>Min - max length</b>: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)</li>\r
- <li><b>Regular expression</b>: expression régulière permettant de valider la valeur saisie</li>\r
- <li><b>Possible values (only for lists)</b>: valeurs possibles pour les champs de type "List". Les valeurs sont séparées par le caractère |</li>\r
-</ul>\r
-<p>Si l'option <b>For all projects</b> n'est pas activée, chaque projet pourra ou non utilisé le champ personnalisé pour ses demandes\r
-(voir <a href="projects.html#settings">Project settings</a>).</p>\r
-\r
-\r
-<h2><a name="issue_statuses"></a>5. Statuts des demandes</h2>\r
-<p>Cet écran vous permet de définir les différents statuts possibles des demandes.</p>\r
-<ul>\r
- <li><b>Closed</b>: indique que le statut correspond à une demande considérée comme fermée</li>\r
- <li><b>Default</b>: statut appliqué par défaut aux nouvelles demandes (seul un statut peut être déclaré comme statut par défaut)</li>\r
- <li><b>HTML color</b>: code de couleur HTML représentant le statut à l'affichage</li>\r
-</ul>\r
-\r
-\r
-<h2><a name="workflow"></a>6. Workflow</h2>\r
-<p>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.</p>\r
-<p>Sélectionnez le rôle et le type de demande pour lesquels vous souhaitez modifier le workflow, puis cliquez sur <b>Edit</b>. \r
-L'écran vous permet alors de modifier, pour le rôle et le type de demande choisi, les changements autorisés.</p>\r
-<p>Les lignes représentent les statuts initiaux des demandes. Les colonnes représentent les statuts autorisés à être appliqués.</p>\r
-<p>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.<br />\r
-Celles au statut Assigned pourront être passées au statut Resolved.<br />\r
-Le statut de toutes les autres demandes de type Bug ne pourra pas être modifié par le Développeur.</p>\r
-<center><img src="images/workflow.png"><br />\r
-<i><small>Exemple de configuration d'un workflow</small></i></center>\r
-<p><b>Remarque</b>: pour qu'un rôle puisse changer le statut des demandes, la permission <i>"Changer le statut des demandes"</i> doit lui être explicitement donnée indépendemment de la configuration du workflow (voir <a href="#roles">Roles et permissions</a>).\r
-\r
-\r
-<h2><a name="enumerations"></a>7. Listes de valeurs</h2>\r
-<p>Les listes de valeurs utilisées par l'application (exemple: les priorités des demandes) peuvent être personnalisées en fonction de vos besoins.<br />\r
-Cet écran vous permet de définir les valeurs possibles pour chacune des listes suivantes:</p>\r
-<ul>\r
- <li><b>Priorités des demandes</b></li>\r
- <li><b>Catégories de documents</b></li>\r
-</ul>\r
-\r
-\r
-<h2><a name="mail_notifications"></a>8. Notifications par mail</h2>\r
-<p>Cet écran vous permet de sélectionner les actions qui donneront lieu à une notification par mail aux membres du projet.</p>\r
-<p><b>Remarque</b>: l'envoi de mails doit être activé dans la configuration de l'application si souhaitez effectuer des notifications.</p>\r
-\r
-\r
-<h2><a name="app_info"></a>9. Informations</h2>\r
-<p>Affiche des informations relatives à l'application</p>\r
-<ul>\r
- <li><b>Version</b>: version de l'application</li>\r
- <li><b>Database</b>: type de base de données utilisée</li>\r
-</ul>\r
-\r
-\r
-</body>\r
-</html>\r
-\r
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>Chapter 1. Administration</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="index.html" title="Documentation redMine"><link rel="next" href="ch01s01.html" title="1. Utilisateurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Administration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4"></a>Chapter 1. Administration</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Création ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. Rôles et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalisés</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Documentation redMine </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 1. Utilisateurs</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>1. Utilisateurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01.html" title="Chapter 1. Administration"><link rel="next" href="ch01s02.html" title="2. Rôles et permissions"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1. Utilisateurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e7"></a>1. Utilisateurs</h2></div></div></div><p>Ces écrans vous permettent de gérer les utilisateurs de l'application.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e12"></a>1.1. Liste des utilisateurs</h3></div></div></div><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/users_list.png"></div></div><p>Les boutons Lock/Unlock vous permettent de vérouiller/dévérouiller les comptes utilisateurs.</p><p>Un utilisateur dont le compte est vérouillé ne peut plus s'identifier pour accéder à l'application.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e26"></a>1.2. Création ou modification d'un utilisateur</h3></div></div></div><p>En mode modification, laissez le champ Password vide pour laisser le mot de passe de l'utilisateur inchangé.</p><p>Un utilisateur déclaré comme administrateur dispose de toutes les permissions sur l'application et sur tous les projets.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Administrateur</span>: déclare l'utilisateur comme administrateur de l'application.</p></li><li><p><span class="guilabel">Notifications par mail</span>: permet d'activer ou non l'envoi automatique de notifications par mail pour cet utilisateur</p></li><li><p><span class="guilabel">Vérouillé</span>: désactive le compte de l'utilisateur</p></li></ul></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 1. Administration </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 2. Rôles et permissions</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>2. Rôles et permissions</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s01.html" title="1. Utilisateurs"><link rel="next" href="ch01s03.html" title="3. Trackers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. Rôles et permissions</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e49"></a>2. Rôles et permissions</h2></div></div></div><p>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.</p><p>Sur l'écran d'édition du rôle, cochez les actions que vous souhaitez autoriser pour le rôle.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1. Utilisateurs </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. Trackers</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>3. Trackers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s02.html" title="2. Rôles et permissions"><link rel="next" href="ch01s04.html" title="4. Champs personnalisés"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. Trackers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e56"></a>3. Trackers</h2></div></div></div><p>Les trackers permettent de typer les demandes et de définir des workflows spécifiques pour chacun de ces types.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. Rôles et permissions </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Champs personnalisés</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>4. Champs personnalisés</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s03.html" title="3. Trackers"><link rel="next" href="ch01s05.html" title="5. Statut des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. Champs personnalisés</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e61"></a>4. Champs personnalisés</h2></div></div></div><p>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:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Integer</span>: entier positif ou négatif</p></li><li><p><span class="guilabel">String</span>: chaîne de caractère</p></li><li><p><span class="guilabel">Date</span>: date</p></li><li><p><span class="guilabel">Boolean</span>: booléen (case à cocher)</p></li><li><p><span class="guilabel">List</span>: valeur à sélectionnée parmi une liste prédéfinie (liste déroulante)</p></li></ul></div><p>Des éléments de validation peuvent être définis:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Obligatoire</span>: champ dont la saisie est obligatoire sur les demandes</p></li><li><p><span class="guilabel">Pour tous les projects</span>: champ automatiquement associé à l'ensemble des projets</p></li><li><p><span class="guilabel">Min - max length</span>: longueurs minimales et maximales pour les champs en saisie libre (0 signifie qu'il n'y a pas de restriction)</p></li><li><p><span class="guilabel">Expression régulière</span>: expression régulière permettant de valider la valeur saisie</p></li><li><p><span class="guilabel">Valeurs possibles</span>: valeurs possibles pour les champs de type "Liste". Les valeurs sont séparées par le caractère |</p></li></ul></div><p>Si l'option <span class="guilabel">Pour tous les projets</span> n'est pas activée, chaque projet pourra choisir d'utiliser ou non le champ pour ses demandes.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3. Trackers </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 5. Statut des demandes</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>5. Statut des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s04.html" title="4. Champs personnalisés"><link rel="next" href="ch01s06.html" title="6. Workflow"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5. Statut des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e125"></a>5. Statut des demandes</h2></div></div></div><p>Ces écrans vous permettent de définir les différents statuts possibles des demandes.</p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Demande fermée</span>: indique que le statut correspond à une demande considérée comme fermée</p></li><li><p><span class="guilabel">Statut par défaut</span>: statut appliqué par défaut aux nouvelles demandes (seul un statut peut être déclaré comme statut par défaut)</p></li><li><p><span class="guilabel">Couleur</span>: code couleur HTML (6 caractères) représentant le statut à l'affichage</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4. Champs personnalisés </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 6. Workflow</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>6. Workflow</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s05.html" title="5. Statut des demandes"><link rel="next" href="ch01s07.html" title="7. Listes de valeurs"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6. Workflow</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e147"></a>6. Workflow</h2></div></div></div><p>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.</p><p>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.</p><p>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.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/workflow.png"></div></div><p>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.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5. Statut des demandes </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 7. Listes de valeurs</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>7. Listes de valeurs</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s06.html" title="6. Workflow"><link rel="next" href="ch01s08.html" title="8. Notifications par mail"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7. Listes de valeurs</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e165"></a>7. Listes de valeurs</h2></div></div></div><p>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:</p><div class="itemizedlist"><ul type="disc"><li><p>Priorités des demandes</p></li><li><p>Catégories de documents</p></li></ul></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6. Workflow </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 8. Notifications par mail</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>8. Notifications par mail</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s07.html" title="7. Listes de valeurs"><link rel="next" href="ch01s09.html" title="9. Informations"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8. Notifications par mail</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch01s09.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e178"></a>8. Notifications par mail</h2></div></div></div><p>Cet écran vous permet de sélectionner les actions qui donneront lieu à une notification par mail aux membres du projet.</p><p>Remarque: l'envoi de mails doit être activé dans la configuration de l'application si souhaitez effectuer des notifications.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch01s09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">7. Listes de valeurs </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 9. Informations</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>9. Informations</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch01.html" title="Chapter 1. Administration"><link rel="prev" href="ch01s08.html" title="8. Notifications par mail"><link rel="next" href="ch02.html" title="Chapter 2. Projets"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">9. Informations</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a> </td><th width="60%" align="center">Chapter 1. Administration</th><td width="20%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e185"></a>9. Informations</h2></div></div></div><p>Affiche des informations relatives à l'application et à son environnement.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s08.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">8. Notifications par mail </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 2. Projets</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>Chapter 2. Projets</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="index.html" title="Documentation redMine"><link rel="prev" href="ch01s09.html" title="9. Informations"><link rel="next" href="ch02s01.html" title="1. Aperçu du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 2. Projets</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch02s01.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="d0e190"></a>Chapter 2. Projets</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="ch02s01.html">1. Aperçu du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propriétés du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Catégories des demandes</a></span></dt></dl></dd></dl></div><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01s09.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch02s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">9. Informations </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 1. Aperçu du projet</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>1. Aperçu du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02.html" title="Chapter 2. Projets"><link rel="next" href="ch02s02.html" title="2. Gestion des demandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1. Aperçu du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e194"></a>1. Aperçu du projet</h2></div></div></div><p>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.</p><p></p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. Projets </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 2. Gestion des demandes</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>2. Gestion des demandes</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s01.html" title="1. Aperçu du projet"><link rel="next" href="ch02s03.html" title="3. Rapports"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. Gestion des demandes</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e200"></a>2. Gestion des demandes</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e204"></a>2.1. Liste des demandes</h3></div></div></div><p>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).</p><p>Une fois appliqué, un filtre reste valable durant toute votre session. Vous pouvez le redéfinir, ou le supprimer en cliquant sur Annuler.</p><p></p><div class="screenshot"><div class="mediaobject"><img src="resources/issues_list.png"></div></div><p></p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">1. Aperçu du projet </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. Rapports</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>3. Rapports</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s02.html" title="2. Gestion des demandes"><link rel="next" href="ch02s04.html" title="4. Historique"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. Rapports</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e219"></a>3. Rapports</h2></div></div></div><p>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.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. Gestion des demandes </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Historique</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>4. Historique</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s03.html" title="3. Rapports"><link rel="next" href="ch02s05.html" title="5. Annonces"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. Historique</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e224"></a>4. Historique</h2></div></div></div><p>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.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3. Rapports </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 5. Annonces</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>5. Annonces</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s04.html" title="4. Historique"><link rel="next" href="ch02s06.html" title="6. Documents"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5. Annonces</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e229"></a>5. Annonces</h2></div></div></div><p>Les nouvelles vous permettent d'informer les utilisateurs sur l'activité du projet.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">4. Historique </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 6. Documents</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>6. Documents</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s05.html" title="5. Annonces"><link rel="next" href="ch02s07.html" title="7. Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6. Documents</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e234"></a>6. Documents</h2></div></div></div><p>Les documents sont groupés par catégories (voir Listes de valeurs). Un document peut contenir plusieurs fichiers (exemple: révisions ou versions successives).</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">5. Annonces </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 7. Fichiers</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>7. Fichiers</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s06.html" title="6. Documents"><link rel="next" href="ch02s08.html" title="8. Configuration du projet"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">7. Fichiers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> <a accesskey="n" href="ch02s08.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e239"></a>7. Fichiers</h2></div></div></div><p>Ce module vous permet de publier les différents fichiers (sources, binaires, ...) pour chaque version de l'application.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">6. Documents </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 8. Configuration du projet</td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>8. Configuration du projet</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="up" href="ch02.html" title="Chapter 2. Projets"><link rel="prev" href="ch02s07.html" title="7. Fichiers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">8. Configuration du projet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Projets</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e244"></a>8. Configuration du projet</h2></div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e248"></a>8.1. Propriétés du projet</h3></div></div></div><p></p><div class="itemizedlist"><ul type="disc"><li><p><span class="guilabel">Public</span>: 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.</p></li><li><p><span class="guilabel">Champs personnalisés</span>: sélectionner les champs personnalisés que vous souhaitez utiliser au sein du projet. Seul l'administrateur peut ajouter de nouveaux champs personnalisés.</p></li></ul></div><p></p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e264"></a>8.2. Membres</h3></div></div></div><p>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.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e269"></a>8.3. Versions</h3></div></div></div><p>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).</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e274"></a>8.4. Catégories des demandes</h3></div></div></div><p>Les catégories de demande vous permettent de typer les demandes. Les catégories peuvent par exemple correspondre aux différents modules du projet.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top">7. Fichiers </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html>
\ No newline at end of file
--- /dev/null
+body {
+ background: #FFFFFF;\r
+ font: 0.8em Verdana,Tahoma,Arial,sans-serif;
+}
+
+h1, h2, h3, h4, h5 {
+ color: #800000;
+ font-family: sans-serif;
+}\r
+\r
+table {\r
+ font-size: 1em;\r
+}
+\r
+a{\r
+color:#467aa7;\r
+font-weight:bold;\r
+text-decoration:none;\r
+background-color:inherit;\r
+}\r
+\r
+a:hover{\r
+ color: #800000; \r
+ text-decoration:underline;\r
+ background-color:inherit;\r
+}\r
+\r
+a img{border:none;}\r
+\r
+.screenshot {\r
+ text-align: center;\r
+}\r
+\r
+.guilabel {\r
+ font-weight: bold;\r
+}\r
+
+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;
+}
--- /dev/null
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>Documentation redMine</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.70.1"><link rel="start" href="index.html" title="Documentation redMine"><link rel="next" href="ch01.html" title="Chapter 1. Administration"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Documentation redMine</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr></table><hr></div><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="d0e1"></a>Documentation redMine</h1></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Administration</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html">1. Utilisateurs</a></span></dt><dd><dl><dt><span class="section"><a href="ch01s01.html#d0e12">1.1. Liste des utilisateurs</a></span></dt><dt><span class="section"><a href="ch01s01.html#d0e26">1.2. Création ou modification d'un utilisateur</a></span></dt></dl></dd><dt><span class="section"><a href="ch01s02.html">2. Rôles et permissions</a></span></dt><dt><span class="section"><a href="ch01s03.html">3. Trackers</a></span></dt><dt><span class="section"><a href="ch01s04.html">4. Champs personnalisés</a></span></dt><dt><span class="section"><a href="ch01s05.html">5. Statut des demandes</a></span></dt><dt><span class="section"><a href="ch01s06.html">6. Workflow</a></span></dt><dt><span class="section"><a href="ch01s07.html">7. Listes de valeurs</a></span></dt><dt><span class="section"><a href="ch01s08.html">8. Notifications par mail</a></span></dt><dt><span class="section"><a href="ch01s09.html">9. Informations</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch02.html">2. Projets</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s01.html">1. Aperçu du projet</a></span></dt><dt><span class="section"><a href="ch02s02.html">2. Gestion des demandes</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#d0e204">2.1. Liste des demandes</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">3. Rapports</a></span></dt><dt><span class="section"><a href="ch02s04.html">4. Historique</a></span></dt><dt><span class="section"><a href="ch02s05.html">5. Annonces</a></span></dt><dt><span class="section"><a href="ch02s06.html">6. Documents</a></span></dt><dt><span class="section"><a href="ch02s07.html">7. Fichiers</a></span></dt><dt><span class="section"><a href="ch02s08.html">8. Configuration du projet</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s08.html#d0e248">8.1. Propriétés du projet</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e264">8.2. Membres</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e269">8.3. Versions</a></span></dt><dt><span class="section"><a href="ch02s08.html#d0e274">8.4. Catégories des demandes</a></span></dt></dl></dd></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Chapter 1. Administration</td></tr></table></div></body></html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-\r
-<head>\r
-<title>redMine - Aide en ligne</title>\r
-<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
-<meta name="description" content="redMine" />\r
-<meta name="keywords" content="issue,bug,tracker" />\r
-<link href="stylesheets/help.css" rel="stylesheet" type="text/css" />\r
-</head>\r
-\r
-<body>\r
-<h1>Aide</h1>\r
-\r
-<p>Documentation en ligne redMine</p>\r
-\r
-Sommaire:\r
-<ul>\r
-\r
- <li> \r
- <a href="administration.html">Administration</a>\r
- <ol>\r
- <li><a href="administration.html#users">Utilisateur</a></li>\r
- <li><a href="administration.html#roles">Rôles et permissions</a></li>\r
- <li><a href="administration.html#trackers">Trackers</a></li>\r
- <li><a href="administration.html#custom_fields">Champs personnalisés</a></li>\r
- <li><a href="administration.html#issue_statuses">Statuts de demande</a></li>\r
- <li><a href="administration.html#workflow">Workflow</a></li>\r
- <li><a href="administration.html#enumerations">Liste de valeurs</a></li>\r
- <li><a href="administration.html#mail_notifications">Notifications par mail</a></li>\r
- <li><a href="administration.html#app_info">Informations</a></li>\r
- </ol>\r
- </li>\r
- \r
- <li><a href="projects.html">Projets</a>\r
- <ol>\r
- <li><a href="projects.html#overview">Aperçu</a></li>\r
- <li><a href="projects.html#issues">Demandes</a>\r
- <ul>\r
- <li>Liste des demandes</li>\r
- <li>Nouvelle demande</li>\r
- <li>Changer le statut d'une demande</li> \r
- </ul>\r
- </li> \r
- <li><a href="projects.html#reports">Rapports</a></li>\r
- <li><a href="projects.html#news">Annonces</a></li>\r
- <li><a href="projects.html#changelog">Historique</a></li>\r
- <li><a href="projects.html#documents">Documents</a></li>\r
- <li><a href="projects.html#members">Membres</a></li>\r
- <li><a href="projects.html#files">Fichiers</a></li>\r
- <li><a href="projects.html#settings">Configuration</a></li>\r
- <ul>\r
- <li>Projet</li>\r
- <li>Membres</li>\r
- <li>Versions</li> \r
- <li>Catégories de demande</li> \r
- </ul>\r
- </ol>\r
- </li>\r
-\r
-\r
-</ul>\r
-\r
-</body>\r
-</html>
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-\r
-<head>\r
-<title>redMine - Aide en ligne</title>\r
-<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />\r
-<meta name="description" content="redMine" />\r
-<meta name="keywords" content="issue,bug,tracker" />\r
-<link href="stylesheets/help.css" rel="stylesheet" type="text/css" />\r
-</head>\r
-\r
-<body>\r
-<p align="right">[ <a href="index.html">Index</a> ]</p>\r
-<h1>Projets</h1>\r
-Sommaire:\r
-<ol>\r
- <li><a href="projects.html#overview">Aperçu</a></li>\r
- <li><a href="projects.html#issues">Demandes</a>\r
- <ul>\r
- <li>Liste des demandes</li>\r
- <li>Nouvelle demande</li>\r
- <li>Changer le statut d'une demande</li> \r
- </ul>\r
- </li> \r
- <li><a href="projects.html#reports">Rapports</a></li>\r
- <li><a href="projects.html#news">Annonces</a></li>\r
- <li><a href="projects.html#changelog">Historique</a></li>\r
- <li><a href="projects.html#documents">Documents</a></li>\r
- <li><a href="projects.html#members">Membres</a></li>\r
- <li><a href="projects.html#files">Fichiers</a></li>\r
- <li><a href="projects.html#settings">Configuration</a></li>\r
- <ul>\r
- <li>Projet</li>\r
- <li>Membres</li>\r
- <li>Versions</li> \r
- <li>Catégories de demande</li> \r
- </ul>\r
-</ol>\r
-\r
-\r
-<h2><a name="overview"></a>1. Aperçu</h2>\r
-<p>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.\r
-\r
-\r
-<h2><a name="issues"></a>2. Demandes</h2>\r
-<h3>2.1 Liste des demandes</h3>\r
-Par défaut, l'ensemble des demandes sont affichées. Vous pouvez utiliser les différents filtres pour limiter l'affichage à certaines demandes seulement.<br />\r
-Lorsque vous appliquez un filtre, il reste en place durant toute votre session. Vous pouvez le redéfinir, ou le supprimer en cliquant sur <b>Annuler</b>.\r
-<center><img src="images/issues_list.png"><br />\r
-<i><small>Liste des demandes</small></i></center>\r
-\r
-<h3>2.2 Nouvelle demande</h3>\r
-<p>TODO</p>\r
-\r
-<h3>2.3 Changer le statut d'une demande</h3>\r
-<p>TODO</p>\r
-\r
-\r
-<h2><a name="reports"></a>3. Rapports</h2>\r
-<p>Synthèse du nombre de demandes par statut et selon différents critères (tracker, priorité, catégorie).\r
-Des liens directs permettent d'accéder à la liste détaillée des demandes pour chaque critère.</p>\r
-\r
-\r
-<h2><a name="news"></a>4. Annonces</h2>\r
-<p>Les nouvelles vous permettent d'informer les utilisateurs sur l'activité du projet.</p>\r
-\r
-\r
-<h2><a name="changelog"></a>5. Historique</h2>\r
-<p>Cette page présente l'ensemble des demandes résolues dans chacune des versions du projet.\r
-Certains types de demande peuvent être exclus de cet affichage (voir <a href="administration.html#trackers">Trackers</a>).</p>\r
-\r
-\r
-<h2><a name="documents"></a>6. Documents</h2>\r
-<p>Les documents sont groupés par catégories (voir <a href="administration.html#enumerations">Listes de valeurs</a>).<br />\r
-Un document peut contenir plusieurs fichiers (exemple: révisions ou versions successives)</p>\r
-\r
-\r
-<h2><a name="members"></a>7. Membres</h2>\r
-<p>Affichage de l'ensemble des membres du projet, par rôle</p>\r
-\r
-\r
-<h2><a name="files"></a>8. Fichiers</h2>\r
-<p>Ce module vous permet de publier les fichiers de l'application (sources, binaires, ...) pour chaque version de l'application .</p>\r
-\r
-<h2><a name="settings"></a>9. Configuration</h2>\r
-<h3>9.1 Projet</h3>\r
-<ul>\r
- <li><b>Public</b>: 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.<br />\r
- Si le projet n'est pas public, seuls les membres du projet y ont accès, en fonction de leur rôle.</li>\r
- <li><b>Champs personnalisés</b>: sélectionner les champs personnalisés que vous souhaitez utiliser au sein du projet.<br />\r
- Seul l'administrateur peut ajouter de nouveaux champs personnalisés.</li>\r
-</ul>\r
-<h3>9.2 Membres</h3>\r
-<p>Cette section vous permet de définir les membres du projet ainsi que leurs rôles respectifs.<br />\r
-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.</p>\r
-\r
-<h3>9.3 Versions</h3>\r
-<p>Les versions vous permettent de suivre les changements survenus tout au long du projet.\r
-A la fermeture d'une demande, vous pouvez indiquer quelle version la prend en compte.<br />\r
-Vous pouvez par ailleurs publier les différentes versions de l'application (voir <a href="projects.html#files">Fichiers</a>).\r
-</p>\r
-\r
-\r
-<h3>9.4 Catégories de demande</h3>\r
-<p>Les catégories de demande vous permettent de typer les demandes. Les catégories peuvent par exemple correspondre aux modules de l'application.</p>\r
-\r
-\r
-</body>\r
-</html>\r
-\r
+++ /dev/null
-/* 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 */\r
-\r
-/**************** Body and tag styles ****************/\r
-\r
-\r
-\r
-body{\r
-font:76% Verdana,Tahoma,Arial,sans-serif;\r
-line-height:1.4em;\r
-color:#303030;\r
-margin: 20px;\r
-}\r
-\r
-a{\r
-color:#467aa7;\r
-font-weight:bold;\r
-text-decoration:none;\r
-background-color:inherit;\r
-}\r
-\r
-a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}\r
-a img{border:none;}\r
-\r
-p{padding:0 0 0.2em 0;}\r
-p form{margin-top:0; margin-bottom:20px;}\r
-\r
-h1 {\r
-display:block;\r
-\r
-font-size:1.7em;\r
-font-weight:normal;\r
-letter-spacing:-1px;\r
-color:#505050;\r
-background-color:inherit;\r
-}\r
-\r
-h2 {\r
-display:block;\r
-margin: 30px 0 0 0;\r
-font-size:1.5em;\r
-font-weight:normal;\r
-letter-spacing:-1px;\r
-color:#505050;\r
-background-color:inherit;\r
-}\r
-\r
-hr { border:0px; border-bottom:1px dashed #000000; }\r
-\r
-\r
-/**************** Misc classes and styles ****************/\r
-\r
-.splitcontentleft{float:left; width:49%;}\r
-.splitcontentright{float:right; width:49%;}\r
-.clear{clear:both;}\r
-.small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}\r
-.hide{display:none;}\r
-.textcenter{text-align:center;}\r
-.textright{text-align:right;}\r
-.important{color:#f02025; background-color:inherit; }\r
-\r
-.box{\r
-margin:0 0 20px 0;\r
-padding:10px;\r
-border:1px solid #c0c0c0;\r
-background-color:#fafbfc;\r
-color:#505050;\r
-line-height:1.5em;\r
-}\r
-\r
-\r
font-size: 0.8em;\r
}\r
\r
+select.select-small \r
+{\r
+ font-size: 0.8em;\r
+}\r
+\r
label {\r
font-weight: bold;\r
font-size: 1em;\r
}\r
\r
+fieldset {\r
+ border:1px solid #7F9DB9;\r
+}\r
+\r
.required {\r
color: #bb0000;\r
}\r
text-decoration:underline;\r
}\r
\r
-tr.ListLine0 {\r
+tr.odd {\r
background-color: #C1E2F7;\r
}\r
-tr.ListLine1 {\r
+tr.even {\r
background-color:#CEE1ED;\r
}\r
\r
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-Mailer#issue_closed
-
-Find me in app/views/mailer/issue_closed.rhtml
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
# 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
# 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
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
# 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
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
- id: 1
-another:
- id: 2
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+# 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'
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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
--- /dev/null
+# 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
--- /dev/null
+# 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
-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'
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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+# 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
+++ /dev/null
-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
+++ /dev/null
-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
+# 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
+++ /dev/null
-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
+++ /dev/null
-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