Commit f37089f5 authored by Jean-Philippe Lang's avatar Jean-Philippe Lang

v0.2.0

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